Repository: zookeeper Updated Branches: refs/heads/branch-3.5 f1429d071 -> eb8ff57f2
ZOOKEEPER-2940: Deal with maxbuffer as it relates to large requests from clients https://issues.apache.org/jira/browse/ZOOKEEPER-2940 This PR covers the other part of Jute buffer monitoring which relates to client response sizes. `jute.maxbuffer` is often set too small or the default (4MB) value is not enough to receive large responses from the server which causes the client unable to operate. e.g. `getChildren()` on a node which has lots of children or execution of a large multi. These new metrics lets operators to monitor the size of generated responses to get an idea on how to properly set client's `jute.maxbuffer`. The other part of monitoring which relates to proposal size has already been merged https://github.com/apache/zookeeper/pull/415 Author: Andor Molnar <[email protected]> Reviewers: [email protected] Closes #466 from anmolnar/ZOOKEEPER-2940 and squashes the following commits: 29224d021 [Andor Molnar] ZOOKEEPER-2940. Test fixes 486d4961d [Andor Molnar] ZOOKEEPER-2940. Removed support of 4lw commands, because master is targeted 60916e09e [Andor Molnar] ZOOKEEPER-2940. Code review fixes b39c4c815 [Andor Molnar] ZOOKEEPER-2940. Code review: variable names renamed to proposalStats 87e72ff31 [Andor Molnar] ZOOKEEPER-2940. Some code review cleanups 6f0adb124 [Andor Molnar] ZOOKEEPER-2940. Code review fixes: stats class renamed, added comments to unit test asserts, updated docs bcb6d4ca5 [Andor Molnar] ZOOKEEPER-2940. Added new metrics to python files 77a5f0aa8 [Andor Molnar] ZOOKEEPER-2940. Fixed failing unit tests 2def61c30 [Andor Molnar] ZOOKEEPER-2940. Track size of client responses Change-Id: I68df371097cc355b1f41b8dbb0168da4fa5dee43 (cherry picked from commit 328b9de0152f987429534c8adcb2ce2866c5733e) Signed-off-by: Patrick Hunt <[email protected]> Project: http://git-wip-us.apache.org/repos/asf/zookeeper/repo Commit: http://git-wip-us.apache.org/repos/asf/zookeeper/commit/eb8ff57f Tree: http://git-wip-us.apache.org/repos/asf/zookeeper/tree/eb8ff57f Diff: http://git-wip-us.apache.org/repos/asf/zookeeper/diff/eb8ff57f Branch: refs/heads/branch-3.5 Commit: eb8ff57f22d04e060fcc015512293b27aa400862 Parents: f1429d0 Author: Andor Molnar <[email protected]> Authored: Wed Jul 11 16:33:51 2018 -0700 Committer: Patrick Hunt <[email protected]> Committed: Wed Jul 11 16:39:38 2018 -0700 ---------------------------------------------------------------------- docs/index.pdf | Bin 12653 -> 12657 bytes docs/javaExample.pdf | Bin 33814 -> 33818 bytes docs/linkmap.pdf | Bin 10822 -> 10826 bytes docs/recipes.pdf | Bin 33852 -> 33856 bytes docs/zookeeperAdmin.html | 4 + docs/zookeeperAdmin.pdf | Bin 102110 -> 102168 bytes docs/zookeeperHierarchicalQuorums.pdf | Bin 6650 -> 6654 bytes docs/zookeeperInternals.pdf | Bin 48807 -> 48811 bytes docs/zookeeperJMX.pdf | Bin 16471 -> 16475 bytes docs/zookeeperObservers.pdf | Bin 12864 -> 12868 bytes docs/zookeeperOver.pdf | Bin 302474 -> 302467 bytes docs/zookeeperProgrammers.pdf | Bin 144320 -> 144324 bytes docs/zookeeperQuotas.pdf | Bin 11180 -> 11184 bytes docs/zookeeperReconfig.pdf | Bin 62412 -> 62416 bytes docs/zookeeperStarted.pdf | Bin 28074 -> 28078 bytes docs/zookeeperTutorial.pdf | Bin 34208 -> 34212 bytes src/contrib/monitoring/check_zookeeper.py | 9 +- src/contrib/monitoring/ganglia/zookeeper.pyconf | 3 + .../monitoring/ganglia/zookeeper_ganglia.py | 5 +- .../org/apache/zookeeper/ClientCnxnSocket.java | 2 +- .../apache/zookeeper/server/NIOServerCnxn.java | 20 +---- .../zookeeper/server/NettyServerCnxn.java | 19 +--- .../org/apache/zookeeper/server/ServerCnxn.java | 30 ++++++- .../apache/zookeeper/server/ServerStats.java | 15 ++++ .../zookeeper/server/ZooKeeperServerBean.java | 15 ++++ .../zookeeper/server/ZooKeeperServerMXBean.java | 15 ++++ .../apache/zookeeper/server/admin/Commands.java | 14 ++- .../server/command/MonitorCommand.java | 6 +- .../zookeeper/server/command/StatCommand.java | 4 +- .../zookeeper/server/quorum/BufferStats.java | 89 +++++++++++++++++++ .../apache/zookeeper/server/quorum/Leader.java | 10 +-- .../zookeeper/server/quorum/LeaderBean.java | 6 +- .../zookeeper/server/quorum/ProposalStats.java | 71 --------------- .../zookeeper/server/NIOServerCnxnTest.java | 25 +++++- .../zookeeper/server/NettyServerCnxnTest.java | 23 +++++ .../zookeeper/server/admin/CommandsTest.java | 13 ++- .../server/quorum/BufferStatsTest.java | 58 ++++++++++++ .../server/quorum/ProposalStatsTest.java | 58 ------------ .../server/quorum/StatCommandTest.java | 5 +- .../server/quorum/StatResetCommandTest.java | 6 +- .../content/xdocs/zookeeperAdmin.xml | 3 + 41 files changed, 330 insertions(+), 198 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/zookeeper/blob/eb8ff57f/docs/index.pdf ---------------------------------------------------------------------- diff --git a/docs/index.pdf b/docs/index.pdf index e8d5d90..9ffd60f 100644 Binary files a/docs/index.pdf and b/docs/index.pdf differ http://git-wip-us.apache.org/repos/asf/zookeeper/blob/eb8ff57f/docs/javaExample.pdf ---------------------------------------------------------------------- diff --git a/docs/javaExample.pdf b/docs/javaExample.pdf index 159d0d2..fb9d678 100644 Binary files a/docs/javaExample.pdf and b/docs/javaExample.pdf differ http://git-wip-us.apache.org/repos/asf/zookeeper/blob/eb8ff57f/docs/linkmap.pdf ---------------------------------------------------------------------- diff --git a/docs/linkmap.pdf b/docs/linkmap.pdf index bd41e0a..89ae180 100644 Binary files a/docs/linkmap.pdf and b/docs/linkmap.pdf differ http://git-wip-us.apache.org/repos/asf/zookeeper/blob/eb8ff57f/docs/recipes.pdf ---------------------------------------------------------------------- diff --git a/docs/recipes.pdf b/docs/recipes.pdf index f0bae47..a6e54bd 100644 Binary files a/docs/recipes.pdf and b/docs/recipes.pdf differ http://git-wip-us.apache.org/repos/asf/zookeeper/blob/eb8ff57f/docs/zookeeperAdmin.html ---------------------------------------------------------------------- diff --git a/docs/zookeeperAdmin.html b/docs/zookeeperAdmin.html index 18cc3a0..487c853 100644 --- a/docs/zookeeperAdmin.html +++ b/docs/zookeeperAdmin.html @@ -2210,6 +2210,7 @@ server.3=zoo3:2888:3888</pre> zk_min_latency 0 zk_packets_received 70 zk_packets_sent 69 + zk_num_alive_connections 1 zk_outstanding_requests 0 zk_server_state leader zk_znode_count 4 @@ -2221,6 +2222,9 @@ server.3=zoo3:2888:3888</pre> zk_pending_syncs 0 - only exposed by the Leader zk_open_file_descriptor_count 23 - only available on Unix platforms zk_max_file_descriptor_count 1024 - only available on Unix platforms + zk_last_proposal_size 23 + zk_min_proposal_size 23 + zk_max_proposal_size 64 </pre> <p>The output is compatible with java properties format and the content may change over time (new keys added). Your scripts should expect changes.</p> http://git-wip-us.apache.org/repos/asf/zookeeper/blob/eb8ff57f/docs/zookeeperAdmin.pdf ---------------------------------------------------------------------- diff --git a/docs/zookeeperAdmin.pdf b/docs/zookeeperAdmin.pdf index 2e56193..3c81835 100644 Binary files a/docs/zookeeperAdmin.pdf and b/docs/zookeeperAdmin.pdf differ http://git-wip-us.apache.org/repos/asf/zookeeper/blob/eb8ff57f/docs/zookeeperHierarchicalQuorums.pdf ---------------------------------------------------------------------- diff --git a/docs/zookeeperHierarchicalQuorums.pdf b/docs/zookeeperHierarchicalQuorums.pdf index c09cd2b..b23e319 100644 Binary files a/docs/zookeeperHierarchicalQuorums.pdf and b/docs/zookeeperHierarchicalQuorums.pdf differ http://git-wip-us.apache.org/repos/asf/zookeeper/blob/eb8ff57f/docs/zookeeperInternals.pdf ---------------------------------------------------------------------- diff --git a/docs/zookeeperInternals.pdf b/docs/zookeeperInternals.pdf index 5405ff0..ec99459 100644 Binary files a/docs/zookeeperInternals.pdf and b/docs/zookeeperInternals.pdf differ http://git-wip-us.apache.org/repos/asf/zookeeper/blob/eb8ff57f/docs/zookeeperJMX.pdf ---------------------------------------------------------------------- diff --git a/docs/zookeeperJMX.pdf b/docs/zookeeperJMX.pdf index f6227ac..37416f3 100644 Binary files a/docs/zookeeperJMX.pdf and b/docs/zookeeperJMX.pdf differ http://git-wip-us.apache.org/repos/asf/zookeeper/blob/eb8ff57f/docs/zookeeperObservers.pdf ---------------------------------------------------------------------- diff --git a/docs/zookeeperObservers.pdf b/docs/zookeeperObservers.pdf index a4dfae4..95924c7 100644 Binary files a/docs/zookeeperObservers.pdf and b/docs/zookeeperObservers.pdf differ http://git-wip-us.apache.org/repos/asf/zookeeper/blob/eb8ff57f/docs/zookeeperOver.pdf ---------------------------------------------------------------------- diff --git a/docs/zookeeperOver.pdf b/docs/zookeeperOver.pdf index f48c7d6..8ddf5ef 100644 Binary files a/docs/zookeeperOver.pdf and b/docs/zookeeperOver.pdf differ http://git-wip-us.apache.org/repos/asf/zookeeper/blob/eb8ff57f/docs/zookeeperProgrammers.pdf ---------------------------------------------------------------------- diff --git a/docs/zookeeperProgrammers.pdf b/docs/zookeeperProgrammers.pdf index 34277f9..dfd6f9c 100644 Binary files a/docs/zookeeperProgrammers.pdf and b/docs/zookeeperProgrammers.pdf differ http://git-wip-us.apache.org/repos/asf/zookeeper/blob/eb8ff57f/docs/zookeeperQuotas.pdf ---------------------------------------------------------------------- diff --git a/docs/zookeeperQuotas.pdf b/docs/zookeeperQuotas.pdf index 76eb18e..b0d7029 100644 Binary files a/docs/zookeeperQuotas.pdf and b/docs/zookeeperQuotas.pdf differ http://git-wip-us.apache.org/repos/asf/zookeeper/blob/eb8ff57f/docs/zookeeperReconfig.pdf ---------------------------------------------------------------------- diff --git a/docs/zookeeperReconfig.pdf b/docs/zookeeperReconfig.pdf index 9b292d4..d91638a 100644 Binary files a/docs/zookeeperReconfig.pdf and b/docs/zookeeperReconfig.pdf differ http://git-wip-us.apache.org/repos/asf/zookeeper/blob/eb8ff57f/docs/zookeeperStarted.pdf ---------------------------------------------------------------------- diff --git a/docs/zookeeperStarted.pdf b/docs/zookeeperStarted.pdf index 24b3716..eb07639 100644 Binary files a/docs/zookeeperStarted.pdf and b/docs/zookeeperStarted.pdf differ http://git-wip-us.apache.org/repos/asf/zookeeper/blob/eb8ff57f/docs/zookeeperTutorial.pdf ---------------------------------------------------------------------- diff --git a/docs/zookeeperTutorial.pdf b/docs/zookeeperTutorial.pdf index 81cda17..1a7fab8 100644 Binary files a/docs/zookeeperTutorial.pdf and b/docs/zookeeperTutorial.pdf differ http://git-wip-us.apache.org/repos/asf/zookeeper/blob/eb8ff57f/src/contrib/monitoring/check_zookeeper.py ---------------------------------------------------------------------- diff --git a/src/contrib/monitoring/check_zookeeper.py b/src/contrib/monitoring/check_zookeeper.py index b2f8db6..cff6a1f 100755 --- a/src/contrib/monitoring/check_zookeeper.py +++ b/src/contrib/monitoring/check_zookeeper.py @@ -293,7 +293,14 @@ class ZooKeeperServer(object): result['zk_zxid_epoch'] = int(m.group(1), 16) >>32 # high 32 bits continue - return result + m = re.match('Proposal sizes last/min/max: (\d+)/(\d+)/(\d+)', line) + if m is not None: + result['zk_last_proposal_size'] = int(m.group(1)) + result['zk_min_proposal_size'] = int(m.group(2)) + result['zk_max_proposal_size'] = int(m.group(3)) + continue + + return result def _parse_line(self, line): try: http://git-wip-us.apache.org/repos/asf/zookeeper/blob/eb8ff57f/src/contrib/monitoring/ganglia/zookeeper.pyconf ---------------------------------------------------------------------- diff --git a/src/contrib/monitoring/ganglia/zookeeper.pyconf b/src/contrib/monitoring/ganglia/zookeeper.pyconf index 179626f..44acd93 100644 --- a/src/contrib/monitoring/ganglia/zookeeper.pyconf +++ b/src/contrib/monitoring/ganglia/zookeeper.pyconf @@ -46,5 +46,8 @@ collection_group { metric { name = "zk_followers" } metric { name = "zk_synced_followers" } metric { name = "zk_pending_syncs" } + metric { name = "zk_last_proposal_size" } + metric { name = "zk_min_proposal_size" } + metric { name = "zk_max_proposal_size" } } http://git-wip-us.apache.org/repos/asf/zookeeper/blob/eb8ff57f/src/contrib/monitoring/ganglia/zookeeper_ganglia.py ---------------------------------------------------------------------- diff --git a/src/contrib/monitoring/ganglia/zookeeper_ganglia.py b/src/contrib/monitoring/ganglia/zookeeper_ganglia.py index c72619f..bbb7a8e 100644 --- a/src/contrib/monitoring/ganglia/zookeeper_ganglia.py +++ b/src/contrib/monitoring/ganglia/zookeeper_ganglia.py @@ -214,7 +214,10 @@ def metric_init(params=None): 'zk_max_file_descriptor_count': {'units': 'descriptors'}, 'zk_followers': {'units': 'nodes'}, 'zk_synced_followers': {'units': 'nodes'}, - 'zk_pending_syncs': {'units': 'syncs'} + 'zk_pending_syncs': {'units': 'syncs'}, + 'zk_last_proposal_size': {'units': 'bytes'}, + 'zk_min_proposal_size': {'units': 'bytes'}, + 'zk_max_proposal_size': {'units': 'bytes'} } metric_handler.descriptors = {} for name, updates in metrics.iteritems(): http://git-wip-us.apache.org/repos/asf/zookeeper/blob/eb8ff57f/src/java/main/org/apache/zookeeper/ClientCnxnSocket.java ---------------------------------------------------------------------- diff --git a/src/java/main/org/apache/zookeeper/ClientCnxnSocket.java b/src/java/main/org/apache/zookeeper/ClientCnxnSocket.java index 0e5316d..84abe84 100644 --- a/src/java/main/org/apache/zookeeper/ClientCnxnSocket.java +++ b/src/java/main/org/apache/zookeeper/ClientCnxnSocket.java @@ -115,7 +115,7 @@ abstract class ClientCnxnSocket { this.lastHeard = now; } - protected void readLength() throws IOException { + void readLength() throws IOException { int len = incomingBuffer.getInt(); if (len < 0 || len >= packetLen) { throw new IOException("Packet len" + len + " is out of range!"); http://git-wip-us.apache.org/repos/asf/zookeeper/blob/eb8ff57f/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java ---------------------------------------------------------------------- diff --git a/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java b/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java index e11ba3e..d7bb19b 100644 --- a/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java +++ b/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java @@ -678,8 +678,6 @@ public class NIOServerCnxn extends ServerCnxn { } } - private final static byte fourBytes[] = new byte[4]; - /* * (non-Javadoc) * @@ -689,23 +687,7 @@ public class NIOServerCnxn extends ServerCnxn { @Override public void sendResponse(ReplyHeader h, Record r, String tag) { try { - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - // Make space for length - BinaryOutputArchive bos = BinaryOutputArchive.getArchive(baos); - try { - baos.write(fourBytes); - bos.writeRecord(h, "header"); - if (r != null) { - bos.writeRecord(r, tag); - } - baos.close(); - } catch (IOException e) { - LOG.error("Error serializing response"); - } - byte b[] = baos.toByteArray(); - ByteBuffer bb = ByteBuffer.wrap(b); - bb.putInt(b.length - 4).rewind(); - sendBuffer(bb); + super.sendResponse(h, r, tag); if (h.getXid() > 0) { // check throttling if (outstandingRequests.decrementAndGet() < 1 || http://git-wip-us.apache.org/repos/asf/zookeeper/blob/eb8ff57f/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java ---------------------------------------------------------------------- diff --git a/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java b/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java index 9ff12e9..ec808a6 100644 --- a/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java +++ b/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java @@ -160,7 +160,6 @@ public class NettyServerCnxn extends ServerCnxn { } } - private static final byte[] fourBytes = new byte[4]; static class ResumeMessageEvent implements MessageEvent { Channel channel; ResumeMessageEvent(Channel channel) { @@ -182,23 +181,7 @@ public class NettyServerCnxn extends ServerCnxn { if (closingChannel || !channel.isOpen()) { return; } - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - // Make space for length - BinaryOutputArchive bos = BinaryOutputArchive.getArchive(baos); - try { - baos.write(fourBytes); - bos.writeRecord(h, "header"); - if (r != null) { - bos.writeRecord(r, tag); - } - baos.close(); - } catch (IOException e) { - LOG.error("Error serializing response"); - } - byte b[] = baos.toByteArray(); - ByteBuffer bb = ByteBuffer.wrap(b); - bb.putInt(b.length - 4).rewind(); - sendBuffer(bb); + super.sendResponse(h, r, tag); if (h.getXid() > 0) { // zks cannot be null otherwise we would not have gotten here! if (!zkServer.shouldThrottle(outstandingCount.decrementAndGet())) { http://git-wip-us.apache.org/repos/asf/zookeeper/blob/eb8ff57f/src/java/main/org/apache/zookeeper/server/ServerCnxn.java ---------------------------------------------------------------------- diff --git a/src/java/main/org/apache/zookeeper/server/ServerCnxn.java b/src/java/main/org/apache/zookeeper/server/ServerCnxn.java index acc5da8..c60503f 100644 --- a/src/java/main/org/apache/zookeeper/server/ServerCnxn.java +++ b/src/java/main/org/apache/zookeeper/server/ServerCnxn.java @@ -18,6 +18,7 @@ package org.apache.zookeeper.server; +import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; @@ -32,6 +33,7 @@ import java.util.List; import java.util.Map; import java.util.concurrent.atomic.AtomicLong; +import org.apache.jute.BinaryOutputArchive; import org.apache.jute.Record; import org.apache.zookeeper.WatchedEvent; import org.apache.zookeeper.Watcher; @@ -53,6 +55,8 @@ public abstract class ServerCnxn implements Stats, Watcher { protected ArrayList<Id> authInfo = new ArrayList<Id>(); + private static final byte[] fourBytes = new byte[4]; + /** * If the client is of old version, we don't send r-o mode info to it. * The reason is that if we would, old C client doesn't read it, which @@ -64,8 +68,26 @@ public abstract class ServerCnxn implements Stats, Watcher { abstract void close(); - public abstract void sendResponse(ReplyHeader h, Record r, String tag) - throws IOException; + public void sendResponse(ReplyHeader h, Record r, String tag) throws IOException { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + // Make space for length + BinaryOutputArchive bos = BinaryOutputArchive.getArchive(baos); + try { + baos.write(fourBytes); + bos.writeRecord(h, "header"); + if (r != null) { + bos.writeRecord(r, tag); + } + baos.close(); + } catch (IOException e) { + LOG.error("Error serializing response"); + } + byte b[] = baos.toByteArray(); + serverStats().updateClientResponseSize(b.length - 4); + ByteBuffer bb = ByteBuffer.wrap(b); + bb.putInt(b.length - 4).rewind(); + sendBuffer(bb); + } /* notify the client the session is closing and close/cleanup socket */ abstract void sendCloseSession(); @@ -133,12 +155,12 @@ public abstract class ServerCnxn implements Stats, Watcher { incrPacketsSent(); ServerStats serverStats = serverStats(); if (serverStats != null) { - serverStats().incrementPacketsSent(); + serverStats.incrementPacketsSent(); } } protected abstract ServerStats serverStats(); - + protected final Date established = new Date(); protected final AtomicLong packetsReceived = new AtomicLong(); http://git-wip-us.apache.org/repos/asf/zookeeper/blob/eb8ff57f/src/java/main/org/apache/zookeeper/server/ServerStats.java ---------------------------------------------------------------------- diff --git a/src/java/main/org/apache/zookeeper/server/ServerStats.java b/src/java/main/org/apache/zookeeper/server/ServerStats.java index 3947d3a..87f37ad 100644 --- a/src/java/main/org/apache/zookeeper/server/ServerStats.java +++ b/src/java/main/org/apache/zookeeper/server/ServerStats.java @@ -21,6 +21,9 @@ package org.apache.zookeeper.server; import org.apache.zookeeper.common.Time; +import org.apache.zookeeper.server.quorum.BufferStats; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.util.concurrent.atomic.AtomicLong; @@ -28,6 +31,8 @@ import java.util.concurrent.atomic.AtomicLong; * Basic Server Statistics */ public class ServerStats { + private static final Logger LOG = LoggerFactory.getLogger(ServerStats.class); + private long packetsSent; private long packetsReceived; private long maxLatency; @@ -36,6 +41,8 @@ public class ServerStats { private long count = 0; private AtomicLong fsyncThresholdExceedCount = new AtomicLong(0); + private final BufferStats clientResponseStats = new BufferStats(); + private final Provider provider; public interface Provider { @@ -167,6 +174,14 @@ public class ServerStats { synchronized public void reset() { resetLatency(); resetRequestCounters(); + clientResponseStats.reset(); } + public void updateClientResponseSize(int size) { + clientResponseStats.setLastBufferSize(size); + } + + public BufferStats getClientResponseStats() { + return clientResponseStats; + } } http://git-wip-us.apache.org/repos/asf/zookeeper/blob/eb8ff57f/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java ---------------------------------------------------------------------- diff --git a/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java b/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java index 43c3f6a..6ac7602 100644 --- a/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java +++ b/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java @@ -182,4 +182,19 @@ public class ZooKeeperServerBean implements ZooKeeperServerMXBean, ZKMBeanInfo { public int getJuteMaxBufferSize() { return BinaryInputArchive.maxBuffer; } + + @Override + public int getLastClientResponseSize() { + return zks.serverStats().getClientResponseStats().getLastBufferSize(); + } + + @Override + public int getMinClientResponseSize() { + return zks.serverStats().getClientResponseStats().getMinBufferSize(); + } + + @Override + public int getMaxClientResponseSize() { + return zks.serverStats().getClientResponseStats().getMaxBufferSize(); + } } http://git-wip-us.apache.org/repos/asf/zookeeper/blob/eb8ff57f/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java ---------------------------------------------------------------------- diff --git a/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java b/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java index 5ff0991..d7e50d3 100644 --- a/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java +++ b/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java @@ -143,4 +143,19 @@ public interface ZooKeeperServerMXBean { * @return Returns the value of the following config setting: jute.maxbuffer */ public int getJuteMaxBufferSize(); + + /** + * @return size of latest generated client response + */ + public int getLastClientResponseSize(); + + /** + * @return size of smallest generated client response + */ + public int getMinClientResponseSize(); + + /** + * @return size of largest generated client response + */ + public int getMaxClientResponseSize(); } http://git-wip-us.apache.org/repos/asf/zookeeper/blob/eb8ff57f/src/java/main/org/apache/zookeeper/server/admin/Commands.java ---------------------------------------------------------------------- diff --git a/src/java/main/org/apache/zookeeper/server/admin/Commands.java b/src/java/main/org/apache/zookeeper/server/admin/Commands.java index fe160b9..4712261 100644 --- a/src/java/main/org/apache/zookeeper/server/admin/Commands.java +++ b/src/java/main/org/apache/zookeeper/server/admin/Commands.java @@ -330,12 +330,20 @@ public class Commands { response.put("open_file_descriptor_count", osMbean.getOpenFileDescriptorCount()); response.put("max_file_descriptor_count", osMbean.getMaxFileDescriptorCount()); + response.put("last_client_response_size", stats.getClientResponseStats().getLastBufferSize()); + response.put("max_client_response_size", stats.getClientResponseStats().getMaxBufferSize()); + response.put("min_client_response_size", stats.getClientResponseStats().getMinBufferSize()); + if (zkServer instanceof LeaderZooKeeperServer) { Leader leader = ((LeaderZooKeeperServer) zkServer).getLeader(); response.put("followers", leader.getLearners().size()); response.put("synced_followers", leader.getForwardingFollowers().size()); response.put("pending_syncs", leader.getNumPendingSyncs()); + + response.put("last_proposal_size", leader.getProposalStats().getLastBufferSize()); + response.put("max_proposal_size", leader.getProposalStats().getMaxBufferSize()); + response.put("min_proposal_size", leader.getProposalStats().getMinBufferSize()); } return response; @@ -415,9 +423,13 @@ public class Commands { response.put("version", Version.getFullVersion()); response.put("read_only", zkServer instanceof ReadOnlyZooKeeperServer); response.put("server_stats", zkServer.serverStats()); + response.put("client_response", zkServer.serverStats().getClientResponseStats()); + if (zkServer instanceof LeaderZooKeeperServer) { + Leader leader = ((LeaderZooKeeperServer)zkServer).getLeader(); + response.put("proposal_stats", leader.getProposalStats()); + } response.put("node_count", zkServer.getZKDatabase().getNodeCount()); return response; - } } http://git-wip-us.apache.org/repos/asf/zookeeper/blob/eb8ff57f/src/java/main/org/apache/zookeeper/server/command/MonitorCommand.java ---------------------------------------------------------------------- diff --git a/src/java/main/org/apache/zookeeper/server/command/MonitorCommand.java b/src/java/main/org/apache/zookeeper/server/command/MonitorCommand.java index c32de4c..a17fe40 100644 --- a/src/java/main/org/apache/zookeeper/server/command/MonitorCommand.java +++ b/src/java/main/org/apache/zookeeper/server/command/MonitorCommand.java @@ -75,9 +75,9 @@ public class MonitorCommand extends AbstractFourLetterCommand { print("synced_followers", leader.getForwardingFollowers().size()); print("pending_syncs", leader.getNumPendingSyncs()); - print("last_proposal_size", leader.getProposalStats().getLastProposalSize()); - print("max_proposal_size", leader.getProposalStats().getMaxProposalSize()); - print("min_proposal_size", leader.getProposalStats().getMinProposalSize()); + print("last_proposal_size", leader.getProposalStats().getLastBufferSize()); + print("max_proposal_size", leader.getProposalStats().getMaxBufferSize()); + print("min_proposal_size", leader.getProposalStats().getMinBufferSize()); } } http://git-wip-us.apache.org/repos/asf/zookeeper/blob/eb8ff57f/src/java/main/org/apache/zookeeper/server/command/StatCommand.java ---------------------------------------------------------------------- diff --git a/src/java/main/org/apache/zookeeper/server/command/StatCommand.java b/src/java/main/org/apache/zookeeper/server/command/StatCommand.java index d04f2f7..c6c4b87 100644 --- a/src/java/main/org/apache/zookeeper/server/command/StatCommand.java +++ b/src/java/main/org/apache/zookeeper/server/command/StatCommand.java @@ -25,7 +25,7 @@ import org.apache.zookeeper.server.ServerCnxn; import org.apache.zookeeper.server.ServerStats; import org.apache.zookeeper.server.quorum.Leader; import org.apache.zookeeper.server.quorum.LeaderZooKeeperServer; -import org.apache.zookeeper.server.quorum.ProposalStats; +import org.apache.zookeeper.server.quorum.BufferStats; import org.apache.zookeeper.server.quorum.ReadOnlyZooKeeperServer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -64,7 +64,7 @@ public class StatCommand extends AbstractFourLetterCommand { pw.println(zkServer.getZKDatabase().getNodeCount()); if (serverStats.getServerState().equals("leader")) { Leader leader = ((LeaderZooKeeperServer)zkServer).getLeader(); - ProposalStats proposalStats = leader.getProposalStats(); + BufferStats proposalStats = leader.getProposalStats(); pw.printf("Proposal sizes last/min/max: %s%n", proposalStats.toString()); } } http://git-wip-us.apache.org/repos/asf/zookeeper/blob/eb8ff57f/src/java/main/org/apache/zookeeper/server/quorum/BufferStats.java ---------------------------------------------------------------------- diff --git a/src/java/main/org/apache/zookeeper/server/quorum/BufferStats.java b/src/java/main/org/apache/zookeeper/server/quorum/BufferStats.java new file mode 100644 index 0000000..a76d80f --- /dev/null +++ b/src/java/main/org/apache/zookeeper/server/quorum/BufferStats.java @@ -0,0 +1,89 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.zookeeper.server.quorum; + +/** + * Provides live statistics about Jute buffer usage in term of proposal and client request size. + */ +public class BufferStats { + public static final int INIT_VALUE = -1; + + /** + * Size of the last buffer usage. + */ + private int lastBufferSize = INIT_VALUE; + + /** + * Size of the smallest buffer usage. + */ + private int minBufferSize = INIT_VALUE; + + /** + * Size of the largest buffer usage. + */ + private int maxBufferSize = INIT_VALUE; + + /** + * Size of the last buffer usage. + */ + public synchronized int getLastBufferSize() { + return lastBufferSize; + } + + /** + * Updates statistics by setting the last buffer usage size. + */ + public synchronized void setLastBufferSize(int value) { + lastBufferSize = value; + if (minBufferSize == INIT_VALUE || value < minBufferSize) { + minBufferSize = value; + } + if (value > maxBufferSize) { + maxBufferSize = value; + } + } + + /** + * Size of the smallest buffer usage. + */ + public synchronized int getMinBufferSize() { + return minBufferSize; + } + + /** + * Size of the largest buffer usage. + */ + public synchronized int getMaxBufferSize() { + return maxBufferSize; + } + + /** + * Reset statistics. + */ + public synchronized void reset() { + lastBufferSize = INIT_VALUE; + minBufferSize = INIT_VALUE; + maxBufferSize = INIT_VALUE; + } + + @Override + public synchronized String toString() { + return String.format("%d/%d/%d", lastBufferSize, minBufferSize, maxBufferSize); + } +} http://git-wip-us.apache.org/repos/asf/zookeeper/blob/eb8ff57f/src/java/main/org/apache/zookeeper/server/quorum/Leader.java ---------------------------------------------------------------------- diff --git a/src/java/main/org/apache/zookeeper/server/quorum/Leader.java b/src/java/main/org/apache/zookeeper/server/quorum/Leader.java index 8d48bf4..359d7e3 100644 --- a/src/java/main/org/apache/zookeeper/server/quorum/Leader.java +++ b/src/java/main/org/apache/zookeeper/server/quorum/Leader.java @@ -18,7 +18,6 @@ package org.apache.zookeeper.server.quorum; -import java.io.ByteArrayOutputStream; import java.io.BufferedInputStream; import java.io.IOException; import java.net.BindException; @@ -41,7 +40,6 @@ import java.util.concurrent.atomic.AtomicLong; import javax.security.sasl.SaslException; -import org.apache.jute.BinaryOutputArchive; import org.apache.zookeeper.ZooDefs.OpCode; import org.apache.zookeeper.common.Time; import org.apache.zookeeper.server.FinalRequestProcessor; @@ -106,9 +104,9 @@ public class Leader { private final HashSet<LearnerHandler> learners = new HashSet<LearnerHandler>(); - private final ProposalStats proposalStats; + private final BufferStats proposalStats; - public ProposalStats getProposalStats() { + public BufferStats getProposalStats() { return proposalStats; } @@ -229,7 +227,7 @@ public class Leader { Leader(QuorumPeer self,LeaderZooKeeperServer zk) throws IOException { this.self = self; - this.proposalStats = new ProposalStats(); + this.proposalStats = new BufferStats(); try { if (self.getQuorumListenOnAllIPs()) { ss = new ServerSocket(self.getQuorumAddress().getPort()); @@ -1060,7 +1058,7 @@ public class Leader { } byte[] data = SerializeUtils.serializeRequest(request); - proposalStats.setLastProposalSize(data.length); + proposalStats.setLastBufferSize(data.length); QuorumPacket pp = new QuorumPacket(Leader.PROPOSAL, request.zxid, data, null); Proposal p = new Proposal(); http://git-wip-us.apache.org/repos/asf/zookeeper/blob/eb8ff57f/src/java/main/org/apache/zookeeper/server/quorum/LeaderBean.java ---------------------------------------------------------------------- diff --git a/src/java/main/org/apache/zookeeper/server/quorum/LeaderBean.java b/src/java/main/org/apache/zookeeper/server/quorum/LeaderBean.java index 9f5eb24..4d4c856 100644 --- a/src/java/main/org/apache/zookeeper/server/quorum/LeaderBean.java +++ b/src/java/main/org/apache/zookeeper/server/quorum/LeaderBean.java @@ -55,17 +55,17 @@ public class LeaderBean extends ZooKeeperServerBean implements LeaderMXBean { @Override public int getLastProposalSize() { - return leader.getProposalStats().getLastProposalSize(); + return leader.getProposalStats().getLastBufferSize(); } @Override public int getMinProposalSize() { - return leader.getProposalStats().getMinProposalSize(); + return leader.getProposalStats().getMinBufferSize(); } @Override public int getMaxProposalSize() { - return leader.getProposalStats().getMaxProposalSize(); + return leader.getProposalStats().getMaxBufferSize(); } @Override http://git-wip-us.apache.org/repos/asf/zookeeper/blob/eb8ff57f/src/java/main/org/apache/zookeeper/server/quorum/ProposalStats.java ---------------------------------------------------------------------- diff --git a/src/java/main/org/apache/zookeeper/server/quorum/ProposalStats.java b/src/java/main/org/apache/zookeeper/server/quorum/ProposalStats.java deleted file mode 100644 index 2f3a9c7..0000000 --- a/src/java/main/org/apache/zookeeper/server/quorum/ProposalStats.java +++ /dev/null @@ -1,71 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.zookeeper.server.quorum; - -/** - * Provides live statistics about a running Leader. - */ -public class ProposalStats { - /** - * Size of the last generated proposal. This should fit into server's jute.maxbuffer setting. - */ - private int lastProposalSize = -1; - - /** - * Size of the smallest proposal which has been generated since the server was started. - */ - private int minProposalSize = -1; - - /** - * Size of the largest proposal which has been generated since the server was started. - */ - private int maxProposalSize = -1; - - public synchronized int getLastProposalSize() { - return lastProposalSize; - } - - synchronized void setLastProposalSize(int value) { - lastProposalSize = value; - if (minProposalSize == -1 || value < minProposalSize) { - minProposalSize = value; - } - if (value > maxProposalSize) { - maxProposalSize = value; - } - } - - public synchronized int getMinProposalSize() { - return minProposalSize; - } - - public synchronized int getMaxProposalSize() { - return maxProposalSize; - } - - public synchronized void reset() { - lastProposalSize = -1; - minProposalSize = -1; - maxProposalSize = -1; - } - - public synchronized String toString() { - return String.format("%d/%d/%d", lastProposalSize, minProposalSize, maxProposalSize); - } -} http://git-wip-us.apache.org/repos/asf/zookeeper/blob/eb8ff57f/src/java/test/org/apache/zookeeper/server/NIOServerCnxnTest.java ---------------------------------------------------------------------- diff --git a/src/java/test/org/apache/zookeeper/server/NIOServerCnxnTest.java b/src/java/test/org/apache/zookeeper/server/NIOServerCnxnTest.java index 538c06a..4362b2c 100644 --- a/src/java/test/org/apache/zookeeper/server/NIOServerCnxnTest.java +++ b/src/java/test/org/apache/zookeeper/server/NIOServerCnxnTest.java @@ -24,12 +24,19 @@ import org.apache.zookeeper.CreateMode; import org.apache.zookeeper.KeeperException; import org.apache.zookeeper.ZooDefs.Ids; import org.apache.zookeeper.ZooKeeper; +import org.apache.zookeeper.server.quorum.BufferStats; import org.apache.zookeeper.test.ClientBase; import org.junit.Assert; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.greaterThan; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertThat; + public class NIOServerCnxnTest extends ClientBase { private static final Logger LOG = LoggerFactory .getLogger(NIOServerCnxnTest.class); @@ -47,7 +54,7 @@ public class NIOServerCnxnTest extends ClientBase { // make sure zkclient works zk.create(path, "test".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); - Assert.assertNotNull("Didn't create znode:" + path, + assertNotNull("Didn't create znode:" + path, zk.exists(path, false)); // Defaults ServerCnxnFactory would be instantiated with // NIOServerCnxnFactory @@ -68,5 +75,21 @@ public class NIOServerCnxnTest extends ClientBase { } finally { zk.close(); } + + } + + @Test + public void testClientResponseStatsUpdate() throws IOException, InterruptedException, KeeperException { + try (ZooKeeper zk = createClient()) { + BufferStats clientResponseStats = serverFactory.getZooKeeperServer().serverStats().getClientResponseStats(); + assertThat("Last client response size should be initialized with INIT_VALUE", + clientResponseStats.getLastBufferSize(), equalTo(BufferStats.INIT_VALUE)); + + zk.create("/a", "test".getBytes(), Ids.OPEN_ACL_UNSAFE, + CreateMode.PERSISTENT); + + assertThat("Last client response size should be greater then zero after client request was performed", + clientResponseStats.getLastBufferSize(), greaterThan(0)); + } } } http://git-wip-us.apache.org/repos/asf/zookeeper/blob/eb8ff57f/src/java/test/org/apache/zookeeper/server/NettyServerCnxnTest.java ---------------------------------------------------------------------- diff --git a/src/java/test/org/apache/zookeeper/server/NettyServerCnxnTest.java b/src/java/test/org/apache/zookeeper/server/NettyServerCnxnTest.java index 7d1b854..2038d8b 100644 --- a/src/java/test/org/apache/zookeeper/server/NettyServerCnxnTest.java +++ b/src/java/test/org/apache/zookeeper/server/NettyServerCnxnTest.java @@ -20,14 +20,22 @@ package org.apache.zookeeper.server; import org.apache.zookeeper.CreateMode; +import org.apache.zookeeper.KeeperException; import org.apache.zookeeper.ZooDefs.Ids; import org.apache.zookeeper.ZooKeeper; +import org.apache.zookeeper.server.quorum.BufferStats; import org.apache.zookeeper.test.ClientBase; import org.junit.Assert; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.io.IOException; + +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.greaterThan; +import static org.junit.Assert.assertThat; + /** * Test verifies the behavior of NettyServerCnxn which represents a connection * from a client to the server. @@ -84,4 +92,19 @@ public class NettyServerCnxnTest extends ClientBase { zk.close(); } } + + @Test + public void testClientResponseStatsUpdate() throws IOException, InterruptedException, KeeperException { + try (ZooKeeper zk = createClient()) { + BufferStats clientResponseStats = serverFactory.getZooKeeperServer().serverStats().getClientResponseStats(); + assertThat("Last client response size should be initialized with INIT_VALUE", + clientResponseStats.getLastBufferSize(), equalTo(BufferStats.INIT_VALUE)); + + zk.create("/a", "test".getBytes(), Ids.OPEN_ACL_UNSAFE, + CreateMode.PERSISTENT); + + assertThat("Last client response size should be greater than 0 after client request was performed", + clientResponseStats.getLastBufferSize(), greaterThan(0)); + } + } } http://git-wip-us.apache.org/repos/asf/zookeeper/blob/eb8ff57f/src/java/test/org/apache/zookeeper/server/admin/CommandsTest.java ---------------------------------------------------------------------- diff --git a/src/java/test/org/apache/zookeeper/server/admin/CommandsTest.java b/src/java/test/org/apache/zookeeper/server/admin/CommandsTest.java index 47b86dd..aae788f 100644 --- a/src/java/test/org/apache/zookeeper/server/admin/CommandsTest.java +++ b/src/java/test/org/apache/zookeeper/server/admin/CommandsTest.java @@ -23,11 +23,13 @@ import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import java.io.IOException; +import java.nio.Buffer; import java.util.HashMap; import java.util.Map; import org.apache.zookeeper.server.ServerStats; import org.apache.zookeeper.server.ZooKeeperServer; +import org.apache.zookeeper.server.quorum.BufferStats; import org.apache.zookeeper.test.ClientBase; import org.junit.Test; @@ -173,7 +175,10 @@ public class CommandsTest extends ClientBase { new Field("ephemerals_count", Integer.class), new Field("approximate_data_size", Long.class), new Field("open_file_descriptor_count", Long.class), - new Field("max_file_descriptor_count", Long.class)); + new Field("max_file_descriptor_count", Long.class), + new Field("last_client_response_size", Integer.class), + new Field("max_client_response_size", Integer.class), + new Field("min_client_response_size", Integer.class)); } @Test @@ -187,7 +192,8 @@ public class CommandsTest extends ClientBase { new Field("version", String.class), new Field("read_only", Boolean.class), new Field("server_stats", ServerStats.class), - new Field("node_count", Integer.class)); + new Field("node_count", Integer.class), + new Field("client_response", BufferStats.class)); } @Test @@ -205,7 +211,8 @@ public class CommandsTest extends ClientBase { new Field("read_only", Boolean.class), new Field("server_stats", ServerStats.class), new Field("node_count", Integer.class), - new Field("connections", Iterable.class)); + new Field("connections", Iterable.class), + new Field("client_response", BufferStats.class)); } @Test http://git-wip-us.apache.org/repos/asf/zookeeper/blob/eb8ff57f/src/java/test/org/apache/zookeeper/server/quorum/BufferStatsTest.java ---------------------------------------------------------------------- diff --git a/src/java/test/org/apache/zookeeper/server/quorum/BufferStatsTest.java b/src/java/test/org/apache/zookeeper/server/quorum/BufferStatsTest.java new file mode 100644 index 0000000..8435e85 --- /dev/null +++ b/src/java/test/org/apache/zookeeper/server/quorum/BufferStatsTest.java @@ -0,0 +1,58 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.zookeeper.server.quorum; + +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +public class BufferStatsTest { + @Test + public void testSetProposalSizeSetMinMax() { + BufferStats stats = new BufferStats(); + assertEquals(-1, stats.getLastBufferSize()); + assertEquals(-1, stats.getMinBufferSize()); + assertEquals(-1, stats.getMaxBufferSize()); + stats.setLastBufferSize(10); + assertEquals(10, stats.getLastBufferSize()); + assertEquals(10, stats.getMinBufferSize()); + assertEquals(10, stats.getMaxBufferSize()); + stats.setLastBufferSize(20); + assertEquals(20, stats.getLastBufferSize()); + assertEquals(10, stats.getMinBufferSize()); + assertEquals(20, stats.getMaxBufferSize()); + stats.setLastBufferSize(5); + assertEquals(5, stats.getLastBufferSize()); + assertEquals(5, stats.getMinBufferSize()); + assertEquals(20, stats.getMaxBufferSize()); + } + + @Test + public void testReset() { + BufferStats stats = new BufferStats(); + stats.setLastBufferSize(10); + assertEquals(10, stats.getLastBufferSize()); + assertEquals(10, stats.getMinBufferSize()); + assertEquals(10, stats.getMaxBufferSize()); + stats.reset(); + assertEquals(-1, stats.getLastBufferSize()); + assertEquals(-1, stats.getMinBufferSize()); + assertEquals(-1, stats.getMaxBufferSize()); + } +} http://git-wip-us.apache.org/repos/asf/zookeeper/blob/eb8ff57f/src/java/test/org/apache/zookeeper/server/quorum/ProposalStatsTest.java ---------------------------------------------------------------------- diff --git a/src/java/test/org/apache/zookeeper/server/quorum/ProposalStatsTest.java b/src/java/test/org/apache/zookeeper/server/quorum/ProposalStatsTest.java deleted file mode 100644 index 1f71979..0000000 --- a/src/java/test/org/apache/zookeeper/server/quorum/ProposalStatsTest.java +++ /dev/null @@ -1,58 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.zookeeper.server.quorum; - -import org.junit.Test; - -import static org.junit.Assert.assertEquals; - -public class ProposalStatsTest { - @Test - public void testSetProposalSizeSetMinMax() { - ProposalStats stats = new ProposalStats(); - assertEquals(-1, stats.getLastProposalSize()); - assertEquals(-1, stats.getMinProposalSize()); - assertEquals(-1, stats.getMaxProposalSize()); - stats.setLastProposalSize(10); - assertEquals(10, stats.getLastProposalSize()); - assertEquals(10, stats.getMinProposalSize()); - assertEquals(10, stats.getMaxProposalSize()); - stats.setLastProposalSize(20); - assertEquals(20, stats.getLastProposalSize()); - assertEquals(10, stats.getMinProposalSize()); - assertEquals(20, stats.getMaxProposalSize()); - stats.setLastProposalSize(5); - assertEquals(5, stats.getLastProposalSize()); - assertEquals(5, stats.getMinProposalSize()); - assertEquals(20, stats.getMaxProposalSize()); - } - - @Test - public void testReset() { - ProposalStats stats = new ProposalStats(); - stats.setLastProposalSize(10); - assertEquals(10, stats.getLastProposalSize()); - assertEquals(10, stats.getMinProposalSize()); - assertEquals(10, stats.getMaxProposalSize()); - stats.reset(); - assertEquals(-1, stats.getLastProposalSize()); - assertEquals(-1, stats.getMinProposalSize()); - assertEquals(-1, stats.getMaxProposalSize()); - } -} http://git-wip-us.apache.org/repos/asf/zookeeper/blob/eb8ff57f/src/java/test/org/apache/zookeeper/server/quorum/StatCommandTest.java ---------------------------------------------------------------------- diff --git a/src/java/test/org/apache/zookeeper/server/quorum/StatCommandTest.java b/src/java/test/org/apache/zookeeper/server/quorum/StatCommandTest.java index 0328b7a..eccb6b1 100644 --- a/src/java/test/org/apache/zookeeper/server/quorum/StatCommandTest.java +++ b/src/java/test/org/apache/zookeeper/server/quorum/StatCommandTest.java @@ -27,7 +27,6 @@ import org.apache.zookeeper.server.command.StatCommand; import org.junit.Before; import org.junit.Test; -import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; import java.util.ArrayList; @@ -44,7 +43,7 @@ public class StatCommandTest { private ServerStats.Provider providerMock; @Before - public void setUp() throws IOException { + public void setUp() { outputWriter = new StringWriter(); ServerCnxn serverCnxnMock = mock(ServerCnxn.class); @@ -55,7 +54,7 @@ public class StatCommandTest { ZKDatabase zkDatabaseMock = mock(ZKDatabase.class); when(zks.getZKDatabase()).thenReturn(zkDatabaseMock); Leader leaderMock = mock(Leader.class); - when(leaderMock.getProposalStats()).thenReturn(new ProposalStats()); + when(leaderMock.getProposalStats()).thenReturn(new BufferStats()); when(zks.getLeader()).thenReturn(leaderMock); ServerCnxnFactory serverCnxnFactory = mock(ServerCnxnFactory.class); http://git-wip-us.apache.org/repos/asf/zookeeper/blob/eb8ff57f/src/java/test/org/apache/zookeeper/server/quorum/StatResetCommandTest.java ---------------------------------------------------------------------- diff --git a/src/java/test/org/apache/zookeeper/server/quorum/StatResetCommandTest.java b/src/java/test/org/apache/zookeeper/server/quorum/StatResetCommandTest.java index ddaf831..0c20c58 100644 --- a/src/java/test/org/apache/zookeeper/server/quorum/StatResetCommandTest.java +++ b/src/java/test/org/apache/zookeeper/server/quorum/StatResetCommandTest.java @@ -96,8 +96,8 @@ public class StatResetCommandTest { when(serverStats.getServerState()).thenReturn("leader"); - ProposalStats proposalStats = mock(ProposalStats.class); - when(leader.getProposalStats()).thenReturn(proposalStats); + BufferStats bufferStats = mock(BufferStats.class); + when(leader.getProposalStats()).thenReturn(bufferStats); // Act statResetCommand.commandRun(); @@ -106,6 +106,6 @@ public class StatResetCommandTest { String output = outputWriter.toString(); assertEquals("Server stats reset.\n", output); verify(serverStats, times(1)).reset(); - verify(proposalStats, times(1)).reset(); + verify(bufferStats, times(1)).reset(); } } http://git-wip-us.apache.org/repos/asf/zookeeper/blob/eb8ff57f/zookeeper-docs/src/documentation/content/xdocs/zookeeperAdmin.xml ---------------------------------------------------------------------- diff --git a/zookeeper-docs/src/documentation/content/xdocs/zookeeperAdmin.xml b/zookeeper-docs/src/documentation/content/xdocs/zookeeperAdmin.xml index a41eb01..8de0a66 100644 --- a/zookeeper-docs/src/documentation/content/xdocs/zookeeperAdmin.xml +++ b/zookeeper-docs/src/documentation/content/xdocs/zookeeperAdmin.xml @@ -1897,6 +1897,9 @@ server.3=zoo3:2888:3888</programlisting> zk_pending_syncs 0 - only exposed by the Leader zk_open_file_descriptor_count 23 - only available on Unix platforms zk_max_file_descriptor_count 1024 - only available on Unix platforms + zk_last_proposal_size 23 + zk_min_proposal_size 23 + zk_max_proposal_size 64 </programlisting> <para>The output is compatible with java properties format and the content
