From: Sage Weil Date: Sun, 20 Jul 2014 20:36:47 +0000 (-0700) Subject: osdc/Objecter: make wait_for_osd_map() locking safe X-Git-Tag: v0.86~213^2~73 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=9f37f3daa8d250327b237226d26ef4d11f4498da;p=ceph.git osdc/Objecter: make wait_for_osd_map() locking safe Signed-off-by: Sage Weil --- diff --git a/src/osdc/Objecter.cc b/src/osdc/Objecter.cc index e938dd860997..170a2e258368 100644 --- a/src/osdc/Objecter.cc +++ b/src/osdc/Objecter.cc @@ -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, 0)); + rwlock.put_write(); while (!done) cond.Wait(lock); lock.Unlock();