diff options
author | Amitay Isaacs <amitay@gmail.com> | 2015-07-27 16:51:08 +1000 |
---|---|---|
committer | Stefan Metzmacher <metze@samba.org> | 2015-08-17 18:09:40 +0200 |
commit | 3c7f3e7b989b1bae03c2f6de18b6359f2f6e313e (patch) | |
tree | e8a15c8c1a78d435c655b6ffd2da28cee057ef8c | |
parent | b37340bc50538b027a4c2804e2b1de574ef03856 (diff) | |
download | samba-3c7f3e7b989b1bae03c2f6de18b6359f2f6e313e.tar.gz |
ctdb-banning: If node is already banned, do not run ctdb_local_node_got_banned()
This calls release_all_ips() only once on the first ban. If the node gets
banned again due to event script timeout while running release_all_ips(),
then avoid calling release_all_ips() in re-entrant fashion.
BUG: https://bugzilla.samba.org/show_bug.cgi?id=11432
Signed-off-by: Amitay Isaacs <amitay@gmail.com>
Reviewed-by: Martin Schwenke <martin@meltin.net>
(cherry picked from commit 8eb04d09b119e234c88150e1dc35fc5057f9c926)
-rw-r--r-- | ctdb/server/ctdb_banning.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/ctdb/server/ctdb_banning.c b/ctdb/server/ctdb_banning.c index a9d18910a06..d8f7ab1b6ff 100644 --- a/ctdb/server/ctdb_banning.c +++ b/ctdb/server/ctdb_banning.c @@ -80,6 +80,7 @@ void ctdb_local_node_got_banned(struct ctdb_context *ctdb) int32_t ctdb_control_set_ban_state(struct ctdb_context *ctdb, TDB_DATA indata) { struct ctdb_ban_time *bantime = (struct ctdb_ban_time *)indata.dptr; + bool already_banned; DEBUG(DEBUG_INFO,("SET BAN STATE\n")); @@ -107,9 +108,11 @@ int32_t ctdb_control_set_ban_state(struct ctdb_context *ctdb, TDB_DATA indata) return 0; } + already_banned = false; if (ctdb->banning_ctx != NULL) { talloc_free(ctdb->banning_ctx); ctdb->banning_ctx = NULL; + already_banned = true; } if (bantime->time == 0) { @@ -136,7 +139,9 @@ int32_t ctdb_control_set_ban_state(struct ctdb_context *ctdb, TDB_DATA indata) event_add_timed(ctdb->ev, ctdb->banning_ctx, timeval_current_ofs(bantime->time,0), ctdb_ban_node_event, ctdb); - ctdb_local_node_got_banned(ctdb); + if (!already_banned) { + ctdb_local_node_got_banned(ctdb); + } return 0; } |