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]>'].