From bb125221be448bcbd4f0bc04bf3c96bb6d5ee558 Mon Sep 17 00:00:00 2001 From: Samuel Just Date: Wed, 20 Mar 2013 11:49:29 -0700 Subject: [PATCH] OSD: clear OpHistory on shutdown Signed-off-by: Samuel Just --- src/osd/OSD.cc | 1 + src/osd/OpRequest.cc | 12 ++++++++++-- src/osd/OpRequest.h | 14 ++++++++++++++ 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index 0bbc840ca4ab3..0163429afb617 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -1294,6 +1294,7 @@ int OSD::shutdown() osdmap = OSDMapRef(); service.shutdown(); + op_tracker.on_shutdown(); client_messenger->shutdown(); cluster_messenger->shutdown(); diff --git a/src/osd/OpRequest.cc b/src/osd/OpRequest.cc index 2b44f16abebc3..d5ce8bbc74953 100644 --- a/src/osd/OpRequest.cc +++ b/src/osd/OpRequest.cc @@ -20,8 +20,16 @@ static ostream& _prefix(std::ostream* _dout) return *_dout << "--OSD::tracker-- "; } -void OpHistory::insert(utime_t now, OpRequest *op) +void OpHistory::on_shutdown() { + arrived.clear(); + duration.clear(); + shutdown = true; +} + +void OpHistory::insert(utime_t now, OpRequestRef op) +{ + assert(!shutdown); duration.insert(make_pair(op->get_duration(), op)); arrived.insert(make_pair(op->get_arrived(), op)); cleanup(now); @@ -108,7 +116,7 @@ void OpTracker::unregister_inflight_op(OpRequest *i) utime_t now = ceph_clock_now(g_ceph_context); i->xitem.remove_myself(); i->request->clear_data(); - history.insert(now, i); + history.insert(now, OpRequestRef(i)); } bool OpTracker::check_ops_in_flight(std::vector &warning_vector) diff --git a/src/osd/OpRequest.h b/src/osd/OpRequest.h index 65f4cc471ea00..ca419f34ff88c 100644 --- a/src/osd/OpRequest.h +++ b/src/osd/OpRequest.h @@ -31,10 +31,17 @@ class OpHistory { set > arrived; set > duration; void cleanup(utime_t now); + bool shutdown; public: + OpHistory() : shutdown(false) {} + ~OpHistory() { + assert(arrived.empty()); + assert(duration.empty()); + } void insert(utime_t now, OpRequestRef op); void dump_ops(utime_t now, Formatter *f); + void on_shutdown(); }; class OpTracker { @@ -69,6 +76,13 @@ public: void mark_event(OpRequest *op, const string &evt); void _mark_event(OpRequest *op, const string &evt, utime_t now); OpRequestRef create_request(Message *req); + void on_shutdown() { + Mutex::Locker l(ops_in_flight_lock); + history.on_shutdown(); + } + ~OpTracker() { + assert(ops_in_flight.empty()); + } }; /** -- 2.39.5