From: Adam C. Emerson Date: Thu, 7 Jan 2016 19:15:34 +0000 (-0500) Subject: osdc: Fix race condition with tick_event and shutdown X-Git-Tag: v10.0.3~72^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=9179ce8ce04c8354d5da39f86b600ac1491c70f8;p=ceph.git osdc: Fix race condition with tick_event and shutdown - Clear the tick_event whether it was in the timer queue or not. - Make sure we don't schedule a new tick_event if someone calls shutdown while tick() is running - Get rid of some assertions that aren't relevant Fixes #14256 --- diff --git a/src/osdc/Objecter.cc b/src/osdc/Objecter.cc index d01dc9d9561..b12c1f49d82 100644 --- a/src/osdc/Objecter.cc +++ b/src/osdc/Objecter.cc @@ -454,8 +454,8 @@ void Objecter::shutdown() if (tick_event) { if (timer.cancel_event(tick_event)) { ldout(cct, 10) << " successfully canceled tick" << dendl; - tick_event = 0; } + tick_event = 0; } if (m_request_state_hook) { @@ -473,8 +473,6 @@ void Objecter::shutdown() // Let go of Objecter write lock so timer thread can shutdown rwlock.unlock(); - - assert(tick_event == 0); } void Objecter::_send_linger(LingerOp *info) @@ -1986,7 +1984,6 @@ void Objecter::tick() ldout(cct, 10) << "tick" << dendl; // we are only called by C_Tick - assert(tick_event); tick_event = 0; if (!initialized.read()) { @@ -2062,9 +2059,11 @@ void Objecter::tick() } } - // reschedule - tick_event = timer.reschedule_me(ceph::make_timespan( - cct->_conf->objecter_tick_interval)); + // Make sure we don't resechedule if we wake up after shutdown + if (initialized.read()) { + tick_event = timer.reschedule_me(ceph::make_timespan( + cct->_conf->objecter_tick_interval)); + } } void Objecter::resend_mon_ops() @@ -4795,7 +4794,6 @@ Objecter::~Objecter() assert(check_latest_map_ops.empty()); assert(check_latest_map_commands.empty()); - assert(!tick_event); assert(!m_request_state_hook); assert(!logger); }