server: add a new ctdb control CTDB_TRANS2_ACTIVE
authorMichael Adam <obnox@samba.org>
Wed, 28 Oct 2009 21:50:05 +0000 (22:50 +0100)
committerRonnie Sahlberg <ronniesahlberg@gmail.com>
Wed, 28 Oct 2009 23:14:30 +0000 (10:14 +1100)
This aske the daemon wheter a transaction is currently active on a
given DB on that node. More precisely this asks for the transaction_active
flag in the ctdb_db_context that is set in the CTDB_TRANS2_COMMIT
control and cleared in the CTDB_TRANS2_ERROR or CTDB_TRANS2_FINISHED controls.

This will be useful for fixing race conditions in the transaction code.

Michael

include/ctdb_private.h
server/ctdb_control.c
server/ctdb_persistent.c

index 5791df0e4ba77d95dc38f86868b0d408c47409e2..2fabfeaed1e537f4a709e883773d54cb758f0f17 100644 (file)
@@ -620,6 +620,7 @@ enum ctdb_controls {CTDB_CONTROL_PROCESS_EXISTS          = 0,
                    CTDB_CONTROL_TRANSACTION_CANCEL      = 113,
                    CTDB_CONTROL_REGISTER_NOTIFY         = 114,
                    CTDB_CONTROL_DEREGISTER_NOTIFY       = 115,
+                   CTDB_CONTROL_TRANS2_ACTIVE           = 116,
 };     
 
 /*
@@ -1469,6 +1470,8 @@ int32_t ctdb_control_trans2_finished(struct ctdb_context *ctdb,
                                     struct ctdb_req_control *c);
 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,
+                                  uint32_t db_id);
 
 char *ctdb_addr_to_str(ctdb_sock_addr *addr);
 unsigned ctdb_addr_to_port(ctdb_sock_addr *addr);
index 7e84078cfa48ce65f289d88cba9763ef12d90a6b..b6bad1c99fa274c8c0a49d19d8e8235180736757 100644 (file)
@@ -424,6 +424,10 @@ static int32_t ctdb_control_dispatch(struct ctdb_context *ctdb,
        case CTDB_CONTROL_TRANS2_FINISHED:
                return ctdb_control_trans2_finished(ctdb, c);
 
+       case CTDB_CONTROL_TRANS2_ACTIVE:
+               CHECK_CONTROL_DATA_SIZE(sizeof(uint32_t));
+               return ctdb_control_trans2_active(ctdb, *(uint32_t *)indata.dptr);
+
        case CTDB_CONTROL_RECD_PING:
                CHECK_CONTROL_DATA_SIZE(0);
                return ctdb_control_recd_ping(ctdb);
index cb77bf092d107c9763686f49176487c7a844cf74..3c51742b1c2b14e9cb2c13b6f6c34c463c1244d4 100644 (file)
@@ -604,6 +604,26 @@ int32_t ctdb_control_trans2_error(struct ctdb_context *ctdb,
        return 0;
 }
 
+/**
+ * Tell whether a transaction is active on this node on the give DB.
+ */
+int32_t ctdb_control_trans2_active(struct ctdb_context *ctdb,
+                                  uint32_t db_id)
+{
+       struct ctdb_db_context *ctdb_db;
+
+       ctdb_db = find_ctdb_db(ctdb, db_id);
+       if (!ctdb_db) {
+               DEBUG(DEBUG_ERR,(__location__ " Unknown db 0x%08x\n", db_id));
+               return -1;
+       }
+
+       if (ctdb_db->transaction_active) {
+               return 1;
+       } else {
+               return 0;
+       }
+}
 
 /*
   backwards compatibility: