server: trans2_active: don't report a transaction active on the node that performs...
authorMichael Adam <obnox@samba.org>
Thu, 29 Oct 2009 16:08:37 +0000 (17:08 +0100)
committerRonnie Sahlberg <ronniesahlberg@gmail.com>
Thu, 29 Oct 2009 22:22:18 +0000 (09:22 +1100)
Otherwise a node can lock itself out, e.g. when a commit control times out...

Michael

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

index 2fabfeaed1e537f4a709e883773d54cb758f0f17..655b33670f01aaed26a8dacaba52d2b4f429f7c2 100644 (file)
@@ -1471,6 +1471,7 @@ int32_t ctdb_control_trans2_finished(struct ctdb_context *ctdb,
 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);
index b6bad1c99fa274c8c0a49d19d8e8235180736757..bf82e515fbd081a623df555d4c47600bd69cd89c 100644 (file)
@@ -426,7 +426,7 @@ static int32_t ctdb_control_dispatch(struct ctdb_context *ctdb,
 
        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);
index 3c51742b1c2b14e9cb2c13b6f6c34c463c1244d4..66a3f7229b6b8394562a526e9585b8fa98b209f8 100644 (file)
@@ -608,9 +608,11 @@ int32_t ctdb_control_trans2_error(struct ctdb_context *ctdb,
  * 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) {
@@ -618,6 +620,10 @@ int32_t ctdb_control_trans2_active(struct ctdb_context *ctdb,
                return -1;
        }
 
+       if (client->db_id == db_id) {
+               return 0;
+       }
+
        if (ctdb_db->transaction_active) {
                return 1;
        } else {