RWLock::Context lc(rwlock, RWLock::Context::TakenForWrite);
vector<OSDOp> opv;
- Context *onack = NULL;
Context *oncommit = NULL;
+ info->watch_lock.get_read(); // just to read registered status
if (info->registered && info->is_watch) {
ldout(cct, 15) << "send_linger " << info->linger_id << " reconnect" << dendl;
opv.push_back(OSDOp());
} else {
ldout(cct, 15) << "send_linger " << info->linger_id << " register" << dendl;
opv = info->ops;
- if (info->on_reg_ack)
- onack = new C_Linger_Register(this, info);
oncommit = new C_Linger_Commit(this, info);
}
+ info->watch_lock.put_read();
Op *o = new Op(info->target.base_oid, info->target.base_oloc,
opv, info->target.flags | CEPH_OSD_FLAG_READ,
- onack, oncommit,
+ NULL, NULL,
info->pobjver);
+ o->oncommit_sync = oncommit;
o->snapid = info->snap;
o->snapc = info->snapc;
o->mtime = info->mtime;
logger->inc(l_osdc_linger_send);
}
- void Objecter::_linger_register(LingerOp *info, int r)
- {
- ldout(cct, 10) << "_linger_register " << info->linger_id << dendl;
- if (info->on_reg_ack) {
- info->on_reg_ack->complete(r);
- info->on_reg_ack = NULL;
- }
- }
-
void Objecter::_linger_commit(LingerOp *info, int r)
{
+ RWLock::WLocker wl(info->watch_lock);
ldout(cct, 10) << "_linger_commit " << info->linger_id << dendl;
if (info->on_reg_commit) {
info->on_reg_commit->complete(r);