The branch, master has been updated
       via  467da12a785ba3367ed9cbdf79440394e9703289 (commit)
       via  cb36bbb5418290e8e5b770d2d836285b15da2a6f (commit)
      from  22712c577f64ec84851b4addcf4a46c7e99e0662 (commit)

http://gitweb.samba.org/?p=sahlberg/ctdb.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 467da12a785ba3367ed9cbdf79440394e9703289
Author: Ronnie Sahlberg <[email protected]>
Date:   Thu Oct 29 10:58:14 2009 +1100

    update the uptime command to indicate that time since last is either from 
alst recovery or from last failover

commit cb36bbb5418290e8e5b770d2d836285b15da2a6f
Author: Ronnie Sahlberg <[email protected]>
Date:   Thu Oct 29 10:49:00 2009 +1100

    Revert "update the "uptime" command to indicate the "time since last" is 
the time since the last recovery OR failover."
    
    This reverts commit 3b0d44497800a16400d05a30bdaf6e6c285d4b36.

-----------------------------------------------------------------------

Summary of changes:
 client/ctdb_client.c         |   48 +++++++++++++++++++++++++++++++++++++++--
 config/events.d/61.nfstickle |    2 +-
 include/ctdb_private.h       |    3 ++
 server/ctdb_control.c        |    4 +++
 server/ctdb_persistent.c     |   20 +++++++++++++++++
 5 files changed, 73 insertions(+), 4 deletions(-)


Changeset truncated at 500 lines:

diff --git a/client/ctdb_client.c b/client/ctdb_client.c
index d4130cd..d47f771 100644
--- a/client/ctdb_client.c
+++ b/client/ctdb_client.c
@@ -3141,12 +3141,42 @@ int ctdb_ctrl_getcapabilities(struct ctdb_context 
*ctdb, struct timeval timeout,
        return ret;
 }
 
+/**
+ * check whether a transaction is active on a given db on a given node
+ */
+static int32_t ctdb_ctrl_transaction_active(struct ctdb_context *ctdb,
+                                           uint32_t destnode,
+                                           uint32_t db_id)
+{
+       int32_t status;
+       int ret;
+       TDB_DATA indata;
+
+       indata.dptr = (uint8_t *)&db_id;
+       indata.dsize = sizeof(db_id);
+
+       ret = ctdb_control(ctdb, destnode, 0,
+                          CTDB_CONTROL_TRANS2_ACTIVE,
+                          0, indata, NULL, NULL, &status,
+                          NULL, NULL);
+
+       if (ret != 0) {
+               DEBUG(DEBUG_ERR, (__location__ " ctdb control for 
transaction_active failed\n"));
+               return -1;
+       }
+
+       return status;
+}
+
+
 struct ctdb_transaction_handle {
        struct ctdb_db_context *ctdb_db;
        bool in_replay;
-       /* we store the reads and writes done under a transaction one
-          list stores both reads and writes, the other just writes
-       */
+       /*
+        * we store the reads and writes done under a transaction:
+        * - one list stores both reads and writes (m_all),
+        * - the other just writes (m_write)
+        */
        struct ctdb_marshall_buffer *m_all;
        struct ctdb_marshall_buffer *m_write;
 };
@@ -3170,6 +3200,7 @@ static int ctdb_transaction_fetch_start(struct 
ctdb_transaction_handle *h)
        int ret;
        struct ctdb_db_context *ctdb_db = h->ctdb_db;
        pid_t pid;
+       int32_t status;
 
        key.dptr = discard_const(keyname);
        key.dsize = strlen(keyname);
@@ -3180,6 +3211,17 @@ static int ctdb_transaction_fetch_start(struct 
ctdb_transaction_handle *h)
        }
 
 again:
+       status = ctdb_ctrl_transaction_active(ctdb_db->ctdb,
+                                             CTDB_CURRENT_NODE,
+                                             ctdb_db->db_id);
+       if (status == 1) {
+               DEBUG(DEBUG_NOTICE, (__location__ " transaction is active "
+                                    "on db_id[%u]. waiting for 1 second\n",
+                                    ctdb_db->db_id));
+               sleep(1);
+               goto again;
+       }
+
        tmp_ctx = talloc_new(h);
 
        rh = ctdb_fetch_lock(ctdb_db, tmp_ctx, key, NULL);
diff --git a/config/events.d/61.nfstickle b/config/events.d/61.nfstickle
index 3e557e4..332d006 100755
--- a/config/events.d/61.nfstickle
+++ b/config/events.d/61.nfstickle
@@ -56,7 +56,7 @@ case $cmd in
        ;;
 
      monitor)
-# always create these direcotries since NFS might be enabled at runtime
+        # always create these direcotries since NFS might be enabled at runtime
        # and we dont want to restart ctdbd
        mkdir -p $CTDB_BASE/state/nfstickle
        mkdir -p $NFS_TICKLE_SHARED_DIRECTORY/`hostname`
diff --git a/include/ctdb_private.h b/include/ctdb_private.h
index 5791df0..2fabfea 100644
--- a/include/ctdb_private.h
+++ b/include/ctdb_private.h
@@ -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);
diff --git a/server/ctdb_control.c b/server/ctdb_control.c
index 7e84078..b6bad1c 100644
--- a/server/ctdb_control.c
+++ b/server/ctdb_control.c
@@ -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);
diff --git a/server/ctdb_persistent.c b/server/ctdb_persistent.c
index cb77bf0..3c51742 100644
--- a/server/ctdb_persistent.c
+++ b/server/ctdb_persistent.c
@@ -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:


-- 
CTDB repository

Reply via email to