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

svn commit: r1479649 - in /zookeeper/bookkeeper/trunk: ./ bookkeeper-server/src/main/java/org/apache/bookkeeper/client/ bookkeeper-server/src/test/java/org/apache/bookkeeper/client/

Author: fpj
Date: Mon May  6 17:32:45 2013
New Revision: 1479649

URL: http://svn.apache.org/r1479649
Log:
BOOKKEEPER-562: Ability to tell if a ledger is closed or not (fpj)


Modified:
    zookeeper/bookkeeper/trunk/CHANGES.txt
    zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/AsyncCallback.java
    zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/BookKeeper.java
    zookeeper/bookkeeper/trunk/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/BookKeeperTest.java

Modified: zookeeper/bookkeeper/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/zookeeper/bookkeeper/trunk/CHANGES.txt?rev=1479649&r1=1479648&r2=1479649&view=diff
==============================================================================
--- zookeeper/bookkeeper/trunk/CHANGES.txt (original)
+++ zookeeper/bookkeeper/trunk/CHANGES.txt Mon May  6 17:32:45 2013
@@ -76,6 +76,10 @@ Trunk (unreleased changes)
 
       BOOKKEEPER-583: Read from a ReadOnlyBookie fails if index fileinfo is not in ledger cache (vinay via sijie)
 
+    NEW FEATURE:
+
+      BOOKKEEPER-562: Ability to tell if a ledger is closed or not (fpj)
+
 Release 4.2.0 - 2013-01-14
 
   Non-backward compatible changes:

Modified: zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/AsyncCallback.java
URL: http://svn.apache.org/viewvc/zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/AsyncCallback.java?rev=1479649&r1=1479648&r2=1479649&view=diff
==============================================================================
--- zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/AsyncCallback.java (original)
+++ zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/AsyncCallback.java Mon May  6 17:32:45 2013
@@ -136,4 +136,16 @@ public interface AsyncCallback {
          */
         void recoverComplete(int rc, Object ctx);
     }
+    
+    public interface IsClosedCallback {
+        /**
+         * Callback definition for isClosed operation
+         *
+         * @param rc
+         *          return code
+         * @param isClosed
+         *          true if ledger is closed
+         */
+        void isClosedComplete(int rc, boolean isClosed, Object ctx);
+    }
 }

Modified: zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/BookKeeper.java
URL: http://svn.apache.org/viewvc/zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/BookKeeper.java?rev=1479649&r1=1479648&r2=1479649&view=diff
==============================================================================
--- zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/BookKeeper.java (original)
+++ zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/BookKeeper.java Mon May  6 17:32:45 2013
@@ -29,11 +29,13 @@ import java.util.concurrent.TimeUnit;
 import org.apache.bookkeeper.client.AsyncCallback.CreateCallback;
 import org.apache.bookkeeper.client.AsyncCallback.DeleteCallback;
 import org.apache.bookkeeper.client.AsyncCallback.OpenCallback;
+import org.apache.bookkeeper.client.AsyncCallback.IsClosedCallback;
 import org.apache.bookkeeper.client.BKException.Code;
 import org.apache.bookkeeper.conf.ClientConfiguration;
 import org.apache.bookkeeper.meta.LedgerManager;
 import org.apache.bookkeeper.meta.LedgerManagerFactory;
 import org.apache.bookkeeper.proto.BookieClient;
+import org.apache.bookkeeper.proto.BookkeeperInternalCallbacks.GenericCallback;
 import org.apache.bookkeeper.util.OrderedSafeExecutor;
 import org.apache.bookkeeper.util.ZkUtils;
 import org.apache.bookkeeper.zookeeper.ZooKeeperWatcherBase;
@@ -555,6 +557,68 @@ public class BookKeeper {
             throw BKException.create(counter.getrc());
         }
     }
+    
+    /**
+     * Check asynchronously whether the ledger with identifier <i>lId</i>
+     * has been closed.
+     * 
+     * @param lId   ledger identifier
+     * @param cb    callback method
+     */
+    public void asyncIsClosed(long lId, final IsClosedCallback cb, final Object ctx){
+        ledgerManager.readLedgerMetadata(lId, new GenericCallback<LedgerMetadata>(){
+            public void operationComplete(int rc, LedgerMetadata lm){
+                if (rc == BKException.Code.OK) {
+                    cb.isClosedComplete(rc, lm.isClosed(), ctx);
+                } else {
+                    cb.isClosedComplete(rc, false, ctx);
+                }
+            }
+        });
+    }
+    
+    /**
+     * Check whether the ledger with identifier <i>lId</i>
+     * has been closed.
+     * 
+     * @param lId
+     * @return boolean true if ledger has been closed
+     * @throws BKException
+     */
+    public boolean isClosed(long lId)
+    throws BKException, InterruptedException {
+        final class Result {
+            int rc;
+            boolean isClosed;
+            final CountDownLatch notifier = new CountDownLatch(1);
+        }
+
+        final Result result = new Result();
+
+        final IsClosedCallback cb = new IsClosedCallback(){
+            public void isClosedComplete(int rc, boolean isClosed, Object ctx){
+                    result.isClosed = isClosed;
+                    result.rc = rc;
+                    result.notifier.countDown();
+            }
+        };
+
+        /*
+         * Call asynchronous version of isClosed
+         */
+        asyncIsClosed(lId, cb, null);
+        
+        /*
+         * Wait for callback
+         */
+        result.notifier.await();
+        
+        if (result.rc != BKException.Code.OK) {
+            throw BKException.create(result.rc);
+        }
+        
+        return result.isClosed;
+    }
 
     /**
      * Shuts down client.

Modified: zookeeper/bookkeeper/trunk/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/BookKeeperTest.java
URL: http://svn.apache.org/viewvc/zookeeper/bookkeeper/trunk/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/BookKeeperTest.java?rev=1479649&r1=1479648&r2=1479649&view=diff
==============================================================================
--- zookeeper/bookkeeper/trunk/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/BookKeeperTest.java (original)
+++ zookeeper/bookkeeper/trunk/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/BookKeeperTest.java Mon May  6 17:32:45 2013
@@ -218,4 +218,24 @@ public class BookKeeperTest extends Base
             assertTrue("Close was not successful", success.get());
         }
     }
+    
+    @Test(timeout=60000)
+    public void testIsClosed() throws Exception {
+        ClientConfiguration conf = new ClientConfiguration()
+        .setZkServers(zkUtil.getZooKeeperConnectString());
+
+        BookKeeper bkc = new BookKeeper(conf);
+        LedgerHandle lh = bkc.createLedger(digestType, "testPasswd".getBytes());
+        Long lId = lh.getId();
+
+        lh.addEntry("000".getBytes());
+        boolean result = bkc.isClosed(lId);
+        Assert.assertTrue("Ledger shouldn't be flagged as closed!",!result);
+
+        lh.close();
+        result = bkc.isClosed(lId);
+        Assert.assertTrue("Ledger should be flagged as closed!",result);
+
+        bkc.close();
+    }
 }