osdc: Add omap operation stubs to Objecter::ObjectOperation

Signed-off-by: Samuel Just <samuel.just@dreamhost.com>
This commit is contained in:
Samuel Just 2012-03-01 12:33:33 -08:00
parent b85f7d7b13
commit d2bf68d1df
4 changed files with 157 additions and 4 deletions

View File

@ -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 "???";
}

View File

@ -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
*

View File

@ -2402,7 +2402,33 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& 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)

View File

@ -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<std::string,bufferlist> *pattrs;
int *prval;
C_ObjectOperation_getxattrs(std::map<std::string,bufferlist> *pa, int *pr)
C_ObjectOperation_decodevals(std::map<std::string,bufferlist> *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<std::string> *pattrs;
int *prval;
C_ObjectOperation_decodekeys(std::set<std::string> *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<std::string> *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<std::string, bufferlist> *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<std::string> &to_get,
std::map<std::string, bufferlist> *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<string, bufferlist> &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<std::string> &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);