]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: take osd_lock in generate_backlog before peer()
authorSage Weil <sage@newdream.net>
Tue, 16 Dec 2008 21:14:30 +0000 (13:14 -0800)
committerSage Weil <sage@newdream.net>
Tue, 16 Dec 2008 21:18:23 +0000 (13:18 -0800)
Peer() uses the osd.timer to schedule the replay interval, which
needs osd_lock.

src/osd/OSD.cc

index a3bea8650f50e3f87f779a3b18180f825a4e07a7..523c94bfe21cf92ac7a0def1717f196100ef5a83 100644 (file)
@@ -3133,13 +3133,15 @@ void OSD::generate_backlog(PG *pg)
 
   pg->assemble_backlog(omap);
   
+  // take osd_lock, map_log (read)
   pg->unlock();
+  osd_lock.Lock();
   map_lock.get_read();
   pg->lock();
 
   if (!pg->generate_backlog_epoch) {
     dout(10) << *pg << " generate_backlog aborting" << dendl;
-    goto out;
+    goto out2;
   }
 
   if (!pg->is_primary()) {
@@ -3163,8 +3165,10 @@ void OSD::generate_backlog(PG *pg)
       pg->write_log(t);
     store->apply_transaction(t);
   }
-  
+
+ out2:
   map_lock.put_read();
+  osd_lock.Unlock();
 
  out:
   pg->unlock();