]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
Merge pull request #3663 from ceph/wip-10765
authorSage Weil <sage@redhat.com>
Thu, 19 Feb 2015 19:02:26 +0000 (11:02 -0800)
committerSage Weil <sage@redhat.com>
Thu, 19 Feb 2015 19:02:26 +0000 (11:02 -0800)
librados: close watch/notify race

Reviewed-by: Josh Durgin <jdurgin@redhat.com>
1  2 
src/osdc/Objecter.cc
src/osdc/Objecter.h
src/tools/rados/rados.cc

index af90732f72714fbc484db81f1a09f17e064dbafe,e11dcf68da55a86094aa43170938aace4a075e49..d9e57ecd2dcc3d2a76ba85598e942690fbc1ef76
@@@ -417,9 -417,7 +417,8 @@@ void Objecter::_send_linger(LingerOp *i
    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);
Simple merge
Simple merge