You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@zookeeper.apache.org by ca...@apache.org on 2013/06/06 18:53:06 UTC

svn commit: r1490358 - in /zookeeper/trunk: CHANGES.txt src/c/src/zookeeper.c src/c/tests/TestClient.cc

Author: camille
Date: Thu Jun  6 16:53:06 2013
New Revision: 1490358

URL: http://svn.apache.org/r1490358
Log:
ZOOKEEPER-1417. investigate differences in client last zxid handling btw c and java clients (thawan via camille)

Modified:
    zookeeper/trunk/CHANGES.txt
    zookeeper/trunk/src/c/src/zookeeper.c
    zookeeper/trunk/src/c/tests/TestClient.cc

Modified: zookeeper/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/zookeeper/trunk/CHANGES.txt?rev=1490358&r1=1490357&r2=1490358&view=diff
==============================================================================
--- zookeeper/trunk/CHANGES.txt (original)
+++ zookeeper/trunk/CHANGES.txt Thu Jun  6 16:53:06 2013
@@ -877,6 +877,8 @@ BUGFIXES: 
   
   ZOOKEEPER-1354. AuthTest.testBadAuthThenSendOtherCommands fails intermittently (phunt via camille)
 
+  ZOOKEEPER-1417. investigate differences in client last zxid handling btw c and java clients (thawan via camille) 
+
 IMPROVEMENTS:
   ZOOKEEPER-724. Improve junit test integration - log harness information 
   (phunt via mahadev)

Modified: zookeeper/trunk/src/c/src/zookeeper.c
URL: http://svn.apache.org/viewvc/zookeeper/trunk/src/c/src/zookeeper.c?rev=1490358&r1=1490357&r2=1490358&view=diff
==============================================================================
--- zookeeper/trunk/src/c/src/zookeeper.c (original)
+++ zookeeper/trunk/src/c/src/zookeeper.c Thu Jun  6 16:53:06 2013
@@ -2597,11 +2597,6 @@ int zookeeper_process(zhandle_t *zh, int
         struct iarchive *ia = create_buffer_iarchive(
                                     bptr->buffer, bptr->curr_offset);
         deserialize_ReplyHeader(ia, "hdr", &hdr);
-        if (hdr.zxid > 0) {
-            zh->last_zxid = hdr.zxid;
-        } else {
-            // fprintf(stderr, "Got %#x for %#x\n", hdr.zxid, hdr.xid);
-        }
 
         if (hdr.xid == WATCHER_EVENT_XID) {
             struct WatcherEvent evt;
@@ -2666,6 +2661,10 @@ int zookeeper_process(zhandle_t *zh, int
                         hdr.xid,cptr->xid);
             }
 
+            if (hdr.xid != PING_XID && hdr.zxid > 0) {
+                // Update last_zxid only when it is a request response
+                zh->last_zxid = hdr.zxid;
+            }
             activateWatcher(zh, cptr->watcher, rc);
 
             if (cptr->c.void_result != SYNCHRONOUS_MARKER) {

Modified: zookeeper/trunk/src/c/tests/TestClient.cc
URL: http://svn.apache.org/viewvc/zookeeper/trunk/src/c/tests/TestClient.cc?rev=1490358&r1=1490357&r2=1490358&view=diff
==============================================================================
--- zookeeper/trunk/src/c/tests/TestClient.cc (original)
+++ zookeeper/trunk/src/c/tests/TestClient.cc Thu Jun  6 16:53:06 2013
@@ -39,6 +39,7 @@ using namespace std;
 #include <errno.h>
 #include <recordio.h>
 #include "Util.h"
+#include "ZKMocks.h"
 
 struct buff_struct_2 {
     int32_t len;
@@ -214,6 +215,7 @@ class Zookeeper_simpleSystem : public CP
     CPPUNIT_TEST(testWatcherAutoResetWithGlobal);
     CPPUNIT_TEST(testWatcherAutoResetWithLocal);
     CPPUNIT_TEST(testGetChildren2);
+    CPPUNIT_TEST(testLastZxid);
 #endif
     CPPUNIT_TEST_SUITE_END();
 
@@ -1238,6 +1240,55 @@ public:
         testWatcherAutoReset(zk, &ctx, &lctx);
       }
     }
+
+    void testLastZxid() {
+      // ZOOKEEPER-1417: Test that c-client only update last zxid upon
+      // receiving request response only.
+      const int timeout = 5000;
+      int rc;
+      watchctx_t ctx1, ctx2;
+      zhandle_t *zk1 = zookeeper_init(hostPorts, NULL, timeout, 0, &ctx1, 0);
+      zhandle_t *zk2 = zookeeper_init(hostPorts, NULL, timeout, 0, &ctx2, 0);
+      CPPUNIT_ASSERT(zk1);
+      CPPUNIT_ASSERT(zk2);
+
+      int64_t original = zk2->last_zxid;
+
+      // Create txn to increase system zxid
+      rc = zoo_create(zk1, "/lastzxid", "", 0,
+                      &ZOO_OPEN_ACL_UNSAFE, 0, 0, 0);
+      CPPUNIT_ASSERT_EQUAL((int)ZOK, rc);
+
+      // This should be enough time for zk2 to receive ping request
+      usleep(timeout/2 * 1000);
+
+      // check that zk1's last zxid is updated
+      struct Stat stat;
+      rc = zoo_exists(zk1, "/lastzxid", 0, &stat);
+      CPPUNIT_ASSERT_EQUAL((int) ZOK, rc);
+      CPPUNIT_ASSERT_EQUAL((int64_t) zk1->last_zxid, stat.czxid);
+      // zk2's last zxid should remain the same
+      CPPUNIT_ASSERT_EQUAL(original, (int64_t) zk2->last_zxid);
+
+      // Perform read and also register a watch
+      rc = zoo_wexists(zk2, "/lastzxid", watcher, &ctx2, &stat);
+      CPPUNIT_ASSERT_EQUAL((int) ZOK, rc);
+      int64_t updated = zk2->last_zxid;
+      // check that zk2's last zxid is updated
+      CPPUNIT_ASSERT_EQUAL(updated, stat.czxid);
+
+      // Increment system zxid again
+      rc = zoo_set(zk1, "/lastzxid", NULL, -1, -1);
+      CPPUNIT_ASSERT_EQUAL((int) ZOK, rc);
+
+      // Wait for zk2 to get watch event
+      CPPUNIT_ASSERT(waitForEvent(zk2, &ctx2, 5));
+      // zk2's last zxid should remain the same
+      CPPUNIT_ASSERT_EQUAL(updated, (int64_t) zk2->last_zxid);
+
+      zookeeper_close(zk1);
+      zookeeper_close(zk2);
+    }
 };
 
 volatile int Zookeeper_simpleSystem::count;