diff options
Diffstat (limited to 'src/osdc/Objecter.h')
-rw-r--r-- | src/osdc/Objecter.h | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/src/osdc/Objecter.h b/src/osdc/Objecter.h index b24349499a1..40331f2afb4 100644 --- a/src/osdc/Objecter.h +++ b/src/osdc/Objecter.h @@ -676,6 +676,85 @@ struct ObjectOperation { out_handler[p] = h; } + struct C_ObjectOperation_hit_set_ls : public Context { + bufferlist bl; + std::list< std::pair<time_t, time_t> > *ptls; + std::list< std::pair<utime_t, utime_t> > *putls; + int *prval; + C_ObjectOperation_hit_set_ls(std::list< std::pair<time_t, time_t> > *t, + std::list< std::pair<utime_t, utime_t> > *ut, + int *r) + : ptls(t), putls(ut), prval(r) {} + void finish(int r) { + if (r < 0) + return; + try { + bufferlist::iterator p = bl.begin(); + std::list< std::pair<utime_t, utime_t> > ls; + ::decode(ls, p); + if (ptls) { + ptls->clear(); + for (list< pair<utime_t,utime_t> >::iterator p = ls.begin(); p != ls.end(); ++p) + // round initial timestamp up to the next full second to keep this a valid interval. + ptls->push_back(make_pair(p->first.usec() ? p->first.sec() + 1 : p->first.sec(), p->second.sec())); + } + if (putls) + putls->swap(ls); + } catch (buffer::error& e) { + r = -EIO; + } + if (prval) + *prval = r; + } + }; + + /** + * list available HitSets. + * + * We will get back a list of time intervals. Note that the most recent range may have + * an empty end timestamp if it is still accumulating. + * + * @param pls [out] list of time intervals + * @param prval [out] return value + */ + void hit_set_ls(std::list< std::pair<time_t, time_t> > *pls, int *prval) { + add_op(CEPH_OSD_OP_PG_HITSET_LS); + unsigned p = ops.size() - 1; + out_rval[p] = prval; + C_ObjectOperation_hit_set_ls *h = + new C_ObjectOperation_hit_set_ls(pls, NULL, prval); + out_bl[p] = &h->bl; + out_handler[p] = h; + } + void hit_set_ls(std::list< std::pair<utime_t, utime_t> > *pls, int *prval) { + add_op(CEPH_OSD_OP_PG_HITSET_LS); + unsigned p = ops.size() - 1; + out_rval[p] = prval; + C_ObjectOperation_hit_set_ls *h = + new C_ObjectOperation_hit_set_ls(NULL, pls, prval); + out_bl[p] = &h->bl; + out_handler[p] = h; + } + + /** + * get HitSet + * + * Return an encoded HitSet that includes the provided time + * interval. + * + * @param stamp [in] timestamp + * @param pbl [out] target buffer for encoded HitSet + * @param prval [out] return value + */ + void hit_set_get(utime_t stamp, bufferlist *pbl, int *prval) { + OSDOp& op = add_op(CEPH_OSD_OP_PG_HITSET_GET); + op.op.hit_set_get.stamp.tv_sec = stamp.sec(); + op.op.hit_set_get.stamp.tv_nsec = stamp.nsec(); + unsigned p = ops.size() - 1; + out_rval[p] = prval; + out_bl[p] = pbl; + } + void omap_get_header(bufferlist *bl, int *prval) { add_op(CEPH_OSD_OP_OMAPGETHEADER); unsigned p = ops.size() - 1; |