From: Wei Jin Date: Sun, 6 Mar 2016 07:48:35 +0000 (+0800) Subject: Event: fix clock skew problem X-Git-Tag: v10.1.0~123^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=e9046700d9513c971faa524a7bdae39a803a040f;p=ceph.git Event: fix clock skew problem Default constructor of utime_t generates the same default time value, so after the loop, we only keep the last list from map 'time_events' into map 'change', thus it will lead to time event lost if swap them. Signed-off-by: Wei Jin --- diff --git a/src/msg/async/Event.cc b/src/msg/async/Event.cc index 54218e75372fe..f242fe735d7dd 100644 --- a/src/msg/async/Event.cc +++ b/src/msg/async/Event.cc @@ -303,13 +303,9 @@ int EventCenter::process_time_events() * events to be processed ASAP when this happens: the idea is that * processing events earlier is less dangerous than delaying them * indefinitely, and practice suggests it is. */ + bool clock_skewed = false; if (now < last_time) { - map > changed; - for (map >::iterator it = time_events.begin(); - it != time_events.end(); ++it) { - changed[utime_t()].swap(it->second); - } - time_events.swap(changed); + clock_skewed = true; } last_time = now; @@ -318,7 +314,7 @@ int EventCenter::process_time_events() for (map >::iterator it = time_events.begin(); it != time_events.end(); ) { prev = it; - if (cur >= it->first) { + if (cur >= it->first || clock_skewed) { need_process.splice(need_process.end(), it->second); ++it; time_events.erase(prev);