Github user hanm commented on a diff in the pull request:
https://github.com/apache/zookeeper/pull/307#discussion_r128153360
--- Diff:
src/java/test/org/apache/zookeeper/server/ZooKeeperServerMainTest.java ---
@@ -138,14 +145,56 @@ void delete(File f) throws IOException {
ServerCnxnFactory getCnxnFactory() {
return main.getCnxnFactory();
}
+
}
- public static class TestZKSMain extends ZooKeeperServerMain {
+ public static class TestZKSMain extends ZooKeeperServerMain {
+
+ private ServerStats serverStats;
+
+ @Override
+ public ZooKeeperServer getZooKeeperServer(FileTxnSnapLog txnLog,
ServerConfig config, ZKDatabase zkDb) {
+ ZooKeeperServer zooKeeperServer =
super.getZooKeeperServer(txnLog, config, zkDb);
+ serverStats = zooKeeperServer.serverStats();
+ return zooKeeperServer;
+ }
+
+ @Override
public void shutdown() {
super.shutdown();
}
}
+ // Test for ZOOKEEPER-2770 ZooKeeper slow operation log
+ @Test
+ public void testRequestWarningThreshold() throws IOException,
KeeperException, InterruptedException {
+ ClientBase.setupTestEnv();
+
+ final int CLIENT_PORT = PortAssignment.unique();
+
+ MainThread main = new MainThread(CLIENT_PORT, true, null, 0);
+ main.start();
+
+ Assert.assertTrue("waiting for server being up",
+ ClientBase.waitForServerUp("127.0.0.1:" + CLIENT_PORT,
+ CONNECTION_TIMEOUT));
+ // Get the stats object from the ZooKeeperServer to keep track of
high latency requests.
+ ServerStats stats = main.main.serverStats;
+
+ ZooKeeper zk = new ZooKeeper("127.0.0.1:" + CLIENT_PORT,
+ ClientBase.CONNECTION_TIMEOUT, this);
+
+ zk.create("/foo1", "foobar".getBytes(), Ids.OPEN_ACL_UNSAFE,
+ CreateMode.PERSISTENT);
+
+ Assert.assertEquals(new String(zk.getData("/foo1", null, null)),
"foobar");
+ // It takes a while for the counter to get updated sometimes, this
is added to reduce flakyness
+ Thread.sleep(1000);
--- End diff --
sync() will not help here because this specific counter is not part of any
zab transactions. Two approaches to make test more robust:
* We can always increase the counter before we send a response back to
client in FinalRequestProcessor. This will make test deterministic, Or,
* In test, implement retry polling with a timeout and a smaller sleep
interval (e..g 10ms instead of 1000ms). We use this pattern a lot in our test.
In general we'd like to make deterministic tests as much as possible (in other
words, avoid sleep at all cost.) though sometimes that is hard to do due to
various reasons.
A side note on sync() - sync is not a quorum operation so it only works if
the client connects to the leader. I think there is a jira trying to fix this.
---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at [email protected] or file a JIRA ticket
with INFRA.
---