mirror of
https://github.com/samba-team/samba.git
synced 2024-12-23 17:34:34 +03:00
ctdb-recovery: Pass db structure for each database recovery
Instead of db_id and db_flags. BUG: https://bugzilla.samba.org/show_bug.cgi?id=14294 Signed-off-by: Martin Schwenke <martin@meltin.net> Reviewed-by: Amitay Isaacs <amitay@gmail.com>
This commit is contained in:
parent
c6f74e590f
commit
1bdfeb3fdc
@ -1672,8 +1672,7 @@ struct recover_db_state {
|
|||||||
struct ctdb_client_context *client;
|
struct ctdb_client_context *client;
|
||||||
struct ctdb_tunable_list *tun_list;
|
struct ctdb_tunable_list *tun_list;
|
||||||
struct node_list *nlist;
|
struct node_list *nlist;
|
||||||
uint32_t db_id;
|
struct db *db;
|
||||||
uint8_t db_flags;
|
|
||||||
|
|
||||||
uint32_t destnode;
|
uint32_t destnode;
|
||||||
struct ctdb_transdb transdb;
|
struct ctdb_transdb transdb;
|
||||||
@ -1698,8 +1697,7 @@ static struct tevent_req *recover_db_send(TALLOC_CTX *mem_ctx,
|
|||||||
struct ctdb_tunable_list *tun_list,
|
struct ctdb_tunable_list *tun_list,
|
||||||
struct node_list *nlist,
|
struct node_list *nlist,
|
||||||
uint32_t generation,
|
uint32_t generation,
|
||||||
uint32_t db_id,
|
struct db *db)
|
||||||
uint8_t db_flags)
|
|
||||||
{
|
{
|
||||||
struct tevent_req *req, *subreq;
|
struct tevent_req *req, *subreq;
|
||||||
struct recover_db_state *state;
|
struct recover_db_state *state;
|
||||||
@ -1714,14 +1712,13 @@ static struct tevent_req *recover_db_send(TALLOC_CTX *mem_ctx,
|
|||||||
state->client = client;
|
state->client = client;
|
||||||
state->tun_list = tun_list;
|
state->tun_list = tun_list;
|
||||||
state->nlist = nlist;
|
state->nlist = nlist;
|
||||||
state->db_id = db_id;
|
state->db = db;
|
||||||
state->db_flags = db_flags;
|
|
||||||
|
|
||||||
state->destnode = ctdb_client_pnn(client);
|
state->destnode = ctdb_client_pnn(client);
|
||||||
state->transdb.db_id = db_id;
|
state->transdb.db_id = db->db_id;
|
||||||
state->transdb.tid = generation;
|
state->transdb.tid = generation;
|
||||||
|
|
||||||
ctdb_req_control_get_dbname(&request, db_id);
|
ctdb_req_control_get_dbname(&request, db->db_id);
|
||||||
subreq = ctdb_client_control_send(state, ev, client, state->destnode,
|
subreq = ctdb_client_control_send(state, ev, client, state->destnode,
|
||||||
TIMEOUT(), &request);
|
TIMEOUT(), &request);
|
||||||
if (tevent_req_nomem(subreq, req)) {
|
if (tevent_req_nomem(subreq, req)) {
|
||||||
@ -1747,7 +1744,7 @@ static void recover_db_name_done(struct tevent_req *subreq)
|
|||||||
TALLOC_FREE(subreq);
|
TALLOC_FREE(subreq);
|
||||||
if (! status) {
|
if (! status) {
|
||||||
D_ERR("control GET_DBNAME failed for db=0x%x, ret=%d\n",
|
D_ERR("control GET_DBNAME failed for db=0x%x, ret=%d\n",
|
||||||
state->db_id, ret);
|
state->db->db_id, ret);
|
||||||
tevent_req_error(req, ret);
|
tevent_req_error(req, ret);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -1755,14 +1752,14 @@ static void recover_db_name_done(struct tevent_req *subreq)
|
|||||||
ret = ctdb_reply_control_get_dbname(reply, state, &state->db_name);
|
ret = ctdb_reply_control_get_dbname(reply, state, &state->db_name);
|
||||||
if (ret != 0) {
|
if (ret != 0) {
|
||||||
D_ERR("control GET_DBNAME failed for db=0x%x, ret=%d\n",
|
D_ERR("control GET_DBNAME failed for db=0x%x, ret=%d\n",
|
||||||
state->db_id, ret);
|
state->db->db_id, ret);
|
||||||
tevent_req_error(req, EPROTO);
|
tevent_req_error(req, EPROTO);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
talloc_free(reply);
|
talloc_free(reply);
|
||||||
|
|
||||||
ctdb_req_control_getdbpath(&request, state->db_id);
|
ctdb_req_control_getdbpath(&request, state->db->db_id);
|
||||||
subreq = ctdb_client_control_send(state, state->ev, state->client,
|
subreq = ctdb_client_control_send(state, state->ev, state->client,
|
||||||
state->destnode, TIMEOUT(),
|
state->destnode, TIMEOUT(),
|
||||||
&request);
|
&request);
|
||||||
@ -1802,7 +1799,7 @@ static void recover_db_path_done(struct tevent_req *subreq)
|
|||||||
|
|
||||||
talloc_free(reply);
|
talloc_free(reply);
|
||||||
|
|
||||||
ctdb_req_control_db_freeze(&request, state->db_id);
|
ctdb_req_control_db_freeze(&request, state->db->db_id);
|
||||||
subreq = ctdb_client_control_multi_send(state,
|
subreq = ctdb_client_control_multi_send(state,
|
||||||
state->ev,
|
state->ev,
|
||||||
state->client,
|
state->client,
|
||||||
@ -1873,6 +1870,7 @@ static void recover_db_transaction_started(struct tevent_req *subreq)
|
|||||||
struct recover_db_state *state = tevent_req_data(
|
struct recover_db_state *state = tevent_req_data(
|
||||||
req, struct recover_db_state);
|
req, struct recover_db_state);
|
||||||
int *err_list;
|
int *err_list;
|
||||||
|
uint32_t flags;
|
||||||
int ret;
|
int ret;
|
||||||
bool status;
|
bool status;
|
||||||
|
|
||||||
@ -1899,28 +1897,31 @@ static void recover_db_transaction_started(struct tevent_req *subreq)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
state->recdb = recdb_create(state, state->db_id, state->db_name,
|
flags = state->db->db_flags;
|
||||||
|
state->recdb = recdb_create(state,
|
||||||
|
state->db->db_id,
|
||||||
|
state->db_name,
|
||||||
state->db_path,
|
state->db_path,
|
||||||
state->tun_list->database_hash_size,
|
state->tun_list->database_hash_size,
|
||||||
state->db_flags & CTDB_DB_FLAGS_PERSISTENT);
|
flags & CTDB_DB_FLAGS_PERSISTENT);
|
||||||
if (tevent_req_nomem(state->recdb, req)) {
|
if (tevent_req_nomem(state->recdb, req)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((state->db_flags & CTDB_DB_FLAGS_PERSISTENT) ||
|
if ((flags & CTDB_DB_FLAGS_PERSISTENT) ||
|
||||||
(state->db_flags & CTDB_DB_FLAGS_REPLICATED)) {
|
(flags & CTDB_DB_FLAGS_REPLICATED)) {
|
||||||
subreq = collect_highseqnum_db_send(state,
|
subreq = collect_highseqnum_db_send(state,
|
||||||
state->ev,
|
state->ev,
|
||||||
state->client,
|
state->client,
|
||||||
state->nlist,
|
state->nlist,
|
||||||
state->db_id,
|
state->db->db_id,
|
||||||
state->recdb);
|
state->recdb);
|
||||||
} else {
|
} else {
|
||||||
subreq = collect_all_db_send(state,
|
subreq = collect_all_db_send(state,
|
||||||
state->ev,
|
state->ev,
|
||||||
state->client,
|
state->client,
|
||||||
state->nlist,
|
state->nlist,
|
||||||
state->db_id,
|
state->db->db_id,
|
||||||
state->recdb);
|
state->recdb);
|
||||||
}
|
}
|
||||||
if (tevent_req_nomem(subreq, req)) {
|
if (tevent_req_nomem(subreq, req)) {
|
||||||
@ -1939,8 +1940,8 @@ static void recover_db_collect_done(struct tevent_req *subreq)
|
|||||||
int ret;
|
int ret;
|
||||||
bool status;
|
bool status;
|
||||||
|
|
||||||
if ((state->db_flags & CTDB_DB_FLAGS_PERSISTENT) ||
|
if ((state->db->db_flags & CTDB_DB_FLAGS_PERSISTENT) ||
|
||||||
(state->db_flags & CTDB_DB_FLAGS_REPLICATED)) {
|
(state->db->db_flags & CTDB_DB_FLAGS_REPLICATED)) {
|
||||||
status = collect_highseqnum_db_recv(subreq, &ret);
|
status = collect_highseqnum_db_recv(subreq, &ret);
|
||||||
} else {
|
} else {
|
||||||
status = collect_all_db_recv(subreq, &ret);
|
status = collect_all_db_recv(subreq, &ret);
|
||||||
@ -2076,7 +2077,7 @@ static void recover_db_transaction_committed(struct tevent_req *subreq)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ctdb_req_control_db_thaw(&request, state->db_id);
|
ctdb_req_control_db_thaw(&request, state->db->db_id);
|
||||||
subreq = ctdb_client_control_multi_send(state,
|
subreq = ctdb_client_control_multi_send(state,
|
||||||
state->ev,
|
state->ev,
|
||||||
state->client,
|
state->client,
|
||||||
@ -2151,8 +2152,7 @@ struct db_recovery_one_state {
|
|||||||
struct ctdb_tunable_list *tun_list;
|
struct ctdb_tunable_list *tun_list;
|
||||||
struct node_list *nlist;
|
struct node_list *nlist;
|
||||||
uint32_t generation;
|
uint32_t generation;
|
||||||
uint32_t db_id;
|
struct db *db;
|
||||||
uint8_t db_flags;
|
|
||||||
int num_fails;
|
int num_fails;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -2199,8 +2199,7 @@ static struct tevent_req *db_recovery_send(TALLOC_CTX *mem_ctx,
|
|||||||
substate->tun_list = tun_list;
|
substate->tun_list = tun_list;
|
||||||
substate->nlist = nlist;
|
substate->nlist = nlist;
|
||||||
substate->generation = generation;
|
substate->generation = generation;
|
||||||
substate->db_id = db->db_id;
|
substate->db = db;
|
||||||
substate->db_flags = db->db_flags;
|
|
||||||
|
|
||||||
subreq = recover_db_send(state,
|
subreq = recover_db_send(state,
|
||||||
ev,
|
ev,
|
||||||
@ -2208,14 +2207,13 @@ static struct tevent_req *db_recovery_send(TALLOC_CTX *mem_ctx,
|
|||||||
tun_list,
|
tun_list,
|
||||||
nlist,
|
nlist,
|
||||||
generation,
|
generation,
|
||||||
substate->db_id,
|
substate->db);
|
||||||
substate->db_flags);
|
|
||||||
if (tevent_req_nomem(subreq, req)) {
|
if (tevent_req_nomem(subreq, req)) {
|
||||||
return tevent_req_post(req, ev);
|
return tevent_req_post(req, ev);
|
||||||
}
|
}
|
||||||
tevent_req_set_callback(subreq, db_recovery_one_done,
|
tevent_req_set_callback(subreq, db_recovery_one_done,
|
||||||
substate);
|
substate);
|
||||||
D_NOTICE("recover database 0x%08x\n", substate->db_id);
|
D_NOTICE("recover database 0x%08x\n", substate->db->db_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
return req;
|
return req;
|
||||||
@ -2246,14 +2244,13 @@ static void db_recovery_one_done(struct tevent_req *subreq)
|
|||||||
substate->tun_list,
|
substate->tun_list,
|
||||||
substate->nlist,
|
substate->nlist,
|
||||||
substate->generation,
|
substate->generation,
|
||||||
substate->db_id,
|
substate->db);
|
||||||
substate->db_flags);
|
|
||||||
if (tevent_req_nomem(subreq, req)) {
|
if (tevent_req_nomem(subreq, req)) {
|
||||||
goto failed;
|
goto failed;
|
||||||
}
|
}
|
||||||
tevent_req_set_callback(subreq, db_recovery_one_done, substate);
|
tevent_req_set_callback(subreq, db_recovery_one_done, substate);
|
||||||
D_NOTICE("recover database 0x%08x, attempt %d\n",
|
D_NOTICE("recover database 0x%08x, attempt %d\n",
|
||||||
substate->db_id, substate->num_fails+1);
|
substate->db->db_id, substate->num_fails+1);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user