int *prval)
{
::ObjectOperation *o = &impl->o;
- o->omap_get_vals(start_after, filter_prefix, max_return, out_vals, prval);
+ o->omap_get_vals(start_after, filter_prefix, max_return, out_vals, nullptr,
+ prval);
}
void librados::ObjectReadOperation::omap_get_vals(
int *prval)
{
::ObjectOperation *o = &impl->o;
- o->omap_get_vals(start_after, "", max_return, out_vals, prval);
+ o->omap_get_vals(start_after, "", max_return, out_vals, nullptr, prval);
}
void librados::ObjectReadOperation::omap_get_keys(
int *prval)
{
::ObjectOperation *o = &impl->o;
- o->omap_get_keys(start_after, max_return, out_keys, prval);
+ o->omap_get_keys(start_after, max_return, out_keys, nullptr, prval);
}
void librados::ObjectReadOperation::omap_get_header(bufferlist *bl, int *prval)
RadosOmapIter *omap_iter = new RadosOmapIter;
const char *start = start_after ? start_after : "";
const char *filter = filter_prefix ? filter_prefix : "";
- ((::ObjectOperation *)read_op)->omap_get_vals(start,
- filter,
- max_return,
- &omap_iter->values,
- prval);
+ ((::ObjectOperation *)read_op)->omap_get_vals(
+ start,
+ filter,
+ max_return,
+ &omap_iter->values,
+ nullptr,
+ prval);
((::ObjectOperation *)read_op)->add_handler(new C_OmapIter(omap_iter));
*iter = omap_iter;
tracepoint(librados, rados_read_op_omap_get_vals_exit, *iter);
tracepoint(librados, rados_read_op_omap_get_keys_enter, read_op, start_after, max_return, prval);
RadosOmapIter *omap_iter = new RadosOmapIter;
C_OmapKeysIter *ctx = new C_OmapKeysIter(omap_iter);
- ((::ObjectOperation *)read_op)->omap_get_keys(start_after ? start_after : "",
- max_return, &ctx->keys, prval);
+ ((::ObjectOperation *)read_op)->omap_get_keys(
+ start_after ? start_after : "",
+ max_return, &ctx->keys, nullptr, prval);
((::ObjectOperation *)read_op)->add_handler(ctx);
*iter = omap_iter;
tracepoint(librados, rados_read_op_omap_get_keys_exit, *iter);
rd.omap_get_header(&fin->hdrbl, &fin->ret1);
if (keys.empty()) {
assert(!c);
- rd.omap_get_vals("", "", (uint64_t)-1, &fin->omap, &fin->ret2);
+#warning use the pmore arg
+ rd.omap_get_vals("", "", (uint64_t)-1, &fin->omap, nullptr, &fin->ret2);
} else {
assert(c);
std::set<std::string> str_keys;
object_locator_t oloc(mds->mdsmap->get_metadata_pool());
C_IO_SM_Load *c = new C_IO_SM_Load(this, false);
ObjectOperation op;
+#warning fixme use the pmore arg
op.omap_get_vals(last_key, "", g_conf->mds_sessionmap_keys_per_op,
- &c->session_vals, &c->values_r);
+ &c->session_vals, nullptr, &c->values_r);
mds->objecter->read(oid, oloc, op, CEPH_NOSNAP, NULL, 0,
new C_OnFinisher(c, mds->finisher));
} else {
ObjectOperation op;
op.omap_get_header(&c->header_bl, &c->header_r);
+#warning use the pmore arg
op.omap_get_vals("", "", g_conf->mds_sessionmap_keys_per_op,
- &c->session_vals, &c->values_r);
+ &c->session_vals, nullptr, &c->values_r);
mds->objecter->read(oid, oloc, op, CEPH_NOSNAP, NULL, 0, new C_OnFinisher(c, mds->finisher));
}
struct C_ObjectOperation_decodevals : public Context {
bufferlist bl;
std::map<std::string,bufferlist> *pattrs;
+ bool *ptruncated;
int *prval;
- C_ObjectOperation_decodevals(std::map<std::string,bufferlist> *pa, int *pr)
- : pattrs(pa), prval(pr) {}
+ C_ObjectOperation_decodevals(std::map<std::string,bufferlist> *pa,
+ bool *pt, int *pr)
+ : pattrs(pa), ptruncated(pt), prval(pr) {
+ if (ptruncated) {
+ *ptruncated = false;
+ }
+ }
void finish(int r) {
if (r >= 0) {
bufferlist::iterator p = bl.begin();
try {
if (pattrs)
::decode(*pattrs, p);
+ if (ptruncated) {
+ if (!pattrs) {
+ std::map<std::string,bufferlist> ignore;
+ ::decode(ignore, p);
+ }
+ if (!p.end()) {
+ ::decode(*ptruncated, p);
+ }
+ }
}
catch (buffer::error& e) {
if (prval)
struct C_ObjectOperation_decodekeys : public Context {
bufferlist bl;
std::set<std::string> *pattrs;
+ bool *ptruncated;
int *prval;
- C_ObjectOperation_decodekeys(std::set<std::string> *pa, int *pr)
- : pattrs(pa), prval(pr) {}
+ C_ObjectOperation_decodekeys(std::set<std::string> *pa, bool *pt,
+ int *pr)
+ : pattrs(pa), ptruncated(pt), prval(pr) {
+ if (ptruncated) {
+ *ptruncated = false;
+ }
+ }
void finish(int r) {
if (r >= 0) {
bufferlist::iterator p = bl.begin();
try {
if (pattrs)
::decode(*pattrs, p);
+ if (ptruncated) {
+ if (!pattrs) {
+ std::set<std::string> ignore;
+ ::decode(ignore, p);
+ }
+ if (!p.end()) {
+ ::decode(*ptruncated, p);
+ }
+ }
}
catch (buffer::error& e) {
if (prval)
if (pattrs || prval) {
unsigned p = ops.size() - 1;
C_ObjectOperation_decodevals *h
- = new C_ObjectOperation_decodevals(pattrs, prval);
+ = new C_ObjectOperation_decodevals(pattrs, nullptr, prval);
out_handler[p] = h;
out_bl[p] = &h->bl;
out_rval[p] = prval;
void omap_get_keys(const string &start_after,
uint64_t max_to_get,
std::set<std::string> *out_set,
+ bool *ptruncated,
int *prval) {
OSDOp &op = add_op(CEPH_OSD_OP_OMAPGETKEYS);
bufferlist bl;
op.op.extent.offset = 0;
op.op.extent.length = bl.length();
op.indata.claim_append(bl);
- if (prval || out_set) {
+ if (prval || ptruncated || out_set) {
unsigned p = ops.size() - 1;
C_ObjectOperation_decodekeys *h =
- new C_ObjectOperation_decodekeys(out_set, prval);
+ new C_ObjectOperation_decodekeys(out_set, ptruncated, prval);
out_handler[p] = h;
out_bl[p] = &h->bl;
out_rval[p] = prval;
const string &filter_prefix,
uint64_t max_to_get,
std::map<std::string, bufferlist> *out_set,
+ bool *ptruncated,
int *prval) {
OSDOp &op = add_op(CEPH_OSD_OP_OMAPGETVALS);
bufferlist bl;
op.op.extent.offset = 0;
op.op.extent.length = bl.length();
op.indata.claim_append(bl);
- if (prval || out_set) {
+ if (prval || out_set || ptruncated) {
unsigned p = ops.size() - 1;
C_ObjectOperation_decodevals *h =
- new C_ObjectOperation_decodevals(out_set, prval);
+ new C_ObjectOperation_decodevals(out_set, ptruncated, prval);
out_handler[p] = h;
out_bl[p] = &h->bl;
out_rval[p] = prval;
if (prval || out_set) {
unsigned p = ops.size() - 1;
C_ObjectOperation_decodevals *h =
- new C_ObjectOperation_decodevals(out_set, prval);
+ new C_ObjectOperation_decodevals(out_set, nullptr, prval);
out_handler[p] = h;
out_bl[p] = &h->bl;
out_rval[p] = prval;