return ctdb_control_send_gratious_arp(ctdb, indata);
case CTDB_CONTROL_TRANSACTION_START:
- CHECK_CONTROL_DATA_SIZE(sizeof(uint32_t));
- return ctdb_control_transaction_start(ctdb, *(uint32_t *)indata.dptr);
+ return control_not_implemented("TRANSACTION_START", NULL);
case CTDB_CONTROL_TRANSACTION_COMMIT:
- CHECK_CONTROL_DATA_SIZE(sizeof(uint32_t));
- return ctdb_control_transaction_commit(ctdb, *(uint32_t *)indata.dptr);
+ return control_not_implemented("TRANSACTION_COMMIT", NULL);
case CTDB_CONTROL_WIPE_DATABASE:
CHECK_CONTROL_DATA_SIZE(sizeof(struct ctdb_transdb));
return control_not_implemented("GET_DB_PRIORITY", "");
case CTDB_CONTROL_TRANSACTION_CANCEL:
- CHECK_CONTROL_DATA_SIZE(0);
- return ctdb_control_transaction_cancel(ctdb);
+ return control_not_implemented("TRANSACTION_CANCEL", NULL);
case CTDB_CONTROL_REGISTER_NOTIFY:
return ctdb_control_register_notify(ctdb, client_id, indata);
return db_commit_transaction(ctdb_db, &state);
}
-/*
- start a transaction on all databases - used for recovery
- */
-int32_t ctdb_control_transaction_start(struct ctdb_context *ctdb, uint32_t id)
-{
- struct db_start_transaction_state state;
- int ret;
-
- if (!ctdb_db_all_frozen(ctdb)) {
- DEBUG(DEBUG_ERR, (__location__
- " failing transaction start while not frozen\n"));
- return -1;
- }
-
- state.transaction_id = id;
- state.transaction_started = ctdb->freeze_transaction_started;
-
- ret = ctdb_db_iterator(ctdb, db_start_transaction, &state);
- if (ret != 0) {
- return -1;
- }
-
- ctdb->freeze_transaction_started = true;
- ctdb->freeze_transaction_id = id;
-
- return 0;
-}
-
-/*
- cancel a transaction for all databases - used for recovery
- */
-int32_t ctdb_control_transaction_cancel(struct ctdb_context *ctdb)
-{
- DEBUG(DEBUG_ERR,(__location__ " recovery transaction cancelled called\n"));
-
- ctdb_db_iterator(ctdb, db_cancel_transaction, NULL);
-
- ctdb->freeze_transaction_started = false;
-
- return 0;
-}
-
-/*
- commit transactions on all databases
- */
-int32_t ctdb_control_transaction_commit(struct ctdb_context *ctdb, uint32_t id)
-{
- struct db_commit_transaction_state state;
- int i;
- int healthy_nodes = 0;
- int ret;
-
- if (!ctdb_db_all_frozen(ctdb)) {
- DEBUG(DEBUG_ERR, (__location__
- " failing transaction commit while not frozen\n"));
- return -1;
- }
-
- if (!ctdb->freeze_transaction_started) {
- DEBUG(DEBUG_ERR,(__location__ " transaction not started\n"));
- return -1;
- }
-
- if (id != ctdb->freeze_transaction_id) {
- DEBUG(DEBUG_ERR,(__location__ " incorrect transaction id 0x%x in commit\n", id));
- return -1;
- }
-
- DEBUG(DEBUG_DEBUG,(__location__ " num_nodes[%d]\n", ctdb->num_nodes));
- for (i=0; i < ctdb->num_nodes; i++) {
- DEBUG(DEBUG_DEBUG,(__location__ " node[%d].flags[0x%X]\n",
- i, ctdb->nodes[i]->flags));
- if (ctdb->nodes[i]->flags == 0) {
- healthy_nodes++;
- }
- }
- DEBUG(DEBUG_INFO,(__location__ " healthy_nodes[%d]\n", healthy_nodes));
-
- state.transaction_id = id;
- state.healthy_nodes = healthy_nodes;
-
- ret = ctdb_db_iterator(ctdb, db_commit_transaction, &state);
- if (ret != 0) {
- DEBUG(DEBUG_ERR, ("Cancel all transactions\n"));
- goto fail;
- }
-
- ctdb->freeze_transaction_started = false;
- ctdb->freeze_transaction_id = 0;
-
- return 0;
-
-fail:
- /* cancel any pending transactions */
- ctdb_db_iterator(ctdb, db_cancel_transaction, NULL);
- ctdb->freeze_transaction_started = false;
-
- return -1;
-}
-
/*
wipe a database - only possible when in a frozen transaction
*/