From 27f172f4c7d1afafeda8c9ec1d530f5e02ea1b7a Mon Sep 17 00:00:00 2001 From: Colin Patrick McCabe Date: Tue, 11 Jan 2011 10:15:02 -0800 Subject: [PATCH] osd: OSD::queue_pg_for_deletion: avoid double del Signed-off-by: Colin McCabe --- src/osd/OSD.cc | 7 +++++-- src/osd/PG.h | 4 ++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index fbc479d3d66bd..e512a0b229301 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -4492,9 +4492,12 @@ void OSD::handle_pg_remove(MOSDPGRemove *m) void OSD::queue_pg_for_deletion(PG *pg) { dout(10) << *pg << " removing." << dendl; + pg->assert_locked(); assert(pg->get_role() == -1); - pg->deleting = true; - remove_wq.queue(pg); + if (!pg->deleting) { + pg->deleting = true; + remove_wq.queue(pg); + } } void OSD::_remove_pg(PG *pg) diff --git a/src/osd/PG.h b/src/osd/PG.h index d6552b3478519..ebb2878daa6f9 100644 --- a/src/osd/PG.h +++ b/src/osd/PG.h @@ -635,6 +635,10 @@ public: //generic_dout(0) << this << " " << info.pgid << " unlock" << dendl; _lock.Unlock(); } + void assert_locked() { + //generic_dout(0) << this << " " << info.pgid << " unlock" << dendl; + assert(_lock.is_locked()); + } void wait() { assert(_lock.is_locked()); _cond.Wait(_lock); -- 2.39.5