Otherwise a node can lock itself out, e.g. when a commit control times out...
Michael
int32_t ctdb_control_trans2_error(struct ctdb_context *ctdb,
struct ctdb_req_control *c);
int32_t ctdb_control_trans2_active(struct ctdb_context *ctdb,
+ struct ctdb_req_control *c,
uint32_t db_id);
char *ctdb_addr_to_str(ctdb_sock_addr *addr);
case CTDB_CONTROL_TRANS2_ACTIVE:
CHECK_CONTROL_DATA_SIZE(sizeof(uint32_t));
- return ctdb_control_trans2_active(ctdb, *(uint32_t *)indata.dptr);
+ return ctdb_control_trans2_active(ctdb, c, *(uint32_t *)indata.dptr);
case CTDB_CONTROL_RECD_PING:
CHECK_CONTROL_DATA_SIZE(0);
* Tell whether a transaction is active on this node on the give DB.
*/
int32_t ctdb_control_trans2_active(struct ctdb_context *ctdb,
+ struct ctdb_req_control *c,
uint32_t db_id)
{
struct ctdb_db_context *ctdb_db;
+ struct ctdb_client *client = ctdb_reqid_find(ctdb, c->client_id, struct ctdb_client);
ctdb_db = find_ctdb_db(ctdb, db_id);
if (!ctdb_db) {
return -1;
}
+ if (client->db_id == db_id) {
+ return 0;
+ }
+
if (ctdb_db->transaction_active) {
return 1;
} else {