diff options
author | Stefan Metzmacher <metze@samba.org> | 2010-08-31 09:28:34 +0200 |
---|---|---|
committer | Ronnie Sahlberg <ronniesahlberg@gmail.com> | 2010-09-14 15:50:31 +1000 |
commit | 0b5bd411ca3c4ce9ff8f8e4224bc9b63319f0ffc (patch) | |
tree | e15f28df410c3ea64a8f25b6982c24825680eab6 /ctdb/server/ctdb_banning.c | |
parent | 5e4615049013e2565df72194b0557372441e5175 (diff) | |
download | samba-0b5bd411ca3c4ce9ff8f8e4224bc9b63319f0ffc.tar.gz samba-0b5bd411ca3c4ce9ff8f8e4224bc9b63319f0ffc.tar.xz samba-0b5bd411ca3c4ce9ff8f8e4224bc9b63319f0ffc.zip |
server/banning: also release all ips if we're banning ourself
metze
(This used to be ctdb commit c386f2c62f06f1c60047b7d4b1ec7a9eec11873c)
Diffstat (limited to 'ctdb/server/ctdb_banning.c')
-rw-r--r-- | ctdb/server/ctdb_banning.c | 30 |
1 files changed, 29 insertions, 1 deletions
diff --git a/ctdb/server/ctdb_banning.c b/ctdb/server/ctdb_banning.c index 3d5f2165d5c..56849072d72 100644 --- a/ctdb/server/ctdb_banning.c +++ b/ctdb/server/ctdb_banning.c @@ -42,6 +42,31 @@ ctdb_ban_node_event(struct event_context *ev, struct timed_event *te, } } +int32_t ctdb_local_node_got_banned(struct ctdb_context *ctdb) +{ + uint32_t i; + + /* make sure we are frozen */ + DEBUG(DEBUG_NOTICE,("This node has been banned - forcing freeze and recovery\n")); + + /* Reset the generation id to 1 to make us ignore any + REQ/REPLY CALL/DMASTER someone sends to us. + We are now banned so we shouldnt service database calls + anymore. + */ + ctdb->vnn_map->generation = INVALID_GENERATION; + + for (i=1; i<=NUM_DB_PRIORITIES; i++) { + if (ctdb_start_freeze(ctdb, i) != 0) { + DEBUG(DEBUG_ERR,(__location__ " Failed to freeze db priority %u\n", i)); + } + } + ctdb_release_all_ips(ctdb); + ctdb->recovery_mode = CTDB_RECOVERY_ACTIVE; + + return 0; +} + 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; @@ -96,7 +121,10 @@ int32_t ctdb_control_set_ban_state(struct ctdb_context *ctdb, TDB_DATA indata) ctdb->nodes[bantime->pnn]->flags |= NODE_FLAGS_BANNED; event_add_timed(ctdb->ev, ctdb->banning_ctx, timeval_current_ofs(bantime->time,0), ctdb_ban_node_event, ctdb); - + if (bantime->pnn == ctdb->pnn) { + return ctdb_local_node_got_banned(ctdb); + } + return 0; } |