prepare_assert_ops(&wr);
wr.watch(*cookie, ver, 1);
bufferlist bl;
- wc->linger_id = objecter->linger(
- oid, oloc, wr, snap_seq, bl, NULL,
- CEPH_OSD_FLAG_WRITE,
- NULL, onfinish, &objver);
+ wc->linger_id = objecter->linger_mutate(oid, oloc, wr,
+ snapc, ceph_clock_now(NULL), bl,
+ 0,
+ NULL, onfinish, &objver);
lock->Unlock();
mylock.Lock();
::encode(timeout, inbl);
::encode(bl, inbl);
rd.notify(cookie, ver, inbl);
- wc->linger_id = objecter->linger(oid, oloc, rd, snap_seq, inbl, NULL,
- 0, onack, NULL, &objver);
+ wc->linger_id = objecter->linger_read(oid, oloc, rd, snap_seq, inbl, NULL, 0,
+ onack, &objver);
lock->Unlock();
mylock.Lock();
onack, oncommit,
info->pobjver);
o->snapid = info->snap;
+ o->snapc = info->snapc;
+ o->mtime = info->mtime;
// do not resend this; we will send a new op to reregister
o->should_resend = false;
}
}
-tid_t Objecter::linger(const object_t& oid, const object_locator_t& oloc,
- ObjectOperation& op,
- snapid_t snap, bufferlist& inbl, bufferlist *poutbl, int flags,
- Context *onack, Context *onfinish,
- eversion_t *objver)
+tid_t Objecter::linger_mutate(const object_t& oid, const object_locator_t& oloc,
+ ObjectOperation& op,
+ const SnapContext& snapc, utime_t mtime,
+ bufferlist& inbl, int flags,
+ Context *onack, Context *oncommit,
+ eversion_t *objver)
+{
+ LingerOp *info = new LingerOp;
+ info->oid = oid;
+ info->oloc = oloc;
+ if (info->oloc.key == oid)
+ info->oloc.key.clear();
+ info->snapc = snapc;
+ info->mtime = mtime;
+ info->flags = flags | CEPH_OSD_FLAG_WRITE;
+ info->ops = op.ops;
+ info->inbl = inbl;
+ info->poutbl = NULL;
+ info->pobjver = objver;
+ info->on_reg_ack = onack;
+ info->on_reg_commit = oncommit;
+
+ info->linger_id = ++max_linger_id;
+ linger_ops[info->linger_id] = info;
+
+ logger->set(l_osdc_linger_active, linger_ops.size());
+
+ send_linger(info);
+
+ return info->linger_id;
+}
+
+tid_t Objecter::linger_read(const object_t& oid, const object_locator_t& oloc,
+ ObjectOperation& op,
+ snapid_t snap, bufferlist& inbl, bufferlist *poutbl, int flags,
+ Context *onfinish,
+ eversion_t *objver)
{
LingerOp *info = new LingerOp;
info->oid = oid;
info->inbl = inbl;
info->poutbl = poutbl;
info->pobjver = objver;
- info->on_reg_ack = onack;
info->on_reg_commit = onfinish;
info->linger_id = ++max_linger_id;
vector<int> acting;
snapid_t snap;
+ SnapContext snapc;
+ utime_t mtime;
+
int flags;
vector<OSDOp> ops;
bufferlist inbl;
o->out_rval.swap(op.out_rval);
return op_submit(o);
}
- tid_t linger(const object_t& oid, const object_locator_t& oloc,
- ObjectOperation& op,
- snapid_t snap, bufferlist& inbl, bufferlist *poutbl, int flags,
- Context *onack, Context *onfinish,
- eversion_t *objver);
+ tid_t linger_mutate(const object_t& oid, const object_locator_t& oloc,
+ ObjectOperation& op,
+ const SnapContext& snapc, utime_t mtime,
+ bufferlist& inbl, int flags,
+ Context *onack, Context *onfinish,
+ eversion_t *objver);
+ tid_t linger_read(const object_t& oid, const object_locator_t& oloc,
+ ObjectOperation& op,
+ snapid_t snap, bufferlist& inbl, bufferlist *poutbl, int flags,
+ Context *onack,
+ eversion_t *objver);
void unregister_linger(uint64_t linger_id);
/**