diff --git a/src/include/ceph_strings.cc b/src/include/ceph_strings.cc index cc03e3f43b2..e94a8daeaf8 100644 --- a/src/include/ceph_strings.cc +++ b/src/include/ceph_strings.cc @@ -79,6 +79,14 @@ const char *ceph_osd_op_name(int op) case CEPH_OSD_OP_PGLS: return "pgls"; case CEPH_OSD_OP_PGLS_FILTER: return "pgls-filter"; + case CEPH_OSD_OP_OMAPGETKEYS: return "omap-get-keys"; + case CEPH_OSD_OP_OMAPGETVALS: return "omap-get-vals"; + case CEPH_OSD_OP_OMAPGETHEADER: return "omap-get-header"; + case CEPH_OSD_OP_OMAPGETVALSBYKEY: return "omap-get-vals-by-key"; + case CEPH_OSD_OP_OMAPSETVALS: return "omap-set-vals"; + case CEPH_OSD_OP_OMAPSETHEADER: return "omap-set-header"; + case CEPH_OSD_OP_OMAPCLEAR: return "omap-clear"; + case CEPH_OSD_OP_OMAPRMKEYS: return "omap-rm-keys"; } return "???"; } diff --git a/src/include/rados.h b/src/include/rados.h index f6f0b2190bd..b95ac754595 100644 --- a/src/include/rados.h +++ b/src/include/rados.h @@ -197,6 +197,17 @@ enum { CEPH_OSD_OP_WATCH = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_DATA | 15, + /* omap */ + CEPH_OSD_OP_OMAPGETKEYS = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_DATA | 17, + CEPH_OSD_OP_OMAPGETVALS = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_DATA | 18, + CEPH_OSD_OP_OMAPGETHEADER = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_DATA | 19, + CEPH_OSD_OP_OMAPGETVALSBYKEY = + CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_DATA | 20, + CEPH_OSD_OP_OMAPSETVALS = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_DATA | 21, + CEPH_OSD_OP_OMAPSETHEADER = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_DATA | 22, + CEPH_OSD_OP_OMAPCLEAR = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_DATA | 23, + CEPH_OSD_OP_OMAPRMKEYS = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_DATA | 24, + /** multi **/ CEPH_OSD_OP_CLONERANGE = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_MULTI | 1, CEPH_OSD_OP_ASSERT_SRC_VERSION = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_MULTI | 2, @@ -290,7 +301,6 @@ static inline int ceph_osd_op_mode_modify(int op) extern const char *ceph_osd_op_name(int op); - /* * osd op flags * diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc index 618b14a1538..18c42e78527 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -2402,7 +2402,33 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector& ops) } break; + // OMAP Read ops + case CEPH_OSD_OP_OMAPGETKEYS: + { + } + case CEPH_OSD_OP_OMAPGETVALS: + { + } + case CEPH_OSD_OP_OMAPGETHEADER: + { + } + case CEPH_OSD_OP_OMAPGETVALSBYKEY: + { + } + // OMAP Write ops + case CEPH_OSD_OP_OMAPSETVALS: + { + } + case CEPH_OSD_OP_OMAPSETHEADER: + { + } + case CEPH_OSD_OP_OMAPCLEAR: + { + } + case CEPH_OSD_OP_OMAPRMKEYS: + { + } default: dout(1) << "unrecognized osd op " << op.op << " " << ceph_osd_op_name(op.op) diff --git a/src/osdc/Objecter.h b/src/osdc/Objecter.h index 023bb1472e1..2b3b8a32376 100644 --- a/src/osdc/Objecter.h +++ b/src/osdc/Objecter.h @@ -267,11 +267,31 @@ struct ObjectOperation { out_bl[p] = pbl; out_rval[p] = prval; } - struct C_ObjectOperation_getxattrs : public Context { + struct C_ObjectOperation_decodevals : public Context { bufferlist bl; std::map *pattrs; int *prval; - C_ObjectOperation_getxattrs(std::map *pa, int *pr) + C_ObjectOperation_decodevals(std::map *pa, int *pr) + : pattrs(pa), prval(pr) {} + void finish(int r) { + if (r >= 0) { + bufferlist::iterator p = bl.begin(); + try { + if (pattrs) + ::decode(*pattrs, p); + } + catch (buffer::error& e) { + if (prval) + *prval = -EIO; + } + } + } + }; + struct C_ObjectOperation_decodekeys : public Context { + bufferlist bl; + std::set *pattrs; + int *prval; + C_ObjectOperation_decodekeys(std::set *pa, int *pr) : pattrs(pa), prval(pr) {} void finish(int r) { if (r >= 0) { @@ -291,7 +311,7 @@ struct ObjectOperation { add_op(CEPH_OSD_OP_GETXATTRS); if (pattrs || prval) { unsigned p = ops.size() - 1; - C_ObjectOperation_getxattrs *h = new C_ObjectOperation_getxattrs(pattrs, prval); + C_ObjectOperation_decodevals *h = new C_ObjectOperation_decodevals(pattrs, prval); out_handler[p] = h; out_bl[p] = &h->bl; out_rval[p] = prval; @@ -340,6 +360,95 @@ struct ObjectOperation { add_op(CEPH_OSD_OP_TMAPGET); } + // objectmap + void omap_get_keys(const string &start_after, + uint64_t max_to_get, + std::set *out_set, + int *prval) { + OSDOp &op = add_op(CEPH_OSD_OP_OMAPGETKEYS); + bufferlist bl; + ::encode(start_after, bl); + ::encode(max_to_get, bl); + op.op.extent.offset = 0; + op.op.extent.length = bl.length(); + op.indata.claim_append(bl); + if (prval || out_set) { + unsigned p = ops.size() - 1; + C_ObjectOperation_decodekeys *h = + new C_ObjectOperation_decodekeys(out_set, prval); + out_handler[p] = h; + out_bl[p] = &h->bl; + out_rval[p] = prval; + } + } + + void omap_get_vals(const string &start_after, + uint64_t max_to_get, + std::map *out_set, + int *prval) { + OSDOp &op = add_op(CEPH_OSD_OP_OMAPGETVALS); + bufferlist bl; + ::encode(start_after, bl); + ::encode(max_to_get, bl); + op.op.extent.offset = 0; + op.op.extent.length = bl.length(); + op.indata.claim_append(bl); + if (prval || out_set) { + unsigned p = ops.size() - 1; + C_ObjectOperation_decodevals *h = + new C_ObjectOperation_decodevals(out_set, prval); + out_handler[p] = h; + out_bl[p] = &h->bl; + out_rval[p] = prval; + } + } + + void omap_get_vals_by_key(const std::set &to_get, + std::map *out_set, + int *prval) { + OSDOp &op = add_op(CEPH_OSD_OP_OMAPGETVALSBYKEY); + bufferlist bl; + ::encode(to_get, bl); + op.op.extent.offset = 0; + op.op.extent.length = bl.length(); + op.indata.claim_append(bl); + if (prval || out_set) { + unsigned p = ops.size() - 1; + C_ObjectOperation_decodevals *h = + new C_ObjectOperation_decodevals(out_set, prval); + out_handler[p] = h; + out_bl[p] = &h->bl; + out_rval[p] = prval; + } + } + + void omap_get_header(bufferlist *bl, int *prval) { + add_op(CEPH_OSD_OP_OMAPGETHEADER); + unsigned p = ops.size() - 1; + out_bl[p] = bl; + out_rval[p] = prval; + } + + void omap_set(const map &map) { + bufferlist bl; + ::encode(map, bl); + add_data(CEPH_OSD_OP_OMAPSETVALS, 0, bl.length(), bl); + } + + void omap_set_header(bufferlist &bl) { + add_data(CEPH_OSD_OP_OMAPSETHEADER, 0, bl.length(), bl); + } + + void omap_clear() { + add_op(CEPH_OSD_OP_OMAPCLEAR); + } + + void omap_rm_keys(const std::set &to_remove) { + bufferlist bl; + ::encode(to_remove, bl); + add_data(CEPH_OSD_OP_OMAPRMKEYS, 0, bl.length(), bl); + } + // object classes void call(const char *cname, const char *method, bufferlist &indata) { add_call(CEPH_OSD_OP_CALL, cname, method, indata);