This is an automated email from the ASF dual-hosted git repository.

zhaijia pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/bookkeeper.git


The following commit(s) were added to refs/heads/master by this push:
     new d44bee5  PendingReadOp: add counter for speculative reads
d44bee5 is described below

commit d44bee59b25035ba69976386b55eecac82a1ae3a
Author: Samuel Just <[email protected]>
AuthorDate: Wed Jan 17 23:09:27 2018 +0800

    PendingReadOp: add counter for speculative reads
    
    (bug W-3324107)
    Signed-off-by: Dustin Castor <dcastorsalesforce.com>
    [Ported to current master, added test]
    Signed-off-by: Samuel Just <sjustsalesforce.com>
    
    Author: Samuel Just <[email protected]>
    
    Reviewers: Enrico Olivelli <[email protected]>, Jia Zhai <None>, Sijie 
Guo <[email protected]>
    
    This closes #991 from athanatos/forupstream/stats1/specreadstats
---
 .../org/apache/bookkeeper/client/BookKeeper.java   | 12 ++++++++++++
 .../bookkeeper/client/BookKeeperClientStats.java   |  1 +
 .../apache/bookkeeper/client/PendingReadOp.java    |  4 ++++
 .../bookkeeper/client/TestSpeculativeRead.java     | 22 +++++++++++++++++-----
 4 files changed, 34 insertions(+), 5 deletions(-)

diff --git 
a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/BookKeeper.java 
b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/BookKeeper.java
index a58b501..6822a0f 100644
--- 
a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/BookKeeper.java
+++ 
b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/BookKeeper.java
@@ -71,6 +71,7 @@ import org.apache.bookkeeper.net.BookieSocketAddress;
 import org.apache.bookkeeper.net.DNSToSwitchMapping;
 import org.apache.bookkeeper.proto.BookieClient;
 import org.apache.bookkeeper.proto.BookkeeperInternalCallbacks.GenericCallback;
+import org.apache.bookkeeper.stats.Counter;
 import org.apache.bookkeeper.stats.NullStatsLogger;
 import org.apache.bookkeeper.stats.OpStatsLogger;
 import org.apache.bookkeeper.stats.StatsLogger;
@@ -117,6 +118,8 @@ public class BookKeeper implements 
org.apache.bookkeeper.client.api.BookKeeper {
     private OpStatsLogger recoverAddEntriesStats;
     private OpStatsLogger recoverReadEntriesStats;
 
+    private Counter speculativeReadCounter;
+
     // whether the event loop group is one we created, or is owned by whoever
     // instantiated us
     boolean ownEventLoopGroup = false;
@@ -583,6 +586,13 @@ public class BookKeeper implements 
org.apache.bookkeeper.client.api.BookKeeper {
         }
     }
 
+    /**
+     * Returns ref to speculative read counter, needed in PendingReadOp.
+     */
+    Counter getSpeculativeReadCounter() {
+        return speculativeReadCounter;
+    }
+
     @VisibleForTesting
     public LedgerManager getLedgerManager() {
         return ledgerManager;
@@ -1417,6 +1427,8 @@ public class BookKeeper implements 
org.apache.bookkeeper.client.api.BookKeeper {
         readLacOpLogger = 
stats.getOpStatsLogger(BookKeeperClientStats.READ_LAC_OP);
         recoverAddEntriesStats = 
stats.getOpStatsLogger(BookKeeperClientStats.LEDGER_RECOVER_ADD_ENTRIES);
         recoverReadEntriesStats = 
stats.getOpStatsLogger(BookKeeperClientStats.LEDGER_RECOVER_READ_ENTRIES);
+
+        speculativeReadCounter = 
stats.getCounter(BookKeeperClientStats.SPECULATIVE_READ_COUNT);
     }
 
     OpStatsLogger getCreateOpLogger() {
diff --git 
a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/BookKeeperClientStats.java
 
b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/BookKeeperClientStats.java
index 8822b93..50ee81c 100644
--- 
a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/BookKeeperClientStats.java
+++ 
b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/BookKeeperClientStats.java
@@ -50,6 +50,7 @@ public interface BookKeeperClientStats {
     String LAC_UPDATE_HITS = "LAC_UPDATE_HITS";
     String LAC_UPDATE_MISSES = "LAC_UPDATE_MISSES";
     String GET_BOOKIE_INFO_OP = "GET_BOOKIE_INFO";
+    String SPECULATIVE_READ_COUNT = "SPECULATIVE_READ_COUNT";
 
     // per channel stats
     String CHANNEL_SCOPE = "per_channel_bookie_client";
diff --git 
a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/PendingReadOp.java
 
b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/PendingReadOp.java
index 32816bf..5f1cecd 100644
--- 
a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/PendingReadOp.java
+++ 
b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/PendingReadOp.java
@@ -42,6 +42,7 @@ import org.apache.bookkeeper.common.util.SafeRunnable;
 import org.apache.bookkeeper.net.BookieSocketAddress;
 import 
org.apache.bookkeeper.proto.BookkeeperInternalCallbacks.ReadEntryCallback;
 import 
org.apache.bookkeeper.proto.BookkeeperInternalCallbacks.ReadEntryCallbackCtx;
+import org.apache.bookkeeper.stats.Counter;
 import org.apache.bookkeeper.stats.OpStatsLogger;
 import org.apache.bookkeeper.util.MathUtils;
 import org.slf4j.Logger;
@@ -69,6 +70,7 @@ class PendingReadOp implements ReadEntryCallback, 
SafeRunnable {
     long endEntryId;
     long requestTimeNanos;
     OpStatsLogger readOpLogger;
+    private final Counter speculativeReadCounter;
 
     final int maxMissedReadsAllowed;
     final boolean isRecoveryRead;
@@ -362,6 +364,7 @@ class PendingReadOp implements ReadEntryCallback, 
SafeRunnable {
             // only send another read, if we have had no response at all (even 
for other entries)
             // from any of the other bookies we have sent the request to
             if (sentTo.cardinality() == 0) {
+                speculativeReadCounter.inc();
                 return sendNextRead();
             } else {
                 return null;
@@ -470,6 +473,7 @@ class PendingReadOp implements ReadEntryCallback, 
SafeRunnable {
         heardFromHostsBitSet = new 
BitSet(getLedgerMetadata().getEnsembleSize());
 
         readOpLogger = lh.bk.getReadOpLogger();
+        speculativeReadCounter = lh.bk.getSpeculativeReadCounter();
     }
 
     CompletableFuture<LedgerEntries> future() {
diff --git 
a/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/TestSpeculativeRead.java
 
b/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/TestSpeculativeRead.java
index d692cea..8b0a8cc 100644
--- 
a/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/TestSpeculativeRead.java
+++ 
b/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/TestSpeculativeRead.java
@@ -20,6 +20,8 @@
  */
 package org.apache.bookkeeper.client;
 
+import static org.apache.bookkeeper.client.BookKeeperClientStats.CLIENT_SCOPE;
+import static 
org.apache.bookkeeper.client.BookKeeperClientStats.SPECULATIVE_READ_COUNT;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNull;
@@ -38,6 +40,7 @@ import org.apache.bookkeeper.client.BookKeeper.DigestType;
 import org.apache.bookkeeper.conf.ClientConfiguration;
 import org.apache.bookkeeper.net.BookieSocketAddress;
 import org.apache.bookkeeper.test.BookKeeperClusterTestCase;
+import org.apache.bookkeeper.test.TestStatsProvider;
 import org.junit.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -69,14 +72,14 @@ public class TestSpeculativeRead extends 
BookKeeperClusterTestCase {
     }
 
     @SuppressWarnings("deprecation")
-    BookKeeper createClient(int specTimeout) throws Exception {
+    BookKeeperTestClient createClient(int specTimeout) throws Exception {
         ClientConfiguration conf = new ClientConfiguration()
             .setSpeculativeReadTimeout(specTimeout)
             .setReadTimeout(30000)
             .setReorderReadSequenceEnabled(true)
             .setEnsemblePlacementPolicySlowBookies(true);
         conf.setZkServers(zkUtil.getZooKeeperConnectString());
-        return new BookKeeper(conf);
+        return new BookKeeperTestClient(conf, new TestStatsProvider());
     }
 
     class LatchCallback implements ReadCallback {
@@ -127,8 +130,8 @@ public class TestSpeculativeRead extends 
BookKeeperClusterTestCase {
     @Test
     public void testSpeculativeRead() throws Exception {
         long id = getLedgerToRead(3, 2);
-        BookKeeper bknospec = createClient(0); // disabled
-        BookKeeper bkspec = createClient(2000);
+        BookKeeperTestClient bknospec = createClient(0); // disabled
+        BookKeeperTestClient bkspec = createClient(2000);
 
         LedgerHandle lnospec = bknospec.openLedger(id, digestType, passwd);
         LedgerHandle lspec = bkspec.openLedger(id, digestType, passwd);
@@ -158,7 +161,16 @@ public class TestSpeculativeRead extends 
BookKeeperClusterTestCase {
             // Check that the second bookie is registered as slow at entryId 1
             RackawareEnsemblePlacementPolicy rep = 
(RackawareEnsemblePlacementPolicy) lspec.bk.placementPolicy;
             assertTrue(rep.slowBookies.asMap().size() == 1);
-            assertTrue(rep.slowBookies.asMap().get(second) == 1L);
+
+            assertTrue(
+                    "Stats should not reflect speculative reads if disabled",
+                    bknospec.getTestStatsProvider()
+                            .getCounter(CLIENT_SCOPE + "." + 
SPECULATIVE_READ_COUNT).get() == 0);
+            assertTrue(
+                    "Stats should reflect speculative reads",
+                    bkspec.getTestStatsProvider()
+                            .getCounter(CLIENT_SCOPE + "." + 
SPECULATIVE_READ_COUNT).get() > 0);
+
         } finally {
             sleepLatch.countDown();
             lspec.close();

-- 
To stop receiving notification emails like this one, please contact
['"[email protected]" <[email protected]>'].

Reply via email to