summaryrefslogtreecommitdiff
path: root/src/osdc/Objecter.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/osdc/Objecter.h')
-rw-r--r--src/osdc/Objecter.h79
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;