From 66ea9c1f66ae31035e62bd4335b08948b1e8e5e2 Mon Sep 17 00:00:00 2001 From: Greg Farnum Date: Thu, 25 May 2017 22:14:38 -0700 Subject: [PATCH] osd: shutdown our reserver_finisher earlier in the process This finisher thread has a lot of callbacks which can hold PGRefs. Make sure we drain them out before checking that all the PGs have finished and have no outstanding references. Moving this should be safe; we've already stopped the op thread et al and the only things still running are the OSDService's objecter_finisher, recovery_request_timer, and snap_sleep_timer (which has definitely been emptied by the time we get here as it's synchronously cleared out on PG shutdown). Signed-off-by: Greg Farnum --- src/osd/OSD.cc | 8 +++++++- src/osd/OSD.h | 1 + 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index 0c88a8714f4..40a7c685875 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -515,10 +515,14 @@ void OSDService::start_shutdown() } } -void OSDService::shutdown() +void OSDService::shutdown_reserver() { reserver_finisher.wait_for_empty(); reserver_finisher.stop(); +} + +void OSDService::shutdown() +{ { Mutex::Locker l(watch_lock); watch_timer.shutdown(); @@ -3210,6 +3214,8 @@ int OSD::shutdown() assert(pg_stat_queue.empty()); } + service.shutdown_reserver(); + // Remove PGs #ifdef PG_DEBUG_REFS service.dump_live_pgids(); diff --git a/src/osd/OSD.h b/src/osd/OSD.h index 0b6cedd09f1..6a8bcb5b9de 100644 --- a/src/osd/OSD.h +++ b/src/osd/OSD.h @@ -1100,6 +1100,7 @@ public: void init(); void final_init(); void start_shutdown(); + void shutdown_reserver(); void shutdown(); private: -- 2.47.3