From: Haomai Wang Date: Wed, 20 Apr 2016 18:23:20 +0000 (-0400) Subject: Event: fix delete_time_event while in processing list X-Git-Tag: v10.2.3~136^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=578ac8aacfdd0ecfecb3ae3ebeb8a0b3ff53b67d;p=ceph.git Event: fix delete_time_event while in processing list Signed-off-by: Haomai Wang (cherry picked from commit 1ddeede83200566666fce80867eb7cb5a61a4f62) --- diff --git a/src/msg/async/Event.cc b/src/msg/async/Event.cc index 469ba4b0d90c..41157e4c3ad1 100644 --- a/src/msg/async/Event.cc +++ b/src/msg/async/Event.cc @@ -279,7 +279,7 @@ int EventCenter::process_time_events() clock_type::time_point now = clock_type::now(); ldout(cct, 10) << __func__ << " cur time is " << now << dendl; - time_lock.Lock(); + Mutex::Locker l(time_lock); /* If the system clock is moved to the future, and then set back to the * right value, time events may be delayed in a random way. Often this * means that scheduled operations will not be performed soon enough. @@ -291,26 +291,26 @@ int EventCenter::process_time_events() bool clock_skewed = now < last_time; last_time = now; - map >::iterator prev; - list need_process; - for (auto it = time_events.begin(); it != time_events.end(); ) { - prev = it; + while (!time_events.empty()) { + auto it = time_events.begin(); if (now >= it->first || clock_skewed) { - need_process.splice(need_process.end(), it->second); - ++it; - time_events.erase(prev); + if (it->second.empty()) { + time_events.erase(it); + } else { + TimeEvent &e = it->second.front(); + EventCallbackRef cb = e.time_cb; + uint64_t id = e.id; + it->second.pop_front(); + ldout(cct, 10) << __func__ << " process time event: id=" << id << dendl; + processed++; + time_lock.Unlock(); + cb->do_request(id); + time_lock.Lock(); + } } else { break; } } - time_lock.Unlock(); - - for (list::iterator it = need_process.begin(); - it != need_process.end(); ++it) { - ldout(cct, 10) << __func__ << " process time event: id=" << it->id << dendl; - it->time_cb->do_request(it->id); - processed++; - } return processed; }