From 8143fffb30ceb32e944826060b6620c6695b676f Mon Sep 17 00:00:00 2001 From: Haomai Wang Date: Sat, 2 Jul 2016 14:04:23 +0800 Subject: [PATCH] msg/async: dont delete time event when exchange eventcenter When replacing and someone called mark_down, it will delete_time_event which isn't allowed. Because we're exchaning EventCenter now! Signed-off-by: Haomai Wang --- src/msg/async/AsyncConnection.cc | 7 +++++-- src/msg/async/AsyncConnection.h | 5 ++++- src/msg/async/Event.cc | 2 +- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/msg/async/AsyncConnection.cc b/src/msg/async/AsyncConnection.cc index f2eb152e988eb..f5147dfa4868e 100644 --- a/src/msg/async/AsyncConnection.cc +++ b/src/msg/async/AsyncConnection.cc @@ -1321,7 +1321,8 @@ ssize_t AsyncConnection::_process_connection() async_msgr->ms_deliver_handle_fast_connect(this); // make sure no pending tick timer - center->delete_time_event(last_tick_id); + if (last_tick_id) + center->delete_time_event(last_tick_id); last_tick_id = center->create_time_event(inactive_timeout_us, tick_handler); // message may in queue between last _try_send and connection ready @@ -1496,7 +1497,8 @@ ssize_t AsyncConnection::_process_connection() if (delay_state) assert(delay_state->ready()); // make sure no pending tick timer - center->delete_time_event(last_tick_id); + if (last_tick_id) + center->delete_time_event(last_tick_id); last_tick_id = center->create_time_event(inactive_timeout_us, tick_handler); write_lock.Lock(); @@ -2654,6 +2656,7 @@ void AsyncConnection::tick(uint64_t id) << " last_active" << last_active << dendl; assert(last_tick_id == id); Mutex::Locker l(lock); + last_tick_id = 0; auto idle_period = std::chrono::duration_cast(now - last_active).count(); if (inactive_timeout_us < (uint64_t)idle_period) { ldout(async_msgr->cct, 1) << __func__ << " idle(" << idle_period << ") more than " diff --git a/src/msg/async/AsyncConnection.h b/src/msg/async/AsyncConnection.h index de81e6c5fcb9d..29854e4114495 100644 --- a/src/msg/async/AsyncConnection.h +++ b/src/msg/async/AsyncConnection.h @@ -107,7 +107,10 @@ class AsyncConnection : public Connection { for (auto &&t : register_time_events) center->delete_time_event(t); register_time_events.clear(); - center->delete_time_event(last_tick_id); + if (last_tick_id) { + center->delete_time_event(last_tick_id); + last_tick_id = 0; + } if (sd >= 0) { center->delete_file_event(sd, EVENT_READABLE|EVENT_WRITABLE); ::shutdown(sd, SHUT_RDWR); diff --git a/src/msg/async/Event.cc b/src/msg/async/Event.cc index 3bbe76eac900d..1388ee9bd5a1b 100644 --- a/src/msg/async/Event.cc +++ b/src/msg/async/Event.cc @@ -245,7 +245,7 @@ void EventCenter::delete_time_event(uint64_t id) { assert(in_thread()); ldout(cct, 10) << __func__ << " id=" << id << dendl; - if (id >= time_event_next_id) + if (id >= time_event_next_id || id == 0) return ; auto it = event_map.find(id); -- 2.39.5