mirror of
https://github.com/samba-team/samba.git
synced 2025-01-03 01:18:10 +03:00
ctdb-recoverd: Drop recovery master verification
This doesn't make sense if leader broadcasts are used. Signed-off-by: Martin Schwenke <martin@meltin.net> Reviewed-by: Amitay Isaacs <amitay@gmail.com>
This commit is contained in:
parent
f02e097485
commit
58d7fcdf7c
@ -2142,103 +2142,6 @@ static enum monitor_result verify_recmode(struct ctdb_context *ctdb, struct ctdb
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
struct verify_recmaster_data {
|
|
||||||
struct ctdb_recoverd *rec;
|
|
||||||
uint32_t count;
|
|
||||||
uint32_t pnn;
|
|
||||||
enum monitor_result status;
|
|
||||||
};
|
|
||||||
|
|
||||||
static void verify_recmaster_callback(struct ctdb_client_control_state *state)
|
|
||||||
{
|
|
||||||
struct verify_recmaster_data *rmdata = talloc_get_type(state->async.private_data, struct verify_recmaster_data);
|
|
||||||
|
|
||||||
|
|
||||||
/* one more node has responded with recmaster data*/
|
|
||||||
rmdata->count--;
|
|
||||||
|
|
||||||
/* if we failed to get the recmaster, then return an error and let
|
|
||||||
the main loop try again.
|
|
||||||
*/
|
|
||||||
if (state->state != CTDB_CONTROL_DONE) {
|
|
||||||
if (rmdata->status == MONITOR_OK) {
|
|
||||||
rmdata->status = MONITOR_FAILED;
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* if we got a response, then the recmaster will be stored in the
|
|
||||||
status field
|
|
||||||
*/
|
|
||||||
if ((uint32_t)state->status != rmdata->pnn) {
|
|
||||||
DEBUG(DEBUG_ERR,("Node %d thinks node %d is recmaster. Need a new recmaster election\n", state->c->hdr.destnode, state->status));
|
|
||||||
ctdb_set_culprit(rmdata->rec, state->c->hdr.destnode);
|
|
||||||
rmdata->status = MONITOR_ELECTION_NEEDED;
|
|
||||||
}
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* verify that all nodes agree that we are the recmaster */
|
|
||||||
static enum monitor_result verify_recmaster(struct ctdb_recoverd *rec, struct ctdb_node_map_old *nodemap, uint32_t pnn)
|
|
||||||
{
|
|
||||||
struct ctdb_context *ctdb = rec->ctdb;
|
|
||||||
struct verify_recmaster_data *rmdata;
|
|
||||||
TALLOC_CTX *mem_ctx = talloc_new(ctdb);
|
|
||||||
struct ctdb_client_control_state *state;
|
|
||||||
enum monitor_result status;
|
|
||||||
unsigned int j;
|
|
||||||
|
|
||||||
rmdata = talloc(mem_ctx, struct verify_recmaster_data);
|
|
||||||
CTDB_NO_MEMORY_FATAL(ctdb, rmdata);
|
|
||||||
rmdata->rec = rec;
|
|
||||||
rmdata->count = 0;
|
|
||||||
rmdata->pnn = pnn;
|
|
||||||
rmdata->status = MONITOR_OK;
|
|
||||||
|
|
||||||
/* loop over all active nodes and send an async getrecmaster call to
|
|
||||||
them*/
|
|
||||||
for (j=0; j<nodemap->num; j++) {
|
|
||||||
if (nodemap->nodes[j].pnn == rec->leader) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (nodemap->nodes[j].flags & NODE_FLAGS_INACTIVE) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
state = ctdb_ctrl_getrecmaster_send(ctdb, mem_ctx,
|
|
||||||
CONTROL_TIMEOUT(),
|
|
||||||
nodemap->nodes[j].pnn);
|
|
||||||
if (state == NULL) {
|
|
||||||
/* we failed to send the control, treat this as
|
|
||||||
an error and try again next iteration
|
|
||||||
*/
|
|
||||||
DEBUG(DEBUG_ERR,("Failed to call ctdb_ctrl_getrecmaster_send during monitoring\n"));
|
|
||||||
talloc_free(mem_ctx);
|
|
||||||
return MONITOR_FAILED;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* set up the callback functions */
|
|
||||||
state->async.fn = verify_recmaster_callback;
|
|
||||||
state->async.private_data = rmdata;
|
|
||||||
|
|
||||||
/* one more control to wait for to complete */
|
|
||||||
rmdata->count++;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* now wait for up to the maximum number of seconds allowed
|
|
||||||
or until all nodes we expect a response from has replied
|
|
||||||
*/
|
|
||||||
while (rmdata->count > 0) {
|
|
||||||
tevent_loop_once(ctdb->ev);
|
|
||||||
}
|
|
||||||
|
|
||||||
status = rmdata->status;
|
|
||||||
talloc_free(mem_ctx);
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool interfaces_have_changed(struct ctdb_context *ctdb,
|
static bool interfaces_have_changed(struct ctdb_context *ctdb,
|
||||||
struct ctdb_recoverd *rec)
|
struct ctdb_recoverd *rec)
|
||||||
{
|
{
|
||||||
@ -2705,21 +2608,6 @@ static void main_loop(struct ctdb_context *ctdb, struct ctdb_recoverd *rec,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* verify that all active nodes agree that we are the recmaster */
|
|
||||||
switch (verify_recmaster(rec, nodemap, rec->pnn)) {
|
|
||||||
case MONITOR_RECOVERY_NEEDED:
|
|
||||||
/* can not happen */
|
|
||||||
return;
|
|
||||||
case MONITOR_ELECTION_NEEDED:
|
|
||||||
force_election(rec);
|
|
||||||
return;
|
|
||||||
case MONITOR_OK:
|
|
||||||
break;
|
|
||||||
case MONITOR_FAILED:
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* get the vnnmap */
|
/* get the vnnmap */
|
||||||
ret = ctdb_ctrl_getvnnmap(ctdb,
|
ret = ctdb_ctrl_getvnnmap(ctdb,
|
||||||
CONTROL_TIMEOUT(),
|
CONTROL_TIMEOUT(),
|
||||||
|
Loading…
Reference in New Issue
Block a user