------------------------------------------------------------ revno: 330 revision-id: [EMAIL PROTECTED] parent: [EMAIL PROTECTED] committer: Andrew Tridgell <[EMAIL PROTECTED]> branch nick: tridge timestamp: Wed 2007-05-23 12:23:07 +1000 message: start ctdb frozen, and let the election sort things out. This prevents a race on startup modified: common/ctdb_daemon.c ctdb_daemon.c-20070409200331-3el1kqgdb9m4ib0g-1 common/ctdb_freeze.c ctdb_freeze.c-20070512051503-935zdtyuqknqnhmo-1 include/ctdb_private.h ctdb_private.h-20061117234101-o3qt14umlg9en8z0-13 === modified file 'common/ctdb_daemon.c' --- a/common/ctdb_daemon.c 2007-05-19 03:45:24 +0000 +++ b/common/ctdb_daemon.c 2007-05-23 02:23:07 +0000 @@ -745,12 +745,24 @@ talloc_set_destructor(domain_socket_name, unlink_destructor); ctdb->ev = event_context_init(NULL); - fde = event_add_fd(ctdb->ev, ctdb, ctdb->daemon.sd, EVENT_FD_READ|EVENT_FD_AUTOCLOSE, - ctdb_accept_client, ctdb); /* start monitoring for dead nodes */ ctdb_start_monitoring(ctdb); + /* start frozen, then let the first election sort things out */ + if (!ctdb_blocking_freeze(ctdb)) { + DEBUG(0,("Failed to get initial freeze\n")); + exit(12); + } + + /* force initial recovery for election */ + ctdb->recovery_mode = CTDB_RECOVERY_ACTIVE; + + /* now start accepting clients, only can do this once frozen */ + fde = event_add_fd(ctdb->ev, ctdb, ctdb->daemon.sd, + EVENT_FD_READ|EVENT_FD_AUTOCLOSE, + ctdb_accept_client, ctdb); + ctdb_main_loop(ctdb); return 0;
=== modified file 'common/ctdb_freeze.c' --- a/common/ctdb_freeze.c 2007-05-18 14:56:49 +0000 +++ b/common/ctdb_freeze.c 2007-05-23 02:23:07 +0000 @@ -215,6 +215,32 @@ } +/* + block until we are frozen, used during daemon startup + */ +bool ctdb_blocking_freeze(struct ctdb_context *ctdb) +{ + if (ctdb->freeze_mode == CTDB_FREEZE_FROZEN) { + /* we're already frozen */ + return true; + } + + /* if there isn't a freeze lock child then create one */ + if (!ctdb->freeze_handle) { + ctdb->freeze_handle = ctdb_freeze_lock(ctdb); + CTDB_NO_MEMORY(ctdb, ctdb->freeze_handle); + ctdb->freeze_mode = CTDB_FREEZE_PENDING; + } + + /* block until frozen */ + while (ctdb->freeze_mode == CTDB_FREEZE_PENDING) { + event_loop_once(ctdb->ev); + } + + return ctdb->freeze_mode == CTDB_FREEZE_FROZEN; +} + + /* thaw the databases === modified file 'include/ctdb_private.h' --- a/include/ctdb_private.h 2007-05-19 07:21:58 +0000 +++ b/include/ctdb_private.h 2007-05-23 02:23:07 +0000 @@ -828,5 +828,6 @@ void ctdb_call_resend_all(struct ctdb_context *ctdb); void ctdb_node_dead(struct ctdb_node *node); void ctdb_node_connected(struct ctdb_node *node); +bool ctdb_blocking_freeze(struct ctdb_context *ctdb); #endif