From: Sage Weil Date: Tue, 16 Dec 2008 21:14:30 +0000 (-0800) Subject: osd: take osd_lock in generate_backlog before peer() X-Git-Tag: v0.6~49 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=6d28c8623f8fdd038cd51750ba90567f817afbc6;p=ceph.git osd: take osd_lock in generate_backlog before peer() Peer() uses the osd.timer to schedule the replay interval, which needs osd_lock. --- diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index a3bea8650f50..523c94bfe21c 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -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();