1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-22 13:34:15 +03:00

persistent: add ctdb_persistent_finish_trans3_commits().

This function walks all databases and checks for running trans3 commits.
It sends replies to all of them (with error code) and ends them.
To be called when a recovery finishes.

(This used to be ctdb commit 70ba153b532528bdccea70c5ea28972257f384c1)
This commit is contained in:
Michael Adam 2011-02-23 17:38:40 +01:00
parent ee44c23cd5
commit 2bd04f0ff8
2 changed files with 36 additions and 0 deletions

View File

@ -1216,6 +1216,8 @@ int32_t ctdb_control_trans3_commit(struct ctdb_context *ctdb,
struct ctdb_req_control *c,
TDB_DATA recdata, bool *async_reply);
void ctdb_persistent_finish_trans3_commits(struct ctdb_context *ctdb);
int32_t ctdb_control_transaction_start(struct ctdb_context *ctdb, uint32_t id);
int32_t ctdb_control_transaction_commit(struct ctdb_context *ctdb, uint32_t id);
int32_t ctdb_control_transaction_cancel(struct ctdb_context *ctdb);

View File

@ -118,6 +118,40 @@ static void ctdb_persistent_store_timeout(struct event_context *ev, struct timed
talloc_free(state);
}
/**
* Finish pending trans3 commit controls, i.e. send
* reply to the client. This is called by the end-recovery
* control to fix the situation when a recovery interrupts
* the usual porgress of a transaction.
*/
void ctdb_persistent_finish_trans3_commits(struct ctdb_context *ctdb)
{
struct ctdb_db_context *ctdb_db;
if (ctdb->recovery_mode != CTDB_RECOVERY_NORMAL) {
DEBUG(DEBUG_INFO, ("ctdb_persistent_store_timeout: ignoring "
"timeout during recovery\n"));
return;
}
for (ctdb_db = ctdb->db_list; ctdb_db; ctdb_db = ctdb_db->next) {
struct ctdb_persistent_state *state;
if (ctdb_db->persistent_state == NULL) {
continue;
}
state = ctdb_db->persistent_state;
ctdb_request_control_reply(ctdb, state->c, NULL,
CTDB_TRANS2_COMMIT_SOMEFAIL,
"trans3 commit ended by recovery");
/* The destructor sets ctdb_db->persistent_state to NULL. */
talloc_free(state);
}
}
/*
store a set of persistent records - called from a ctdb client when it has updated
some records in a persistent database. The client will have the record