diff options
| author | Ronnie Sahlberg <ronniesahlberg@gmail.com> | 2009-10-10 16:28:20 +1100 |
|---|---|---|
| committer | Ronnie Sahlberg <ronniesahlberg@gmail.com> | 2009-10-10 16:28:20 +1100 |
| commit | ae57e545666aa4c39bd3e52a3fd08de3e7e1f91d (patch) | |
| tree | 62bb8735b0e44e7fee71c94bfe1699aaf73559d9 | |
| parent | 3219f81710da86de1bf500c451cfb1fa673cee06 (diff) | |
during recovery, update all remote nodes so they use the same priorities
for the databases as this node.
(This used to be ctdb commit 465dc95fef0ff6651ff49fa94e4cf2ebd1036ac4)
| -rw-r--r-- | ctdb/server/ctdb_recoverd.c | 52 |
1 files changed, 51 insertions, 1 deletions
diff --git a/ctdb/server/ctdb_recoverd.c b/ctdb/server/ctdb_recoverd.c index 7a01995970..15181224b8 100644 --- a/ctdb/server/ctdb_recoverd.c +++ b/ctdb/server/ctdb_recoverd.c @@ -328,6 +328,50 @@ static int set_recovery_master(struct ctdb_context *ctdb, struct ctdb_node_map * return 0; } +/* update all remote nodes to use the same db priority that we have + this can fail if the remove node has not yet been upgraded to + support this function, so we always return success and never fail + a recovery if this call fails. +*/ +static int update_db_priority_on_remote_nodes(struct ctdb_context *ctdb, + struct ctdb_node_map *nodemap, + uint32_t pnn, struct ctdb_dbid_map *dbmap, TALLOC_CTX *mem_ctx) +{ + int db; + uint32_t *nodes; + + nodes = list_of_active_nodes(ctdb, nodemap, mem_ctx, true); + + /* step through all local databases */ + for (db=0; db<dbmap->num;db++) { + TDB_DATA data; + struct ctdb_db_priority db_prio; + int ret; + + db_prio.db_id = dbmap->dbs[db].dbid; + ret = ctdb_ctrl_get_db_priority(ctdb, CONTROL_TIMEOUT(), CTDB_CURRENT_NODE, dbmap->dbs[db].dbid, &db_prio.priority); + if (ret != 0) { + DEBUG(DEBUG_ERR,(__location__ " Failed to read database priority from local node for db 0x%08x\n", dbmap->dbs[db].dbid)); + continue; + } + + DEBUG(DEBUG_INFO,("Update DB priority for db 0x%08x to %u\n", dbmap->dbs[db].dbid, db_prio.priority)); + + data.dptr = (uint8_t *)&db_prio; + data.dsize = sizeof(db_prio); + + if (ctdb_client_async_control(ctdb, + CTDB_CONTROL_SET_DB_PRIORITY, + nodes, + CONTROL_TIMEOUT(), false, data, + NULL, NULL, + NULL) != 0) { + DEBUG(DEBUG_ERR,(__location__ " Failed to set DB priority for 0x%08x\n", db_prio.db_id)); + } + } + + return 0; +} /* ensure all other nodes have attached to any databases that we have @@ -1232,9 +1276,15 @@ static int do_recovery(struct ctdb_recoverd *rec, DEBUG(DEBUG_ERR, (__location__ " Unable to create missing remote databases\n")); return -1; } - DEBUG(DEBUG_NOTICE, (__location__ " Recovery - created remote databases\n")); + /* update the database priority for all remote databases */ + ret = update_db_priority_on_remote_nodes(ctdb, nodemap, pnn, dbmap, mem_ctx); + if (ret != 0) { + DEBUG(DEBUG_ERR, (__location__ " Unable to set db priority on remote nodes\n")); + } + DEBUG(DEBUG_NOTICE, (__location__ " Recovery - updated db priority for all databases\n")); + /* set recovery mode to active on all nodes */ ret = set_recovery_mode(ctdb, rec, nodemap, CTDB_RECOVERY_ACTIVE); |
