]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osdc/Objecter: make wait_for_osd_map() locking safe
authorSage Weil <sage@redhat.com>
Sun, 20 Jul 2014 20:36:47 +0000 (13:36 -0700)
committerJohn Spray <john.spray@redhat.com>
Mon, 25 Aug 2014 00:34:01 +0000 (01:34 +0100)
Signed-off-by: Sage Weil <sage@redhat.com>
src/osdc/Objecter.cc

index e938dd860997a6f6ae887931d0d21bfd76e36cac..170a2e25836843545d575a095f9e7da453a366a9 100644 (file)
@@ -1201,13 +1201,19 @@ void Objecter::close_session(OSDSession *s)
 
 void Objecter::wait_for_osd_map()
 {
-  if (osdmap->get_epoch()) return;
+  rwlock.get_write();
+  if (osdmap->get_epoch()) {
+    rwlock.put_write();
+    return;
+  }
+
   Mutex lock("");
   Cond cond;
   bool done;
   lock.Lock();
   C_SafeCond *context = new C_SafeCond(&lock, &cond, &done, NULL);
   waiting_for_map[0].push_back(pair<Context*, int>(context, 0));
+  rwlock.put_write();
   while (!done)
     cond.Wait(lock);
   lock.Unlock();