size_t librados::ObjectOperation::size()
{
::ObjectOperation *o = &impl->o;
- return o->size();
+ if (o)
+ return o->size();
+ else
+ return 0;
}
//deprcated
void librados::ObjectOperation::set_op_flags2(int flags)
{
+ ceph_assert(impl);
impl->o.set_last_op_flags(get_op_flags(flags));
}
const bufferlist &cmp_bl,
int *prval)
{
+ ceph_assert(impl);
::ObjectOperation *o = &impl->o;
bufferlist c = cmp_bl;
o->cmpext(off, c, prval);
void librados::ObjectOperation::cmpxattr(const char *name, uint8_t op, const bufferlist& v)
{
+ ceph_assert(impl);
::ObjectOperation *o = &impl->o;
o->cmpxattr(name, op, CEPH_OSD_CMPXATTR_MODE_STRING, v);
}
void librados::ObjectOperation::cmpxattr(const char *name, uint8_t op, uint64_t v)
{
+ ceph_assert(impl);
::ObjectOperation *o = &impl->o;
bufferlist bl;
encode(v, bl);
void librados::ObjectOperation::assert_version(uint64_t ver)
{
+ ceph_assert(impl);
::ObjectOperation *o = &impl->o;
o->assert_version(ver);
}
void librados::ObjectOperation::assert_exists()
{
+ ceph_assert(impl);
::ObjectOperation *o = &impl->o;
o->stat(NULL, (ceph::real_time*) NULL, NULL);
}
void librados::ObjectOperation::exec(const char *cls, const char *method, bufferlist& inbl)
{
+ ceph_assert(impl);
::ObjectOperation *o = &impl->o;
o->call(cls, method, inbl);
}
void librados::ObjectOperation::exec(const char *cls, const char *method, bufferlist& inbl, bufferlist *outbl, int *prval)
{
+ ceph_assert(impl);
::ObjectOperation *o = &impl->o;
o->call(cls, method, inbl, outbl, NULL, prval);
}
void librados::ObjectOperation::exec(const char *cls, const char *method, bufferlist& inbl, librados::ObjectOperationCompletion *completion)
{
+ ceph_assert(impl);
::ObjectOperation *o = &impl->o;
ObjectOpCompletionCtx *ctx = new ObjectOpCompletionCtx(completion);
void librados::ObjectReadOperation::stat(uint64_t *psize, time_t *pmtime, int *prval)
{
+ ceph_assert(impl);
::ObjectOperation *o = &impl->o;
o->stat(psize, pmtime, prval);
}
void librados::ObjectReadOperation::stat2(uint64_t *psize, struct timespec *pts, int *prval)
{
+ ceph_assert(impl);
::ObjectOperation *o = &impl->o;
o->stat(psize, pts, prval);
}
void librados::ObjectReadOperation::read(size_t off, uint64_t len, bufferlist *pbl, int *prval)
{
+ ceph_assert(impl);
::ObjectOperation *o = &impl->o;
o->read(off, len, pbl, prval, NULL);
}
std::map<uint64_t,uint64_t> *m,
bufferlist *data_bl, int *prval)
{
+ ceph_assert(impl);
::ObjectOperation *o = &impl->o;
o->sparse_read(off, len, m, data_bl, prval);
}
size_t chunk_size, bufferlist *pbl,
int *prval)
{
+ ceph_assert(impl);
::ObjectOperation *o = &impl->o;
o->checksum(get_checksum_op_type(type), init_value_bl, off, len, chunk_size,
pbl, prval, nullptr);
void librados::ObjectReadOperation::getxattr(const char *name, bufferlist *pbl, int *prval)
{
+ ceph_assert(impl);
::ObjectOperation *o = &impl->o;
o->getxattr(name, pbl, prval);
}
std::map<std::string, bufferlist> *out_vals,
int *prval)
{
+ ceph_assert(impl);
::ObjectOperation *o = &impl->o;
o->omap_get_vals(start_after, filter_prefix, max_return, out_vals, nullptr,
prval);
bool *pmore,
int *prval)
{
+ ceph_assert(impl);
::ObjectOperation *o = &impl->o;
o->omap_get_vals(start_after, filter_prefix, max_return, out_vals, pmore,
prval);
std::map<std::string, bufferlist> *out_vals,
int *prval)
{
+ ceph_assert(impl);
::ObjectOperation *o = &impl->o;
o->omap_get_vals(start_after, "", max_return, out_vals, nullptr, prval);
}
bool *pmore,
int *prval)
{
+ ceph_assert(impl);
::ObjectOperation *o = &impl->o;
o->omap_get_vals(start_after, "", max_return, out_vals, pmore, prval);
}
std::set<std::string> *out_keys,
int *prval)
{
+ ceph_assert(impl);
::ObjectOperation *o = &impl->o;
o->omap_get_keys(start_after, max_return, out_keys, nullptr, prval);
}
bool *pmore,
int *prval)
{
+ ceph_assert(impl);
::ObjectOperation *o = &impl->o;
o->omap_get_keys(start_after, max_return, out_keys, pmore, prval);
}
void librados::ObjectReadOperation::omap_get_header(bufferlist *bl, int *prval)
{
+ ceph_assert(impl);
::ObjectOperation *o = &impl->o;
o->omap_get_header(bl, prval);
}
std::map<std::string, bufferlist> *map,
int *prval)
{
+ ceph_assert(impl);
::ObjectOperation *o = &impl->o;
o->omap_get_vals_by_keys(keys, map, prval);
}
const std::map<std::string, pair<bufferlist, int> > &assertions,
int *prval)
{
+ ceph_assert(impl);
::ObjectOperation *o = &impl->o;
o->omap_cmp(assertions, prval);
}
list<obj_watch_t> *out_watchers,
int *prval)
{
+ ceph_assert(impl);
::ObjectOperation *o = &impl->o;
o->list_watchers(out_watchers, prval);
}
snap_set_t *out_snaps,
int *prval)
{
+ ceph_assert(impl);
::ObjectOperation *o = &impl->o;
o->list_snaps(out_snaps, prval);
}
void librados::ObjectReadOperation::is_dirty(bool *is_dirty, int *prval)
{
+ ceph_assert(impl);
::ObjectOperation *o = &impl->o;
o->is_dirty(is_dirty, prval);
}
void librados::ObjectReadOperation::getxattrs(map<string, bufferlist> *pattrs, int *prval)
{
+ ceph_assert(impl);
::ObjectOperation *o = &impl->o;
o->getxattrs(pattrs, prval);
}
void librados::ObjectWriteOperation::mtime(time_t *pt)
{
+ ceph_assert(impl);
if (pt) {
impl->rt = ceph::real_clock::from_time_t(*pt);
impl->prt = &impl->rt;
void librados::ObjectWriteOperation::mtime2(struct timespec *pts)
{
+ ceph_assert(impl);
if (pts) {
impl->rt = ceph::real_clock::from_timespec(*pts);
impl->prt = &impl->rt;
void librados::ObjectWriteOperation::create(bool exclusive)
{
+ ceph_assert(impl);
::ObjectOperation *o = &impl->o;
o->create(exclusive);
}
void librados::ObjectWriteOperation::create(bool exclusive,
const std::string& category) // unused
{
+ ceph_assert(impl);
::ObjectOperation *o = &impl->o;
o->create(exclusive);
}
void librados::ObjectWriteOperation::write(uint64_t off, const bufferlist& bl)
{
+ ceph_assert(impl);
::ObjectOperation *o = &impl->o;
bufferlist c = bl;
o->write(off, c);
void librados::ObjectWriteOperation::write_full(const bufferlist& bl)
{
+ ceph_assert(impl);
::ObjectOperation *o = &impl->o;
bufferlist c = bl;
o->write_full(c);
void librados::ObjectWriteOperation::writesame(uint64_t off, uint64_t write_len,
const bufferlist& bl)
{
+ ceph_assert(impl);
::ObjectOperation *o = &impl->o;
bufferlist c = bl;
o->writesame(off, write_len, c);
void librados::ObjectWriteOperation::append(const bufferlist& bl)
{
+ ceph_assert(impl);
::ObjectOperation *o = &impl->o;
bufferlist c = bl;
o->append(c);
void librados::ObjectWriteOperation::remove()
{
+ ceph_assert(impl);
::ObjectOperation *o = &impl->o;
o->remove();
}
void librados::ObjectWriteOperation::truncate(uint64_t off)
{
+ ceph_assert(impl);
::ObjectOperation *o = &impl->o;
o->truncate(off);
}
void librados::ObjectWriteOperation::zero(uint64_t off, uint64_t len)
{
+ ceph_assert(impl);
::ObjectOperation *o = &impl->o;
o->zero(off, len);
}
void librados::ObjectWriteOperation::rmxattr(const char *name)
{
+ ceph_assert(impl);
::ObjectOperation *o = &impl->o;
o->rmxattr(name);
}
void librados::ObjectWriteOperation::setxattr(const char *name, const bufferlist& v)
{
+ ceph_assert(impl);
::ObjectOperation *o = &impl->o;
o->setxattr(name, v);
}
void librados::ObjectWriteOperation::setxattr(const char *name,
const buffer::list&& v)
{
+ ceph_assert(impl);
::ObjectOperation *o = &impl->o;
o->setxattr(name, std::move(v));
-}
+}
void librados::ObjectWriteOperation::omap_set(
const map<string, bufferlist> &map)
{
+ ceph_assert(impl);
::ObjectOperation *o = &impl->o;
o->omap_set(map);
}
void librados::ObjectWriteOperation::omap_set_header(const bufferlist &bl)
{
+ ceph_assert(impl);
bufferlist c = bl;
::ObjectOperation *o = &impl->o;
o->omap_set_header(c);
void librados::ObjectWriteOperation::omap_clear()
{
+ ceph_assert(impl);
::ObjectOperation *o = &impl->o;
o->omap_clear();
}
void librados::ObjectWriteOperation::omap_rm_keys(
const std::set<std::string> &to_rm)
{
+ ceph_assert(impl);
::ObjectOperation *o = &impl->o;
o->omap_rm_keys(to_rm);
}
uint64_t src_version,
uint32_t src_fadvise_flags)
{
+ ceph_assert(impl);
::ObjectOperation *o = &impl->o;
o->copy_from(object_t(src), src_ioctx.io_ctx_impl->snap_seq,
src_ioctx.io_ctx_impl->oloc, src_version, 0, src_fadvise_flags);
}
+void librados::ObjectWriteOperation::copy_from2(const std::string& src,
+ const IoCtx& src_ioctx,
+ uint64_t src_version,
+ uint32_t truncate_seq,
+ uint64_t truncate_size,
+ uint32_t src_fadvise_flags)
+{
+ ceph_assert(impl);
+ ::ObjectOperation *o = &impl->o;
+ o->copy_from2(object_t(src), src_ioctx.io_ctx_impl->snap_seq,
+ src_ioctx.io_ctx_impl->oloc, src_version, 0,
+ truncate_seq, truncate_size, src_fadvise_flags);
+}
+
void librados::ObjectWriteOperation::undirty()
{
+ ceph_assert(impl);
::ObjectOperation *o = &impl->o;
o->undirty();
}
void librados::ObjectReadOperation::cache_flush()
{
+ ceph_assert(impl);
::ObjectOperation *o = &impl->o;
o->cache_flush();
}
void librados::ObjectReadOperation::cache_try_flush()
{
+ ceph_assert(impl);
::ObjectOperation *o = &impl->o;
o->cache_try_flush();
}
void librados::ObjectReadOperation::cache_evict()
{
+ ceph_assert(impl);
::ObjectOperation *o = &impl->o;
o->cache_evict();
}
uint64_t tgt_version,
int flag)
{
+ ceph_assert(impl);
::ObjectOperation *o = &impl->o;
o->set_redirect(object_t(tgt_obj), tgt_ioctx.io_ctx_impl->snap_seq,
tgt_ioctx.io_ctx_impl->oloc, tgt_version, flag);
uint64_t tgt_offset,
int flag)
{
+ ceph_assert(impl);
::ObjectOperation *o = &impl->o;
- o->set_chunk(src_offset, src_length,
+ o->set_chunk(src_offset, src_length,
tgt_ioctx.io_ctx_impl->oloc, object_t(tgt_oid), tgt_offset, flag);
}
void librados::ObjectWriteOperation::tier_promote()
{
+ ceph_assert(impl);
::ObjectOperation *o = &impl->o;
o->tier_promote();
}
void librados::ObjectWriteOperation::unset_manifest()
{
+ ceph_assert(impl);
::ObjectOperation *o = &impl->o;
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);
::ObjectOperation *o = &impl->o;
bufferlist c = cmdbl;
o->tmap_update(c);
void librados::ObjectWriteOperation::selfmanaged_snap_rollback(snap_t snapid)
{
+ ceph_assert(impl);
::ObjectOperation *o = &impl->o;
o->rollback(snapid);
}
// You must specify the snapid not the name normally used with pool snapshots
void librados::ObjectWriteOperation::snap_rollback(snap_t snapid)
{
+ ceph_assert(impl);
::ObjectOperation *o = &impl->o;
o->rollback(snapid);
}
uint64_t expected_object_size,
uint64_t expected_write_size)
{
+ ceph_assert(impl);
::ObjectOperation *o = &impl->o;
o->set_alloc_hint(expected_object_size, expected_write_size, 0);
}
uint64_t expected_write_size,
uint32_t flags)
{
+ ceph_assert(impl);
::ObjectOperation *o = &impl->o;
o->set_alloc_hint(expected_object_size, expected_write_size, flags);
}
void librados::ObjectWriteOperation::cache_pin()
{
+ ceph_assert(impl);
::ObjectOperation *o = &impl->o;
o->cache_pin();
}
void librados::ObjectWriteOperation::cache_unpin()
{
+ ceph_assert(impl);
::ObjectOperation *o = &impl->o;
o->cache_unpin();
}
const librados::NObjectIterator librados::NObjectIterator::__EndObjectIterator(NULL);
///////////////////////////// PoolAsyncCompletion //////////////////////////////
+librados::PoolAsyncCompletion::PoolAsyncCompletion::~PoolAsyncCompletion()
+{
+ auto c = reinterpret_cast<PoolAsyncCompletionImpl *>(pc);
+ c->release();
+}
+
int librados::PoolAsyncCompletion::PoolAsyncCompletion::set_callback(void *cb_arg,
rados_callback_t cb)
{
void librados::PoolAsyncCompletion::PoolAsyncCompletion::release()
{
- PoolAsyncCompletionImpl *c = (PoolAsyncCompletionImpl *)pc;
- c->release();
delete this;
}
///////////////////////////// AioCompletion //////////////////////////////
+librados::AioCompletion::AioCompletion::~AioCompletion()
+{
+ auto c = reinterpret_cast<AioCompletionImpl *>(pc);
+ c->release();
+}
+
int librados::AioCompletion::AioCompletion::set_complete_callback(void *cb_arg, rados_callback_t cb)
{
AioCompletionImpl *c = (AioCompletionImpl *)pc;
int librados::AioCompletion::AioCompletion::wait_for_safe()
{
AioCompletionImpl *c = (AioCompletionImpl *)pc;
- return c->wait_for_safe();
+ return c->wait_for_complete();
}
bool librados::AioCompletion::AioCompletion::is_complete()
void librados::AioCompletion::AioCompletion::release()
{
- AioCompletionImpl *c = (AioCompletionImpl *)pc;
- c->release();
delete this;
}
int librados::IoCtx::operate(const std::string& oid, librados::ObjectWriteOperation *o)
{
object_t obj(oid);
+ if (unlikely(!o->impl))
+ return -EINVAL;
return io_ctx_impl->operate(obj, &o->impl->o, (ceph::real_time *)o->impl->prt);
}
+int librados::IoCtx::operate(const std::string& oid, librados::ObjectWriteOperation *o, int flags)
+{
+ object_t obj(oid);
+ if (unlikely(!o->impl))
+ return -EINVAL;
+ return io_ctx_impl->operate(obj, &o->impl->o, (ceph::real_time *)o->impl->prt, translate_flags(flags));
+}
+
int librados::IoCtx::operate(const std::string& oid, librados::ObjectReadOperation *o, bufferlist *pbl)
{
object_t obj(oid);
+ if (unlikely(!o->impl))
+ return -EINVAL;
return io_ctx_impl->operate_read(obj, &o->impl->o, pbl);
}
+int librados::IoCtx::operate(const std::string& oid, librados::ObjectReadOperation *o, bufferlist *pbl, int flags)
+{
+ object_t obj(oid);
+ if (unlikely(!o->impl))
+ return -EINVAL;
+ return io_ctx_impl->operate_read(obj, &o->impl->o, pbl, translate_flags(flags));
+}
+
int librados::IoCtx::aio_operate(const std::string& oid, AioCompletion *c,
librados::ObjectWriteOperation *o)
{
object_t obj(oid);
+ if (unlikely(!o->impl))
+ return -EINVAL;
return io_ctx_impl->aio_operate(obj, &o->impl->o, c->pc,
io_ctx_impl->snapc, 0);
}
ObjectWriteOperation *o, int flags)
{
object_t obj(oid);
+ if (unlikely(!o->impl))
+ return -EINVAL;
return io_ctx_impl->aio_operate(obj, &o->impl->o, c->pc,
io_ctx_impl->snapc,
translate_flags(flags));
librados::ObjectWriteOperation *o,
snap_t snap_seq, std::vector<snap_t>& snaps)
{
+ if (unlikely(!o->impl))
+ return -EINVAL;
object_t obj(oid);
vector<snapid_t> snv;
snv.resize(snaps.size());
snap_t snap_seq, std::vector<snap_t>& snaps,
const blkin_trace_info *trace_info)
{
+ if (unlikely(!o->impl))
+ return -EINVAL;
object_t obj(oid);
vector<snapid_t> snv;
snv.resize(snaps.size());
snap_t snap_seq, std::vector<snap_t>& snaps, int flags,
const blkin_trace_info *trace_info)
{
+ if (unlikely(!o->impl))
+ return -EINVAL;
object_t obj(oid);
vector<snapid_t> snv;
snv.resize(snaps.size());
librados::ObjectReadOperation *o,
bufferlist *pbl)
{
+ if (unlikely(!o->impl))
+ return -EINVAL;
object_t obj(oid);
return io_ctx_impl->aio_operate_read(obj, &o->impl->o, c->pc,
0, pbl);
snap_t snapid_unused_deprecated,
int flags, bufferlist *pbl)
{
+ if (unlikely(!o->impl))
+ return -EINVAL;
object_t obj(oid);
int op_flags = 0;
if (flags & OPERATION_BALANCE_READS)
librados::ObjectReadOperation *o,
int flags, bufferlist *pbl)
{
+ if (unlikely(!o->impl))
+ return -EINVAL;
object_t obj(oid);
return io_ctx_impl->aio_operate_read(obj, &o->impl->o, c->pc,
translate_flags(flags), pbl);
librados::ObjectReadOperation *o,
int flags, bufferlist *pbl, const blkin_trace_info *trace_info)
{
+ if (unlikely(!o->impl))
+ return -EINVAL;
object_t obj(oid);
return io_ctx_impl->aio_operate_read(obj, &o->impl->o, c->pc,
translate_flags(flags), pbl, trace_info);
rados_callback_t cb = completion->callback_complete;
void *cb_arg = completion->callback_complete_arg;
cb(completion, cb_arg);
- completion->lock.Lock();
+ completion->lock.lock();
completion->callback_complete = NULL;
- completion->cond.Signal();
+ completion->cond.notify_all();
completion->put_unlock();
}
};
void librados::IoCtx::set_osdmap_full_try()
{
- io_ctx_impl->objecter->set_osdmap_full_try();
+ io_ctx_impl->objecter->set_pool_full_try();
}
void librados::IoCtx::unset_osdmap_full_try()
{
- io_ctx_impl->objecter->unset_osdmap_full_try();
+ io_ctx_impl->objecter->unset_pool_full_try();
+}
+
+void librados::IoCtx::set_pool_full_try()
+{
+ io_ctx_impl->objecter->set_pool_full_try();
+}
+
+void librados::IoCtx::unset_pool_full_try()
+{
+ io_ctx_impl->objecter->unset_pool_full_try();
}
///////////////////////////// Rados //////////////////////////////
pool_stat_t& pv = result[p->first];
auto& pstat = p->second;
store_statfs_t &statfs = pstat.store_stats;
- uint64_t allocated_bytes = pstat.get_allocated_bytes(per_pool);
+ uint64_t allocated_bytes = pstat.get_allocated_data_bytes(per_pool) +
+ pstat.get_allocated_omap_bytes(per_pool);
// FIXME: raw_used_rate is unknown hence use 1.0 here
// meaning we keep net amount aggregated over all replicas
// Not a big deal so far since this field isn't exposed
- uint64_t user_bytes = pstat.get_user_bytes(1.0, per_pool);
+ uint64_t user_bytes = pstat.get_user_data_bytes(1.0, per_pool) +
+ pstat.get_user_omap_bytes(1.0, per_pool);
object_stat_sum_t *sum = &p->second.stats.sum;
pv.num_kb = shift_round_up(allocated_bytes, 10);
return new AioCompletion(c);
}
-librados::ObjectOperation::ObjectOperation()
+librados::AioCompletion *librados::Rados::aio_create_completion(void *cb_arg,
+ callback_t cb_complete)
{
- impl = new ObjectOperationImpl;
+ AioCompletionImpl *c;
+ int r = rados_aio_create_completion2(cb_arg, cb_complete, (void**)&c);
+ ceph_assert(r == 0);
+ return new AioCompletion(c);
}
-librados::ObjectOperation::~ObjectOperation()
-{
+librados::ObjectOperation::ObjectOperation() : impl(new ObjectOperationImpl) {}
+
+librados::ObjectOperation::ObjectOperation(ObjectOperation&& rhs)
+ : impl(rhs.impl) {
+ rhs.impl = nullptr;
+}
+
+librados::ObjectOperation&
+librados::ObjectOperation::operator =(ObjectOperation&& rhs) {
+ delete impl;
+ impl = rhs.impl;
+ rhs.impl = nullptr;
+ return *this;
+}
+
+librados::ObjectOperation::~ObjectOperation() {
delete impl;
}