f(SET_CHUNK, __CEPH_OSD_OP(WR, DATA, 40), "set-chunk") \
f(TIER_PROMOTE, __CEPH_OSD_OP(WR, DATA, 41), "tier-promote") \
f(UNSET_MANIFEST, __CEPH_OSD_OP(WR, DATA, 42), "unset-manifest") \
- f(TIER_FLUSH, __CEPH_OSD_OP(WR, DATA, 43), "tier-flush") \
+ f(TIER_FLUSH, __CEPH_OSD_OP(CACHE, DATA, 43), "tier-flush") \
\
/** attrs **/ \
/* read */ \
std::string tgt_oid, uint64_t tgt_offset, int flag = 0);
void tier_promote();
void unset_manifest();
- void tier_flush();
friend class IoCtx;
* triggering a promote on the OSD (that is then evicted).
*/
void cache_evict();
+
+ /**
+ * flush a manifest tier object to backing tier; will block racing
+ * updates.
+ */
+ void tier_flush();
};
/* IoCtx : This is a context in which we can perform I/O.
o->cache_evict();
}
+void librados::ObjectReadOperation::tier_flush()
+{
+ ceph_assert(impl);
+ ::ObjectOperation *o = &impl->o;
+ o->tier_flush();
+}
+
void librados::ObjectWriteOperation::set_redirect(const std::string& tgt_obj,
const IoCtx& tgt_ioctx,
uint64_t tgt_version,
o->unset_manifest();
}
-void librados::ObjectWriteOperation::tier_flush()
-{
- ceph_assert(impl);
- ::ObjectOperation *o = &impl->o;
- o->tier_flush();
-}
-
void librados::ObjectWriteOperation::tmap_update(const bufferlist& cmdbl)
{
ceph_assert(impl);
result = -EOPNOTSUPP;
break;
}
- if (soid.has_snapset()) {
+ if (ctx->snapc.snaps.size() ||
+ (ctx->obc->ssc && ctx->obc->ssc->snapset.clones.size()) ) {
result = -EOPNOTSUPP;
break;
}
class TierFlushOp : public TestOp {
public:
librados::AioCompletion *completion;
- librados::ObjectWriteOperation op;
+ librados::ObjectReadOperation op;
string oid;
std::shared_ptr<int> in_use;
context->state_lock.unlock();
op.tier_flush();
+ unsigned flags = librados::OPERATION_IGNORE_CACHE;
int r = context->io_ctx.aio_operate(context->prefix+oid, completion,
- &op);
+ &op, flags, NULL);
ceph_assert(!r);
}
}
string oid(nargs[1]);
- ObjectWriteOperation op;
+ ObjectReadOperation op;
op.tier_flush();
- ret = io_ctx.operate(oid, &op);
+ librados::AioCompletion *completion =
+ librados::Rados::aio_create_completion();
+ io_ctx.aio_operate(oid.c_str(), completion, &op,
+ librados::OPERATION_IGNORE_CACHE |
+ librados::OPERATION_IGNORE_OVERLAY,
+ NULL);
+ completion->wait_for_complete();
+ ret = completion->get_return_value();
+ completion->release();
if (ret < 0) {
cerr << "error tier-flush " << pool_name << "/" << oid << " : "
<< cpp_strerror(ret) << std::endl;