You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@zookeeper.apache.org by ca...@apache.org on 2011/12/28 15:55:38 UTC

svn commit: r1225200 - in /zookeeper/trunk: ./ src/java/main/org/apache/zookeeper/server/ src/java/test/org/apache/zookeeper/server/quorum/ src/java/test/org/apache/zookeeper/test/

Author: camille
Date: Wed Dec 28 14:55:37 2011
New Revision: 1225200

URL: http://svn.apache.org/viewvc?rev=1225200&view=rev
Log:
ZOOKEEPER-1321: Add number of client connections metric in JMX and srvr (Neha Narkhede via camille)

Modified:
    zookeeper/trunk/CHANGES.txt
    zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java
    zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java
    zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java
    zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java
    zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java
    zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerStats.java
    zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java
    zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java
    zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java
    zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/Zab1_0Test.java
    zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java

Modified: zookeeper/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/zookeeper/trunk/CHANGES.txt?rev=1225200&r1=1225199&r2=1225200&view=diff
==============================================================================
--- zookeeper/trunk/CHANGES.txt (original)
+++ zookeeper/trunk/CHANGES.txt Wed Dec 28 14:55:37 2011
@@ -162,6 +162,8 @@ IMPROVEMENTS:
 
   ZOOKEEPER-1342. quorum Listener & LearnerCnxAcceptor are missing
   thread names (Rakesh R via phunt)
+  
+  ZOOKEEPER-1321. Add number of client connections metric in JMX and srvr (Neha Narkhede via camille)
 
 Release 3.4.0 - 
 

Modified: zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java
URL: http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java?rev=1225200&r1=1225199&r2=1225200&view=diff
==============================================================================
--- zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java (original)
+++ zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java Wed Dec 28 14:55:37 2011
@@ -749,7 +749,8 @@ public class NIOServerCnxn extends Serve
 
             print("packets_received", stats.getPacketsReceived());
             print("packets_sent", stats.getPacketsSent());
-
+            print("num_alive_connections", stats.getNumAliveClientConnections());
+            
             print("outstanding_requests", stats.getOutstandingRequests());
 
             print("server_state", stats.getServerState());

Modified: zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java
URL: http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java?rev=1225200&r1=1225199&r2=1225200&view=diff
==============================================================================
--- zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java (original)
+++ zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java Wed Dec 28 14:55:37 2011
@@ -32,14 +32,14 @@ import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Set;
 
+import javax.security.auth.login.Configuration;
+import javax.security.auth.login.LoginException;
+
 import org.apache.zookeeper.Login;
 import org.apache.zookeeper.server.auth.SaslServerCallbackHandler;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import javax.security.auth.login.Configuration;
-import javax.security.auth.login.LoginException;
-
 public class NIOServerCnxnFactory extends ServerCnxnFactory implements Runnable {
     private static final Logger LOG = LoggerFactory.getLogger(NIOServerCnxnFactory.class);
 
@@ -78,7 +78,6 @@ public class NIOServerCnxnFactory extend
 
     int maxClientCnxns = 60;
 
-
     /**
      * Construct a new server connection factory which will accept an unlimited number
      * of concurrent connections from each client (up to the file descriptor
@@ -122,7 +121,7 @@ public class NIOServerCnxnFactory extend
     public void setMaxClientCnxnsPerHost(int max) {
         maxClientCnxns = max;
     }
-
+   
     @Override
     public void start() {
         // ensure thread is started once and only once
@@ -187,7 +186,7 @@ public class NIOServerCnxnFactory extend
             return s.size();
         }
     }
-
+    
     public void run() {
         while (!ss.socket().isClosed()) {
             try {
@@ -323,4 +322,8 @@ public class NIOServerCnxnFactory extend
         return cnxns;
     }
 
+    @Override
+    public int getNumAliveConnections() {
+    	return cnxns.size();
+    }
 }

Modified: zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java
URL: http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java?rev=1225200&r1=1225199&r2=1225200&view=diff
==============================================================================
--- zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java (original)
+++ zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java Wed Dec 28 14:55:37 2011
@@ -560,7 +560,8 @@ public class NettyServerCnxn extends Ser
 
             print("packets_received", stats.getPacketsReceived());
             print("packets_sent", stats.getPacketsSent());
-
+            print("num_alive_connections", stats.getNumAliveClientConnections());
+            
             print("outstanding_requests", stats.getOutstandingRequests());
 
             print("server_state", stats.getServerState());

Modified: zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java
URL: http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java?rev=1225200&r1=1225199&r2=1225200&view=diff
==============================================================================
--- zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java (original)
+++ zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java Wed Dec 28 14:55:37 2011
@@ -411,5 +411,10 @@ public class NettyServerCnxnFactory exte
             }
         }
     }
+    
+    @Override
+    public int getNumAliveConnections() {
+    	return cnxns.size();
+    }
 
 }

Modified: zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java
URL: http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java?rev=1225200&r1=1225199&r2=1225200&view=diff
==============================================================================
--- zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java (original)
+++ zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java Wed Dec 28 14:55:37 2011
@@ -24,15 +24,16 @@ import java.nio.ByteBuffer;
 import java.util.HashMap;
 
 import javax.management.JMException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.apache.zookeeper.jmx.MBeanRegistry;
+
 import org.apache.zookeeper.Login;
+import org.apache.zookeeper.jmx.MBeanRegistry;
 import org.apache.zookeeper.server.auth.SaslServerCallbackHandler;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public abstract class ServerCnxnFactory {
 
-    public static final String ZOOKEEPER_SERVER_CNXN_FACTORY = "zookeeper.serverCnxnFactory";
+    public static final String ZOOKEEPER_SERVER_CNXN_FACTORY = "zookeeper.serverCnxnFactory";    
 
     public interface PacketProcessor {
         public void processPacket(ByteBuffer packet, ServerCnxn src);
@@ -49,6 +50,8 @@ public abstract class ServerCnxnFactory 
     
     public abstract Iterable<ServerCnxn> getConnections();
 
+    public abstract int getNumAliveConnections();
+    
     public abstract void closeSession(long sessionId);
 
     public abstract void configure(InetSocketAddress addr,

Modified: zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerStats.java
URL: http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerStats.java?rev=1225200&r1=1225199&r2=1225200&view=diff
==============================================================================
--- zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerStats.java (original)
+++ zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerStats.java Wed Dec 28 14:55:37 2011
@@ -19,6 +19,7 @@
 package org.apache.zookeeper.server;
 
 
+
 /**
  * Basic Server Statistics
  */
@@ -29,13 +30,14 @@ public class ServerStats {
     private long minLatency = Long.MAX_VALUE;
     private long totalLatency = 0;
     private long count = 0;
-
+    
     private final Provider provider;
 
     public interface Provider {
         public long getOutstandingRequests();
         public long getLastProcessedZxid();
         public String getState();
+        public int getNumAliveConnections();
     }
     
     public ServerStats(Provider provider) {
@@ -75,9 +77,14 @@ public class ServerStats {
     }
 
     public String getServerState() {
-        return provider.getState();
+    	return provider.getState();
     }
-    
+
+    /** The number of client connections alive to this server */
+    public int getNumAliveClientConnections() {
+    	return provider.getNumAliveConnections();
+    }
+
     @Override
     public String toString(){
         StringBuilder sb = new StringBuilder();
@@ -85,6 +92,8 @@ public class ServerStats {
                 + getAvgLatency() + "/" + getMaxLatency() + "\n");
         sb.append("Received: " + getPacketsReceived() + "\n");
         sb.append("Sent: " + getPacketsSent() + "\n");
+        sb.append("Connections: " + getNumAliveClientConnections() + "\n");
+        
         if (provider != null) {
             sb.append("Outstanding: " + getOutstandingRequests() + "\n");
             sb.append("Zxid: 0x"+ Long.toHexString(getLastProcessedZxid())+ "\n");
@@ -123,7 +132,6 @@ public class ServerStats {
         packetsReceived = 0;
         packetsSent = 0;
     }
-    
     synchronized public void reset() {
         resetLatency();
         resetRequestCounters();

Modified: zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java
URL: http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java?rev=1225200&r1=1225199&r2=1225200&view=diff
==============================================================================
--- zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java (original)
+++ zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java Wed Dec 28 14:55:37 2011
@@ -109,7 +109,7 @@ public class ZooKeeperServer implements 
     private ServerCnxnFactory serverCnxnFactory;
 
     private final ServerStats serverStats;
-
+ 
     void removeCnxn(ServerCnxn cnxn) {
         zkDb.removeCnxn(cnxn);
     }
@@ -254,7 +254,6 @@ public class ZooKeeperServer implements 
         }
     }
 
-
     /**
      * This should be called from a synchronized block on this!
      */
@@ -678,6 +677,14 @@ public class ZooKeeperServer implements 
     }
 
     /**
+     * return the total number of client connections that are alive
+     * to this server
+     */
+    public int getNumAliveConnections() {
+    	return serverCnxnFactory.getNumAliveConnections();
+    }
+    
+    /**
      * trunccate the log to get in sync with others
      * if in a quorum
      * @param zxid the zxid that it needs to get in sync

Modified: zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java
URL: http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java?rev=1225200&r1=1225199&r2=1225200&view=diff
==============================================================================
--- zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java (original)
+++ zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java Wed Dec 28 14:55:37 2011
@@ -140,4 +140,8 @@ public class ZooKeeperServerBean impleme
         serverStats.resetRequestCounters();
         serverStats.resetLatency();
     }
+
+	public long getNumAliveConnections() {
+		return zks.getNumAliveConnections();
+	}
 }

Modified: zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java
URL: http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java?rev=1225200&r1=1225199&r2=1225200&view=diff
==============================================================================
--- zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java (original)
+++ zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java Wed Dec 28 14:55:37 2011
@@ -103,4 +103,8 @@ public interface ZooKeeperServerMXBean {
      * Reset max latency statistics only.
      */
     public void resetMaxLatency();
+    /**
+     * @return number of alive client connections
+     */
+    public long getNumAliveConnections();
 }

Modified: zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/Zab1_0Test.java
URL: http://svn.apache.org/viewvc/zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/Zab1_0Test.java?rev=1225200&r1=1225199&r2=1225200&view=diff
==============================================================================
--- zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/Zab1_0Test.java (original)
+++ zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/Zab1_0Test.java Wed Dec 28 14:55:37 2011
@@ -212,6 +212,10 @@ public class Zab1_0Test {
         }
         public void closeAll() {
         }
+		@Override
+		public int getNumAliveConnections() {			
+			return 0;
+		}
     }
     static Socket[] getSocketPair() throws IOException {
         ServerSocket ss = new ServerSocket();

Modified: zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java
URL: http://svn.apache.org/viewvc/zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java?rev=1225200&r1=1225199&r2=1225200&view=diff
==============================================================================
--- zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java (original)
+++ zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java Wed Dec 28 14:55:37 2011
@@ -94,6 +94,9 @@ public class FourLetterWordsTest extends
         verify("srvr", "Outstanding");
         verify("cons", "queued");
         verify("mntr", "zk_server_state\tstandalone");
+        verify("mntr", "num_alive_connections");
+        verify("stat", "Connections");
+        verify("srvr", "Connections");
     }
 
     private String sendRequest(String cmd) throws IOException {
@@ -136,6 +139,8 @@ public class FourLetterWordsTest extends
         line = in.readLine();
         Assert.assertTrue(Pattern.matches("^Sent: \\d+$", line));
         line = in.readLine();
+        Assert.assertTrue(Pattern.matches("^Connections: \\d+$", line));
+        line = in.readLine();
         Assert.assertTrue(Pattern.matches("^Outstanding: \\d+$", line));
         line = in.readLine();
         Assert.assertTrue(Pattern.matches("^Zxid: 0x[\\da-fA-F]+$", line));



Re: svn commit: r1225200 - in /zookeeper/trunk: ./ src/java/main/org/apache/zookeeper/server/ src/java/test/org/apache/zookeeper/server/quorum/ src/java/test/org/apache/zookeeper/test/

Posted by Patrick Hunt <ph...@apache.org>.
I would suggest start clean, "link" the new jira to the old jiras, but
make the new description a useful summary of what this umbrella jira
should do and the issues faced. I say umbrella because we should split
it into sub-parts, as the whole will be relatively big chunk of work.

If you could also add a sub-task right off the bat to address the
cnxns issue I think that would be helpful as well.

Patrick

On Wed, Dec 28, 2011 at 2:21 PM, Camille Fournier <ca...@apache.org> wrote:
> :)
>
> That is a very good question. This should definitely be fixed in 3.5. I
> think your general idea in that tracker comment is right on:
>
> One option that would make this a lot less ugly would be to deprecate
>> support for 4letterwords on the client port in 3.5.0 (dep, not remove,
>> although provide an option to turn off via config), we'd designate a new
>> port specifically for 4letterwords. We'd fix this problem on the new port,
>> the old port would have the existing limitations.
>>
>> 3.6.0 we would remove 4lw on client port entirely.
>>
>> This is good for a number of reasons IMO – one is that having 4lw on the
>> client port is a bit of a security issue in some customers - as any client
>> has access to this port and it cannot by definition be firewalled. Many
>> admins would like to firewall this.
>>
>> In the process we could:
>> 1) make the new port fully b/w compatible with the existing functionality
>> 2) enable long lived sessions rather than polling
>> 3) provide support for "extended command syntax" which would enhance 4lw
>> features (for example to control the format of the output)
>> 4) etc...
>>
>
> Especially the points 1-4... we need this to be a handshake model, not just
> a connect and dump model.
> I want to work on this, but I will probably need someone a bit better at
> python to rewrite your monitoring server to use it.
> I would also welcome help on this issue, if there's someone else is
> interested in tackling it, I am happy to provide feedback and guidance.
>
> Should I start clean and make a new tracker or fold it into 1197?
>
> C
>
> On Wed, Dec 28, 2011 at 5:12 PM, Patrick Hunt <ph...@apache.org> wrote:
>
>> On Wed, Dec 28, 2011 at 1:53 PM, Camille Fournier <ca...@apache.org>
>> wrote:
>> > Fair enough. Syncs for all! It's a drop in the bucket compared to the
>> fact
>> > that we aren't handling the fundamental socket connections for 4lws
>> > correctly anyway.
>>
>> sorry. I see a blog post coming on. ;-)
>>
>> You're referring to the following (any more?)
>> https://issues.apache.org/jira/browse/ZOOKEEPER-1197
>> https://issues.apache.org/jira/browse/ZOOKEEPER-1237
>>
>> is this comment still a correct interpretation of the issue?
>>
>> https://issues.apache.org/jira/browse/ZOOKEEPER-737?focusedCommentId=13109067&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-13109067
>>
>> What would you like to do about these? I had proposed having a
>> separate 4lw port some time back in order to simplify/isolate. Should
>> we do this for 3.5.0? (deprecate the old port usage but keep it around
>> for a while) Something else?
>>
>> Patrick
>>
>> > On Wed, Dec 28, 2011 at 4:32 PM, Patrick Hunt <ph...@apache.org> wrote:
>> >
>> >> On Wed, Dec 28, 2011 at 1:26 PM, Camille Fournier <ca...@apache.org>
>> >> wrote:
>> >> > I'm not sure I agree in the assumption that monitoring pulls happen
>> >> > infrequently...
>> >>
>> >> Well that would be bad news then - see "stat" command processing and
>> >> similar. All the more reason to look at this in more depth.
>> >>
>> >> Patrick
>> >>
>> >>
>> >> > On Dec 28, 2011 4:24 PM, "Patrick Hunt" <ph...@apache.org> wrote:
>> >> >
>> >> >> They seem like distinct changes to me. In particular getting the size
>> >> >> is going to happen infrequently (monitoring pull) so I don't see a
>> >> >> problem fixing the existing patch in the same way the code currently
>> >> >> handles cnxns access, with a separate jira to do the refactoring. Am
>> I
>> >> >> missing something?
>> >> >>
>> >> >> Patrick
>> >> >>
>> >> >> On Wed, Dec 28, 2011 at 1:10 PM, Camille Fournier <
>> camille@apache.org>
>> >> >> wrote:
>> >> >> > I don't think creating it as a flat sync is a good idea, so if we
>> want
>> >> >> this
>> >> >> > I think we need to refactor that structure to be concurrent.
>> >> >> >
>> >> >> > C
>> >> >> > On Dec 28, 2011 2:24 PM, "Patrick Hunt" <ph...@apache.org> wrote:
>> >> >> >
>> >> >> >> I think it needs to be fixed. It's obviously incorrect. Also if
>> >> >> >> someone changes the underlying implementation at some point it
>> might
>> >> >> >> bite them.
>> >> >> >>
>> >> >> >> Given it wasn't applied to 3.4 branch yet I'd suggest revert, fix
>> the
>> >> >> >> patch, then reapply to both branches. (that's easiest/bulletproof
>> >> imo)
>> >> >> >>
>> >> >> >> I'd recommend a new ticket to fix the issues you identified
>> >> (refactor,
>> >> >> >> etc...) Neha was looking for further items to work on, this would
>> be
>> >> a
>> >> >> >> good one.
>> >> >> >>
>> >> >> >> Patrick
>> >> >> >>
>> >> >> >> On Wed, Dec 28, 2011 at 11:18 AM, Camille Fournier <
>> >> camille@apache.org>
>> >> >> >> wrote:
>> >> >> >> > Also, Pat, the JIRA is still open. I will look to revert in a
>> >> minute
>> >> >> >> > although I think the sync changes may necessitate a new JIRA
>> >> entirely.
>> >> >> >> >
>> >> >> >> > On Wed, Dec 28, 2011 at 1:31 PM, Camille Fournier <
>> >> camille@apache.org
>> >> >> >
>> >> >> >> wrote:
>> >> >> >> >> After looking for a few mins, here are my observations:
>> >> >> >> >>
>> >> >> >> >> The implementation of HashSet in jdk 1.6 uses an underlying
>> >> HashMap,
>> >> >> >> which
>> >> >> >> >> uses a bog-standard int for the size. So, I completely agree
>> that
>> >> we
>> >> >> can
>> >> >> >> >> get invalid results for a point in time. But does anyone really
>> >> care
>> >> >> >> about
>> >> >> >> >> the *exact* moment-in-time number of cnxns in the system, in a
>> >> system
>> >> >> >> where
>> >> >> >> >> cnxns are coming and going? At best you'll see a value that
>> will
>> >> >> likely
>> >> >> >> be
>> >> >> >> >> out of date the moment you read it.
>> >> >> >> >>
>> >> >> >> >> But, if we're going to do this, I do think there may be a case
>> for
>> >> >> >> >> refactoring to a concurrent data structure given that we are
>> >> randomly
>> >> >> >> >> syncing on the cnxns set in a way that makes adding additional
>> >> >> >> interactions
>> >> >> >> >> with it error prone in this way. And we should definitely
>> remove
>> >> that
>> >> >> >> >> getConnections method, if anyone ever iterated over that set
>> they
>> >> >> would
>> >> >> >> be
>> >> >> >> >> in a sad concurrency situation.
>> >> >> >> >> Seems possibly worth a whole new ticket to do this. What do you
>> >> >> think?
>> >> >> >> >>
>> >> >> >> >> Thanks,
>> >> >> >> >> C
>> >> >> >> >>
>> >> >> >> >> On Wed, Dec 28, 2011 at 1:12 PM, Camille Fournier <
>> >> >> camille@apache.org
>> >> >> >> >wrote:
>> >> >> >> >>
>> >> >> >> >>> I'm not sure it's meaningful enough to be worth the sync
>> >> overhead.
>> >> >> We
>> >> >> >> >>> should look into that. The alternative if we must is using a
>> >> proper
>> >> >> >> >>> concurrent collection. Neha, any thoughts?
>> >> >> >> >>>
>> >> >> >> >>> C
>> >> >> >> >>> On Dec 28, 2011 12:45 PM, "Patrick Hunt" <ph...@apache.org>
>> >> wrote:
>> >> >> >> >>>
>> >> >> >> >>>> I believe there is a bug in this commit. The "cnxns" size()
>> >> call is
>> >> >> >> >>>> not being synchronized. This will lead to invalid results at
>> >> best,
>> >> >> at
>> >> >> >> >>>> worst outright failure (hard to say w/o knowing the
>> >> implementation
>> >> >> of
>> >> >> >> >>>> HashSet).
>> >> >> >> >>>>
>> >> >> >> >>>> Camille can you work with Neha to get this fixed? Perhaps in
>> the
>> >> >> >> >>>> meantime (if it's going to take a while) you can revert this
>> >> >> change,
>> >> >> >> >>>> re-open the jira, update the patch, and reapply at some later
>> >> time?
>> >> >> >> >>>>
>> >> >> >> >>>> Patrick
>> >> >> >> >>>>
>> >> >> >> >>>> On Wed, Dec 28, 2011 at 6:55 AM,  <ca...@apache.org>
>> wrote:
>> >> >> >> >>>> > Author: camille
>> >> >> >> >>>> > Date: Wed Dec 28 14:55:37 2011
>> >> >> >> >>>> > New Revision: 1225200
>> >> >> >> >>>> >
>> >> >> >> >>>> > URL: http://svn.apache.org/viewvc?rev=1225200&view=rev
>> >> >> >> >>>> > Log:
>> >> >> >> >>>> > ZOOKEEPER-1321: Add number of client connections metric in
>> JMX
>> >> >> and
>> >> >> >> srvr
>> >> >> >> >>>> (Neha Narkhede via camille)
>> >> >> >> >>>> >
>> >> >> >> >>>> > Modified:
>> >> >> >> >>>> >    zookeeper/trunk/CHANGES.txt
>> >> >> >> >>>> >
>> >> >> >> >>>>
>> >> >> >>
>> >> >>
>> >>
>>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java
>> >> >> >> >>>> >
>> >> >> >> >>>>
>> >> >> >>
>> >> >>
>> >>
>>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java
>> >> >> >> >>>> >
>> >> >> >> >>>>
>> >> >> >>
>> >> >>
>> >>
>>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java
>> >> >> >> >>>> >
>> >> >> >> >>>>
>> >> >> >>
>> >> >>
>> >>
>>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java
>> >> >> >> >>>> >
>> >> >> >> >>>>
>> >> >> >>
>> >> >>
>> >>
>>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java
>> >> >> >> >>>> >
>> >> >> >> >>>>
>> >> >> >>
>> >> >>
>> >>
>>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerStats.java
>> >> >> >> >>>> >
>> >> >> >> >>>>
>> >> >> >>
>> >> >>
>> >>
>>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java
>> >> >> >> >>>> >
>> >> >> >> >>>>
>> >> >> >>
>> >> >>
>> >>
>>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java
>> >> >> >> >>>> >
>> >> >> >> >>>>
>> >> >> >>
>> >> >>
>> >>
>>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java
>> >> >> >> >>>> >
>> >> >> >> >>>>
>> >> >> >>
>> >> >>
>> >>
>>  zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/Zab1_0Test.java
>> >> >> >> >>>> >
>> >> >> >> >>>>
>> >> >> >>
>> >> >>
>> >>
>>  zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java
>> >> >> >> >>>> >
>> >> >> >> >>>> > Modified: zookeeper/trunk/CHANGES.txt
>> >> >> >> >>>> > URL:
>> >> >> >> >>>>
>> >> >> >>
>> >> >>
>> >>
>> http://svn.apache.org/viewvc/zookeeper/trunk/CHANGES.txt?rev=1225200&r1=1225199&r2=1225200&view=diff
>> >> >> >> >>>> >
>> >> >> >> >>>>
>> >> >> >>
>> >> >>
>> >>
>> ==============================================================================
>> >> >> >> >>>> > --- zookeeper/trunk/CHANGES.txt (original)
>> >> >> >> >>>> > +++ zookeeper/trunk/CHANGES.txt Wed Dec 28 14:55:37 2011
>> >> >> >> >>>> > @@ -162,6 +162,8 @@ IMPROVEMENTS:
>> >> >> >> >>>> >
>> >> >> >> >>>> >   ZOOKEEPER-1342. quorum Listener & LearnerCnxAcceptor are
>> >> >> missing
>> >> >> >> >>>> >   thread names (Rakesh R via phunt)
>> >> >> >> >>>> > +
>> >> >> >> >>>> > +  ZOOKEEPER-1321. Add number of client connections metric
>> in
>> >> JMX
>> >> >> >> and
>> >> >> >> >>>> srvr (Neha Narkhede via camille)
>> >> >> >> >>>> >
>> >> >> >> >>>> >  Release 3.4.0 -
>> >> >> >> >>>> >
>> >> >> >> >>>> >
>> >> >> >> >>>> > Modified:
>> >> >> >> >>>>
>> >> >> >>
>> >> >>
>> >>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java
>> >> >> >> >>>> > URL:
>> >> >> >> >>>>
>> >> >> >>
>> >> >>
>> >>
>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>> >> >> >> >>>> >
>> >> >> >> >>>>
>> >> >> >>
>> >> >>
>> >>
>> ==============================================================================
>> >> >> >> >>>> > ---
>> >> >> >> >>>>
>> >> >> >>
>> >> >>
>> >>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java
>> >> >> >> >>>> (original)
>> >> >> >> >>>> > +++
>> >> >> >> >>>>
>> >> >> >>
>> >> >>
>> >>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java
>> >> >> >> >>>> Wed Dec 28 14:55:37 2011
>> >> >> >> >>>> > @@ -749,7 +749,8 @@ public class NIOServerCnxn extends
>> Serve
>> >> >> >> >>>> >
>> >> >> >> >>>> >             print("packets_received",
>> >> >> stats.getPacketsReceived());
>> >> >> >> >>>> >             print("packets_sent", stats.getPacketsSent());
>> >> >> >> >>>> > -
>> >> >> >> >>>> > +            print("num_alive_connections",
>> >> >> >> >>>> stats.getNumAliveClientConnections());
>> >> >> >> >>>> > +
>> >> >> >> >>>> >             print("outstanding_requests",
>> >> >> >> >>>> stats.getOutstandingRequests());
>> >> >> >> >>>> >
>> >> >> >> >>>> >             print("server_state", stats.getServerState());
>> >> >> >> >>>> >
>> >> >> >> >>>> > Modified:
>> >> >> >> >>>>
>> >> >> >>
>> >> >>
>> >>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java
>> >> >> >> >>>> > URL:
>> >> >> >> >>>>
>> >> >> >>
>> >> >>
>> >>
>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>> >> >> >> >>>> >
>> >> >> >> >>>>
>> >> >> >>
>> >> >>
>> >>
>> ==============================================================================
>> >> >> >> >>>> > ---
>> >> >> >> >>>>
>> >> >> >>
>> >> >>
>> >>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java
>> >> >> >> >>>> (original)
>> >> >> >> >>>> > +++
>> >> >> >> >>>>
>> >> >> >>
>> >> >>
>> >>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java
>> >> >> >> >>>> Wed Dec 28 14:55:37 2011
>> >> >> >> >>>> > @@ -32,14 +32,14 @@ import java.util.HashMap;
>> >> >> >> >>>> >  import java.util.HashSet;
>> >> >> >> >>>> >  import java.util.Set;
>> >> >> >> >>>> >
>> >> >> >> >>>> > +import javax.security.auth.login.Configuration;
>> >> >> >> >>>> > +import javax.security.auth.login.LoginException;
>> >> >> >> >>>> > +
>> >> >> >> >>>> >  import org.apache.zookeeper.Login;
>> >> >> >> >>>> >  import
>> >> >> org.apache.zookeeper.server.auth.SaslServerCallbackHandler;
>> >> >> >> >>>> >  import org.slf4j.Logger;
>> >> >> >> >>>> >  import org.slf4j.LoggerFactory;
>> >> >> >> >>>> >
>> >> >> >> >>>> > -import javax.security.auth.login.Configuration;
>> >> >> >> >>>> > -import javax.security.auth.login.LoginException;
>> >> >> >> >>>> > -
>> >> >> >> >>>> >  public class NIOServerCnxnFactory extends
>> ServerCnxnFactory
>> >> >> >> implements
>> >> >> >> >>>> Runnable {
>> >> >> >> >>>> >     private static final Logger LOG =
>> >> >> >> >>>> LoggerFactory.getLogger(NIOServerCnxnFactory.class);
>> >> >> >> >>>> >
>> >> >> >> >>>> > @@ -78,7 +78,6 @@ public class NIOServerCnxnFactory extend
>> >> >> >> >>>> >
>> >> >> >> >>>> >     int maxClientCnxns = 60;
>> >> >> >> >>>> >
>> >> >> >> >>>> > -
>> >> >> >> >>>> >     /**
>> >> >> >> >>>> >      * Construct a new server connection factory which will
>> >> >> accept
>> >> >> >> an
>> >> >> >> >>>> unlimited number
>> >> >> >> >>>> >      * of concurrent connections from each client (up to
>> the
>> >> file
>> >> >> >> >>>> descriptor
>> >> >> >> >>>> > @@ -122,7 +121,7 @@ public class NIOServerCnxnFactory
>> extend
>> >> >> >> >>>> >     public void setMaxClientCnxnsPerHost(int max) {
>> >> >> >> >>>> >         maxClientCnxns = max;
>> >> >> >> >>>> >     }
>> >> >> >> >>>> > -
>> >> >> >> >>>> > +
>> >> >> >> >>>> >     @Override
>> >> >> >> >>>> >     public void start() {
>> >> >> >> >>>> >         // ensure thread is started once and only once
>> >> >> >> >>>> > @@ -187,7 +186,7 @@ public class NIOServerCnxnFactory
>> extend
>> >> >> >> >>>> >             return s.size();
>> >> >> >> >>>> >         }
>> >> >> >> >>>> >     }
>> >> >> >> >>>> > -
>> >> >> >> >>>> > +
>> >> >> >> >>>> >     public void run() {
>> >> >> >> >>>> >         while (!ss.socket().isClosed()) {
>> >> >> >> >>>> >             try {
>> >> >> >> >>>> > @@ -323,4 +322,8 @@ public class NIOServerCnxnFactory
>> extend
>> >> >> >> >>>> >         return cnxns;
>> >> >> >> >>>> >     }
>> >> >> >> >>>> >
>> >> >> >> >>>> > +    @Override
>> >> >> >> >>>> > +    public int getNumAliveConnections() {
>> >> >> >> >>>> > +       return cnxns.size();
>> >> >> >> >>>> > +    }
>> >> >> >> >>>> >  }
>> >> >> >> >>>> >
>> >> >> >> >>>> > Modified:
>> >> >> >> >>>>
>> >> >> >>
>> >> >>
>> >>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java
>> >> >> >> >>>> > URL:
>> >> >> >> >>>>
>> >> >> >>
>> >> >>
>> >>
>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>> >> >> >> >>>> >
>> >> >> >> >>>>
>> >> >> >>
>> >> >>
>> >>
>> ==============================================================================
>> >> >> >> >>>> > ---
>> >> >> >> >>>>
>> >> >> >>
>> >> >>
>> >>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java
>> >> >> >> >>>> (original)
>> >> >> >> >>>> > +++
>> >> >> >> >>>>
>> >> >> >>
>> >> >>
>> >>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java
>> >> >> >> >>>> Wed Dec 28 14:55:37 2011
>> >> >> >> >>>> > @@ -560,7 +560,8 @@ public class NettyServerCnxn extends
>> Ser
>> >> >> >> >>>> >
>> >> >> >> >>>> >             print("packets_received",
>> >> >> stats.getPacketsReceived());
>> >> >> >> >>>> >             print("packets_sent", stats.getPacketsSent());
>> >> >> >> >>>> > -
>> >> >> >> >>>> > +            print("num_alive_connections",
>> >> >> >> >>>> stats.getNumAliveClientConnections());
>> >> >> >> >>>> > +
>> >> >> >> >>>> >             print("outstanding_requests",
>> >> >> >> >>>> stats.getOutstandingRequests());
>> >> >> >> >>>> >
>> >> >> >> >>>> >             print("server_state", stats.getServerState());
>> >> >> >> >>>> >
>> >> >> >> >>>> > Modified:
>> >> >> >> >>>>
>> >> >> >>
>> >> >>
>> >>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java
>> >> >> >> >>>> > URL:
>> >> >> >> >>>>
>> >> >> >>
>> >> >>
>> >>
>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>> >> >> >> >>>> >
>> >> >> >> >>>>
>> >> >> >>
>> >> >>
>> >>
>> ==============================================================================
>> >> >> >> >>>> > ---
>> >> >> >> >>>>
>> >> >> >>
>> >> >>
>> >>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java
>> >> >> >> >>>> (original)
>> >> >> >> >>>> > +++
>> >> >> >> >>>>
>> >> >> >>
>> >> >>
>> >>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java
>> >> >> >> >>>> Wed Dec 28 14:55:37 2011
>> >> >> >> >>>> > @@ -411,5 +411,10 @@ public class NettyServerCnxnFactory
>> exte
>> >> >> >> >>>> >             }
>> >> >> >> >>>> >         }
>> >> >> >> >>>> >     }
>> >> >> >> >>>> > +
>> >> >> >> >>>> > +    @Override
>> >> >> >> >>>> > +    public int getNumAliveConnections() {
>> >> >> >> >>>> > +       return cnxns.size();
>> >> >> >> >>>> > +    }
>> >> >> >> >>>> >
>> >> >> >> >>>> >  }
>> >> >> >> >>>> >
>> >> >> >> >>>> > Modified:
>> >> >> >> >>>>
>> >> >> >>
>> >> >>
>> >>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java
>> >> >> >> >>>> > URL:
>> >> >> >> >>>>
>> >> >> >>
>> >> >>
>> >>
>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>> >> >> >> >>>> >
>> >> >> >> >>>>
>> >> >> >>
>> >> >>
>> >>
>> ==============================================================================
>> >> >> >> >>>> > ---
>> >> >> >> >>>>
>> >> >> >>
>> >> >>
>> >>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java
>> >> >> >> >>>> (original)
>> >> >> >> >>>> > +++
>> >> >> >> >>>>
>> >> >> >>
>> >> >>
>> >>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java
>> >> >> >> >>>> Wed Dec 28 14:55:37 2011
>> >> >> >> >>>> > @@ -24,15 +24,16 @@ import java.nio.ByteBuffer;
>> >> >> >> >>>> >  import java.util.HashMap;
>> >> >> >> >>>> >
>> >> >> >> >>>> >  import javax.management.JMException;
>> >> >> >> >>>> > -import org.slf4j.Logger;
>> >> >> >> >>>> > -import org.slf4j.LoggerFactory;
>> >> >> >> >>>> > -import org.apache.zookeeper.jmx.MBeanRegistry;
>> >> >> >> >>>> > +
>> >> >> >> >>>> >  import org.apache.zookeeper.Login;
>> >> >> >> >>>> > +import org.apache.zookeeper.jmx.MBeanRegistry;
>> >> >> >> >>>> >  import
>> >> >> org.apache.zookeeper.server.auth.SaslServerCallbackHandler;
>> >> >> >> >>>> > +import org.slf4j.Logger;
>> >> >> >> >>>> > +import org.slf4j.LoggerFactory;
>> >> >> >> >>>> >
>> >> >> >> >>>> >  public abstract class ServerCnxnFactory {
>> >> >> >> >>>> >
>> >> >> >> >>>> > -    public static final String
>> ZOOKEEPER_SERVER_CNXN_FACTORY
>> >> =
>> >> >> >> >>>> "zookeeper.serverCnxnFactory";
>> >> >> >> >>>> > +    public static final String
>> ZOOKEEPER_SERVER_CNXN_FACTORY
>> >> =
>> >> >> >> >>>> "zookeeper.serverCnxnFactory";
>> >> >> >> >>>> >
>> >> >> >> >>>> >     public interface PacketProcessor {
>> >> >> >> >>>> >         public void processPacket(ByteBuffer packet,
>> >> ServerCnxn
>> >> >> >> src);
>> >> >> >> >>>> > @@ -49,6 +50,8 @@ public abstract class ServerCnxnFactory
>> >> >> >> >>>> >
>> >> >> >> >>>> >     public abstract Iterable<ServerCnxn> getConnections();
>> >> >> >> >>>> >
>> >> >> >> >>>> > +    public abstract int getNumAliveConnections();
>> >> >> >> >>>> > +
>> >> >> >> >>>> >     public abstract void closeSession(long sessionId);
>> >> >> >> >>>> >
>> >> >> >> >>>> >     public abstract void configure(InetSocketAddress addr,
>> >> >> >> >>>> >
>> >> >> >> >>>> > Modified:
>> >> >> >> >>>>
>> >> >> >>
>> >> >>
>> >>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerStats.java
>> >> >> >> >>>> > URL:
>> >> >> >> >>>>
>> >> >> >>
>> >> >>
>> >>
>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerStats.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>> >> >> >> >>>> >
>> >> >> >> >>>>
>> >> >> >>
>> >> >>
>> >>
>> ==============================================================================
>> >> >> >> >>>> > ---
>> >> >> >> >>>>
>> >> >> >>
>> >> >>
>> >>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerStats.java
>> >> >> >> >>>> (original)
>> >> >> >> >>>> > +++
>> >> >> >> >>>>
>> >> >> >>
>> >> >>
>> >>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerStats.java
>> >> >> >> >>>> Wed Dec 28 14:55:37 2011
>> >> >> >> >>>> > @@ -19,6 +19,7 @@
>> >> >> >> >>>> >  package org.apache.zookeeper.server;
>> >> >> >> >>>> >
>> >> >> >> >>>> >
>> >> >> >> >>>> > +
>> >> >> >> >>>> >  /**
>> >> >> >> >>>> >  * Basic Server Statistics
>> >> >> >> >>>> >  */
>> >> >> >> >>>> > @@ -29,13 +30,14 @@ public class ServerStats {
>> >> >> >> >>>> >     private long minLatency = Long.MAX_VALUE;
>> >> >> >> >>>> >     private long totalLatency = 0;
>> >> >> >> >>>> >     private long count = 0;
>> >> >> >> >>>> > -
>> >> >> >> >>>> > +
>> >> >> >> >>>> >     private final Provider provider;
>> >> >> >> >>>> >
>> >> >> >> >>>> >     public interface Provider {
>> >> >> >> >>>> >         public long getOutstandingRequests();
>> >> >> >> >>>> >         public long getLastProcessedZxid();
>> >> >> >> >>>> >         public String getState();
>> >> >> >> >>>> > +        public int getNumAliveConnections();
>> >> >> >> >>>> >     }
>> >> >> >> >>>> >
>> >> >> >> >>>> >     public ServerStats(Provider provider) {
>> >> >> >> >>>> > @@ -75,9 +77,14 @@ public class ServerStats {
>> >> >> >> >>>> >     }
>> >> >> >> >>>> >
>> >> >> >> >>>> >     public String getServerState() {
>> >> >> >> >>>> > -        return provider.getState();
>> >> >> >> >>>> > +       return provider.getState();
>> >> >> >> >>>> >     }
>> >> >> >> >>>> > -
>> >> >> >> >>>> > +
>> >> >> >> >>>> > +    /** The number of client connections alive to this
>> >> server */
>> >> >> >> >>>> > +    public int getNumAliveClientConnections() {
>> >> >> >> >>>> > +       return provider.getNumAliveConnections();
>> >> >> >> >>>> > +    }
>> >> >> >> >>>> > +
>> >> >> >> >>>> >     @Override
>> >> >> >> >>>> >     public String toString(){
>> >> >> >> >>>> >         StringBuilder sb = new StringBuilder();
>> >> >> >> >>>> > @@ -85,6 +92,8 @@ public class ServerStats {
>> >> >> >> >>>> >                 + getAvgLatency() + "/" + getMaxLatency() +
>> >> >> "\n");
>> >> >> >> >>>> >         sb.append("Received: " + getPacketsReceived() +
>> "\n");
>> >> >> >> >>>> >         sb.append("Sent: " + getPacketsSent() + "\n");
>> >> >> >> >>>> > +        sb.append("Connections: " +
>> >> >> getNumAliveClientConnections()
>> >> >> >> +
>> >> >> >> >>>> "\n");
>> >> >> >> >>>> > +
>> >> >> >> >>>> >         if (provider != null) {
>> >> >> >> >>>> >             sb.append("Outstanding: " +
>> >> getOutstandingRequests()
>> >> >> +
>> >> >> >> >>>> "\n");
>> >> >> >> >>>> >             sb.append("Zxid: 0x"+
>> >> >> >> >>>> Long.toHexString(getLastProcessedZxid())+ "\n");
>> >> >> >> >>>> > @@ -123,7 +132,6 @@ public class ServerStats {
>> >> >> >> >>>> >         packetsReceived = 0;
>> >> >> >> >>>> >         packetsSent = 0;
>> >> >> >> >>>> >     }
>> >> >> >> >>>> > -
>> >> >> >> >>>> >     synchronized public void reset() {
>> >> >> >> >>>> >         resetLatency();
>> >> >> >> >>>> >         resetRequestCounters();
>> >> >> >> >>>> >
>> >> >> >> >>>> > Modified:
>> >> >> >> >>>>
>> >> >> >>
>> >> >>
>> >>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java
>> >> >> >> >>>> > URL:
>> >> >> >> >>>>
>> >> >> >>
>> >> >>
>> >>
>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>> >> >> >> >>>> >
>> >> >> >> >>>>
>> >> >> >>
>> >> >>
>> >>
>> ==============================================================================
>> >> >> >> >>>> > ---
>> >> >> >> >>>>
>> >> >> >>
>> >> >>
>> >>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java
>> >> >> >> >>>> (original)
>> >> >> >> >>>> > +++
>> >> >> >> >>>>
>> >> >> >>
>> >> >>
>> >>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java
>> >> >> >> >>>> Wed Dec 28 14:55:37 2011
>> >> >> >> >>>> > @@ -109,7 +109,7 @@ public class ZooKeeperServer implements
>> >> >> >> >>>> >     private ServerCnxnFactory serverCnxnFactory;
>> >> >> >> >>>> >
>> >> >> >> >>>> >     private final ServerStats serverStats;
>> >> >> >> >>>> > -
>> >> >> >> >>>> > +
>> >> >> >> >>>> >     void removeCnxn(ServerCnxn cnxn) {
>> >> >> >> >>>> >         zkDb.removeCnxn(cnxn);
>> >> >> >> >>>> >     }
>> >> >> >> >>>> > @@ -254,7 +254,6 @@ public class ZooKeeperServer implements
>> >> >> >> >>>> >         }
>> >> >> >> >>>> >     }
>> >> >> >> >>>> >
>> >> >> >> >>>> > -
>> >> >> >> >>>> >     /**
>> >> >> >> >>>> >      * This should be called from a synchronized block on
>> >> this!
>> >> >> >> >>>> >      */
>> >> >> >> >>>> > @@ -678,6 +677,14 @@ public class ZooKeeperServer
>> implements
>> >> >> >> >>>> >     }
>> >> >> >> >>>> >
>> >> >> >> >>>> >     /**
>> >> >> >> >>>> > +     * return the total number of client connections that
>> are
>> >> >> alive
>> >> >> >> >>>> > +     * to this server
>> >> >> >> >>>> > +     */
>> >> >> >> >>>> > +    public int getNumAliveConnections() {
>> >> >> >> >>>> > +       return serverCnxnFactory.getNumAliveConnections();
>> >> >> >> >>>> > +    }
>> >> >> >> >>>> > +
>> >> >> >> >>>> > +    /**
>> >> >> >> >>>> >      * trunccate the log to get in sync with others
>> >> >> >> >>>> >      * if in a quorum
>> >> >> >> >>>> >      * @param zxid the zxid that it needs to get in sync
>> >> >> >> >>>> >
>> >> >> >> >>>> > Modified:
>> >> >> >> >>>>
>> >> >> >>
>> >> >>
>> >>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java
>> >> >> >> >>>> > URL:
>> >> >> >> >>>>
>> >> >> >>
>> >> >>
>> >>
>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>> >> >> >> >>>> >
>> >> >> >> >>>>
>> >> >> >>
>> >> >>
>> >>
>> ==============================================================================
>> >> >> >> >>>> > ---
>> >> >> >> >>>>
>> >> >> >>
>> >> >>
>> >>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java
>> >> >> >> >>>> (original)
>> >> >> >> >>>> > +++
>> >> >> >> >>>>
>> >> >> >>
>> >> >>
>> >>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java
>> >> >> >> >>>> Wed Dec 28 14:55:37 2011
>> >> >> >> >>>> > @@ -140,4 +140,8 @@ public class ZooKeeperServerBean
>> impleme
>> >> >> >> >>>> >         serverStats.resetRequestCounters();
>> >> >> >> >>>> >         serverStats.resetLatency();
>> >> >> >> >>>> >     }
>> >> >> >> >>>> > +
>> >> >> >> >>>> > +       public long getNumAliveConnections() {
>> >> >> >> >>>> > +               return zks.getNumAliveConnections();
>> >> >> >> >>>> > +       }
>> >> >> >> >>>> >  }
>> >> >> >> >>>> >
>> >> >> >> >>>> > Modified:
>> >> >> >> >>>>
>> >> >> >>
>> >> >>
>> >>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java
>> >> >> >> >>>> > URL:
>> >> >> >> >>>>
>> >> >> >>
>> >> >>
>> >>
>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>> >> >> >> >>>> >
>> >> >> >> >>>>
>> >> >> >>
>> >> >>
>> >>
>> ==============================================================================
>> >> >> >> >>>> > ---
>> >> >> >> >>>>
>> >> >> >>
>> >> >>
>> >>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java
>> >> >> >> >>>> (original)
>> >> >> >> >>>> > +++
>> >> >> >> >>>>
>> >> >> >>
>> >> >>
>> >>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java
>> >> >> >> >>>> Wed Dec 28 14:55:37 2011
>> >> >> >> >>>> > @@ -103,4 +103,8 @@ public interface ZooKeeperServerMXBean
>> {
>> >> >> >> >>>> >      * Reset max latency statistics only.
>> >> >> >> >>>> >      */
>> >> >> >> >>>> >     public void resetMaxLatency();
>> >> >> >> >>>> > +    /**
>> >> >> >> >>>> > +     * @return number of alive client connections
>> >> >> >> >>>> > +     */
>> >> >> >> >>>> > +    public long getNumAliveConnections();
>> >> >> >> >>>> >  }
>> >> >> >> >>>> >
>> >> >> >> >>>> > Modified:
>> >> >> >> >>>>
>> >> >> >>
>> >> >>
>> >>
>> zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/Zab1_0Test.java
>> >> >> >> >>>> > URL:
>> >> >> >> >>>>
>> >> >> >>
>> >> >>
>> >>
>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/Zab1_0Test.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>> >> >> >> >>>> >
>> >> >> >> >>>>
>> >> >> >>
>> >> >>
>> >>
>> ==============================================================================
>> >> >> >> >>>> > ---
>> >> >> >> >>>>
>> >> >> >>
>> >> >>
>> >>
>> zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/Zab1_0Test.java
>> >> >> >> >>>> (original)
>> >> >> >> >>>> > +++
>> >> >> >> >>>>
>> >> >> >>
>> >> >>
>> >>
>> zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/Zab1_0Test.java
>> >> >> >> >>>> Wed Dec 28 14:55:37 2011
>> >> >> >> >>>> > @@ -212,6 +212,10 @@ public class Zab1_0Test {
>> >> >> >> >>>> >         }
>> >> >> >> >>>> >         public void closeAll() {
>> >> >> >> >>>> >         }
>> >> >> >> >>>> > +               @Override
>> >> >> >> >>>> > +               public int getNumAliveConnections() {
>> >> >> >> >>>> > +                       return 0;
>> >> >> >> >>>> > +               }
>> >> >> >> >>>> >     }
>> >> >> >> >>>> >     static Socket[] getSocketPair() throws IOException {
>> >> >> >> >>>> >         ServerSocket ss = new ServerSocket();
>> >> >> >> >>>> >
>> >> >> >> >>>> > Modified:
>> >> >> >> >>>>
>> >> >> >>
>> >> >>
>> >>
>> zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java
>> >> >> >> >>>> > URL:
>> >> >> >> >>>>
>> >> >> >>
>> >> >>
>> >>
>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>> >> >> >> >>>> >
>> >> >> >> >>>>
>> >> >> >>
>> >> >>
>> >>
>> ==============================================================================
>> >> >> >> >>>> > ---
>> >> >> >> >>>>
>> >> >> >>
>> >> >>
>> >>
>> zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java
>> >> >> >> >>>> (original)
>> >> >> >> >>>> > +++
>> >> >> >> >>>>
>> >> >> >>
>> >> >>
>> >>
>> zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java
>> >> >> >> >>>> Wed Dec 28 14:55:37 2011
>> >> >> >> >>>> > @@ -94,6 +94,9 @@ public class FourLetterWordsTest extends
>> >> >> >> >>>> >         verify("srvr", "Outstanding");
>> >> >> >> >>>> >         verify("cons", "queued");
>> >> >> >> >>>> >         verify("mntr", "zk_server_state\tstandalone");
>> >> >> >> >>>> > +        verify("mntr", "num_alive_connections");
>> >> >> >> >>>> > +        verify("stat", "Connections");
>> >> >> >> >>>> > +        verify("srvr", "Connections");
>> >> >> >> >>>> >     }
>> >> >> >> >>>> >
>> >> >> >> >>>> >     private String sendRequest(String cmd) throws
>> IOException
>> >> {
>> >> >> >> >>>> > @@ -136,6 +139,8 @@ public class FourLetterWordsTest
>> extends
>> >> >> >> >>>> >         line = in.readLine();
>> >> >> >> >>>> >         Assert.assertTrue(Pattern.matches("^Sent: \\d+$",
>> >> line));
>> >> >> >> >>>> >         line = in.readLine();
>> >> >> >> >>>> > +        Assert.assertTrue(Pattern.matches("^Connections:
>> >> \\d+$",
>> >> >> >> >>>> line));
>> >> >> >> >>>> > +        line = in.readLine();
>> >> >> >> >>>> >         Assert.assertTrue(Pattern.matches("^Outstanding:
>> >> \\d+$",
>> >> >> >> line));
>> >> >> >> >>>> >         line = in.readLine();
>> >> >> >> >>>> >         Assert.assertTrue(Pattern.matches("^Zxid:
>> >> >> 0x[\\da-fA-F]+$",
>> >> >> >> >>>> line));
>> >> >> >> >>>> >
>> >> >> >> >>>> >
>> >> >> >> >>>>
>> >> >> >> >>>
>> >> >> >>
>> >> >>
>> >>
>>

Re: svn commit: r1225200 - in /zookeeper/trunk: ./ src/java/main/org/apache/zookeeper/server/ src/java/test/org/apache/zookeeper/server/quorum/ src/java/test/org/apache/zookeeper/test/

Posted by Camille Fournier <ca...@apache.org>.
:)

That is a very good question. This should definitely be fixed in 3.5. I
think your general idea in that tracker comment is right on:

One option that would make this a lot less ugly would be to deprecate
> support for 4letterwords on the client port in 3.5.0 (dep, not remove,
> although provide an option to turn off via config), we'd designate a new
> port specifically for 4letterwords. We'd fix this problem on the new port,
> the old port would have the existing limitations.
>
> 3.6.0 we would remove 4lw on client port entirely.
>
> This is good for a number of reasons IMO – one is that having 4lw on the
> client port is a bit of a security issue in some customers - as any client
> has access to this port and it cannot by definition be firewalled. Many
> admins would like to firewall this.
>
> In the process we could:
> 1) make the new port fully b/w compatible with the existing functionality
> 2) enable long lived sessions rather than polling
> 3) provide support for "extended command syntax" which would enhance 4lw
> features (for example to control the format of the output)
> 4) etc...
>

Especially the points 1-4... we need this to be a handshake model, not just
a connect and dump model.
I want to work on this, but I will probably need someone a bit better at
python to rewrite your monitoring server to use it.
I would also welcome help on this issue, if there's someone else is
interested in tackling it, I am happy to provide feedback and guidance.

Should I start clean and make a new tracker or fold it into 1197?

C

On Wed, Dec 28, 2011 at 5:12 PM, Patrick Hunt <ph...@apache.org> wrote:

> On Wed, Dec 28, 2011 at 1:53 PM, Camille Fournier <ca...@apache.org>
> wrote:
> > Fair enough. Syncs for all! It's a drop in the bucket compared to the
> fact
> > that we aren't handling the fundamental socket connections for 4lws
> > correctly anyway.
>
> sorry. I see a blog post coming on. ;-)
>
> You're referring to the following (any more?)
> https://issues.apache.org/jira/browse/ZOOKEEPER-1197
> https://issues.apache.org/jira/browse/ZOOKEEPER-1237
>
> is this comment still a correct interpretation of the issue?
>
> https://issues.apache.org/jira/browse/ZOOKEEPER-737?focusedCommentId=13109067&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-13109067
>
> What would you like to do about these? I had proposed having a
> separate 4lw port some time back in order to simplify/isolate. Should
> we do this for 3.5.0? (deprecate the old port usage but keep it around
> for a while) Something else?
>
> Patrick
>
> > On Wed, Dec 28, 2011 at 4:32 PM, Patrick Hunt <ph...@apache.org> wrote:
> >
> >> On Wed, Dec 28, 2011 at 1:26 PM, Camille Fournier <ca...@apache.org>
> >> wrote:
> >> > I'm not sure I agree in the assumption that monitoring pulls happen
> >> > infrequently...
> >>
> >> Well that would be bad news then - see "stat" command processing and
> >> similar. All the more reason to look at this in more depth.
> >>
> >> Patrick
> >>
> >>
> >> > On Dec 28, 2011 4:24 PM, "Patrick Hunt" <ph...@apache.org> wrote:
> >> >
> >> >> They seem like distinct changes to me. In particular getting the size
> >> >> is going to happen infrequently (monitoring pull) so I don't see a
> >> >> problem fixing the existing patch in the same way the code currently
> >> >> handles cnxns access, with a separate jira to do the refactoring. Am
> I
> >> >> missing something?
> >> >>
> >> >> Patrick
> >> >>
> >> >> On Wed, Dec 28, 2011 at 1:10 PM, Camille Fournier <
> camille@apache.org>
> >> >> wrote:
> >> >> > I don't think creating it as a flat sync is a good idea, so if we
> want
> >> >> this
> >> >> > I think we need to refactor that structure to be concurrent.
> >> >> >
> >> >> > C
> >> >> > On Dec 28, 2011 2:24 PM, "Patrick Hunt" <ph...@apache.org> wrote:
> >> >> >
> >> >> >> I think it needs to be fixed. It's obviously incorrect. Also if
> >> >> >> someone changes the underlying implementation at some point it
> might
> >> >> >> bite them.
> >> >> >>
> >> >> >> Given it wasn't applied to 3.4 branch yet I'd suggest revert, fix
> the
> >> >> >> patch, then reapply to both branches. (that's easiest/bulletproof
> >> imo)
> >> >> >>
> >> >> >> I'd recommend a new ticket to fix the issues you identified
> >> (refactor,
> >> >> >> etc...) Neha was looking for further items to work on, this would
> be
> >> a
> >> >> >> good one.
> >> >> >>
> >> >> >> Patrick
> >> >> >>
> >> >> >> On Wed, Dec 28, 2011 at 11:18 AM, Camille Fournier <
> >> camille@apache.org>
> >> >> >> wrote:
> >> >> >> > Also, Pat, the JIRA is still open. I will look to revert in a
> >> minute
> >> >> >> > although I think the sync changes may necessitate a new JIRA
> >> entirely.
> >> >> >> >
> >> >> >> > On Wed, Dec 28, 2011 at 1:31 PM, Camille Fournier <
> >> camille@apache.org
> >> >> >
> >> >> >> wrote:
> >> >> >> >> After looking for a few mins, here are my observations:
> >> >> >> >>
> >> >> >> >> The implementation of HashSet in jdk 1.6 uses an underlying
> >> HashMap,
> >> >> >> which
> >> >> >> >> uses a bog-standard int for the size. So, I completely agree
> that
> >> we
> >> >> can
> >> >> >> >> get invalid results for a point in time. But does anyone really
> >> care
> >> >> >> about
> >> >> >> >> the *exact* moment-in-time number of cnxns in the system, in a
> >> system
> >> >> >> where
> >> >> >> >> cnxns are coming and going? At best you'll see a value that
> will
> >> >> likely
> >> >> >> be
> >> >> >> >> out of date the moment you read it.
> >> >> >> >>
> >> >> >> >> But, if we're going to do this, I do think there may be a case
> for
> >> >> >> >> refactoring to a concurrent data structure given that we are
> >> randomly
> >> >> >> >> syncing on the cnxns set in a way that makes adding additional
> >> >> >> interactions
> >> >> >> >> with it error prone in this way. And we should definitely
> remove
> >> that
> >> >> >> >> getConnections method, if anyone ever iterated over that set
> they
> >> >> would
> >> >> >> be
> >> >> >> >> in a sad concurrency situation.
> >> >> >> >> Seems possibly worth a whole new ticket to do this. What do you
> >> >> think?
> >> >> >> >>
> >> >> >> >> Thanks,
> >> >> >> >> C
> >> >> >> >>
> >> >> >> >> On Wed, Dec 28, 2011 at 1:12 PM, Camille Fournier <
> >> >> camille@apache.org
> >> >> >> >wrote:
> >> >> >> >>
> >> >> >> >>> I'm not sure it's meaningful enough to be worth the sync
> >> overhead.
> >> >> We
> >> >> >> >>> should look into that. The alternative if we must is using a
> >> proper
> >> >> >> >>> concurrent collection. Neha, any thoughts?
> >> >> >> >>>
> >> >> >> >>> C
> >> >> >> >>> On Dec 28, 2011 12:45 PM, "Patrick Hunt" <ph...@apache.org>
> >> wrote:
> >> >> >> >>>
> >> >> >> >>>> I believe there is a bug in this commit. The "cnxns" size()
> >> call is
> >> >> >> >>>> not being synchronized. This will lead to invalid results at
> >> best,
> >> >> at
> >> >> >> >>>> worst outright failure (hard to say w/o knowing the
> >> implementation
> >> >> of
> >> >> >> >>>> HashSet).
> >> >> >> >>>>
> >> >> >> >>>> Camille can you work with Neha to get this fixed? Perhaps in
> the
> >> >> >> >>>> meantime (if it's going to take a while) you can revert this
> >> >> change,
> >> >> >> >>>> re-open the jira, update the patch, and reapply at some later
> >> time?
> >> >> >> >>>>
> >> >> >> >>>> Patrick
> >> >> >> >>>>
> >> >> >> >>>> On Wed, Dec 28, 2011 at 6:55 AM,  <ca...@apache.org>
> wrote:
> >> >> >> >>>> > Author: camille
> >> >> >> >>>> > Date: Wed Dec 28 14:55:37 2011
> >> >> >> >>>> > New Revision: 1225200
> >> >> >> >>>> >
> >> >> >> >>>> > URL: http://svn.apache.org/viewvc?rev=1225200&view=rev
> >> >> >> >>>> > Log:
> >> >> >> >>>> > ZOOKEEPER-1321: Add number of client connections metric in
> JMX
> >> >> and
> >> >> >> srvr
> >> >> >> >>>> (Neha Narkhede via camille)
> >> >> >> >>>> >
> >> >> >> >>>> > Modified:
> >> >> >> >>>> >    zookeeper/trunk/CHANGES.txt
> >> >> >> >>>> >
> >> >> >> >>>>
> >> >> >>
> >> >>
> >>
>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java
> >> >> >> >>>> >
> >> >> >> >>>>
> >> >> >>
> >> >>
> >>
>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java
> >> >> >> >>>> >
> >> >> >> >>>>
> >> >> >>
> >> >>
> >>
>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java
> >> >> >> >>>> >
> >> >> >> >>>>
> >> >> >>
> >> >>
> >>
>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java
> >> >> >> >>>> >
> >> >> >> >>>>
> >> >> >>
> >> >>
> >>
>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java
> >> >> >> >>>> >
> >> >> >> >>>>
> >> >> >>
> >> >>
> >>
>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerStats.java
> >> >> >> >>>> >
> >> >> >> >>>>
> >> >> >>
> >> >>
> >>
>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java
> >> >> >> >>>> >
> >> >> >> >>>>
> >> >> >>
> >> >>
> >>
>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java
> >> >> >> >>>> >
> >> >> >> >>>>
> >> >> >>
> >> >>
> >>
>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java
> >> >> >> >>>> >
> >> >> >> >>>>
> >> >> >>
> >> >>
> >>
>  zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/Zab1_0Test.java
> >> >> >> >>>> >
> >> >> >> >>>>
> >> >> >>
> >> >>
> >>
>  zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java
> >> >> >> >>>> >
> >> >> >> >>>> > Modified: zookeeper/trunk/CHANGES.txt
> >> >> >> >>>> > URL:
> >> >> >> >>>>
> >> >> >>
> >> >>
> >>
> http://svn.apache.org/viewvc/zookeeper/trunk/CHANGES.txt?rev=1225200&r1=1225199&r2=1225200&view=diff
> >> >> >> >>>> >
> >> >> >> >>>>
> >> >> >>
> >> >>
> >>
> ==============================================================================
> >> >> >> >>>> > --- zookeeper/trunk/CHANGES.txt (original)
> >> >> >> >>>> > +++ zookeeper/trunk/CHANGES.txt Wed Dec 28 14:55:37 2011
> >> >> >> >>>> > @@ -162,6 +162,8 @@ IMPROVEMENTS:
> >> >> >> >>>> >
> >> >> >> >>>> >   ZOOKEEPER-1342. quorum Listener & LearnerCnxAcceptor are
> >> >> missing
> >> >> >> >>>> >   thread names (Rakesh R via phunt)
> >> >> >> >>>> > +
> >> >> >> >>>> > +  ZOOKEEPER-1321. Add number of client connections metric
> in
> >> JMX
> >> >> >> and
> >> >> >> >>>> srvr (Neha Narkhede via camille)
> >> >> >> >>>> >
> >> >> >> >>>> >  Release 3.4.0 -
> >> >> >> >>>> >
> >> >> >> >>>> >
> >> >> >> >>>> > Modified:
> >> >> >> >>>>
> >> >> >>
> >> >>
> >>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java
> >> >> >> >>>> > URL:
> >> >> >> >>>>
> >> >> >>
> >> >>
> >>
> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java?rev=1225200&r1=1225199&r2=1225200&view=diff
> >> >> >> >>>> >
> >> >> >> >>>>
> >> >> >>
> >> >>
> >>
> ==============================================================================
> >> >> >> >>>> > ---
> >> >> >> >>>>
> >> >> >>
> >> >>
> >>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java
> >> >> >> >>>> (original)
> >> >> >> >>>> > +++
> >> >> >> >>>>
> >> >> >>
> >> >>
> >>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java
> >> >> >> >>>> Wed Dec 28 14:55:37 2011
> >> >> >> >>>> > @@ -749,7 +749,8 @@ public class NIOServerCnxn extends
> Serve
> >> >> >> >>>> >
> >> >> >> >>>> >             print("packets_received",
> >> >> stats.getPacketsReceived());
> >> >> >> >>>> >             print("packets_sent", stats.getPacketsSent());
> >> >> >> >>>> > -
> >> >> >> >>>> > +            print("num_alive_connections",
> >> >> >> >>>> stats.getNumAliveClientConnections());
> >> >> >> >>>> > +
> >> >> >> >>>> >             print("outstanding_requests",
> >> >> >> >>>> stats.getOutstandingRequests());
> >> >> >> >>>> >
> >> >> >> >>>> >             print("server_state", stats.getServerState());
> >> >> >> >>>> >
> >> >> >> >>>> > Modified:
> >> >> >> >>>>
> >> >> >>
> >> >>
> >>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java
> >> >> >> >>>> > URL:
> >> >> >> >>>>
> >> >> >>
> >> >>
> >>
> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java?rev=1225200&r1=1225199&r2=1225200&view=diff
> >> >> >> >>>> >
> >> >> >> >>>>
> >> >> >>
> >> >>
> >>
> ==============================================================================
> >> >> >> >>>> > ---
> >> >> >> >>>>
> >> >> >>
> >> >>
> >>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java
> >> >> >> >>>> (original)
> >> >> >> >>>> > +++
> >> >> >> >>>>
> >> >> >>
> >> >>
> >>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java
> >> >> >> >>>> Wed Dec 28 14:55:37 2011
> >> >> >> >>>> > @@ -32,14 +32,14 @@ import java.util.HashMap;
> >> >> >> >>>> >  import java.util.HashSet;
> >> >> >> >>>> >  import java.util.Set;
> >> >> >> >>>> >
> >> >> >> >>>> > +import javax.security.auth.login.Configuration;
> >> >> >> >>>> > +import javax.security.auth.login.LoginException;
> >> >> >> >>>> > +
> >> >> >> >>>> >  import org.apache.zookeeper.Login;
> >> >> >> >>>> >  import
> >> >> org.apache.zookeeper.server.auth.SaslServerCallbackHandler;
> >> >> >> >>>> >  import org.slf4j.Logger;
> >> >> >> >>>> >  import org.slf4j.LoggerFactory;
> >> >> >> >>>> >
> >> >> >> >>>> > -import javax.security.auth.login.Configuration;
> >> >> >> >>>> > -import javax.security.auth.login.LoginException;
> >> >> >> >>>> > -
> >> >> >> >>>> >  public class NIOServerCnxnFactory extends
> ServerCnxnFactory
> >> >> >> implements
> >> >> >> >>>> Runnable {
> >> >> >> >>>> >     private static final Logger LOG =
> >> >> >> >>>> LoggerFactory.getLogger(NIOServerCnxnFactory.class);
> >> >> >> >>>> >
> >> >> >> >>>> > @@ -78,7 +78,6 @@ public class NIOServerCnxnFactory extend
> >> >> >> >>>> >
> >> >> >> >>>> >     int maxClientCnxns = 60;
> >> >> >> >>>> >
> >> >> >> >>>> > -
> >> >> >> >>>> >     /**
> >> >> >> >>>> >      * Construct a new server connection factory which will
> >> >> accept
> >> >> >> an
> >> >> >> >>>> unlimited number
> >> >> >> >>>> >      * of concurrent connections from each client (up to
> the
> >> file
> >> >> >> >>>> descriptor
> >> >> >> >>>> > @@ -122,7 +121,7 @@ public class NIOServerCnxnFactory
> extend
> >> >> >> >>>> >     public void setMaxClientCnxnsPerHost(int max) {
> >> >> >> >>>> >         maxClientCnxns = max;
> >> >> >> >>>> >     }
> >> >> >> >>>> > -
> >> >> >> >>>> > +
> >> >> >> >>>> >     @Override
> >> >> >> >>>> >     public void start() {
> >> >> >> >>>> >         // ensure thread is started once and only once
> >> >> >> >>>> > @@ -187,7 +186,7 @@ public class NIOServerCnxnFactory
> extend
> >> >> >> >>>> >             return s.size();
> >> >> >> >>>> >         }
> >> >> >> >>>> >     }
> >> >> >> >>>> > -
> >> >> >> >>>> > +
> >> >> >> >>>> >     public void run() {
> >> >> >> >>>> >         while (!ss.socket().isClosed()) {
> >> >> >> >>>> >             try {
> >> >> >> >>>> > @@ -323,4 +322,8 @@ public class NIOServerCnxnFactory
> extend
> >> >> >> >>>> >         return cnxns;
> >> >> >> >>>> >     }
> >> >> >> >>>> >
> >> >> >> >>>> > +    @Override
> >> >> >> >>>> > +    public int getNumAliveConnections() {
> >> >> >> >>>> > +       return cnxns.size();
> >> >> >> >>>> > +    }
> >> >> >> >>>> >  }
> >> >> >> >>>> >
> >> >> >> >>>> > Modified:
> >> >> >> >>>>
> >> >> >>
> >> >>
> >>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java
> >> >> >> >>>> > URL:
> >> >> >> >>>>
> >> >> >>
> >> >>
> >>
> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java?rev=1225200&r1=1225199&r2=1225200&view=diff
> >> >> >> >>>> >
> >> >> >> >>>>
> >> >> >>
> >> >>
> >>
> ==============================================================================
> >> >> >> >>>> > ---
> >> >> >> >>>>
> >> >> >>
> >> >>
> >>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java
> >> >> >> >>>> (original)
> >> >> >> >>>> > +++
> >> >> >> >>>>
> >> >> >>
> >> >>
> >>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java
> >> >> >> >>>> Wed Dec 28 14:55:37 2011
> >> >> >> >>>> > @@ -560,7 +560,8 @@ public class NettyServerCnxn extends
> Ser
> >> >> >> >>>> >
> >> >> >> >>>> >             print("packets_received",
> >> >> stats.getPacketsReceived());
> >> >> >> >>>> >             print("packets_sent", stats.getPacketsSent());
> >> >> >> >>>> > -
> >> >> >> >>>> > +            print("num_alive_connections",
> >> >> >> >>>> stats.getNumAliveClientConnections());
> >> >> >> >>>> > +
> >> >> >> >>>> >             print("outstanding_requests",
> >> >> >> >>>> stats.getOutstandingRequests());
> >> >> >> >>>> >
> >> >> >> >>>> >             print("server_state", stats.getServerState());
> >> >> >> >>>> >
> >> >> >> >>>> > Modified:
> >> >> >> >>>>
> >> >> >>
> >> >>
> >>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java
> >> >> >> >>>> > URL:
> >> >> >> >>>>
> >> >> >>
> >> >>
> >>
> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java?rev=1225200&r1=1225199&r2=1225200&view=diff
> >> >> >> >>>> >
> >> >> >> >>>>
> >> >> >>
> >> >>
> >>
> ==============================================================================
> >> >> >> >>>> > ---
> >> >> >> >>>>
> >> >> >>
> >> >>
> >>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java
> >> >> >> >>>> (original)
> >> >> >> >>>> > +++
> >> >> >> >>>>
> >> >> >>
> >> >>
> >>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java
> >> >> >> >>>> Wed Dec 28 14:55:37 2011
> >> >> >> >>>> > @@ -411,5 +411,10 @@ public class NettyServerCnxnFactory
> exte
> >> >> >> >>>> >             }
> >> >> >> >>>> >         }
> >> >> >> >>>> >     }
> >> >> >> >>>> > +
> >> >> >> >>>> > +    @Override
> >> >> >> >>>> > +    public int getNumAliveConnections() {
> >> >> >> >>>> > +       return cnxns.size();
> >> >> >> >>>> > +    }
> >> >> >> >>>> >
> >> >> >> >>>> >  }
> >> >> >> >>>> >
> >> >> >> >>>> > Modified:
> >> >> >> >>>>
> >> >> >>
> >> >>
> >>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java
> >> >> >> >>>> > URL:
> >> >> >> >>>>
> >> >> >>
> >> >>
> >>
> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java?rev=1225200&r1=1225199&r2=1225200&view=diff
> >> >> >> >>>> >
> >> >> >> >>>>
> >> >> >>
> >> >>
> >>
> ==============================================================================
> >> >> >> >>>> > ---
> >> >> >> >>>>
> >> >> >>
> >> >>
> >>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java
> >> >> >> >>>> (original)
> >> >> >> >>>> > +++
> >> >> >> >>>>
> >> >> >>
> >> >>
> >>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java
> >> >> >> >>>> Wed Dec 28 14:55:37 2011
> >> >> >> >>>> > @@ -24,15 +24,16 @@ import java.nio.ByteBuffer;
> >> >> >> >>>> >  import java.util.HashMap;
> >> >> >> >>>> >
> >> >> >> >>>> >  import javax.management.JMException;
> >> >> >> >>>> > -import org.slf4j.Logger;
> >> >> >> >>>> > -import org.slf4j.LoggerFactory;
> >> >> >> >>>> > -import org.apache.zookeeper.jmx.MBeanRegistry;
> >> >> >> >>>> > +
> >> >> >> >>>> >  import org.apache.zookeeper.Login;
> >> >> >> >>>> > +import org.apache.zookeeper.jmx.MBeanRegistry;
> >> >> >> >>>> >  import
> >> >> org.apache.zookeeper.server.auth.SaslServerCallbackHandler;
> >> >> >> >>>> > +import org.slf4j.Logger;
> >> >> >> >>>> > +import org.slf4j.LoggerFactory;
> >> >> >> >>>> >
> >> >> >> >>>> >  public abstract class ServerCnxnFactory {
> >> >> >> >>>> >
> >> >> >> >>>> > -    public static final String
> ZOOKEEPER_SERVER_CNXN_FACTORY
> >> =
> >> >> >> >>>> "zookeeper.serverCnxnFactory";
> >> >> >> >>>> > +    public static final String
> ZOOKEEPER_SERVER_CNXN_FACTORY
> >> =
> >> >> >> >>>> "zookeeper.serverCnxnFactory";
> >> >> >> >>>> >
> >> >> >> >>>> >     public interface PacketProcessor {
> >> >> >> >>>> >         public void processPacket(ByteBuffer packet,
> >> ServerCnxn
> >> >> >> src);
> >> >> >> >>>> > @@ -49,6 +50,8 @@ public abstract class ServerCnxnFactory
> >> >> >> >>>> >
> >> >> >> >>>> >     public abstract Iterable<ServerCnxn> getConnections();
> >> >> >> >>>> >
> >> >> >> >>>> > +    public abstract int getNumAliveConnections();
> >> >> >> >>>> > +
> >> >> >> >>>> >     public abstract void closeSession(long sessionId);
> >> >> >> >>>> >
> >> >> >> >>>> >     public abstract void configure(InetSocketAddress addr,
> >> >> >> >>>> >
> >> >> >> >>>> > Modified:
> >> >> >> >>>>
> >> >> >>
> >> >>
> >>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerStats.java
> >> >> >> >>>> > URL:
> >> >> >> >>>>
> >> >> >>
> >> >>
> >>
> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerStats.java?rev=1225200&r1=1225199&r2=1225200&view=diff
> >> >> >> >>>> >
> >> >> >> >>>>
> >> >> >>
> >> >>
> >>
> ==============================================================================
> >> >> >> >>>> > ---
> >> >> >> >>>>
> >> >> >>
> >> >>
> >>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerStats.java
> >> >> >> >>>> (original)
> >> >> >> >>>> > +++
> >> >> >> >>>>
> >> >> >>
> >> >>
> >>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerStats.java
> >> >> >> >>>> Wed Dec 28 14:55:37 2011
> >> >> >> >>>> > @@ -19,6 +19,7 @@
> >> >> >> >>>> >  package org.apache.zookeeper.server;
> >> >> >> >>>> >
> >> >> >> >>>> >
> >> >> >> >>>> > +
> >> >> >> >>>> >  /**
> >> >> >> >>>> >  * Basic Server Statistics
> >> >> >> >>>> >  */
> >> >> >> >>>> > @@ -29,13 +30,14 @@ public class ServerStats {
> >> >> >> >>>> >     private long minLatency = Long.MAX_VALUE;
> >> >> >> >>>> >     private long totalLatency = 0;
> >> >> >> >>>> >     private long count = 0;
> >> >> >> >>>> > -
> >> >> >> >>>> > +
> >> >> >> >>>> >     private final Provider provider;
> >> >> >> >>>> >
> >> >> >> >>>> >     public interface Provider {
> >> >> >> >>>> >         public long getOutstandingRequests();
> >> >> >> >>>> >         public long getLastProcessedZxid();
> >> >> >> >>>> >         public String getState();
> >> >> >> >>>> > +        public int getNumAliveConnections();
> >> >> >> >>>> >     }
> >> >> >> >>>> >
> >> >> >> >>>> >     public ServerStats(Provider provider) {
> >> >> >> >>>> > @@ -75,9 +77,14 @@ public class ServerStats {
> >> >> >> >>>> >     }
> >> >> >> >>>> >
> >> >> >> >>>> >     public String getServerState() {
> >> >> >> >>>> > -        return provider.getState();
> >> >> >> >>>> > +       return provider.getState();
> >> >> >> >>>> >     }
> >> >> >> >>>> > -
> >> >> >> >>>> > +
> >> >> >> >>>> > +    /** The number of client connections alive to this
> >> server */
> >> >> >> >>>> > +    public int getNumAliveClientConnections() {
> >> >> >> >>>> > +       return provider.getNumAliveConnections();
> >> >> >> >>>> > +    }
> >> >> >> >>>> > +
> >> >> >> >>>> >     @Override
> >> >> >> >>>> >     public String toString(){
> >> >> >> >>>> >         StringBuilder sb = new StringBuilder();
> >> >> >> >>>> > @@ -85,6 +92,8 @@ public class ServerStats {
> >> >> >> >>>> >                 + getAvgLatency() + "/" + getMaxLatency() +
> >> >> "\n");
> >> >> >> >>>> >         sb.append("Received: " + getPacketsReceived() +
> "\n");
> >> >> >> >>>> >         sb.append("Sent: " + getPacketsSent() + "\n");
> >> >> >> >>>> > +        sb.append("Connections: " +
> >> >> getNumAliveClientConnections()
> >> >> >> +
> >> >> >> >>>> "\n");
> >> >> >> >>>> > +
> >> >> >> >>>> >         if (provider != null) {
> >> >> >> >>>> >             sb.append("Outstanding: " +
> >> getOutstandingRequests()
> >> >> +
> >> >> >> >>>> "\n");
> >> >> >> >>>> >             sb.append("Zxid: 0x"+
> >> >> >> >>>> Long.toHexString(getLastProcessedZxid())+ "\n");
> >> >> >> >>>> > @@ -123,7 +132,6 @@ public class ServerStats {
> >> >> >> >>>> >         packetsReceived = 0;
> >> >> >> >>>> >         packetsSent = 0;
> >> >> >> >>>> >     }
> >> >> >> >>>> > -
> >> >> >> >>>> >     synchronized public void reset() {
> >> >> >> >>>> >         resetLatency();
> >> >> >> >>>> >         resetRequestCounters();
> >> >> >> >>>> >
> >> >> >> >>>> > Modified:
> >> >> >> >>>>
> >> >> >>
> >> >>
> >>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java
> >> >> >> >>>> > URL:
> >> >> >> >>>>
> >> >> >>
> >> >>
> >>
> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java?rev=1225200&r1=1225199&r2=1225200&view=diff
> >> >> >> >>>> >
> >> >> >> >>>>
> >> >> >>
> >> >>
> >>
> ==============================================================================
> >> >> >> >>>> > ---
> >> >> >> >>>>
> >> >> >>
> >> >>
> >>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java
> >> >> >> >>>> (original)
> >> >> >> >>>> > +++
> >> >> >> >>>>
> >> >> >>
> >> >>
> >>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java
> >> >> >> >>>> Wed Dec 28 14:55:37 2011
> >> >> >> >>>> > @@ -109,7 +109,7 @@ public class ZooKeeperServer implements
> >> >> >> >>>> >     private ServerCnxnFactory serverCnxnFactory;
> >> >> >> >>>> >
> >> >> >> >>>> >     private final ServerStats serverStats;
> >> >> >> >>>> > -
> >> >> >> >>>> > +
> >> >> >> >>>> >     void removeCnxn(ServerCnxn cnxn) {
> >> >> >> >>>> >         zkDb.removeCnxn(cnxn);
> >> >> >> >>>> >     }
> >> >> >> >>>> > @@ -254,7 +254,6 @@ public class ZooKeeperServer implements
> >> >> >> >>>> >         }
> >> >> >> >>>> >     }
> >> >> >> >>>> >
> >> >> >> >>>> > -
> >> >> >> >>>> >     /**
> >> >> >> >>>> >      * This should be called from a synchronized block on
> >> this!
> >> >> >> >>>> >      */
> >> >> >> >>>> > @@ -678,6 +677,14 @@ public class ZooKeeperServer
> implements
> >> >> >> >>>> >     }
> >> >> >> >>>> >
> >> >> >> >>>> >     /**
> >> >> >> >>>> > +     * return the total number of client connections that
> are
> >> >> alive
> >> >> >> >>>> > +     * to this server
> >> >> >> >>>> > +     */
> >> >> >> >>>> > +    public int getNumAliveConnections() {
> >> >> >> >>>> > +       return serverCnxnFactory.getNumAliveConnections();
> >> >> >> >>>> > +    }
> >> >> >> >>>> > +
> >> >> >> >>>> > +    /**
> >> >> >> >>>> >      * trunccate the log to get in sync with others
> >> >> >> >>>> >      * if in a quorum
> >> >> >> >>>> >      * @param zxid the zxid that it needs to get in sync
> >> >> >> >>>> >
> >> >> >> >>>> > Modified:
> >> >> >> >>>>
> >> >> >>
> >> >>
> >>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java
> >> >> >> >>>> > URL:
> >> >> >> >>>>
> >> >> >>
> >> >>
> >>
> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java?rev=1225200&r1=1225199&r2=1225200&view=diff
> >> >> >> >>>> >
> >> >> >> >>>>
> >> >> >>
> >> >>
> >>
> ==============================================================================
> >> >> >> >>>> > ---
> >> >> >> >>>>
> >> >> >>
> >> >>
> >>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java
> >> >> >> >>>> (original)
> >> >> >> >>>> > +++
> >> >> >> >>>>
> >> >> >>
> >> >>
> >>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java
> >> >> >> >>>> Wed Dec 28 14:55:37 2011
> >> >> >> >>>> > @@ -140,4 +140,8 @@ public class ZooKeeperServerBean
> impleme
> >> >> >> >>>> >         serverStats.resetRequestCounters();
> >> >> >> >>>> >         serverStats.resetLatency();
> >> >> >> >>>> >     }
> >> >> >> >>>> > +
> >> >> >> >>>> > +       public long getNumAliveConnections() {
> >> >> >> >>>> > +               return zks.getNumAliveConnections();
> >> >> >> >>>> > +       }
> >> >> >> >>>> >  }
> >> >> >> >>>> >
> >> >> >> >>>> > Modified:
> >> >> >> >>>>
> >> >> >>
> >> >>
> >>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java
> >> >> >> >>>> > URL:
> >> >> >> >>>>
> >> >> >>
> >> >>
> >>
> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java?rev=1225200&r1=1225199&r2=1225200&view=diff
> >> >> >> >>>> >
> >> >> >> >>>>
> >> >> >>
> >> >>
> >>
> ==============================================================================
> >> >> >> >>>> > ---
> >> >> >> >>>>
> >> >> >>
> >> >>
> >>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java
> >> >> >> >>>> (original)
> >> >> >> >>>> > +++
> >> >> >> >>>>
> >> >> >>
> >> >>
> >>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java
> >> >> >> >>>> Wed Dec 28 14:55:37 2011
> >> >> >> >>>> > @@ -103,4 +103,8 @@ public interface ZooKeeperServerMXBean
> {
> >> >> >> >>>> >      * Reset max latency statistics only.
> >> >> >> >>>> >      */
> >> >> >> >>>> >     public void resetMaxLatency();
> >> >> >> >>>> > +    /**
> >> >> >> >>>> > +     * @return number of alive client connections
> >> >> >> >>>> > +     */
> >> >> >> >>>> > +    public long getNumAliveConnections();
> >> >> >> >>>> >  }
> >> >> >> >>>> >
> >> >> >> >>>> > Modified:
> >> >> >> >>>>
> >> >> >>
> >> >>
> >>
> zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/Zab1_0Test.java
> >> >> >> >>>> > URL:
> >> >> >> >>>>
> >> >> >>
> >> >>
> >>
> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/Zab1_0Test.java?rev=1225200&r1=1225199&r2=1225200&view=diff
> >> >> >> >>>> >
> >> >> >> >>>>
> >> >> >>
> >> >>
> >>
> ==============================================================================
> >> >> >> >>>> > ---
> >> >> >> >>>>
> >> >> >>
> >> >>
> >>
> zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/Zab1_0Test.java
> >> >> >> >>>> (original)
> >> >> >> >>>> > +++
> >> >> >> >>>>
> >> >> >>
> >> >>
> >>
> zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/Zab1_0Test.java
> >> >> >> >>>> Wed Dec 28 14:55:37 2011
> >> >> >> >>>> > @@ -212,6 +212,10 @@ public class Zab1_0Test {
> >> >> >> >>>> >         }
> >> >> >> >>>> >         public void closeAll() {
> >> >> >> >>>> >         }
> >> >> >> >>>> > +               @Override
> >> >> >> >>>> > +               public int getNumAliveConnections() {
> >> >> >> >>>> > +                       return 0;
> >> >> >> >>>> > +               }
> >> >> >> >>>> >     }
> >> >> >> >>>> >     static Socket[] getSocketPair() throws IOException {
> >> >> >> >>>> >         ServerSocket ss = new ServerSocket();
> >> >> >> >>>> >
> >> >> >> >>>> > Modified:
> >> >> >> >>>>
> >> >> >>
> >> >>
> >>
> zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java
> >> >> >> >>>> > URL:
> >> >> >> >>>>
> >> >> >>
> >> >>
> >>
> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java?rev=1225200&r1=1225199&r2=1225200&view=diff
> >> >> >> >>>> >
> >> >> >> >>>>
> >> >> >>
> >> >>
> >>
> ==============================================================================
> >> >> >> >>>> > ---
> >> >> >> >>>>
> >> >> >>
> >> >>
> >>
> zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java
> >> >> >> >>>> (original)
> >> >> >> >>>> > +++
> >> >> >> >>>>
> >> >> >>
> >> >>
> >>
> zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java
> >> >> >> >>>> Wed Dec 28 14:55:37 2011
> >> >> >> >>>> > @@ -94,6 +94,9 @@ public class FourLetterWordsTest extends
> >> >> >> >>>> >         verify("srvr", "Outstanding");
> >> >> >> >>>> >         verify("cons", "queued");
> >> >> >> >>>> >         verify("mntr", "zk_server_state\tstandalone");
> >> >> >> >>>> > +        verify("mntr", "num_alive_connections");
> >> >> >> >>>> > +        verify("stat", "Connections");
> >> >> >> >>>> > +        verify("srvr", "Connections");
> >> >> >> >>>> >     }
> >> >> >> >>>> >
> >> >> >> >>>> >     private String sendRequest(String cmd) throws
> IOException
> >> {
> >> >> >> >>>> > @@ -136,6 +139,8 @@ public class FourLetterWordsTest
> extends
> >> >> >> >>>> >         line = in.readLine();
> >> >> >> >>>> >         Assert.assertTrue(Pattern.matches("^Sent: \\d+$",
> >> line));
> >> >> >> >>>> >         line = in.readLine();
> >> >> >> >>>> > +        Assert.assertTrue(Pattern.matches("^Connections:
> >> \\d+$",
> >> >> >> >>>> line));
> >> >> >> >>>> > +        line = in.readLine();
> >> >> >> >>>> >         Assert.assertTrue(Pattern.matches("^Outstanding:
> >> \\d+$",
> >> >> >> line));
> >> >> >> >>>> >         line = in.readLine();
> >> >> >> >>>> >         Assert.assertTrue(Pattern.matches("^Zxid:
> >> >> 0x[\\da-fA-F]+$",
> >> >> >> >>>> line));
> >> >> >> >>>> >
> >> >> >> >>>> >
> >> >> >> >>>>
> >> >> >> >>>
> >> >> >>
> >> >>
> >>
>

Re: svn commit: r1225200 - in /zookeeper/trunk: ./ src/java/main/org/apache/zookeeper/server/ src/java/test/org/apache/zookeeper/server/quorum/ src/java/test/org/apache/zookeeper/test/

Posted by Patrick Hunt <ph...@apache.org>.
On Wed, Dec 28, 2011 at 1:53 PM, Camille Fournier <ca...@apache.org> wrote:
> Fair enough. Syncs for all! It's a drop in the bucket compared to the fact
> that we aren't handling the fundamental socket connections for 4lws
> correctly anyway.

sorry. I see a blog post coming on. ;-)

You're referring to the following (any more?)
https://issues.apache.org/jira/browse/ZOOKEEPER-1197
https://issues.apache.org/jira/browse/ZOOKEEPER-1237

is this comment still a correct interpretation of the issue?
https://issues.apache.org/jira/browse/ZOOKEEPER-737?focusedCommentId=13109067&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-13109067

What would you like to do about these? I had proposed having a
separate 4lw port some time back in order to simplify/isolate. Should
we do this for 3.5.0? (deprecate the old port usage but keep it around
for a while) Something else?

Patrick

> On Wed, Dec 28, 2011 at 4:32 PM, Patrick Hunt <ph...@apache.org> wrote:
>
>> On Wed, Dec 28, 2011 at 1:26 PM, Camille Fournier <ca...@apache.org>
>> wrote:
>> > I'm not sure I agree in the assumption that monitoring pulls happen
>> > infrequently...
>>
>> Well that would be bad news then - see "stat" command processing and
>> similar. All the more reason to look at this in more depth.
>>
>> Patrick
>>
>>
>> > On Dec 28, 2011 4:24 PM, "Patrick Hunt" <ph...@apache.org> wrote:
>> >
>> >> They seem like distinct changes to me. In particular getting the size
>> >> is going to happen infrequently (monitoring pull) so I don't see a
>> >> problem fixing the existing patch in the same way the code currently
>> >> handles cnxns access, with a separate jira to do the refactoring. Am I
>> >> missing something?
>> >>
>> >> Patrick
>> >>
>> >> On Wed, Dec 28, 2011 at 1:10 PM, Camille Fournier <ca...@apache.org>
>> >> wrote:
>> >> > I don't think creating it as a flat sync is a good idea, so if we want
>> >> this
>> >> > I think we need to refactor that structure to be concurrent.
>> >> >
>> >> > C
>> >> > On Dec 28, 2011 2:24 PM, "Patrick Hunt" <ph...@apache.org> wrote:
>> >> >
>> >> >> I think it needs to be fixed. It's obviously incorrect. Also if
>> >> >> someone changes the underlying implementation at some point it might
>> >> >> bite them.
>> >> >>
>> >> >> Given it wasn't applied to 3.4 branch yet I'd suggest revert, fix the
>> >> >> patch, then reapply to both branches. (that's easiest/bulletproof
>> imo)
>> >> >>
>> >> >> I'd recommend a new ticket to fix the issues you identified
>> (refactor,
>> >> >> etc...) Neha was looking for further items to work on, this would be
>> a
>> >> >> good one.
>> >> >>
>> >> >> Patrick
>> >> >>
>> >> >> On Wed, Dec 28, 2011 at 11:18 AM, Camille Fournier <
>> camille@apache.org>
>> >> >> wrote:
>> >> >> > Also, Pat, the JIRA is still open. I will look to revert in a
>> minute
>> >> >> > although I think the sync changes may necessitate a new JIRA
>> entirely.
>> >> >> >
>> >> >> > On Wed, Dec 28, 2011 at 1:31 PM, Camille Fournier <
>> camille@apache.org
>> >> >
>> >> >> wrote:
>> >> >> >> After looking for a few mins, here are my observations:
>> >> >> >>
>> >> >> >> The implementation of HashSet in jdk 1.6 uses an underlying
>> HashMap,
>> >> >> which
>> >> >> >> uses a bog-standard int for the size. So, I completely agree that
>> we
>> >> can
>> >> >> >> get invalid results for a point in time. But does anyone really
>> care
>> >> >> about
>> >> >> >> the *exact* moment-in-time number of cnxns in the system, in a
>> system
>> >> >> where
>> >> >> >> cnxns are coming and going? At best you'll see a value that will
>> >> likely
>> >> >> be
>> >> >> >> out of date the moment you read it.
>> >> >> >>
>> >> >> >> But, if we're going to do this, I do think there may be a case for
>> >> >> >> refactoring to a concurrent data structure given that we are
>> randomly
>> >> >> >> syncing on the cnxns set in a way that makes adding additional
>> >> >> interactions
>> >> >> >> with it error prone in this way. And we should definitely remove
>> that
>> >> >> >> getConnections method, if anyone ever iterated over that set they
>> >> would
>> >> >> be
>> >> >> >> in a sad concurrency situation.
>> >> >> >> Seems possibly worth a whole new ticket to do this. What do you
>> >> think?
>> >> >> >>
>> >> >> >> Thanks,
>> >> >> >> C
>> >> >> >>
>> >> >> >> On Wed, Dec 28, 2011 at 1:12 PM, Camille Fournier <
>> >> camille@apache.org
>> >> >> >wrote:
>> >> >> >>
>> >> >> >>> I'm not sure it's meaningful enough to be worth the sync
>> overhead.
>> >> We
>> >> >> >>> should look into that. The alternative if we must is using a
>> proper
>> >> >> >>> concurrent collection. Neha, any thoughts?
>> >> >> >>>
>> >> >> >>> C
>> >> >> >>> On Dec 28, 2011 12:45 PM, "Patrick Hunt" <ph...@apache.org>
>> wrote:
>> >> >> >>>
>> >> >> >>>> I believe there is a bug in this commit. The "cnxns" size()
>> call is
>> >> >> >>>> not being synchronized. This will lead to invalid results at
>> best,
>> >> at
>> >> >> >>>> worst outright failure (hard to say w/o knowing the
>> implementation
>> >> of
>> >> >> >>>> HashSet).
>> >> >> >>>>
>> >> >> >>>> Camille can you work with Neha to get this fixed? Perhaps in the
>> >> >> >>>> meantime (if it's going to take a while) you can revert this
>> >> change,
>> >> >> >>>> re-open the jira, update the patch, and reapply at some later
>> time?
>> >> >> >>>>
>> >> >> >>>> Patrick
>> >> >> >>>>
>> >> >> >>>> On Wed, Dec 28, 2011 at 6:55 AM,  <ca...@apache.org> wrote:
>> >> >> >>>> > Author: camille
>> >> >> >>>> > Date: Wed Dec 28 14:55:37 2011
>> >> >> >>>> > New Revision: 1225200
>> >> >> >>>> >
>> >> >> >>>> > URL: http://svn.apache.org/viewvc?rev=1225200&view=rev
>> >> >> >>>> > Log:
>> >> >> >>>> > ZOOKEEPER-1321: Add number of client connections metric in JMX
>> >> and
>> >> >> srvr
>> >> >> >>>> (Neha Narkhede via camille)
>> >> >> >>>> >
>> >> >> >>>> > Modified:
>> >> >> >>>> >    zookeeper/trunk/CHANGES.txt
>> >> >> >>>> >
>> >> >> >>>>
>> >> >>
>> >>
>>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java
>> >> >> >>>> >
>> >> >> >>>>
>> >> >>
>> >>
>>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java
>> >> >> >>>> >
>> >> >> >>>>
>> >> >>
>> >>
>>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java
>> >> >> >>>> >
>> >> >> >>>>
>> >> >>
>> >>
>>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java
>> >> >> >>>> >
>> >> >> >>>>
>> >> >>
>> >>
>>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java
>> >> >> >>>> >
>> >> >> >>>>
>> >> >>
>> >>
>>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerStats.java
>> >> >> >>>> >
>> >> >> >>>>
>> >> >>
>> >>
>>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java
>> >> >> >>>> >
>> >> >> >>>>
>> >> >>
>> >>
>>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java
>> >> >> >>>> >
>> >> >> >>>>
>> >> >>
>> >>
>>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java
>> >> >> >>>> >
>> >> >> >>>>
>> >> >>
>> >>
>>  zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/Zab1_0Test.java
>> >> >> >>>> >
>> >> >> >>>>
>> >> >>
>> >>
>>  zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java
>> >> >> >>>> >
>> >> >> >>>> > Modified: zookeeper/trunk/CHANGES.txt
>> >> >> >>>> > URL:
>> >> >> >>>>
>> >> >>
>> >>
>> http://svn.apache.org/viewvc/zookeeper/trunk/CHANGES.txt?rev=1225200&r1=1225199&r2=1225200&view=diff
>> >> >> >>>> >
>> >> >> >>>>
>> >> >>
>> >>
>> ==============================================================================
>> >> >> >>>> > --- zookeeper/trunk/CHANGES.txt (original)
>> >> >> >>>> > +++ zookeeper/trunk/CHANGES.txt Wed Dec 28 14:55:37 2011
>> >> >> >>>> > @@ -162,6 +162,8 @@ IMPROVEMENTS:
>> >> >> >>>> >
>> >> >> >>>> >   ZOOKEEPER-1342. quorum Listener & LearnerCnxAcceptor are
>> >> missing
>> >> >> >>>> >   thread names (Rakesh R via phunt)
>> >> >> >>>> > +
>> >> >> >>>> > +  ZOOKEEPER-1321. Add number of client connections metric in
>> JMX
>> >> >> and
>> >> >> >>>> srvr (Neha Narkhede via camille)
>> >> >> >>>> >
>> >> >> >>>> >  Release 3.4.0 -
>> >> >> >>>> >
>> >> >> >>>> >
>> >> >> >>>> > Modified:
>> >> >> >>>>
>> >> >>
>> >>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java
>> >> >> >>>> > URL:
>> >> >> >>>>
>> >> >>
>> >>
>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>> >> >> >>>> >
>> >> >> >>>>
>> >> >>
>> >>
>> ==============================================================================
>> >> >> >>>> > ---
>> >> >> >>>>
>> >> >>
>> >>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java
>> >> >> >>>> (original)
>> >> >> >>>> > +++
>> >> >> >>>>
>> >> >>
>> >>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java
>> >> >> >>>> Wed Dec 28 14:55:37 2011
>> >> >> >>>> > @@ -749,7 +749,8 @@ public class NIOServerCnxn extends Serve
>> >> >> >>>> >
>> >> >> >>>> >             print("packets_received",
>> >> stats.getPacketsReceived());
>> >> >> >>>> >             print("packets_sent", stats.getPacketsSent());
>> >> >> >>>> > -
>> >> >> >>>> > +            print("num_alive_connections",
>> >> >> >>>> stats.getNumAliveClientConnections());
>> >> >> >>>> > +
>> >> >> >>>> >             print("outstanding_requests",
>> >> >> >>>> stats.getOutstandingRequests());
>> >> >> >>>> >
>> >> >> >>>> >             print("server_state", stats.getServerState());
>> >> >> >>>> >
>> >> >> >>>> > Modified:
>> >> >> >>>>
>> >> >>
>> >>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java
>> >> >> >>>> > URL:
>> >> >> >>>>
>> >> >>
>> >>
>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>> >> >> >>>> >
>> >> >> >>>>
>> >> >>
>> >>
>> ==============================================================================
>> >> >> >>>> > ---
>> >> >> >>>>
>> >> >>
>> >>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java
>> >> >> >>>> (original)
>> >> >> >>>> > +++
>> >> >> >>>>
>> >> >>
>> >>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java
>> >> >> >>>> Wed Dec 28 14:55:37 2011
>> >> >> >>>> > @@ -32,14 +32,14 @@ import java.util.HashMap;
>> >> >> >>>> >  import java.util.HashSet;
>> >> >> >>>> >  import java.util.Set;
>> >> >> >>>> >
>> >> >> >>>> > +import javax.security.auth.login.Configuration;
>> >> >> >>>> > +import javax.security.auth.login.LoginException;
>> >> >> >>>> > +
>> >> >> >>>> >  import org.apache.zookeeper.Login;
>> >> >> >>>> >  import
>> >> org.apache.zookeeper.server.auth.SaslServerCallbackHandler;
>> >> >> >>>> >  import org.slf4j.Logger;
>> >> >> >>>> >  import org.slf4j.LoggerFactory;
>> >> >> >>>> >
>> >> >> >>>> > -import javax.security.auth.login.Configuration;
>> >> >> >>>> > -import javax.security.auth.login.LoginException;
>> >> >> >>>> > -
>> >> >> >>>> >  public class NIOServerCnxnFactory extends ServerCnxnFactory
>> >> >> implements
>> >> >> >>>> Runnable {
>> >> >> >>>> >     private static final Logger LOG =
>> >> >> >>>> LoggerFactory.getLogger(NIOServerCnxnFactory.class);
>> >> >> >>>> >
>> >> >> >>>> > @@ -78,7 +78,6 @@ public class NIOServerCnxnFactory extend
>> >> >> >>>> >
>> >> >> >>>> >     int maxClientCnxns = 60;
>> >> >> >>>> >
>> >> >> >>>> > -
>> >> >> >>>> >     /**
>> >> >> >>>> >      * Construct a new server connection factory which will
>> >> accept
>> >> >> an
>> >> >> >>>> unlimited number
>> >> >> >>>> >      * of concurrent connections from each client (up to the
>> file
>> >> >> >>>> descriptor
>> >> >> >>>> > @@ -122,7 +121,7 @@ public class NIOServerCnxnFactory extend
>> >> >> >>>> >     public void setMaxClientCnxnsPerHost(int max) {
>> >> >> >>>> >         maxClientCnxns = max;
>> >> >> >>>> >     }
>> >> >> >>>> > -
>> >> >> >>>> > +
>> >> >> >>>> >     @Override
>> >> >> >>>> >     public void start() {
>> >> >> >>>> >         // ensure thread is started once and only once
>> >> >> >>>> > @@ -187,7 +186,7 @@ public class NIOServerCnxnFactory extend
>> >> >> >>>> >             return s.size();
>> >> >> >>>> >         }
>> >> >> >>>> >     }
>> >> >> >>>> > -
>> >> >> >>>> > +
>> >> >> >>>> >     public void run() {
>> >> >> >>>> >         while (!ss.socket().isClosed()) {
>> >> >> >>>> >             try {
>> >> >> >>>> > @@ -323,4 +322,8 @@ public class NIOServerCnxnFactory extend
>> >> >> >>>> >         return cnxns;
>> >> >> >>>> >     }
>> >> >> >>>> >
>> >> >> >>>> > +    @Override
>> >> >> >>>> > +    public int getNumAliveConnections() {
>> >> >> >>>> > +       return cnxns.size();
>> >> >> >>>> > +    }
>> >> >> >>>> >  }
>> >> >> >>>> >
>> >> >> >>>> > Modified:
>> >> >> >>>>
>> >> >>
>> >>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java
>> >> >> >>>> > URL:
>> >> >> >>>>
>> >> >>
>> >>
>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>> >> >> >>>> >
>> >> >> >>>>
>> >> >>
>> >>
>> ==============================================================================
>> >> >> >>>> > ---
>> >> >> >>>>
>> >> >>
>> >>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java
>> >> >> >>>> (original)
>> >> >> >>>> > +++
>> >> >> >>>>
>> >> >>
>> >>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java
>> >> >> >>>> Wed Dec 28 14:55:37 2011
>> >> >> >>>> > @@ -560,7 +560,8 @@ public class NettyServerCnxn extends Ser
>> >> >> >>>> >
>> >> >> >>>> >             print("packets_received",
>> >> stats.getPacketsReceived());
>> >> >> >>>> >             print("packets_sent", stats.getPacketsSent());
>> >> >> >>>> > -
>> >> >> >>>> > +            print("num_alive_connections",
>> >> >> >>>> stats.getNumAliveClientConnections());
>> >> >> >>>> > +
>> >> >> >>>> >             print("outstanding_requests",
>> >> >> >>>> stats.getOutstandingRequests());
>> >> >> >>>> >
>> >> >> >>>> >             print("server_state", stats.getServerState());
>> >> >> >>>> >
>> >> >> >>>> > Modified:
>> >> >> >>>>
>> >> >>
>> >>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java
>> >> >> >>>> > URL:
>> >> >> >>>>
>> >> >>
>> >>
>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>> >> >> >>>> >
>> >> >> >>>>
>> >> >>
>> >>
>> ==============================================================================
>> >> >> >>>> > ---
>> >> >> >>>>
>> >> >>
>> >>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java
>> >> >> >>>> (original)
>> >> >> >>>> > +++
>> >> >> >>>>
>> >> >>
>> >>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java
>> >> >> >>>> Wed Dec 28 14:55:37 2011
>> >> >> >>>> > @@ -411,5 +411,10 @@ public class NettyServerCnxnFactory exte
>> >> >> >>>> >             }
>> >> >> >>>> >         }
>> >> >> >>>> >     }
>> >> >> >>>> > +
>> >> >> >>>> > +    @Override
>> >> >> >>>> > +    public int getNumAliveConnections() {
>> >> >> >>>> > +       return cnxns.size();
>> >> >> >>>> > +    }
>> >> >> >>>> >
>> >> >> >>>> >  }
>> >> >> >>>> >
>> >> >> >>>> > Modified:
>> >> >> >>>>
>> >> >>
>> >>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java
>> >> >> >>>> > URL:
>> >> >> >>>>
>> >> >>
>> >>
>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>> >> >> >>>> >
>> >> >> >>>>
>> >> >>
>> >>
>> ==============================================================================
>> >> >> >>>> > ---
>> >> >> >>>>
>> >> >>
>> >>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java
>> >> >> >>>> (original)
>> >> >> >>>> > +++
>> >> >> >>>>
>> >> >>
>> >>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java
>> >> >> >>>> Wed Dec 28 14:55:37 2011
>> >> >> >>>> > @@ -24,15 +24,16 @@ import java.nio.ByteBuffer;
>> >> >> >>>> >  import java.util.HashMap;
>> >> >> >>>> >
>> >> >> >>>> >  import javax.management.JMException;
>> >> >> >>>> > -import org.slf4j.Logger;
>> >> >> >>>> > -import org.slf4j.LoggerFactory;
>> >> >> >>>> > -import org.apache.zookeeper.jmx.MBeanRegistry;
>> >> >> >>>> > +
>> >> >> >>>> >  import org.apache.zookeeper.Login;
>> >> >> >>>> > +import org.apache.zookeeper.jmx.MBeanRegistry;
>> >> >> >>>> >  import
>> >> org.apache.zookeeper.server.auth.SaslServerCallbackHandler;
>> >> >> >>>> > +import org.slf4j.Logger;
>> >> >> >>>> > +import org.slf4j.LoggerFactory;
>> >> >> >>>> >
>> >> >> >>>> >  public abstract class ServerCnxnFactory {
>> >> >> >>>> >
>> >> >> >>>> > -    public static final String ZOOKEEPER_SERVER_CNXN_FACTORY
>> =
>> >> >> >>>> "zookeeper.serverCnxnFactory";
>> >> >> >>>> > +    public static final String ZOOKEEPER_SERVER_CNXN_FACTORY
>> =
>> >> >> >>>> "zookeeper.serverCnxnFactory";
>> >> >> >>>> >
>> >> >> >>>> >     public interface PacketProcessor {
>> >> >> >>>> >         public void processPacket(ByteBuffer packet,
>> ServerCnxn
>> >> >> src);
>> >> >> >>>> > @@ -49,6 +50,8 @@ public abstract class ServerCnxnFactory
>> >> >> >>>> >
>> >> >> >>>> >     public abstract Iterable<ServerCnxn> getConnections();
>> >> >> >>>> >
>> >> >> >>>> > +    public abstract int getNumAliveConnections();
>> >> >> >>>> > +
>> >> >> >>>> >     public abstract void closeSession(long sessionId);
>> >> >> >>>> >
>> >> >> >>>> >     public abstract void configure(InetSocketAddress addr,
>> >> >> >>>> >
>> >> >> >>>> > Modified:
>> >> >> >>>>
>> >> >>
>> >>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerStats.java
>> >> >> >>>> > URL:
>> >> >> >>>>
>> >> >>
>> >>
>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerStats.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>> >> >> >>>> >
>> >> >> >>>>
>> >> >>
>> >>
>> ==============================================================================
>> >> >> >>>> > ---
>> >> >> >>>>
>> >> >>
>> >>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerStats.java
>> >> >> >>>> (original)
>> >> >> >>>> > +++
>> >> >> >>>>
>> >> >>
>> >>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerStats.java
>> >> >> >>>> Wed Dec 28 14:55:37 2011
>> >> >> >>>> > @@ -19,6 +19,7 @@
>> >> >> >>>> >  package org.apache.zookeeper.server;
>> >> >> >>>> >
>> >> >> >>>> >
>> >> >> >>>> > +
>> >> >> >>>> >  /**
>> >> >> >>>> >  * Basic Server Statistics
>> >> >> >>>> >  */
>> >> >> >>>> > @@ -29,13 +30,14 @@ public class ServerStats {
>> >> >> >>>> >     private long minLatency = Long.MAX_VALUE;
>> >> >> >>>> >     private long totalLatency = 0;
>> >> >> >>>> >     private long count = 0;
>> >> >> >>>> > -
>> >> >> >>>> > +
>> >> >> >>>> >     private final Provider provider;
>> >> >> >>>> >
>> >> >> >>>> >     public interface Provider {
>> >> >> >>>> >         public long getOutstandingRequests();
>> >> >> >>>> >         public long getLastProcessedZxid();
>> >> >> >>>> >         public String getState();
>> >> >> >>>> > +        public int getNumAliveConnections();
>> >> >> >>>> >     }
>> >> >> >>>> >
>> >> >> >>>> >     public ServerStats(Provider provider) {
>> >> >> >>>> > @@ -75,9 +77,14 @@ public class ServerStats {
>> >> >> >>>> >     }
>> >> >> >>>> >
>> >> >> >>>> >     public String getServerState() {
>> >> >> >>>> > -        return provider.getState();
>> >> >> >>>> > +       return provider.getState();
>> >> >> >>>> >     }
>> >> >> >>>> > -
>> >> >> >>>> > +
>> >> >> >>>> > +    /** The number of client connections alive to this
>> server */
>> >> >> >>>> > +    public int getNumAliveClientConnections() {
>> >> >> >>>> > +       return provider.getNumAliveConnections();
>> >> >> >>>> > +    }
>> >> >> >>>> > +
>> >> >> >>>> >     @Override
>> >> >> >>>> >     public String toString(){
>> >> >> >>>> >         StringBuilder sb = new StringBuilder();
>> >> >> >>>> > @@ -85,6 +92,8 @@ public class ServerStats {
>> >> >> >>>> >                 + getAvgLatency() + "/" + getMaxLatency() +
>> >> "\n");
>> >> >> >>>> >         sb.append("Received: " + getPacketsReceived() + "\n");
>> >> >> >>>> >         sb.append("Sent: " + getPacketsSent() + "\n");
>> >> >> >>>> > +        sb.append("Connections: " +
>> >> getNumAliveClientConnections()
>> >> >> +
>> >> >> >>>> "\n");
>> >> >> >>>> > +
>> >> >> >>>> >         if (provider != null) {
>> >> >> >>>> >             sb.append("Outstanding: " +
>> getOutstandingRequests()
>> >> +
>> >> >> >>>> "\n");
>> >> >> >>>> >             sb.append("Zxid: 0x"+
>> >> >> >>>> Long.toHexString(getLastProcessedZxid())+ "\n");
>> >> >> >>>> > @@ -123,7 +132,6 @@ public class ServerStats {
>> >> >> >>>> >         packetsReceived = 0;
>> >> >> >>>> >         packetsSent = 0;
>> >> >> >>>> >     }
>> >> >> >>>> > -
>> >> >> >>>> >     synchronized public void reset() {
>> >> >> >>>> >         resetLatency();
>> >> >> >>>> >         resetRequestCounters();
>> >> >> >>>> >
>> >> >> >>>> > Modified:
>> >> >> >>>>
>> >> >>
>> >>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java
>> >> >> >>>> > URL:
>> >> >> >>>>
>> >> >>
>> >>
>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>> >> >> >>>> >
>> >> >> >>>>
>> >> >>
>> >>
>> ==============================================================================
>> >> >> >>>> > ---
>> >> >> >>>>
>> >> >>
>> >>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java
>> >> >> >>>> (original)
>> >> >> >>>> > +++
>> >> >> >>>>
>> >> >>
>> >>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java
>> >> >> >>>> Wed Dec 28 14:55:37 2011
>> >> >> >>>> > @@ -109,7 +109,7 @@ public class ZooKeeperServer implements
>> >> >> >>>> >     private ServerCnxnFactory serverCnxnFactory;
>> >> >> >>>> >
>> >> >> >>>> >     private final ServerStats serverStats;
>> >> >> >>>> > -
>> >> >> >>>> > +
>> >> >> >>>> >     void removeCnxn(ServerCnxn cnxn) {
>> >> >> >>>> >         zkDb.removeCnxn(cnxn);
>> >> >> >>>> >     }
>> >> >> >>>> > @@ -254,7 +254,6 @@ public class ZooKeeperServer implements
>> >> >> >>>> >         }
>> >> >> >>>> >     }
>> >> >> >>>> >
>> >> >> >>>> > -
>> >> >> >>>> >     /**
>> >> >> >>>> >      * This should be called from a synchronized block on
>> this!
>> >> >> >>>> >      */
>> >> >> >>>> > @@ -678,6 +677,14 @@ public class ZooKeeperServer implements
>> >> >> >>>> >     }
>> >> >> >>>> >
>> >> >> >>>> >     /**
>> >> >> >>>> > +     * return the total number of client connections that are
>> >> alive
>> >> >> >>>> > +     * to this server
>> >> >> >>>> > +     */
>> >> >> >>>> > +    public int getNumAliveConnections() {
>> >> >> >>>> > +       return serverCnxnFactory.getNumAliveConnections();
>> >> >> >>>> > +    }
>> >> >> >>>> > +
>> >> >> >>>> > +    /**
>> >> >> >>>> >      * trunccate the log to get in sync with others
>> >> >> >>>> >      * if in a quorum
>> >> >> >>>> >      * @param zxid the zxid that it needs to get in sync
>> >> >> >>>> >
>> >> >> >>>> > Modified:
>> >> >> >>>>
>> >> >>
>> >>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java
>> >> >> >>>> > URL:
>> >> >> >>>>
>> >> >>
>> >>
>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>> >> >> >>>> >
>> >> >> >>>>
>> >> >>
>> >>
>> ==============================================================================
>> >> >> >>>> > ---
>> >> >> >>>>
>> >> >>
>> >>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java
>> >> >> >>>> (original)
>> >> >> >>>> > +++
>> >> >> >>>>
>> >> >>
>> >>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java
>> >> >> >>>> Wed Dec 28 14:55:37 2011
>> >> >> >>>> > @@ -140,4 +140,8 @@ public class ZooKeeperServerBean impleme
>> >> >> >>>> >         serverStats.resetRequestCounters();
>> >> >> >>>> >         serverStats.resetLatency();
>> >> >> >>>> >     }
>> >> >> >>>> > +
>> >> >> >>>> > +       public long getNumAliveConnections() {
>> >> >> >>>> > +               return zks.getNumAliveConnections();
>> >> >> >>>> > +       }
>> >> >> >>>> >  }
>> >> >> >>>> >
>> >> >> >>>> > Modified:
>> >> >> >>>>
>> >> >>
>> >>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java
>> >> >> >>>> > URL:
>> >> >> >>>>
>> >> >>
>> >>
>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>> >> >> >>>> >
>> >> >> >>>>
>> >> >>
>> >>
>> ==============================================================================
>> >> >> >>>> > ---
>> >> >> >>>>
>> >> >>
>> >>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java
>> >> >> >>>> (original)
>> >> >> >>>> > +++
>> >> >> >>>>
>> >> >>
>> >>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java
>> >> >> >>>> Wed Dec 28 14:55:37 2011
>> >> >> >>>> > @@ -103,4 +103,8 @@ public interface ZooKeeperServerMXBean {
>> >> >> >>>> >      * Reset max latency statistics only.
>> >> >> >>>> >      */
>> >> >> >>>> >     public void resetMaxLatency();
>> >> >> >>>> > +    /**
>> >> >> >>>> > +     * @return number of alive client connections
>> >> >> >>>> > +     */
>> >> >> >>>> > +    public long getNumAliveConnections();
>> >> >> >>>> >  }
>> >> >> >>>> >
>> >> >> >>>> > Modified:
>> >> >> >>>>
>> >> >>
>> >>
>> zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/Zab1_0Test.java
>> >> >> >>>> > URL:
>> >> >> >>>>
>> >> >>
>> >>
>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/Zab1_0Test.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>> >> >> >>>> >
>> >> >> >>>>
>> >> >>
>> >>
>> ==============================================================================
>> >> >> >>>> > ---
>> >> >> >>>>
>> >> >>
>> >>
>> zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/Zab1_0Test.java
>> >> >> >>>> (original)
>> >> >> >>>> > +++
>> >> >> >>>>
>> >> >>
>> >>
>> zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/Zab1_0Test.java
>> >> >> >>>> Wed Dec 28 14:55:37 2011
>> >> >> >>>> > @@ -212,6 +212,10 @@ public class Zab1_0Test {
>> >> >> >>>> >         }
>> >> >> >>>> >         public void closeAll() {
>> >> >> >>>> >         }
>> >> >> >>>> > +               @Override
>> >> >> >>>> > +               public int getNumAliveConnections() {
>> >> >> >>>> > +                       return 0;
>> >> >> >>>> > +               }
>> >> >> >>>> >     }
>> >> >> >>>> >     static Socket[] getSocketPair() throws IOException {
>> >> >> >>>> >         ServerSocket ss = new ServerSocket();
>> >> >> >>>> >
>> >> >> >>>> > Modified:
>> >> >> >>>>
>> >> >>
>> >>
>> zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java
>> >> >> >>>> > URL:
>> >> >> >>>>
>> >> >>
>> >>
>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>> >> >> >>>> >
>> >> >> >>>>
>> >> >>
>> >>
>> ==============================================================================
>> >> >> >>>> > ---
>> >> >> >>>>
>> >> >>
>> >>
>> zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java
>> >> >> >>>> (original)
>> >> >> >>>> > +++
>> >> >> >>>>
>> >> >>
>> >>
>> zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java
>> >> >> >>>> Wed Dec 28 14:55:37 2011
>> >> >> >>>> > @@ -94,6 +94,9 @@ public class FourLetterWordsTest extends
>> >> >> >>>> >         verify("srvr", "Outstanding");
>> >> >> >>>> >         verify("cons", "queued");
>> >> >> >>>> >         verify("mntr", "zk_server_state\tstandalone");
>> >> >> >>>> > +        verify("mntr", "num_alive_connections");
>> >> >> >>>> > +        verify("stat", "Connections");
>> >> >> >>>> > +        verify("srvr", "Connections");
>> >> >> >>>> >     }
>> >> >> >>>> >
>> >> >> >>>> >     private String sendRequest(String cmd) throws IOException
>> {
>> >> >> >>>> > @@ -136,6 +139,8 @@ public class FourLetterWordsTest extends
>> >> >> >>>> >         line = in.readLine();
>> >> >> >>>> >         Assert.assertTrue(Pattern.matches("^Sent: \\d+$",
>> line));
>> >> >> >>>> >         line = in.readLine();
>> >> >> >>>> > +        Assert.assertTrue(Pattern.matches("^Connections:
>> \\d+$",
>> >> >> >>>> line));
>> >> >> >>>> > +        line = in.readLine();
>> >> >> >>>> >         Assert.assertTrue(Pattern.matches("^Outstanding:
>> \\d+$",
>> >> >> line));
>> >> >> >>>> >         line = in.readLine();
>> >> >> >>>> >         Assert.assertTrue(Pattern.matches("^Zxid:
>> >> 0x[\\da-fA-F]+$",
>> >> >> >>>> line));
>> >> >> >>>> >
>> >> >> >>>> >
>> >> >> >>>>
>> >> >> >>>
>> >> >>
>> >>
>>

Re: svn commit: r1225200 - in /zookeeper/trunk: ./ src/java/main/org/apache/zookeeper/server/ src/java/test/org/apache/zookeeper/server/quorum/ src/java/test/org/apache/zookeeper/test/

Posted by Camille Fournier <ca...@apache.org>.
Fair enough. Syncs for all! It's a drop in the bucket compared to the fact
that we aren't handling the fundamental socket connections for 4lws
correctly anyway.

On Wed, Dec 28, 2011 at 4:32 PM, Patrick Hunt <ph...@apache.org> wrote:

> On Wed, Dec 28, 2011 at 1:26 PM, Camille Fournier <ca...@apache.org>
> wrote:
> > I'm not sure I agree in the assumption that monitoring pulls happen
> > infrequently...
>
> Well that would be bad news then - see "stat" command processing and
> similar. All the more reason to look at this in more depth.
>
> Patrick
>
>
> > On Dec 28, 2011 4:24 PM, "Patrick Hunt" <ph...@apache.org> wrote:
> >
> >> They seem like distinct changes to me. In particular getting the size
> >> is going to happen infrequently (monitoring pull) so I don't see a
> >> problem fixing the existing patch in the same way the code currently
> >> handles cnxns access, with a separate jira to do the refactoring. Am I
> >> missing something?
> >>
> >> Patrick
> >>
> >> On Wed, Dec 28, 2011 at 1:10 PM, Camille Fournier <ca...@apache.org>
> >> wrote:
> >> > I don't think creating it as a flat sync is a good idea, so if we want
> >> this
> >> > I think we need to refactor that structure to be concurrent.
> >> >
> >> > C
> >> > On Dec 28, 2011 2:24 PM, "Patrick Hunt" <ph...@apache.org> wrote:
> >> >
> >> >> I think it needs to be fixed. It's obviously incorrect. Also if
> >> >> someone changes the underlying implementation at some point it might
> >> >> bite them.
> >> >>
> >> >> Given it wasn't applied to 3.4 branch yet I'd suggest revert, fix the
> >> >> patch, then reapply to both branches. (that's easiest/bulletproof
> imo)
> >> >>
> >> >> I'd recommend a new ticket to fix the issues you identified
> (refactor,
> >> >> etc...) Neha was looking for further items to work on, this would be
> a
> >> >> good one.
> >> >>
> >> >> Patrick
> >> >>
> >> >> On Wed, Dec 28, 2011 at 11:18 AM, Camille Fournier <
> camille@apache.org>
> >> >> wrote:
> >> >> > Also, Pat, the JIRA is still open. I will look to revert in a
> minute
> >> >> > although I think the sync changes may necessitate a new JIRA
> entirely.
> >> >> >
> >> >> > On Wed, Dec 28, 2011 at 1:31 PM, Camille Fournier <
> camille@apache.org
> >> >
> >> >> wrote:
> >> >> >> After looking for a few mins, here are my observations:
> >> >> >>
> >> >> >> The implementation of HashSet in jdk 1.6 uses an underlying
> HashMap,
> >> >> which
> >> >> >> uses a bog-standard int for the size. So, I completely agree that
> we
> >> can
> >> >> >> get invalid results for a point in time. But does anyone really
> care
> >> >> about
> >> >> >> the *exact* moment-in-time number of cnxns in the system, in a
> system
> >> >> where
> >> >> >> cnxns are coming and going? At best you'll see a value that will
> >> likely
> >> >> be
> >> >> >> out of date the moment you read it.
> >> >> >>
> >> >> >> But, if we're going to do this, I do think there may be a case for
> >> >> >> refactoring to a concurrent data structure given that we are
> randomly
> >> >> >> syncing on the cnxns set in a way that makes adding additional
> >> >> interactions
> >> >> >> with it error prone in this way. And we should definitely remove
> that
> >> >> >> getConnections method, if anyone ever iterated over that set they
> >> would
> >> >> be
> >> >> >> in a sad concurrency situation.
> >> >> >> Seems possibly worth a whole new ticket to do this. What do you
> >> think?
> >> >> >>
> >> >> >> Thanks,
> >> >> >> C
> >> >> >>
> >> >> >> On Wed, Dec 28, 2011 at 1:12 PM, Camille Fournier <
> >> camille@apache.org
> >> >> >wrote:
> >> >> >>
> >> >> >>> I'm not sure it's meaningful enough to be worth the sync
> overhead.
> >> We
> >> >> >>> should look into that. The alternative if we must is using a
> proper
> >> >> >>> concurrent collection. Neha, any thoughts?
> >> >> >>>
> >> >> >>> C
> >> >> >>> On Dec 28, 2011 12:45 PM, "Patrick Hunt" <ph...@apache.org>
> wrote:
> >> >> >>>
> >> >> >>>> I believe there is a bug in this commit. The "cnxns" size()
> call is
> >> >> >>>> not being synchronized. This will lead to invalid results at
> best,
> >> at
> >> >> >>>> worst outright failure (hard to say w/o knowing the
> implementation
> >> of
> >> >> >>>> HashSet).
> >> >> >>>>
> >> >> >>>> Camille can you work with Neha to get this fixed? Perhaps in the
> >> >> >>>> meantime (if it's going to take a while) you can revert this
> >> change,
> >> >> >>>> re-open the jira, update the patch, and reapply at some later
> time?
> >> >> >>>>
> >> >> >>>> Patrick
> >> >> >>>>
> >> >> >>>> On Wed, Dec 28, 2011 at 6:55 AM,  <ca...@apache.org> wrote:
> >> >> >>>> > Author: camille
> >> >> >>>> > Date: Wed Dec 28 14:55:37 2011
> >> >> >>>> > New Revision: 1225200
> >> >> >>>> >
> >> >> >>>> > URL: http://svn.apache.org/viewvc?rev=1225200&view=rev
> >> >> >>>> > Log:
> >> >> >>>> > ZOOKEEPER-1321: Add number of client connections metric in JMX
> >> and
> >> >> srvr
> >> >> >>>> (Neha Narkhede via camille)
> >> >> >>>> >
> >> >> >>>> > Modified:
> >> >> >>>> >    zookeeper/trunk/CHANGES.txt
> >> >> >>>> >
> >> >> >>>>
> >> >>
> >>
>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java
> >> >> >>>> >
> >> >> >>>>
> >> >>
> >>
>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java
> >> >> >>>> >
> >> >> >>>>
> >> >>
> >>
>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java
> >> >> >>>> >
> >> >> >>>>
> >> >>
> >>
>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java
> >> >> >>>> >
> >> >> >>>>
> >> >>
> >>
>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java
> >> >> >>>> >
> >> >> >>>>
> >> >>
> >>
>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerStats.java
> >> >> >>>> >
> >> >> >>>>
> >> >>
> >>
>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java
> >> >> >>>> >
> >> >> >>>>
> >> >>
> >>
>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java
> >> >> >>>> >
> >> >> >>>>
> >> >>
> >>
>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java
> >> >> >>>> >
> >> >> >>>>
> >> >>
> >>
>  zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/Zab1_0Test.java
> >> >> >>>> >
> >> >> >>>>
> >> >>
> >>
>  zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java
> >> >> >>>> >
> >> >> >>>> > Modified: zookeeper/trunk/CHANGES.txt
> >> >> >>>> > URL:
> >> >> >>>>
> >> >>
> >>
> http://svn.apache.org/viewvc/zookeeper/trunk/CHANGES.txt?rev=1225200&r1=1225199&r2=1225200&view=diff
> >> >> >>>> >
> >> >> >>>>
> >> >>
> >>
> ==============================================================================
> >> >> >>>> > --- zookeeper/trunk/CHANGES.txt (original)
> >> >> >>>> > +++ zookeeper/trunk/CHANGES.txt Wed Dec 28 14:55:37 2011
> >> >> >>>> > @@ -162,6 +162,8 @@ IMPROVEMENTS:
> >> >> >>>> >
> >> >> >>>> >   ZOOKEEPER-1342. quorum Listener & LearnerCnxAcceptor are
> >> missing
> >> >> >>>> >   thread names (Rakesh R via phunt)
> >> >> >>>> > +
> >> >> >>>> > +  ZOOKEEPER-1321. Add number of client connections metric in
> JMX
> >> >> and
> >> >> >>>> srvr (Neha Narkhede via camille)
> >> >> >>>> >
> >> >> >>>> >  Release 3.4.0 -
> >> >> >>>> >
> >> >> >>>> >
> >> >> >>>> > Modified:
> >> >> >>>>
> >> >>
> >>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java
> >> >> >>>> > URL:
> >> >> >>>>
> >> >>
> >>
> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java?rev=1225200&r1=1225199&r2=1225200&view=diff
> >> >> >>>> >
> >> >> >>>>
> >> >>
> >>
> ==============================================================================
> >> >> >>>> > ---
> >> >> >>>>
> >> >>
> >>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java
> >> >> >>>> (original)
> >> >> >>>> > +++
> >> >> >>>>
> >> >>
> >>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java
> >> >> >>>> Wed Dec 28 14:55:37 2011
> >> >> >>>> > @@ -749,7 +749,8 @@ public class NIOServerCnxn extends Serve
> >> >> >>>> >
> >> >> >>>> >             print("packets_received",
> >> stats.getPacketsReceived());
> >> >> >>>> >             print("packets_sent", stats.getPacketsSent());
> >> >> >>>> > -
> >> >> >>>> > +            print("num_alive_connections",
> >> >> >>>> stats.getNumAliveClientConnections());
> >> >> >>>> > +
> >> >> >>>> >             print("outstanding_requests",
> >> >> >>>> stats.getOutstandingRequests());
> >> >> >>>> >
> >> >> >>>> >             print("server_state", stats.getServerState());
> >> >> >>>> >
> >> >> >>>> > Modified:
> >> >> >>>>
> >> >>
> >>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java
> >> >> >>>> > URL:
> >> >> >>>>
> >> >>
> >>
> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java?rev=1225200&r1=1225199&r2=1225200&view=diff
> >> >> >>>> >
> >> >> >>>>
> >> >>
> >>
> ==============================================================================
> >> >> >>>> > ---
> >> >> >>>>
> >> >>
> >>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java
> >> >> >>>> (original)
> >> >> >>>> > +++
> >> >> >>>>
> >> >>
> >>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java
> >> >> >>>> Wed Dec 28 14:55:37 2011
> >> >> >>>> > @@ -32,14 +32,14 @@ import java.util.HashMap;
> >> >> >>>> >  import java.util.HashSet;
> >> >> >>>> >  import java.util.Set;
> >> >> >>>> >
> >> >> >>>> > +import javax.security.auth.login.Configuration;
> >> >> >>>> > +import javax.security.auth.login.LoginException;
> >> >> >>>> > +
> >> >> >>>> >  import org.apache.zookeeper.Login;
> >> >> >>>> >  import
> >> org.apache.zookeeper.server.auth.SaslServerCallbackHandler;
> >> >> >>>> >  import org.slf4j.Logger;
> >> >> >>>> >  import org.slf4j.LoggerFactory;
> >> >> >>>> >
> >> >> >>>> > -import javax.security.auth.login.Configuration;
> >> >> >>>> > -import javax.security.auth.login.LoginException;
> >> >> >>>> > -
> >> >> >>>> >  public class NIOServerCnxnFactory extends ServerCnxnFactory
> >> >> implements
> >> >> >>>> Runnable {
> >> >> >>>> >     private static final Logger LOG =
> >> >> >>>> LoggerFactory.getLogger(NIOServerCnxnFactory.class);
> >> >> >>>> >
> >> >> >>>> > @@ -78,7 +78,6 @@ public class NIOServerCnxnFactory extend
> >> >> >>>> >
> >> >> >>>> >     int maxClientCnxns = 60;
> >> >> >>>> >
> >> >> >>>> > -
> >> >> >>>> >     /**
> >> >> >>>> >      * Construct a new server connection factory which will
> >> accept
> >> >> an
> >> >> >>>> unlimited number
> >> >> >>>> >      * of concurrent connections from each client (up to the
> file
> >> >> >>>> descriptor
> >> >> >>>> > @@ -122,7 +121,7 @@ public class NIOServerCnxnFactory extend
> >> >> >>>> >     public void setMaxClientCnxnsPerHost(int max) {
> >> >> >>>> >         maxClientCnxns = max;
> >> >> >>>> >     }
> >> >> >>>> > -
> >> >> >>>> > +
> >> >> >>>> >     @Override
> >> >> >>>> >     public void start() {
> >> >> >>>> >         // ensure thread is started once and only once
> >> >> >>>> > @@ -187,7 +186,7 @@ public class NIOServerCnxnFactory extend
> >> >> >>>> >             return s.size();
> >> >> >>>> >         }
> >> >> >>>> >     }
> >> >> >>>> > -
> >> >> >>>> > +
> >> >> >>>> >     public void run() {
> >> >> >>>> >         while (!ss.socket().isClosed()) {
> >> >> >>>> >             try {
> >> >> >>>> > @@ -323,4 +322,8 @@ public class NIOServerCnxnFactory extend
> >> >> >>>> >         return cnxns;
> >> >> >>>> >     }
> >> >> >>>> >
> >> >> >>>> > +    @Override
> >> >> >>>> > +    public int getNumAliveConnections() {
> >> >> >>>> > +       return cnxns.size();
> >> >> >>>> > +    }
> >> >> >>>> >  }
> >> >> >>>> >
> >> >> >>>> > Modified:
> >> >> >>>>
> >> >>
> >>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java
> >> >> >>>> > URL:
> >> >> >>>>
> >> >>
> >>
> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java?rev=1225200&r1=1225199&r2=1225200&view=diff
> >> >> >>>> >
> >> >> >>>>
> >> >>
> >>
> ==============================================================================
> >> >> >>>> > ---
> >> >> >>>>
> >> >>
> >>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java
> >> >> >>>> (original)
> >> >> >>>> > +++
> >> >> >>>>
> >> >>
> >>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java
> >> >> >>>> Wed Dec 28 14:55:37 2011
> >> >> >>>> > @@ -560,7 +560,8 @@ public class NettyServerCnxn extends Ser
> >> >> >>>> >
> >> >> >>>> >             print("packets_received",
> >> stats.getPacketsReceived());
> >> >> >>>> >             print("packets_sent", stats.getPacketsSent());
> >> >> >>>> > -
> >> >> >>>> > +            print("num_alive_connections",
> >> >> >>>> stats.getNumAliveClientConnections());
> >> >> >>>> > +
> >> >> >>>> >             print("outstanding_requests",
> >> >> >>>> stats.getOutstandingRequests());
> >> >> >>>> >
> >> >> >>>> >             print("server_state", stats.getServerState());
> >> >> >>>> >
> >> >> >>>> > Modified:
> >> >> >>>>
> >> >>
> >>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java
> >> >> >>>> > URL:
> >> >> >>>>
> >> >>
> >>
> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java?rev=1225200&r1=1225199&r2=1225200&view=diff
> >> >> >>>> >
> >> >> >>>>
> >> >>
> >>
> ==============================================================================
> >> >> >>>> > ---
> >> >> >>>>
> >> >>
> >>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java
> >> >> >>>> (original)
> >> >> >>>> > +++
> >> >> >>>>
> >> >>
> >>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java
> >> >> >>>> Wed Dec 28 14:55:37 2011
> >> >> >>>> > @@ -411,5 +411,10 @@ public class NettyServerCnxnFactory exte
> >> >> >>>> >             }
> >> >> >>>> >         }
> >> >> >>>> >     }
> >> >> >>>> > +
> >> >> >>>> > +    @Override
> >> >> >>>> > +    public int getNumAliveConnections() {
> >> >> >>>> > +       return cnxns.size();
> >> >> >>>> > +    }
> >> >> >>>> >
> >> >> >>>> >  }
> >> >> >>>> >
> >> >> >>>> > Modified:
> >> >> >>>>
> >> >>
> >>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java
> >> >> >>>> > URL:
> >> >> >>>>
> >> >>
> >>
> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java?rev=1225200&r1=1225199&r2=1225200&view=diff
> >> >> >>>> >
> >> >> >>>>
> >> >>
> >>
> ==============================================================================
> >> >> >>>> > ---
> >> >> >>>>
> >> >>
> >>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java
> >> >> >>>> (original)
> >> >> >>>> > +++
> >> >> >>>>
> >> >>
> >>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java
> >> >> >>>> Wed Dec 28 14:55:37 2011
> >> >> >>>> > @@ -24,15 +24,16 @@ import java.nio.ByteBuffer;
> >> >> >>>> >  import java.util.HashMap;
> >> >> >>>> >
> >> >> >>>> >  import javax.management.JMException;
> >> >> >>>> > -import org.slf4j.Logger;
> >> >> >>>> > -import org.slf4j.LoggerFactory;
> >> >> >>>> > -import org.apache.zookeeper.jmx.MBeanRegistry;
> >> >> >>>> > +
> >> >> >>>> >  import org.apache.zookeeper.Login;
> >> >> >>>> > +import org.apache.zookeeper.jmx.MBeanRegistry;
> >> >> >>>> >  import
> >> org.apache.zookeeper.server.auth.SaslServerCallbackHandler;
> >> >> >>>> > +import org.slf4j.Logger;
> >> >> >>>> > +import org.slf4j.LoggerFactory;
> >> >> >>>> >
> >> >> >>>> >  public abstract class ServerCnxnFactory {
> >> >> >>>> >
> >> >> >>>> > -    public static final String ZOOKEEPER_SERVER_CNXN_FACTORY
> =
> >> >> >>>> "zookeeper.serverCnxnFactory";
> >> >> >>>> > +    public static final String ZOOKEEPER_SERVER_CNXN_FACTORY
> =
> >> >> >>>> "zookeeper.serverCnxnFactory";
> >> >> >>>> >
> >> >> >>>> >     public interface PacketProcessor {
> >> >> >>>> >         public void processPacket(ByteBuffer packet,
> ServerCnxn
> >> >> src);
> >> >> >>>> > @@ -49,6 +50,8 @@ public abstract class ServerCnxnFactory
> >> >> >>>> >
> >> >> >>>> >     public abstract Iterable<ServerCnxn> getConnections();
> >> >> >>>> >
> >> >> >>>> > +    public abstract int getNumAliveConnections();
> >> >> >>>> > +
> >> >> >>>> >     public abstract void closeSession(long sessionId);
> >> >> >>>> >
> >> >> >>>> >     public abstract void configure(InetSocketAddress addr,
> >> >> >>>> >
> >> >> >>>> > Modified:
> >> >> >>>>
> >> >>
> >>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerStats.java
> >> >> >>>> > URL:
> >> >> >>>>
> >> >>
> >>
> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerStats.java?rev=1225200&r1=1225199&r2=1225200&view=diff
> >> >> >>>> >
> >> >> >>>>
> >> >>
> >>
> ==============================================================================
> >> >> >>>> > ---
> >> >> >>>>
> >> >>
> >>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerStats.java
> >> >> >>>> (original)
> >> >> >>>> > +++
> >> >> >>>>
> >> >>
> >>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerStats.java
> >> >> >>>> Wed Dec 28 14:55:37 2011
> >> >> >>>> > @@ -19,6 +19,7 @@
> >> >> >>>> >  package org.apache.zookeeper.server;
> >> >> >>>> >
> >> >> >>>> >
> >> >> >>>> > +
> >> >> >>>> >  /**
> >> >> >>>> >  * Basic Server Statistics
> >> >> >>>> >  */
> >> >> >>>> > @@ -29,13 +30,14 @@ public class ServerStats {
> >> >> >>>> >     private long minLatency = Long.MAX_VALUE;
> >> >> >>>> >     private long totalLatency = 0;
> >> >> >>>> >     private long count = 0;
> >> >> >>>> > -
> >> >> >>>> > +
> >> >> >>>> >     private final Provider provider;
> >> >> >>>> >
> >> >> >>>> >     public interface Provider {
> >> >> >>>> >         public long getOutstandingRequests();
> >> >> >>>> >         public long getLastProcessedZxid();
> >> >> >>>> >         public String getState();
> >> >> >>>> > +        public int getNumAliveConnections();
> >> >> >>>> >     }
> >> >> >>>> >
> >> >> >>>> >     public ServerStats(Provider provider) {
> >> >> >>>> > @@ -75,9 +77,14 @@ public class ServerStats {
> >> >> >>>> >     }
> >> >> >>>> >
> >> >> >>>> >     public String getServerState() {
> >> >> >>>> > -        return provider.getState();
> >> >> >>>> > +       return provider.getState();
> >> >> >>>> >     }
> >> >> >>>> > -
> >> >> >>>> > +
> >> >> >>>> > +    /** The number of client connections alive to this
> server */
> >> >> >>>> > +    public int getNumAliveClientConnections() {
> >> >> >>>> > +       return provider.getNumAliveConnections();
> >> >> >>>> > +    }
> >> >> >>>> > +
> >> >> >>>> >     @Override
> >> >> >>>> >     public String toString(){
> >> >> >>>> >         StringBuilder sb = new StringBuilder();
> >> >> >>>> > @@ -85,6 +92,8 @@ public class ServerStats {
> >> >> >>>> >                 + getAvgLatency() + "/" + getMaxLatency() +
> >> "\n");
> >> >> >>>> >         sb.append("Received: " + getPacketsReceived() + "\n");
> >> >> >>>> >         sb.append("Sent: " + getPacketsSent() + "\n");
> >> >> >>>> > +        sb.append("Connections: " +
> >> getNumAliveClientConnections()
> >> >> +
> >> >> >>>> "\n");
> >> >> >>>> > +
> >> >> >>>> >         if (provider != null) {
> >> >> >>>> >             sb.append("Outstanding: " +
> getOutstandingRequests()
> >> +
> >> >> >>>> "\n");
> >> >> >>>> >             sb.append("Zxid: 0x"+
> >> >> >>>> Long.toHexString(getLastProcessedZxid())+ "\n");
> >> >> >>>> > @@ -123,7 +132,6 @@ public class ServerStats {
> >> >> >>>> >         packetsReceived = 0;
> >> >> >>>> >         packetsSent = 0;
> >> >> >>>> >     }
> >> >> >>>> > -
> >> >> >>>> >     synchronized public void reset() {
> >> >> >>>> >         resetLatency();
> >> >> >>>> >         resetRequestCounters();
> >> >> >>>> >
> >> >> >>>> > Modified:
> >> >> >>>>
> >> >>
> >>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java
> >> >> >>>> > URL:
> >> >> >>>>
> >> >>
> >>
> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java?rev=1225200&r1=1225199&r2=1225200&view=diff
> >> >> >>>> >
> >> >> >>>>
> >> >>
> >>
> ==============================================================================
> >> >> >>>> > ---
> >> >> >>>>
> >> >>
> >>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java
> >> >> >>>> (original)
> >> >> >>>> > +++
> >> >> >>>>
> >> >>
> >>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java
> >> >> >>>> Wed Dec 28 14:55:37 2011
> >> >> >>>> > @@ -109,7 +109,7 @@ public class ZooKeeperServer implements
> >> >> >>>> >     private ServerCnxnFactory serverCnxnFactory;
> >> >> >>>> >
> >> >> >>>> >     private final ServerStats serverStats;
> >> >> >>>> > -
> >> >> >>>> > +
> >> >> >>>> >     void removeCnxn(ServerCnxn cnxn) {
> >> >> >>>> >         zkDb.removeCnxn(cnxn);
> >> >> >>>> >     }
> >> >> >>>> > @@ -254,7 +254,6 @@ public class ZooKeeperServer implements
> >> >> >>>> >         }
> >> >> >>>> >     }
> >> >> >>>> >
> >> >> >>>> > -
> >> >> >>>> >     /**
> >> >> >>>> >      * This should be called from a synchronized block on
> this!
> >> >> >>>> >      */
> >> >> >>>> > @@ -678,6 +677,14 @@ public class ZooKeeperServer implements
> >> >> >>>> >     }
> >> >> >>>> >
> >> >> >>>> >     /**
> >> >> >>>> > +     * return the total number of client connections that are
> >> alive
> >> >> >>>> > +     * to this server
> >> >> >>>> > +     */
> >> >> >>>> > +    public int getNumAliveConnections() {
> >> >> >>>> > +       return serverCnxnFactory.getNumAliveConnections();
> >> >> >>>> > +    }
> >> >> >>>> > +
> >> >> >>>> > +    /**
> >> >> >>>> >      * trunccate the log to get in sync with others
> >> >> >>>> >      * if in a quorum
> >> >> >>>> >      * @param zxid the zxid that it needs to get in sync
> >> >> >>>> >
> >> >> >>>> > Modified:
> >> >> >>>>
> >> >>
> >>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java
> >> >> >>>> > URL:
> >> >> >>>>
> >> >>
> >>
> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java?rev=1225200&r1=1225199&r2=1225200&view=diff
> >> >> >>>> >
> >> >> >>>>
> >> >>
> >>
> ==============================================================================
> >> >> >>>> > ---
> >> >> >>>>
> >> >>
> >>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java
> >> >> >>>> (original)
> >> >> >>>> > +++
> >> >> >>>>
> >> >>
> >>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java
> >> >> >>>> Wed Dec 28 14:55:37 2011
> >> >> >>>> > @@ -140,4 +140,8 @@ public class ZooKeeperServerBean impleme
> >> >> >>>> >         serverStats.resetRequestCounters();
> >> >> >>>> >         serverStats.resetLatency();
> >> >> >>>> >     }
> >> >> >>>> > +
> >> >> >>>> > +       public long getNumAliveConnections() {
> >> >> >>>> > +               return zks.getNumAliveConnections();
> >> >> >>>> > +       }
> >> >> >>>> >  }
> >> >> >>>> >
> >> >> >>>> > Modified:
> >> >> >>>>
> >> >>
> >>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java
> >> >> >>>> > URL:
> >> >> >>>>
> >> >>
> >>
> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java?rev=1225200&r1=1225199&r2=1225200&view=diff
> >> >> >>>> >
> >> >> >>>>
> >> >>
> >>
> ==============================================================================
> >> >> >>>> > ---
> >> >> >>>>
> >> >>
> >>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java
> >> >> >>>> (original)
> >> >> >>>> > +++
> >> >> >>>>
> >> >>
> >>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java
> >> >> >>>> Wed Dec 28 14:55:37 2011
> >> >> >>>> > @@ -103,4 +103,8 @@ public interface ZooKeeperServerMXBean {
> >> >> >>>> >      * Reset max latency statistics only.
> >> >> >>>> >      */
> >> >> >>>> >     public void resetMaxLatency();
> >> >> >>>> > +    /**
> >> >> >>>> > +     * @return number of alive client connections
> >> >> >>>> > +     */
> >> >> >>>> > +    public long getNumAliveConnections();
> >> >> >>>> >  }
> >> >> >>>> >
> >> >> >>>> > Modified:
> >> >> >>>>
> >> >>
> >>
> zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/Zab1_0Test.java
> >> >> >>>> > URL:
> >> >> >>>>
> >> >>
> >>
> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/Zab1_0Test.java?rev=1225200&r1=1225199&r2=1225200&view=diff
> >> >> >>>> >
> >> >> >>>>
> >> >>
> >>
> ==============================================================================
> >> >> >>>> > ---
> >> >> >>>>
> >> >>
> >>
> zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/Zab1_0Test.java
> >> >> >>>> (original)
> >> >> >>>> > +++
> >> >> >>>>
> >> >>
> >>
> zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/Zab1_0Test.java
> >> >> >>>> Wed Dec 28 14:55:37 2011
> >> >> >>>> > @@ -212,6 +212,10 @@ public class Zab1_0Test {
> >> >> >>>> >         }
> >> >> >>>> >         public void closeAll() {
> >> >> >>>> >         }
> >> >> >>>> > +               @Override
> >> >> >>>> > +               public int getNumAliveConnections() {
> >> >> >>>> > +                       return 0;
> >> >> >>>> > +               }
> >> >> >>>> >     }
> >> >> >>>> >     static Socket[] getSocketPair() throws IOException {
> >> >> >>>> >         ServerSocket ss = new ServerSocket();
> >> >> >>>> >
> >> >> >>>> > Modified:
> >> >> >>>>
> >> >>
> >>
> zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java
> >> >> >>>> > URL:
> >> >> >>>>
> >> >>
> >>
> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java?rev=1225200&r1=1225199&r2=1225200&view=diff
> >> >> >>>> >
> >> >> >>>>
> >> >>
> >>
> ==============================================================================
> >> >> >>>> > ---
> >> >> >>>>
> >> >>
> >>
> zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java
> >> >> >>>> (original)
> >> >> >>>> > +++
> >> >> >>>>
> >> >>
> >>
> zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java
> >> >> >>>> Wed Dec 28 14:55:37 2011
> >> >> >>>> > @@ -94,6 +94,9 @@ public class FourLetterWordsTest extends
> >> >> >>>> >         verify("srvr", "Outstanding");
> >> >> >>>> >         verify("cons", "queued");
> >> >> >>>> >         verify("mntr", "zk_server_state\tstandalone");
> >> >> >>>> > +        verify("mntr", "num_alive_connections");
> >> >> >>>> > +        verify("stat", "Connections");
> >> >> >>>> > +        verify("srvr", "Connections");
> >> >> >>>> >     }
> >> >> >>>> >
> >> >> >>>> >     private String sendRequest(String cmd) throws IOException
> {
> >> >> >>>> > @@ -136,6 +139,8 @@ public class FourLetterWordsTest extends
> >> >> >>>> >         line = in.readLine();
> >> >> >>>> >         Assert.assertTrue(Pattern.matches("^Sent: \\d+$",
> line));
> >> >> >>>> >         line = in.readLine();
> >> >> >>>> > +        Assert.assertTrue(Pattern.matches("^Connections:
> \\d+$",
> >> >> >>>> line));
> >> >> >>>> > +        line = in.readLine();
> >> >> >>>> >         Assert.assertTrue(Pattern.matches("^Outstanding:
> \\d+$",
> >> >> line));
> >> >> >>>> >         line = in.readLine();
> >> >> >>>> >         Assert.assertTrue(Pattern.matches("^Zxid:
> >> 0x[\\da-fA-F]+$",
> >> >> >>>> line));
> >> >> >>>> >
> >> >> >>>> >
> >> >> >>>>
> >> >> >>>
> >> >>
> >>
>

Re: svn commit: r1225200 - in /zookeeper/trunk: ./ src/java/main/org/apache/zookeeper/server/ src/java/test/org/apache/zookeeper/server/quorum/ src/java/test/org/apache/zookeeper/test/

Posted by Patrick Hunt <ph...@apache.org>.
On Wed, Dec 28, 2011 at 1:26 PM, Camille Fournier <ca...@apache.org> wrote:
> I'm not sure I agree in the assumption that monitoring pulls happen
> infrequently...

Well that would be bad news then - see "stat" command processing and
similar. All the more reason to look at this in more depth.

Patrick


> On Dec 28, 2011 4:24 PM, "Patrick Hunt" <ph...@apache.org> wrote:
>
>> They seem like distinct changes to me. In particular getting the size
>> is going to happen infrequently (monitoring pull) so I don't see a
>> problem fixing the existing patch in the same way the code currently
>> handles cnxns access, with a separate jira to do the refactoring. Am I
>> missing something?
>>
>> Patrick
>>
>> On Wed, Dec 28, 2011 at 1:10 PM, Camille Fournier <ca...@apache.org>
>> wrote:
>> > I don't think creating it as a flat sync is a good idea, so if we want
>> this
>> > I think we need to refactor that structure to be concurrent.
>> >
>> > C
>> > On Dec 28, 2011 2:24 PM, "Patrick Hunt" <ph...@apache.org> wrote:
>> >
>> >> I think it needs to be fixed. It's obviously incorrect. Also if
>> >> someone changes the underlying implementation at some point it might
>> >> bite them.
>> >>
>> >> Given it wasn't applied to 3.4 branch yet I'd suggest revert, fix the
>> >> patch, then reapply to both branches. (that's easiest/bulletproof imo)
>> >>
>> >> I'd recommend a new ticket to fix the issues you identified (refactor,
>> >> etc...) Neha was looking for further items to work on, this would be a
>> >> good one.
>> >>
>> >> Patrick
>> >>
>> >> On Wed, Dec 28, 2011 at 11:18 AM, Camille Fournier <ca...@apache.org>
>> >> wrote:
>> >> > Also, Pat, the JIRA is still open. I will look to revert in a minute
>> >> > although I think the sync changes may necessitate a new JIRA entirely.
>> >> >
>> >> > On Wed, Dec 28, 2011 at 1:31 PM, Camille Fournier <camille@apache.org
>> >
>> >> wrote:
>> >> >> After looking for a few mins, here are my observations:
>> >> >>
>> >> >> The implementation of HashSet in jdk 1.6 uses an underlying HashMap,
>> >> which
>> >> >> uses a bog-standard int for the size. So, I completely agree that we
>> can
>> >> >> get invalid results for a point in time. But does anyone really care
>> >> about
>> >> >> the *exact* moment-in-time number of cnxns in the system, in a system
>> >> where
>> >> >> cnxns are coming and going? At best you'll see a value that will
>> likely
>> >> be
>> >> >> out of date the moment you read it.
>> >> >>
>> >> >> But, if we're going to do this, I do think there may be a case for
>> >> >> refactoring to a concurrent data structure given that we are randomly
>> >> >> syncing on the cnxns set in a way that makes adding additional
>> >> interactions
>> >> >> with it error prone in this way. And we should definitely remove that
>> >> >> getConnections method, if anyone ever iterated over that set they
>> would
>> >> be
>> >> >> in a sad concurrency situation.
>> >> >> Seems possibly worth a whole new ticket to do this. What do you
>> think?
>> >> >>
>> >> >> Thanks,
>> >> >> C
>> >> >>
>> >> >> On Wed, Dec 28, 2011 at 1:12 PM, Camille Fournier <
>> camille@apache.org
>> >> >wrote:
>> >> >>
>> >> >>> I'm not sure it's meaningful enough to be worth the sync overhead.
>> We
>> >> >>> should look into that. The alternative if we must is using a proper
>> >> >>> concurrent collection. Neha, any thoughts?
>> >> >>>
>> >> >>> C
>> >> >>> On Dec 28, 2011 12:45 PM, "Patrick Hunt" <ph...@apache.org> wrote:
>> >> >>>
>> >> >>>> I believe there is a bug in this commit. The "cnxns" size() call is
>> >> >>>> not being synchronized. This will lead to invalid results at best,
>> at
>> >> >>>> worst outright failure (hard to say w/o knowing the implementation
>> of
>> >> >>>> HashSet).
>> >> >>>>
>> >> >>>> Camille can you work with Neha to get this fixed? Perhaps in the
>> >> >>>> meantime (if it's going to take a while) you can revert this
>> change,
>> >> >>>> re-open the jira, update the patch, and reapply at some later time?
>> >> >>>>
>> >> >>>> Patrick
>> >> >>>>
>> >> >>>> On Wed, Dec 28, 2011 at 6:55 AM,  <ca...@apache.org> wrote:
>> >> >>>> > Author: camille
>> >> >>>> > Date: Wed Dec 28 14:55:37 2011
>> >> >>>> > New Revision: 1225200
>> >> >>>> >
>> >> >>>> > URL: http://svn.apache.org/viewvc?rev=1225200&view=rev
>> >> >>>> > Log:
>> >> >>>> > ZOOKEEPER-1321: Add number of client connections metric in JMX
>> and
>> >> srvr
>> >> >>>> (Neha Narkhede via camille)
>> >> >>>> >
>> >> >>>> > Modified:
>> >> >>>> >    zookeeper/trunk/CHANGES.txt
>> >> >>>> >
>> >> >>>>
>> >>
>>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java
>> >> >>>> >
>> >> >>>>
>> >>
>>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java
>> >> >>>> >
>> >> >>>>
>> >>
>>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java
>> >> >>>> >
>> >> >>>>
>> >>
>>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java
>> >> >>>> >
>> >> >>>>
>> >>
>>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java
>> >> >>>> >
>> >> >>>>
>> >>
>>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerStats.java
>> >> >>>> >
>> >> >>>>
>> >>
>>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java
>> >> >>>> >
>> >> >>>>
>> >>
>>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java
>> >> >>>> >
>> >> >>>>
>> >>
>>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java
>> >> >>>> >
>> >> >>>>
>> >>
>>  zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/Zab1_0Test.java
>> >> >>>> >
>> >> >>>>
>> >>
>>  zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java
>> >> >>>> >
>> >> >>>> > Modified: zookeeper/trunk/CHANGES.txt
>> >> >>>> > URL:
>> >> >>>>
>> >>
>> http://svn.apache.org/viewvc/zookeeper/trunk/CHANGES.txt?rev=1225200&r1=1225199&r2=1225200&view=diff
>> >> >>>> >
>> >> >>>>
>> >>
>> ==============================================================================
>> >> >>>> > --- zookeeper/trunk/CHANGES.txt (original)
>> >> >>>> > +++ zookeeper/trunk/CHANGES.txt Wed Dec 28 14:55:37 2011
>> >> >>>> > @@ -162,6 +162,8 @@ IMPROVEMENTS:
>> >> >>>> >
>> >> >>>> >   ZOOKEEPER-1342. quorum Listener & LearnerCnxAcceptor are
>> missing
>> >> >>>> >   thread names (Rakesh R via phunt)
>> >> >>>> > +
>> >> >>>> > +  ZOOKEEPER-1321. Add number of client connections metric in JMX
>> >> and
>> >> >>>> srvr (Neha Narkhede via camille)
>> >> >>>> >
>> >> >>>> >  Release 3.4.0 -
>> >> >>>> >
>> >> >>>> >
>> >> >>>> > Modified:
>> >> >>>>
>> >>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java
>> >> >>>> > URL:
>> >> >>>>
>> >>
>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>> >> >>>> >
>> >> >>>>
>> >>
>> ==============================================================================
>> >> >>>> > ---
>> >> >>>>
>> >>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java
>> >> >>>> (original)
>> >> >>>> > +++
>> >> >>>>
>> >>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java
>> >> >>>> Wed Dec 28 14:55:37 2011
>> >> >>>> > @@ -749,7 +749,8 @@ public class NIOServerCnxn extends Serve
>> >> >>>> >
>> >> >>>> >             print("packets_received",
>> stats.getPacketsReceived());
>> >> >>>> >             print("packets_sent", stats.getPacketsSent());
>> >> >>>> > -
>> >> >>>> > +            print("num_alive_connections",
>> >> >>>> stats.getNumAliveClientConnections());
>> >> >>>> > +
>> >> >>>> >             print("outstanding_requests",
>> >> >>>> stats.getOutstandingRequests());
>> >> >>>> >
>> >> >>>> >             print("server_state", stats.getServerState());
>> >> >>>> >
>> >> >>>> > Modified:
>> >> >>>>
>> >>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java
>> >> >>>> > URL:
>> >> >>>>
>> >>
>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>> >> >>>> >
>> >> >>>>
>> >>
>> ==============================================================================
>> >> >>>> > ---
>> >> >>>>
>> >>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java
>> >> >>>> (original)
>> >> >>>> > +++
>> >> >>>>
>> >>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java
>> >> >>>> Wed Dec 28 14:55:37 2011
>> >> >>>> > @@ -32,14 +32,14 @@ import java.util.HashMap;
>> >> >>>> >  import java.util.HashSet;
>> >> >>>> >  import java.util.Set;
>> >> >>>> >
>> >> >>>> > +import javax.security.auth.login.Configuration;
>> >> >>>> > +import javax.security.auth.login.LoginException;
>> >> >>>> > +
>> >> >>>> >  import org.apache.zookeeper.Login;
>> >> >>>> >  import
>> org.apache.zookeeper.server.auth.SaslServerCallbackHandler;
>> >> >>>> >  import org.slf4j.Logger;
>> >> >>>> >  import org.slf4j.LoggerFactory;
>> >> >>>> >
>> >> >>>> > -import javax.security.auth.login.Configuration;
>> >> >>>> > -import javax.security.auth.login.LoginException;
>> >> >>>> > -
>> >> >>>> >  public class NIOServerCnxnFactory extends ServerCnxnFactory
>> >> implements
>> >> >>>> Runnable {
>> >> >>>> >     private static final Logger LOG =
>> >> >>>> LoggerFactory.getLogger(NIOServerCnxnFactory.class);
>> >> >>>> >
>> >> >>>> > @@ -78,7 +78,6 @@ public class NIOServerCnxnFactory extend
>> >> >>>> >
>> >> >>>> >     int maxClientCnxns = 60;
>> >> >>>> >
>> >> >>>> > -
>> >> >>>> >     /**
>> >> >>>> >      * Construct a new server connection factory which will
>> accept
>> >> an
>> >> >>>> unlimited number
>> >> >>>> >      * of concurrent connections from each client (up to the file
>> >> >>>> descriptor
>> >> >>>> > @@ -122,7 +121,7 @@ public class NIOServerCnxnFactory extend
>> >> >>>> >     public void setMaxClientCnxnsPerHost(int max) {
>> >> >>>> >         maxClientCnxns = max;
>> >> >>>> >     }
>> >> >>>> > -
>> >> >>>> > +
>> >> >>>> >     @Override
>> >> >>>> >     public void start() {
>> >> >>>> >         // ensure thread is started once and only once
>> >> >>>> > @@ -187,7 +186,7 @@ public class NIOServerCnxnFactory extend
>> >> >>>> >             return s.size();
>> >> >>>> >         }
>> >> >>>> >     }
>> >> >>>> > -
>> >> >>>> > +
>> >> >>>> >     public void run() {
>> >> >>>> >         while (!ss.socket().isClosed()) {
>> >> >>>> >             try {
>> >> >>>> > @@ -323,4 +322,8 @@ public class NIOServerCnxnFactory extend
>> >> >>>> >         return cnxns;
>> >> >>>> >     }
>> >> >>>> >
>> >> >>>> > +    @Override
>> >> >>>> > +    public int getNumAliveConnections() {
>> >> >>>> > +       return cnxns.size();
>> >> >>>> > +    }
>> >> >>>> >  }
>> >> >>>> >
>> >> >>>> > Modified:
>> >> >>>>
>> >>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java
>> >> >>>> > URL:
>> >> >>>>
>> >>
>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>> >> >>>> >
>> >> >>>>
>> >>
>> ==============================================================================
>> >> >>>> > ---
>> >> >>>>
>> >>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java
>> >> >>>> (original)
>> >> >>>> > +++
>> >> >>>>
>> >>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java
>> >> >>>> Wed Dec 28 14:55:37 2011
>> >> >>>> > @@ -560,7 +560,8 @@ public class NettyServerCnxn extends Ser
>> >> >>>> >
>> >> >>>> >             print("packets_received",
>> stats.getPacketsReceived());
>> >> >>>> >             print("packets_sent", stats.getPacketsSent());
>> >> >>>> > -
>> >> >>>> > +            print("num_alive_connections",
>> >> >>>> stats.getNumAliveClientConnections());
>> >> >>>> > +
>> >> >>>> >             print("outstanding_requests",
>> >> >>>> stats.getOutstandingRequests());
>> >> >>>> >
>> >> >>>> >             print("server_state", stats.getServerState());
>> >> >>>> >
>> >> >>>> > Modified:
>> >> >>>>
>> >>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java
>> >> >>>> > URL:
>> >> >>>>
>> >>
>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>> >> >>>> >
>> >> >>>>
>> >>
>> ==============================================================================
>> >> >>>> > ---
>> >> >>>>
>> >>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java
>> >> >>>> (original)
>> >> >>>> > +++
>> >> >>>>
>> >>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java
>> >> >>>> Wed Dec 28 14:55:37 2011
>> >> >>>> > @@ -411,5 +411,10 @@ public class NettyServerCnxnFactory exte
>> >> >>>> >             }
>> >> >>>> >         }
>> >> >>>> >     }
>> >> >>>> > +
>> >> >>>> > +    @Override
>> >> >>>> > +    public int getNumAliveConnections() {
>> >> >>>> > +       return cnxns.size();
>> >> >>>> > +    }
>> >> >>>> >
>> >> >>>> >  }
>> >> >>>> >
>> >> >>>> > Modified:
>> >> >>>>
>> >>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java
>> >> >>>> > URL:
>> >> >>>>
>> >>
>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>> >> >>>> >
>> >> >>>>
>> >>
>> ==============================================================================
>> >> >>>> > ---
>> >> >>>>
>> >>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java
>> >> >>>> (original)
>> >> >>>> > +++
>> >> >>>>
>> >>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java
>> >> >>>> Wed Dec 28 14:55:37 2011
>> >> >>>> > @@ -24,15 +24,16 @@ import java.nio.ByteBuffer;
>> >> >>>> >  import java.util.HashMap;
>> >> >>>> >
>> >> >>>> >  import javax.management.JMException;
>> >> >>>> > -import org.slf4j.Logger;
>> >> >>>> > -import org.slf4j.LoggerFactory;
>> >> >>>> > -import org.apache.zookeeper.jmx.MBeanRegistry;
>> >> >>>> > +
>> >> >>>> >  import org.apache.zookeeper.Login;
>> >> >>>> > +import org.apache.zookeeper.jmx.MBeanRegistry;
>> >> >>>> >  import
>> org.apache.zookeeper.server.auth.SaslServerCallbackHandler;
>> >> >>>> > +import org.slf4j.Logger;
>> >> >>>> > +import org.slf4j.LoggerFactory;
>> >> >>>> >
>> >> >>>> >  public abstract class ServerCnxnFactory {
>> >> >>>> >
>> >> >>>> > -    public static final String ZOOKEEPER_SERVER_CNXN_FACTORY =
>> >> >>>> "zookeeper.serverCnxnFactory";
>> >> >>>> > +    public static final String ZOOKEEPER_SERVER_CNXN_FACTORY =
>> >> >>>> "zookeeper.serverCnxnFactory";
>> >> >>>> >
>> >> >>>> >     public interface PacketProcessor {
>> >> >>>> >         public void processPacket(ByteBuffer packet, ServerCnxn
>> >> src);
>> >> >>>> > @@ -49,6 +50,8 @@ public abstract class ServerCnxnFactory
>> >> >>>> >
>> >> >>>> >     public abstract Iterable<ServerCnxn> getConnections();
>> >> >>>> >
>> >> >>>> > +    public abstract int getNumAliveConnections();
>> >> >>>> > +
>> >> >>>> >     public abstract void closeSession(long sessionId);
>> >> >>>> >
>> >> >>>> >     public abstract void configure(InetSocketAddress addr,
>> >> >>>> >
>> >> >>>> > Modified:
>> >> >>>>
>> >>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerStats.java
>> >> >>>> > URL:
>> >> >>>>
>> >>
>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerStats.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>> >> >>>> >
>> >> >>>>
>> >>
>> ==============================================================================
>> >> >>>> > ---
>> >> >>>>
>> >>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerStats.java
>> >> >>>> (original)
>> >> >>>> > +++
>> >> >>>>
>> >>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerStats.java
>> >> >>>> Wed Dec 28 14:55:37 2011
>> >> >>>> > @@ -19,6 +19,7 @@
>> >> >>>> >  package org.apache.zookeeper.server;
>> >> >>>> >
>> >> >>>> >
>> >> >>>> > +
>> >> >>>> >  /**
>> >> >>>> >  * Basic Server Statistics
>> >> >>>> >  */
>> >> >>>> > @@ -29,13 +30,14 @@ public class ServerStats {
>> >> >>>> >     private long minLatency = Long.MAX_VALUE;
>> >> >>>> >     private long totalLatency = 0;
>> >> >>>> >     private long count = 0;
>> >> >>>> > -
>> >> >>>> > +
>> >> >>>> >     private final Provider provider;
>> >> >>>> >
>> >> >>>> >     public interface Provider {
>> >> >>>> >         public long getOutstandingRequests();
>> >> >>>> >         public long getLastProcessedZxid();
>> >> >>>> >         public String getState();
>> >> >>>> > +        public int getNumAliveConnections();
>> >> >>>> >     }
>> >> >>>> >
>> >> >>>> >     public ServerStats(Provider provider) {
>> >> >>>> > @@ -75,9 +77,14 @@ public class ServerStats {
>> >> >>>> >     }
>> >> >>>> >
>> >> >>>> >     public String getServerState() {
>> >> >>>> > -        return provider.getState();
>> >> >>>> > +       return provider.getState();
>> >> >>>> >     }
>> >> >>>> > -
>> >> >>>> > +
>> >> >>>> > +    /** The number of client connections alive to this server */
>> >> >>>> > +    public int getNumAliveClientConnections() {
>> >> >>>> > +       return provider.getNumAliveConnections();
>> >> >>>> > +    }
>> >> >>>> > +
>> >> >>>> >     @Override
>> >> >>>> >     public String toString(){
>> >> >>>> >         StringBuilder sb = new StringBuilder();
>> >> >>>> > @@ -85,6 +92,8 @@ public class ServerStats {
>> >> >>>> >                 + getAvgLatency() + "/" + getMaxLatency() +
>> "\n");
>> >> >>>> >         sb.append("Received: " + getPacketsReceived() + "\n");
>> >> >>>> >         sb.append("Sent: " + getPacketsSent() + "\n");
>> >> >>>> > +        sb.append("Connections: " +
>> getNumAliveClientConnections()
>> >> +
>> >> >>>> "\n");
>> >> >>>> > +
>> >> >>>> >         if (provider != null) {
>> >> >>>> >             sb.append("Outstanding: " + getOutstandingRequests()
>> +
>> >> >>>> "\n");
>> >> >>>> >             sb.append("Zxid: 0x"+
>> >> >>>> Long.toHexString(getLastProcessedZxid())+ "\n");
>> >> >>>> > @@ -123,7 +132,6 @@ public class ServerStats {
>> >> >>>> >         packetsReceived = 0;
>> >> >>>> >         packetsSent = 0;
>> >> >>>> >     }
>> >> >>>> > -
>> >> >>>> >     synchronized public void reset() {
>> >> >>>> >         resetLatency();
>> >> >>>> >         resetRequestCounters();
>> >> >>>> >
>> >> >>>> > Modified:
>> >> >>>>
>> >>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java
>> >> >>>> > URL:
>> >> >>>>
>> >>
>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>> >> >>>> >
>> >> >>>>
>> >>
>> ==============================================================================
>> >> >>>> > ---
>> >> >>>>
>> >>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java
>> >> >>>> (original)
>> >> >>>> > +++
>> >> >>>>
>> >>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java
>> >> >>>> Wed Dec 28 14:55:37 2011
>> >> >>>> > @@ -109,7 +109,7 @@ public class ZooKeeperServer implements
>> >> >>>> >     private ServerCnxnFactory serverCnxnFactory;
>> >> >>>> >
>> >> >>>> >     private final ServerStats serverStats;
>> >> >>>> > -
>> >> >>>> > +
>> >> >>>> >     void removeCnxn(ServerCnxn cnxn) {
>> >> >>>> >         zkDb.removeCnxn(cnxn);
>> >> >>>> >     }
>> >> >>>> > @@ -254,7 +254,6 @@ public class ZooKeeperServer implements
>> >> >>>> >         }
>> >> >>>> >     }
>> >> >>>> >
>> >> >>>> > -
>> >> >>>> >     /**
>> >> >>>> >      * This should be called from a synchronized block on this!
>> >> >>>> >      */
>> >> >>>> > @@ -678,6 +677,14 @@ public class ZooKeeperServer implements
>> >> >>>> >     }
>> >> >>>> >
>> >> >>>> >     /**
>> >> >>>> > +     * return the total number of client connections that are
>> alive
>> >> >>>> > +     * to this server
>> >> >>>> > +     */
>> >> >>>> > +    public int getNumAliveConnections() {
>> >> >>>> > +       return serverCnxnFactory.getNumAliveConnections();
>> >> >>>> > +    }
>> >> >>>> > +
>> >> >>>> > +    /**
>> >> >>>> >      * trunccate the log to get in sync with others
>> >> >>>> >      * if in a quorum
>> >> >>>> >      * @param zxid the zxid that it needs to get in sync
>> >> >>>> >
>> >> >>>> > Modified:
>> >> >>>>
>> >>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java
>> >> >>>> > URL:
>> >> >>>>
>> >>
>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>> >> >>>> >
>> >> >>>>
>> >>
>> ==============================================================================
>> >> >>>> > ---
>> >> >>>>
>> >>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java
>> >> >>>> (original)
>> >> >>>> > +++
>> >> >>>>
>> >>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java
>> >> >>>> Wed Dec 28 14:55:37 2011
>> >> >>>> > @@ -140,4 +140,8 @@ public class ZooKeeperServerBean impleme
>> >> >>>> >         serverStats.resetRequestCounters();
>> >> >>>> >         serverStats.resetLatency();
>> >> >>>> >     }
>> >> >>>> > +
>> >> >>>> > +       public long getNumAliveConnections() {
>> >> >>>> > +               return zks.getNumAliveConnections();
>> >> >>>> > +       }
>> >> >>>> >  }
>> >> >>>> >
>> >> >>>> > Modified:
>> >> >>>>
>> >>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java
>> >> >>>> > URL:
>> >> >>>>
>> >>
>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>> >> >>>> >
>> >> >>>>
>> >>
>> ==============================================================================
>> >> >>>> > ---
>> >> >>>>
>> >>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java
>> >> >>>> (original)
>> >> >>>> > +++
>> >> >>>>
>> >>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java
>> >> >>>> Wed Dec 28 14:55:37 2011
>> >> >>>> > @@ -103,4 +103,8 @@ public interface ZooKeeperServerMXBean {
>> >> >>>> >      * Reset max latency statistics only.
>> >> >>>> >      */
>> >> >>>> >     public void resetMaxLatency();
>> >> >>>> > +    /**
>> >> >>>> > +     * @return number of alive client connections
>> >> >>>> > +     */
>> >> >>>> > +    public long getNumAliveConnections();
>> >> >>>> >  }
>> >> >>>> >
>> >> >>>> > Modified:
>> >> >>>>
>> >>
>> zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/Zab1_0Test.java
>> >> >>>> > URL:
>> >> >>>>
>> >>
>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/Zab1_0Test.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>> >> >>>> >
>> >> >>>>
>> >>
>> ==============================================================================
>> >> >>>> > ---
>> >> >>>>
>> >>
>> zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/Zab1_0Test.java
>> >> >>>> (original)
>> >> >>>> > +++
>> >> >>>>
>> >>
>> zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/Zab1_0Test.java
>> >> >>>> Wed Dec 28 14:55:37 2011
>> >> >>>> > @@ -212,6 +212,10 @@ public class Zab1_0Test {
>> >> >>>> >         }
>> >> >>>> >         public void closeAll() {
>> >> >>>> >         }
>> >> >>>> > +               @Override
>> >> >>>> > +               public int getNumAliveConnections() {
>> >> >>>> > +                       return 0;
>> >> >>>> > +               }
>> >> >>>> >     }
>> >> >>>> >     static Socket[] getSocketPair() throws IOException {
>> >> >>>> >         ServerSocket ss = new ServerSocket();
>> >> >>>> >
>> >> >>>> > Modified:
>> >> >>>>
>> >>
>> zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java
>> >> >>>> > URL:
>> >> >>>>
>> >>
>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>> >> >>>> >
>> >> >>>>
>> >>
>> ==============================================================================
>> >> >>>> > ---
>> >> >>>>
>> >>
>> zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java
>> >> >>>> (original)
>> >> >>>> > +++
>> >> >>>>
>> >>
>> zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java
>> >> >>>> Wed Dec 28 14:55:37 2011
>> >> >>>> > @@ -94,6 +94,9 @@ public class FourLetterWordsTest extends
>> >> >>>> >         verify("srvr", "Outstanding");
>> >> >>>> >         verify("cons", "queued");
>> >> >>>> >         verify("mntr", "zk_server_state\tstandalone");
>> >> >>>> > +        verify("mntr", "num_alive_connections");
>> >> >>>> > +        verify("stat", "Connections");
>> >> >>>> > +        verify("srvr", "Connections");
>> >> >>>> >     }
>> >> >>>> >
>> >> >>>> >     private String sendRequest(String cmd) throws IOException {
>> >> >>>> > @@ -136,6 +139,8 @@ public class FourLetterWordsTest extends
>> >> >>>> >         line = in.readLine();
>> >> >>>> >         Assert.assertTrue(Pattern.matches("^Sent: \\d+$", line));
>> >> >>>> >         line = in.readLine();
>> >> >>>> > +        Assert.assertTrue(Pattern.matches("^Connections: \\d+$",
>> >> >>>> line));
>> >> >>>> > +        line = in.readLine();
>> >> >>>> >         Assert.assertTrue(Pattern.matches("^Outstanding: \\d+$",
>> >> line));
>> >> >>>> >         line = in.readLine();
>> >> >>>> >         Assert.assertTrue(Pattern.matches("^Zxid:
>> 0x[\\da-fA-F]+$",
>> >> >>>> line));
>> >> >>>> >
>> >> >>>> >
>> >> >>>>
>> >> >>>
>> >>
>>

Re: svn commit: r1225200 - in /zookeeper/trunk: ./ src/java/main/org/apache/zookeeper/server/ src/java/test/org/apache/zookeeper/server/quorum/ src/java/test/org/apache/zookeeper/test/

Posted by Camille Fournier <ca...@apache.org>.
I'm not sure I agree in the assumption that monitoring pulls happen
infrequently...
On Dec 28, 2011 4:24 PM, "Patrick Hunt" <ph...@apache.org> wrote:

> They seem like distinct changes to me. In particular getting the size
> is going to happen infrequently (monitoring pull) so I don't see a
> problem fixing the existing patch in the same way the code currently
> handles cnxns access, with a separate jira to do the refactoring. Am I
> missing something?
>
> Patrick
>
> On Wed, Dec 28, 2011 at 1:10 PM, Camille Fournier <ca...@apache.org>
> wrote:
> > I don't think creating it as a flat sync is a good idea, so if we want
> this
> > I think we need to refactor that structure to be concurrent.
> >
> > C
> > On Dec 28, 2011 2:24 PM, "Patrick Hunt" <ph...@apache.org> wrote:
> >
> >> I think it needs to be fixed. It's obviously incorrect. Also if
> >> someone changes the underlying implementation at some point it might
> >> bite them.
> >>
> >> Given it wasn't applied to 3.4 branch yet I'd suggest revert, fix the
> >> patch, then reapply to both branches. (that's easiest/bulletproof imo)
> >>
> >> I'd recommend a new ticket to fix the issues you identified (refactor,
> >> etc...) Neha was looking for further items to work on, this would be a
> >> good one.
> >>
> >> Patrick
> >>
> >> On Wed, Dec 28, 2011 at 11:18 AM, Camille Fournier <ca...@apache.org>
> >> wrote:
> >> > Also, Pat, the JIRA is still open. I will look to revert in a minute
> >> > although I think the sync changes may necessitate a new JIRA entirely.
> >> >
> >> > On Wed, Dec 28, 2011 at 1:31 PM, Camille Fournier <camille@apache.org
> >
> >> wrote:
> >> >> After looking for a few mins, here are my observations:
> >> >>
> >> >> The implementation of HashSet in jdk 1.6 uses an underlying HashMap,
> >> which
> >> >> uses a bog-standard int for the size. So, I completely agree that we
> can
> >> >> get invalid results for a point in time. But does anyone really care
> >> about
> >> >> the *exact* moment-in-time number of cnxns in the system, in a system
> >> where
> >> >> cnxns are coming and going? At best you'll see a value that will
> likely
> >> be
> >> >> out of date the moment you read it.
> >> >>
> >> >> But, if we're going to do this, I do think there may be a case for
> >> >> refactoring to a concurrent data structure given that we are randomly
> >> >> syncing on the cnxns set in a way that makes adding additional
> >> interactions
> >> >> with it error prone in this way. And we should definitely remove that
> >> >> getConnections method, if anyone ever iterated over that set they
> would
> >> be
> >> >> in a sad concurrency situation.
> >> >> Seems possibly worth a whole new ticket to do this. What do you
> think?
> >> >>
> >> >> Thanks,
> >> >> C
> >> >>
> >> >> On Wed, Dec 28, 2011 at 1:12 PM, Camille Fournier <
> camille@apache.org
> >> >wrote:
> >> >>
> >> >>> I'm not sure it's meaningful enough to be worth the sync overhead.
> We
> >> >>> should look into that. The alternative if we must is using a proper
> >> >>> concurrent collection. Neha, any thoughts?
> >> >>>
> >> >>> C
> >> >>> On Dec 28, 2011 12:45 PM, "Patrick Hunt" <ph...@apache.org> wrote:
> >> >>>
> >> >>>> I believe there is a bug in this commit. The "cnxns" size() call is
> >> >>>> not being synchronized. This will lead to invalid results at best,
> at
> >> >>>> worst outright failure (hard to say w/o knowing the implementation
> of
> >> >>>> HashSet).
> >> >>>>
> >> >>>> Camille can you work with Neha to get this fixed? Perhaps in the
> >> >>>> meantime (if it's going to take a while) you can revert this
> change,
> >> >>>> re-open the jira, update the patch, and reapply at some later time?
> >> >>>>
> >> >>>> Patrick
> >> >>>>
> >> >>>> On Wed, Dec 28, 2011 at 6:55 AM,  <ca...@apache.org> wrote:
> >> >>>> > Author: camille
> >> >>>> > Date: Wed Dec 28 14:55:37 2011
> >> >>>> > New Revision: 1225200
> >> >>>> >
> >> >>>> > URL: http://svn.apache.org/viewvc?rev=1225200&view=rev
> >> >>>> > Log:
> >> >>>> > ZOOKEEPER-1321: Add number of client connections metric in JMX
> and
> >> srvr
> >> >>>> (Neha Narkhede via camille)
> >> >>>> >
> >> >>>> > Modified:
> >> >>>> >    zookeeper/trunk/CHANGES.txt
> >> >>>> >
> >> >>>>
> >>
>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java
> >> >>>> >
> >> >>>>
> >>
>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java
> >> >>>> >
> >> >>>>
> >>
>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java
> >> >>>> >
> >> >>>>
> >>
>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java
> >> >>>> >
> >> >>>>
> >>
>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java
> >> >>>> >
> >> >>>>
> >>
>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerStats.java
> >> >>>> >
> >> >>>>
> >>
>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java
> >> >>>> >
> >> >>>>
> >>
>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java
> >> >>>> >
> >> >>>>
> >>
>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java
> >> >>>> >
> >> >>>>
> >>
>  zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/Zab1_0Test.java
> >> >>>> >
> >> >>>>
> >>
>  zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java
> >> >>>> >
> >> >>>> > Modified: zookeeper/trunk/CHANGES.txt
> >> >>>> > URL:
> >> >>>>
> >>
> http://svn.apache.org/viewvc/zookeeper/trunk/CHANGES.txt?rev=1225200&r1=1225199&r2=1225200&view=diff
> >> >>>> >
> >> >>>>
> >>
> ==============================================================================
> >> >>>> > --- zookeeper/trunk/CHANGES.txt (original)
> >> >>>> > +++ zookeeper/trunk/CHANGES.txt Wed Dec 28 14:55:37 2011
> >> >>>> > @@ -162,6 +162,8 @@ IMPROVEMENTS:
> >> >>>> >
> >> >>>> >   ZOOKEEPER-1342. quorum Listener & LearnerCnxAcceptor are
> missing
> >> >>>> >   thread names (Rakesh R via phunt)
> >> >>>> > +
> >> >>>> > +  ZOOKEEPER-1321. Add number of client connections metric in JMX
> >> and
> >> >>>> srvr (Neha Narkhede via camille)
> >> >>>> >
> >> >>>> >  Release 3.4.0 -
> >> >>>> >
> >> >>>> >
> >> >>>> > Modified:
> >> >>>>
> >>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java
> >> >>>> > URL:
> >> >>>>
> >>
> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java?rev=1225200&r1=1225199&r2=1225200&view=diff
> >> >>>> >
> >> >>>>
> >>
> ==============================================================================
> >> >>>> > ---
> >> >>>>
> >>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java
> >> >>>> (original)
> >> >>>> > +++
> >> >>>>
> >>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java
> >> >>>> Wed Dec 28 14:55:37 2011
> >> >>>> > @@ -749,7 +749,8 @@ public class NIOServerCnxn extends Serve
> >> >>>> >
> >> >>>> >             print("packets_received",
> stats.getPacketsReceived());
> >> >>>> >             print("packets_sent", stats.getPacketsSent());
> >> >>>> > -
> >> >>>> > +            print("num_alive_connections",
> >> >>>> stats.getNumAliveClientConnections());
> >> >>>> > +
> >> >>>> >             print("outstanding_requests",
> >> >>>> stats.getOutstandingRequests());
> >> >>>> >
> >> >>>> >             print("server_state", stats.getServerState());
> >> >>>> >
> >> >>>> > Modified:
> >> >>>>
> >>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java
> >> >>>> > URL:
> >> >>>>
> >>
> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java?rev=1225200&r1=1225199&r2=1225200&view=diff
> >> >>>> >
> >> >>>>
> >>
> ==============================================================================
> >> >>>> > ---
> >> >>>>
> >>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java
> >> >>>> (original)
> >> >>>> > +++
> >> >>>>
> >>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java
> >> >>>> Wed Dec 28 14:55:37 2011
> >> >>>> > @@ -32,14 +32,14 @@ import java.util.HashMap;
> >> >>>> >  import java.util.HashSet;
> >> >>>> >  import java.util.Set;
> >> >>>> >
> >> >>>> > +import javax.security.auth.login.Configuration;
> >> >>>> > +import javax.security.auth.login.LoginException;
> >> >>>> > +
> >> >>>> >  import org.apache.zookeeper.Login;
> >> >>>> >  import
> org.apache.zookeeper.server.auth.SaslServerCallbackHandler;
> >> >>>> >  import org.slf4j.Logger;
> >> >>>> >  import org.slf4j.LoggerFactory;
> >> >>>> >
> >> >>>> > -import javax.security.auth.login.Configuration;
> >> >>>> > -import javax.security.auth.login.LoginException;
> >> >>>> > -
> >> >>>> >  public class NIOServerCnxnFactory extends ServerCnxnFactory
> >> implements
> >> >>>> Runnable {
> >> >>>> >     private static final Logger LOG =
> >> >>>> LoggerFactory.getLogger(NIOServerCnxnFactory.class);
> >> >>>> >
> >> >>>> > @@ -78,7 +78,6 @@ public class NIOServerCnxnFactory extend
> >> >>>> >
> >> >>>> >     int maxClientCnxns = 60;
> >> >>>> >
> >> >>>> > -
> >> >>>> >     /**
> >> >>>> >      * Construct a new server connection factory which will
> accept
> >> an
> >> >>>> unlimited number
> >> >>>> >      * of concurrent connections from each client (up to the file
> >> >>>> descriptor
> >> >>>> > @@ -122,7 +121,7 @@ public class NIOServerCnxnFactory extend
> >> >>>> >     public void setMaxClientCnxnsPerHost(int max) {
> >> >>>> >         maxClientCnxns = max;
> >> >>>> >     }
> >> >>>> > -
> >> >>>> > +
> >> >>>> >     @Override
> >> >>>> >     public void start() {
> >> >>>> >         // ensure thread is started once and only once
> >> >>>> > @@ -187,7 +186,7 @@ public class NIOServerCnxnFactory extend
> >> >>>> >             return s.size();
> >> >>>> >         }
> >> >>>> >     }
> >> >>>> > -
> >> >>>> > +
> >> >>>> >     public void run() {
> >> >>>> >         while (!ss.socket().isClosed()) {
> >> >>>> >             try {
> >> >>>> > @@ -323,4 +322,8 @@ public class NIOServerCnxnFactory extend
> >> >>>> >         return cnxns;
> >> >>>> >     }
> >> >>>> >
> >> >>>> > +    @Override
> >> >>>> > +    public int getNumAliveConnections() {
> >> >>>> > +       return cnxns.size();
> >> >>>> > +    }
> >> >>>> >  }
> >> >>>> >
> >> >>>> > Modified:
> >> >>>>
> >>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java
> >> >>>> > URL:
> >> >>>>
> >>
> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java?rev=1225200&r1=1225199&r2=1225200&view=diff
> >> >>>> >
> >> >>>>
> >>
> ==============================================================================
> >> >>>> > ---
> >> >>>>
> >>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java
> >> >>>> (original)
> >> >>>> > +++
> >> >>>>
> >>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java
> >> >>>> Wed Dec 28 14:55:37 2011
> >> >>>> > @@ -560,7 +560,8 @@ public class NettyServerCnxn extends Ser
> >> >>>> >
> >> >>>> >             print("packets_received",
> stats.getPacketsReceived());
> >> >>>> >             print("packets_sent", stats.getPacketsSent());
> >> >>>> > -
> >> >>>> > +            print("num_alive_connections",
> >> >>>> stats.getNumAliveClientConnections());
> >> >>>> > +
> >> >>>> >             print("outstanding_requests",
> >> >>>> stats.getOutstandingRequests());
> >> >>>> >
> >> >>>> >             print("server_state", stats.getServerState());
> >> >>>> >
> >> >>>> > Modified:
> >> >>>>
> >>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java
> >> >>>> > URL:
> >> >>>>
> >>
> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java?rev=1225200&r1=1225199&r2=1225200&view=diff
> >> >>>> >
> >> >>>>
> >>
> ==============================================================================
> >> >>>> > ---
> >> >>>>
> >>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java
> >> >>>> (original)
> >> >>>> > +++
> >> >>>>
> >>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java
> >> >>>> Wed Dec 28 14:55:37 2011
> >> >>>> > @@ -411,5 +411,10 @@ public class NettyServerCnxnFactory exte
> >> >>>> >             }
> >> >>>> >         }
> >> >>>> >     }
> >> >>>> > +
> >> >>>> > +    @Override
> >> >>>> > +    public int getNumAliveConnections() {
> >> >>>> > +       return cnxns.size();
> >> >>>> > +    }
> >> >>>> >
> >> >>>> >  }
> >> >>>> >
> >> >>>> > Modified:
> >> >>>>
> >>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java
> >> >>>> > URL:
> >> >>>>
> >>
> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java?rev=1225200&r1=1225199&r2=1225200&view=diff
> >> >>>> >
> >> >>>>
> >>
> ==============================================================================
> >> >>>> > ---
> >> >>>>
> >>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java
> >> >>>> (original)
> >> >>>> > +++
> >> >>>>
> >>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java
> >> >>>> Wed Dec 28 14:55:37 2011
> >> >>>> > @@ -24,15 +24,16 @@ import java.nio.ByteBuffer;
> >> >>>> >  import java.util.HashMap;
> >> >>>> >
> >> >>>> >  import javax.management.JMException;
> >> >>>> > -import org.slf4j.Logger;
> >> >>>> > -import org.slf4j.LoggerFactory;
> >> >>>> > -import org.apache.zookeeper.jmx.MBeanRegistry;
> >> >>>> > +
> >> >>>> >  import org.apache.zookeeper.Login;
> >> >>>> > +import org.apache.zookeeper.jmx.MBeanRegistry;
> >> >>>> >  import
> org.apache.zookeeper.server.auth.SaslServerCallbackHandler;
> >> >>>> > +import org.slf4j.Logger;
> >> >>>> > +import org.slf4j.LoggerFactory;
> >> >>>> >
> >> >>>> >  public abstract class ServerCnxnFactory {
> >> >>>> >
> >> >>>> > -    public static final String ZOOKEEPER_SERVER_CNXN_FACTORY =
> >> >>>> "zookeeper.serverCnxnFactory";
> >> >>>> > +    public static final String ZOOKEEPER_SERVER_CNXN_FACTORY =
> >> >>>> "zookeeper.serverCnxnFactory";
> >> >>>> >
> >> >>>> >     public interface PacketProcessor {
> >> >>>> >         public void processPacket(ByteBuffer packet, ServerCnxn
> >> src);
> >> >>>> > @@ -49,6 +50,8 @@ public abstract class ServerCnxnFactory
> >> >>>> >
> >> >>>> >     public abstract Iterable<ServerCnxn> getConnections();
> >> >>>> >
> >> >>>> > +    public abstract int getNumAliveConnections();
> >> >>>> > +
> >> >>>> >     public abstract void closeSession(long sessionId);
> >> >>>> >
> >> >>>> >     public abstract void configure(InetSocketAddress addr,
> >> >>>> >
> >> >>>> > Modified:
> >> >>>>
> >>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerStats.java
> >> >>>> > URL:
> >> >>>>
> >>
> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerStats.java?rev=1225200&r1=1225199&r2=1225200&view=diff
> >> >>>> >
> >> >>>>
> >>
> ==============================================================================
> >> >>>> > ---
> >> >>>>
> >>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerStats.java
> >> >>>> (original)
> >> >>>> > +++
> >> >>>>
> >>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerStats.java
> >> >>>> Wed Dec 28 14:55:37 2011
> >> >>>> > @@ -19,6 +19,7 @@
> >> >>>> >  package org.apache.zookeeper.server;
> >> >>>> >
> >> >>>> >
> >> >>>> > +
> >> >>>> >  /**
> >> >>>> >  * Basic Server Statistics
> >> >>>> >  */
> >> >>>> > @@ -29,13 +30,14 @@ public class ServerStats {
> >> >>>> >     private long minLatency = Long.MAX_VALUE;
> >> >>>> >     private long totalLatency = 0;
> >> >>>> >     private long count = 0;
> >> >>>> > -
> >> >>>> > +
> >> >>>> >     private final Provider provider;
> >> >>>> >
> >> >>>> >     public interface Provider {
> >> >>>> >         public long getOutstandingRequests();
> >> >>>> >         public long getLastProcessedZxid();
> >> >>>> >         public String getState();
> >> >>>> > +        public int getNumAliveConnections();
> >> >>>> >     }
> >> >>>> >
> >> >>>> >     public ServerStats(Provider provider) {
> >> >>>> > @@ -75,9 +77,14 @@ public class ServerStats {
> >> >>>> >     }
> >> >>>> >
> >> >>>> >     public String getServerState() {
> >> >>>> > -        return provider.getState();
> >> >>>> > +       return provider.getState();
> >> >>>> >     }
> >> >>>> > -
> >> >>>> > +
> >> >>>> > +    /** The number of client connections alive to this server */
> >> >>>> > +    public int getNumAliveClientConnections() {
> >> >>>> > +       return provider.getNumAliveConnections();
> >> >>>> > +    }
> >> >>>> > +
> >> >>>> >     @Override
> >> >>>> >     public String toString(){
> >> >>>> >         StringBuilder sb = new StringBuilder();
> >> >>>> > @@ -85,6 +92,8 @@ public class ServerStats {
> >> >>>> >                 + getAvgLatency() + "/" + getMaxLatency() +
> "\n");
> >> >>>> >         sb.append("Received: " + getPacketsReceived() + "\n");
> >> >>>> >         sb.append("Sent: " + getPacketsSent() + "\n");
> >> >>>> > +        sb.append("Connections: " +
> getNumAliveClientConnections()
> >> +
> >> >>>> "\n");
> >> >>>> > +
> >> >>>> >         if (provider != null) {
> >> >>>> >             sb.append("Outstanding: " + getOutstandingRequests()
> +
> >> >>>> "\n");
> >> >>>> >             sb.append("Zxid: 0x"+
> >> >>>> Long.toHexString(getLastProcessedZxid())+ "\n");
> >> >>>> > @@ -123,7 +132,6 @@ public class ServerStats {
> >> >>>> >         packetsReceived = 0;
> >> >>>> >         packetsSent = 0;
> >> >>>> >     }
> >> >>>> > -
> >> >>>> >     synchronized public void reset() {
> >> >>>> >         resetLatency();
> >> >>>> >         resetRequestCounters();
> >> >>>> >
> >> >>>> > Modified:
> >> >>>>
> >>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java
> >> >>>> > URL:
> >> >>>>
> >>
> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java?rev=1225200&r1=1225199&r2=1225200&view=diff
> >> >>>> >
> >> >>>>
> >>
> ==============================================================================
> >> >>>> > ---
> >> >>>>
> >>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java
> >> >>>> (original)
> >> >>>> > +++
> >> >>>>
> >>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java
> >> >>>> Wed Dec 28 14:55:37 2011
> >> >>>> > @@ -109,7 +109,7 @@ public class ZooKeeperServer implements
> >> >>>> >     private ServerCnxnFactory serverCnxnFactory;
> >> >>>> >
> >> >>>> >     private final ServerStats serverStats;
> >> >>>> > -
> >> >>>> > +
> >> >>>> >     void removeCnxn(ServerCnxn cnxn) {
> >> >>>> >         zkDb.removeCnxn(cnxn);
> >> >>>> >     }
> >> >>>> > @@ -254,7 +254,6 @@ public class ZooKeeperServer implements
> >> >>>> >         }
> >> >>>> >     }
> >> >>>> >
> >> >>>> > -
> >> >>>> >     /**
> >> >>>> >      * This should be called from a synchronized block on this!
> >> >>>> >      */
> >> >>>> > @@ -678,6 +677,14 @@ public class ZooKeeperServer implements
> >> >>>> >     }
> >> >>>> >
> >> >>>> >     /**
> >> >>>> > +     * return the total number of client connections that are
> alive
> >> >>>> > +     * to this server
> >> >>>> > +     */
> >> >>>> > +    public int getNumAliveConnections() {
> >> >>>> > +       return serverCnxnFactory.getNumAliveConnections();
> >> >>>> > +    }
> >> >>>> > +
> >> >>>> > +    /**
> >> >>>> >      * trunccate the log to get in sync with others
> >> >>>> >      * if in a quorum
> >> >>>> >      * @param zxid the zxid that it needs to get in sync
> >> >>>> >
> >> >>>> > Modified:
> >> >>>>
> >>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java
> >> >>>> > URL:
> >> >>>>
> >>
> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java?rev=1225200&r1=1225199&r2=1225200&view=diff
> >> >>>> >
> >> >>>>
> >>
> ==============================================================================
> >> >>>> > ---
> >> >>>>
> >>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java
> >> >>>> (original)
> >> >>>> > +++
> >> >>>>
> >>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java
> >> >>>> Wed Dec 28 14:55:37 2011
> >> >>>> > @@ -140,4 +140,8 @@ public class ZooKeeperServerBean impleme
> >> >>>> >         serverStats.resetRequestCounters();
> >> >>>> >         serverStats.resetLatency();
> >> >>>> >     }
> >> >>>> > +
> >> >>>> > +       public long getNumAliveConnections() {
> >> >>>> > +               return zks.getNumAliveConnections();
> >> >>>> > +       }
> >> >>>> >  }
> >> >>>> >
> >> >>>> > Modified:
> >> >>>>
> >>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java
> >> >>>> > URL:
> >> >>>>
> >>
> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java?rev=1225200&r1=1225199&r2=1225200&view=diff
> >> >>>> >
> >> >>>>
> >>
> ==============================================================================
> >> >>>> > ---
> >> >>>>
> >>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java
> >> >>>> (original)
> >> >>>> > +++
> >> >>>>
> >>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java
> >> >>>> Wed Dec 28 14:55:37 2011
> >> >>>> > @@ -103,4 +103,8 @@ public interface ZooKeeperServerMXBean {
> >> >>>> >      * Reset max latency statistics only.
> >> >>>> >      */
> >> >>>> >     public void resetMaxLatency();
> >> >>>> > +    /**
> >> >>>> > +     * @return number of alive client connections
> >> >>>> > +     */
> >> >>>> > +    public long getNumAliveConnections();
> >> >>>> >  }
> >> >>>> >
> >> >>>> > Modified:
> >> >>>>
> >>
> zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/Zab1_0Test.java
> >> >>>> > URL:
> >> >>>>
> >>
> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/Zab1_0Test.java?rev=1225200&r1=1225199&r2=1225200&view=diff
> >> >>>> >
> >> >>>>
> >>
> ==============================================================================
> >> >>>> > ---
> >> >>>>
> >>
> zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/Zab1_0Test.java
> >> >>>> (original)
> >> >>>> > +++
> >> >>>>
> >>
> zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/Zab1_0Test.java
> >> >>>> Wed Dec 28 14:55:37 2011
> >> >>>> > @@ -212,6 +212,10 @@ public class Zab1_0Test {
> >> >>>> >         }
> >> >>>> >         public void closeAll() {
> >> >>>> >         }
> >> >>>> > +               @Override
> >> >>>> > +               public int getNumAliveConnections() {
> >> >>>> > +                       return 0;
> >> >>>> > +               }
> >> >>>> >     }
> >> >>>> >     static Socket[] getSocketPair() throws IOException {
> >> >>>> >         ServerSocket ss = new ServerSocket();
> >> >>>> >
> >> >>>> > Modified:
> >> >>>>
> >>
> zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java
> >> >>>> > URL:
> >> >>>>
> >>
> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java?rev=1225200&r1=1225199&r2=1225200&view=diff
> >> >>>> >
> >> >>>>
> >>
> ==============================================================================
> >> >>>> > ---
> >> >>>>
> >>
> zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java
> >> >>>> (original)
> >> >>>> > +++
> >> >>>>
> >>
> zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java
> >> >>>> Wed Dec 28 14:55:37 2011
> >> >>>> > @@ -94,6 +94,9 @@ public class FourLetterWordsTest extends
> >> >>>> >         verify("srvr", "Outstanding");
> >> >>>> >         verify("cons", "queued");
> >> >>>> >         verify("mntr", "zk_server_state\tstandalone");
> >> >>>> > +        verify("mntr", "num_alive_connections");
> >> >>>> > +        verify("stat", "Connections");
> >> >>>> > +        verify("srvr", "Connections");
> >> >>>> >     }
> >> >>>> >
> >> >>>> >     private String sendRequest(String cmd) throws IOException {
> >> >>>> > @@ -136,6 +139,8 @@ public class FourLetterWordsTest extends
> >> >>>> >         line = in.readLine();
> >> >>>> >         Assert.assertTrue(Pattern.matches("^Sent: \\d+$", line));
> >> >>>> >         line = in.readLine();
> >> >>>> > +        Assert.assertTrue(Pattern.matches("^Connections: \\d+$",
> >> >>>> line));
> >> >>>> > +        line = in.readLine();
> >> >>>> >         Assert.assertTrue(Pattern.matches("^Outstanding: \\d+$",
> >> line));
> >> >>>> >         line = in.readLine();
> >> >>>> >         Assert.assertTrue(Pattern.matches("^Zxid:
> 0x[\\da-fA-F]+$",
> >> >>>> line));
> >> >>>> >
> >> >>>> >
> >> >>>>
> >> >>>
> >>
>

Re: svn commit: r1225200 - in /zookeeper/trunk: ./ src/java/main/org/apache/zookeeper/server/ src/java/test/org/apache/zookeeper/server/quorum/ src/java/test/org/apache/zookeeper/test/

Posted by Patrick Hunt <ph...@apache.org>.
They seem like distinct changes to me. In particular getting the size
is going to happen infrequently (monitoring pull) so I don't see a
problem fixing the existing patch in the same way the code currently
handles cnxns access, with a separate jira to do the refactoring. Am I
missing something?

Patrick

On Wed, Dec 28, 2011 at 1:10 PM, Camille Fournier <ca...@apache.org> wrote:
> I don't think creating it as a flat sync is a good idea, so if we want this
> I think we need to refactor that structure to be concurrent.
>
> C
> On Dec 28, 2011 2:24 PM, "Patrick Hunt" <ph...@apache.org> wrote:
>
>> I think it needs to be fixed. It's obviously incorrect. Also if
>> someone changes the underlying implementation at some point it might
>> bite them.
>>
>> Given it wasn't applied to 3.4 branch yet I'd suggest revert, fix the
>> patch, then reapply to both branches. (that's easiest/bulletproof imo)
>>
>> I'd recommend a new ticket to fix the issues you identified (refactor,
>> etc...) Neha was looking for further items to work on, this would be a
>> good one.
>>
>> Patrick
>>
>> On Wed, Dec 28, 2011 at 11:18 AM, Camille Fournier <ca...@apache.org>
>> wrote:
>> > Also, Pat, the JIRA is still open. I will look to revert in a minute
>> > although I think the sync changes may necessitate a new JIRA entirely.
>> >
>> > On Wed, Dec 28, 2011 at 1:31 PM, Camille Fournier <ca...@apache.org>
>> wrote:
>> >> After looking for a few mins, here are my observations:
>> >>
>> >> The implementation of HashSet in jdk 1.6 uses an underlying HashMap,
>> which
>> >> uses a bog-standard int for the size. So, I completely agree that we can
>> >> get invalid results for a point in time. But does anyone really care
>> about
>> >> the *exact* moment-in-time number of cnxns in the system, in a system
>> where
>> >> cnxns are coming and going? At best you'll see a value that will likely
>> be
>> >> out of date the moment you read it.
>> >>
>> >> But, if we're going to do this, I do think there may be a case for
>> >> refactoring to a concurrent data structure given that we are randomly
>> >> syncing on the cnxns set in a way that makes adding additional
>> interactions
>> >> with it error prone in this way. And we should definitely remove that
>> >> getConnections method, if anyone ever iterated over that set they would
>> be
>> >> in a sad concurrency situation.
>> >> Seems possibly worth a whole new ticket to do this. What do you think?
>> >>
>> >> Thanks,
>> >> C
>> >>
>> >> On Wed, Dec 28, 2011 at 1:12 PM, Camille Fournier <camille@apache.org
>> >wrote:
>> >>
>> >>> I'm not sure it's meaningful enough to be worth the sync overhead. We
>> >>> should look into that. The alternative if we must is using a proper
>> >>> concurrent collection. Neha, any thoughts?
>> >>>
>> >>> C
>> >>> On Dec 28, 2011 12:45 PM, "Patrick Hunt" <ph...@apache.org> wrote:
>> >>>
>> >>>> I believe there is a bug in this commit. The "cnxns" size() call is
>> >>>> not being synchronized. This will lead to invalid results at best, at
>> >>>> worst outright failure (hard to say w/o knowing the implementation of
>> >>>> HashSet).
>> >>>>
>> >>>> Camille can you work with Neha to get this fixed? Perhaps in the
>> >>>> meantime (if it's going to take a while) you can revert this change,
>> >>>> re-open the jira, update the patch, and reapply at some later time?
>> >>>>
>> >>>> Patrick
>> >>>>
>> >>>> On Wed, Dec 28, 2011 at 6:55 AM,  <ca...@apache.org> wrote:
>> >>>> > Author: camille
>> >>>> > Date: Wed Dec 28 14:55:37 2011
>> >>>> > New Revision: 1225200
>> >>>> >
>> >>>> > URL: http://svn.apache.org/viewvc?rev=1225200&view=rev
>> >>>> > Log:
>> >>>> > ZOOKEEPER-1321: Add number of client connections metric in JMX and
>> srvr
>> >>>> (Neha Narkhede via camille)
>> >>>> >
>> >>>> > Modified:
>> >>>> >    zookeeper/trunk/CHANGES.txt
>> >>>> >
>> >>>>
>>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java
>> >>>> >
>> >>>>
>>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java
>> >>>> >
>> >>>>
>>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java
>> >>>> >
>> >>>>
>>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java
>> >>>> >
>> >>>>
>>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java
>> >>>> >
>> >>>>
>>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerStats.java
>> >>>> >
>> >>>>
>>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java
>> >>>> >
>> >>>>
>>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java
>> >>>> >
>> >>>>
>>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java
>> >>>> >
>> >>>>
>>  zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/Zab1_0Test.java
>> >>>> >
>> >>>>
>>  zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java
>> >>>> >
>> >>>> > Modified: zookeeper/trunk/CHANGES.txt
>> >>>> > URL:
>> >>>>
>> http://svn.apache.org/viewvc/zookeeper/trunk/CHANGES.txt?rev=1225200&r1=1225199&r2=1225200&view=diff
>> >>>> >
>> >>>>
>> ==============================================================================
>> >>>> > --- zookeeper/trunk/CHANGES.txt (original)
>> >>>> > +++ zookeeper/trunk/CHANGES.txt Wed Dec 28 14:55:37 2011
>> >>>> > @@ -162,6 +162,8 @@ IMPROVEMENTS:
>> >>>> >
>> >>>> >   ZOOKEEPER-1342. quorum Listener & LearnerCnxAcceptor are missing
>> >>>> >   thread names (Rakesh R via phunt)
>> >>>> > +
>> >>>> > +  ZOOKEEPER-1321. Add number of client connections metric in JMX
>> and
>> >>>> srvr (Neha Narkhede via camille)
>> >>>> >
>> >>>> >  Release 3.4.0 -
>> >>>> >
>> >>>> >
>> >>>> > Modified:
>> >>>>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java
>> >>>> > URL:
>> >>>>
>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>> >>>> >
>> >>>>
>> ==============================================================================
>> >>>> > ---
>> >>>>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java
>> >>>> (original)
>> >>>> > +++
>> >>>>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java
>> >>>> Wed Dec 28 14:55:37 2011
>> >>>> > @@ -749,7 +749,8 @@ public class NIOServerCnxn extends Serve
>> >>>> >
>> >>>> >             print("packets_received", stats.getPacketsReceived());
>> >>>> >             print("packets_sent", stats.getPacketsSent());
>> >>>> > -
>> >>>> > +            print("num_alive_connections",
>> >>>> stats.getNumAliveClientConnections());
>> >>>> > +
>> >>>> >             print("outstanding_requests",
>> >>>> stats.getOutstandingRequests());
>> >>>> >
>> >>>> >             print("server_state", stats.getServerState());
>> >>>> >
>> >>>> > Modified:
>> >>>>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java
>> >>>> > URL:
>> >>>>
>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>> >>>> >
>> >>>>
>> ==============================================================================
>> >>>> > ---
>> >>>>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java
>> >>>> (original)
>> >>>> > +++
>> >>>>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java
>> >>>> Wed Dec 28 14:55:37 2011
>> >>>> > @@ -32,14 +32,14 @@ import java.util.HashMap;
>> >>>> >  import java.util.HashSet;
>> >>>> >  import java.util.Set;
>> >>>> >
>> >>>> > +import javax.security.auth.login.Configuration;
>> >>>> > +import javax.security.auth.login.LoginException;
>> >>>> > +
>> >>>> >  import org.apache.zookeeper.Login;
>> >>>> >  import org.apache.zookeeper.server.auth.SaslServerCallbackHandler;
>> >>>> >  import org.slf4j.Logger;
>> >>>> >  import org.slf4j.LoggerFactory;
>> >>>> >
>> >>>> > -import javax.security.auth.login.Configuration;
>> >>>> > -import javax.security.auth.login.LoginException;
>> >>>> > -
>> >>>> >  public class NIOServerCnxnFactory extends ServerCnxnFactory
>> implements
>> >>>> Runnable {
>> >>>> >     private static final Logger LOG =
>> >>>> LoggerFactory.getLogger(NIOServerCnxnFactory.class);
>> >>>> >
>> >>>> > @@ -78,7 +78,6 @@ public class NIOServerCnxnFactory extend
>> >>>> >
>> >>>> >     int maxClientCnxns = 60;
>> >>>> >
>> >>>> > -
>> >>>> >     /**
>> >>>> >      * Construct a new server connection factory which will accept
>> an
>> >>>> unlimited number
>> >>>> >      * of concurrent connections from each client (up to the file
>> >>>> descriptor
>> >>>> > @@ -122,7 +121,7 @@ public class NIOServerCnxnFactory extend
>> >>>> >     public void setMaxClientCnxnsPerHost(int max) {
>> >>>> >         maxClientCnxns = max;
>> >>>> >     }
>> >>>> > -
>> >>>> > +
>> >>>> >     @Override
>> >>>> >     public void start() {
>> >>>> >         // ensure thread is started once and only once
>> >>>> > @@ -187,7 +186,7 @@ public class NIOServerCnxnFactory extend
>> >>>> >             return s.size();
>> >>>> >         }
>> >>>> >     }
>> >>>> > -
>> >>>> > +
>> >>>> >     public void run() {
>> >>>> >         while (!ss.socket().isClosed()) {
>> >>>> >             try {
>> >>>> > @@ -323,4 +322,8 @@ public class NIOServerCnxnFactory extend
>> >>>> >         return cnxns;
>> >>>> >     }
>> >>>> >
>> >>>> > +    @Override
>> >>>> > +    public int getNumAliveConnections() {
>> >>>> > +       return cnxns.size();
>> >>>> > +    }
>> >>>> >  }
>> >>>> >
>> >>>> > Modified:
>> >>>>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java
>> >>>> > URL:
>> >>>>
>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>> >>>> >
>> >>>>
>> ==============================================================================
>> >>>> > ---
>> >>>>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java
>> >>>> (original)
>> >>>> > +++
>> >>>>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java
>> >>>> Wed Dec 28 14:55:37 2011
>> >>>> > @@ -560,7 +560,8 @@ public class NettyServerCnxn extends Ser
>> >>>> >
>> >>>> >             print("packets_received", stats.getPacketsReceived());
>> >>>> >             print("packets_sent", stats.getPacketsSent());
>> >>>> > -
>> >>>> > +            print("num_alive_connections",
>> >>>> stats.getNumAliveClientConnections());
>> >>>> > +
>> >>>> >             print("outstanding_requests",
>> >>>> stats.getOutstandingRequests());
>> >>>> >
>> >>>> >             print("server_state", stats.getServerState());
>> >>>> >
>> >>>> > Modified:
>> >>>>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java
>> >>>> > URL:
>> >>>>
>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>> >>>> >
>> >>>>
>> ==============================================================================
>> >>>> > ---
>> >>>>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java
>> >>>> (original)
>> >>>> > +++
>> >>>>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java
>> >>>> Wed Dec 28 14:55:37 2011
>> >>>> > @@ -411,5 +411,10 @@ public class NettyServerCnxnFactory exte
>> >>>> >             }
>> >>>> >         }
>> >>>> >     }
>> >>>> > +
>> >>>> > +    @Override
>> >>>> > +    public int getNumAliveConnections() {
>> >>>> > +       return cnxns.size();
>> >>>> > +    }
>> >>>> >
>> >>>> >  }
>> >>>> >
>> >>>> > Modified:
>> >>>>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java
>> >>>> > URL:
>> >>>>
>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>> >>>> >
>> >>>>
>> ==============================================================================
>> >>>> > ---
>> >>>>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java
>> >>>> (original)
>> >>>> > +++
>> >>>>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java
>> >>>> Wed Dec 28 14:55:37 2011
>> >>>> > @@ -24,15 +24,16 @@ import java.nio.ByteBuffer;
>> >>>> >  import java.util.HashMap;
>> >>>> >
>> >>>> >  import javax.management.JMException;
>> >>>> > -import org.slf4j.Logger;
>> >>>> > -import org.slf4j.LoggerFactory;
>> >>>> > -import org.apache.zookeeper.jmx.MBeanRegistry;
>> >>>> > +
>> >>>> >  import org.apache.zookeeper.Login;
>> >>>> > +import org.apache.zookeeper.jmx.MBeanRegistry;
>> >>>> >  import org.apache.zookeeper.server.auth.SaslServerCallbackHandler;
>> >>>> > +import org.slf4j.Logger;
>> >>>> > +import org.slf4j.LoggerFactory;
>> >>>> >
>> >>>> >  public abstract class ServerCnxnFactory {
>> >>>> >
>> >>>> > -    public static final String ZOOKEEPER_SERVER_CNXN_FACTORY =
>> >>>> "zookeeper.serverCnxnFactory";
>> >>>> > +    public static final String ZOOKEEPER_SERVER_CNXN_FACTORY =
>> >>>> "zookeeper.serverCnxnFactory";
>> >>>> >
>> >>>> >     public interface PacketProcessor {
>> >>>> >         public void processPacket(ByteBuffer packet, ServerCnxn
>> src);
>> >>>> > @@ -49,6 +50,8 @@ public abstract class ServerCnxnFactory
>> >>>> >
>> >>>> >     public abstract Iterable<ServerCnxn> getConnections();
>> >>>> >
>> >>>> > +    public abstract int getNumAliveConnections();
>> >>>> > +
>> >>>> >     public abstract void closeSession(long sessionId);
>> >>>> >
>> >>>> >     public abstract void configure(InetSocketAddress addr,
>> >>>> >
>> >>>> > Modified:
>> >>>>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerStats.java
>> >>>> > URL:
>> >>>>
>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerStats.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>> >>>> >
>> >>>>
>> ==============================================================================
>> >>>> > ---
>> >>>>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerStats.java
>> >>>> (original)
>> >>>> > +++
>> >>>>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerStats.java
>> >>>> Wed Dec 28 14:55:37 2011
>> >>>> > @@ -19,6 +19,7 @@
>> >>>> >  package org.apache.zookeeper.server;
>> >>>> >
>> >>>> >
>> >>>> > +
>> >>>> >  /**
>> >>>> >  * Basic Server Statistics
>> >>>> >  */
>> >>>> > @@ -29,13 +30,14 @@ public class ServerStats {
>> >>>> >     private long minLatency = Long.MAX_VALUE;
>> >>>> >     private long totalLatency = 0;
>> >>>> >     private long count = 0;
>> >>>> > -
>> >>>> > +
>> >>>> >     private final Provider provider;
>> >>>> >
>> >>>> >     public interface Provider {
>> >>>> >         public long getOutstandingRequests();
>> >>>> >         public long getLastProcessedZxid();
>> >>>> >         public String getState();
>> >>>> > +        public int getNumAliveConnections();
>> >>>> >     }
>> >>>> >
>> >>>> >     public ServerStats(Provider provider) {
>> >>>> > @@ -75,9 +77,14 @@ public class ServerStats {
>> >>>> >     }
>> >>>> >
>> >>>> >     public String getServerState() {
>> >>>> > -        return provider.getState();
>> >>>> > +       return provider.getState();
>> >>>> >     }
>> >>>> > -
>> >>>> > +
>> >>>> > +    /** The number of client connections alive to this server */
>> >>>> > +    public int getNumAliveClientConnections() {
>> >>>> > +       return provider.getNumAliveConnections();
>> >>>> > +    }
>> >>>> > +
>> >>>> >     @Override
>> >>>> >     public String toString(){
>> >>>> >         StringBuilder sb = new StringBuilder();
>> >>>> > @@ -85,6 +92,8 @@ public class ServerStats {
>> >>>> >                 + getAvgLatency() + "/" + getMaxLatency() + "\n");
>> >>>> >         sb.append("Received: " + getPacketsReceived() + "\n");
>> >>>> >         sb.append("Sent: " + getPacketsSent() + "\n");
>> >>>> > +        sb.append("Connections: " + getNumAliveClientConnections()
>> +
>> >>>> "\n");
>> >>>> > +
>> >>>> >         if (provider != null) {
>> >>>> >             sb.append("Outstanding: " + getOutstandingRequests() +
>> >>>> "\n");
>> >>>> >             sb.append("Zxid: 0x"+
>> >>>> Long.toHexString(getLastProcessedZxid())+ "\n");
>> >>>> > @@ -123,7 +132,6 @@ public class ServerStats {
>> >>>> >         packetsReceived = 0;
>> >>>> >         packetsSent = 0;
>> >>>> >     }
>> >>>> > -
>> >>>> >     synchronized public void reset() {
>> >>>> >         resetLatency();
>> >>>> >         resetRequestCounters();
>> >>>> >
>> >>>> > Modified:
>> >>>>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java
>> >>>> > URL:
>> >>>>
>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>> >>>> >
>> >>>>
>> ==============================================================================
>> >>>> > ---
>> >>>>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java
>> >>>> (original)
>> >>>> > +++
>> >>>>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java
>> >>>> Wed Dec 28 14:55:37 2011
>> >>>> > @@ -109,7 +109,7 @@ public class ZooKeeperServer implements
>> >>>> >     private ServerCnxnFactory serverCnxnFactory;
>> >>>> >
>> >>>> >     private final ServerStats serverStats;
>> >>>> > -
>> >>>> > +
>> >>>> >     void removeCnxn(ServerCnxn cnxn) {
>> >>>> >         zkDb.removeCnxn(cnxn);
>> >>>> >     }
>> >>>> > @@ -254,7 +254,6 @@ public class ZooKeeperServer implements
>> >>>> >         }
>> >>>> >     }
>> >>>> >
>> >>>> > -
>> >>>> >     /**
>> >>>> >      * This should be called from a synchronized block on this!
>> >>>> >      */
>> >>>> > @@ -678,6 +677,14 @@ public class ZooKeeperServer implements
>> >>>> >     }
>> >>>> >
>> >>>> >     /**
>> >>>> > +     * return the total number of client connections that are alive
>> >>>> > +     * to this server
>> >>>> > +     */
>> >>>> > +    public int getNumAliveConnections() {
>> >>>> > +       return serverCnxnFactory.getNumAliveConnections();
>> >>>> > +    }
>> >>>> > +
>> >>>> > +    /**
>> >>>> >      * trunccate the log to get in sync with others
>> >>>> >      * if in a quorum
>> >>>> >      * @param zxid the zxid that it needs to get in sync
>> >>>> >
>> >>>> > Modified:
>> >>>>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java
>> >>>> > URL:
>> >>>>
>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>> >>>> >
>> >>>>
>> ==============================================================================
>> >>>> > ---
>> >>>>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java
>> >>>> (original)
>> >>>> > +++
>> >>>>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java
>> >>>> Wed Dec 28 14:55:37 2011
>> >>>> > @@ -140,4 +140,8 @@ public class ZooKeeperServerBean impleme
>> >>>> >         serverStats.resetRequestCounters();
>> >>>> >         serverStats.resetLatency();
>> >>>> >     }
>> >>>> > +
>> >>>> > +       public long getNumAliveConnections() {
>> >>>> > +               return zks.getNumAliveConnections();
>> >>>> > +       }
>> >>>> >  }
>> >>>> >
>> >>>> > Modified:
>> >>>>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java
>> >>>> > URL:
>> >>>>
>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>> >>>> >
>> >>>>
>> ==============================================================================
>> >>>> > ---
>> >>>>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java
>> >>>> (original)
>> >>>> > +++
>> >>>>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java
>> >>>> Wed Dec 28 14:55:37 2011
>> >>>> > @@ -103,4 +103,8 @@ public interface ZooKeeperServerMXBean {
>> >>>> >      * Reset max latency statistics only.
>> >>>> >      */
>> >>>> >     public void resetMaxLatency();
>> >>>> > +    /**
>> >>>> > +     * @return number of alive client connections
>> >>>> > +     */
>> >>>> > +    public long getNumAliveConnections();
>> >>>> >  }
>> >>>> >
>> >>>> > Modified:
>> >>>>
>> zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/Zab1_0Test.java
>> >>>> > URL:
>> >>>>
>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/Zab1_0Test.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>> >>>> >
>> >>>>
>> ==============================================================================
>> >>>> > ---
>> >>>>
>> zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/Zab1_0Test.java
>> >>>> (original)
>> >>>> > +++
>> >>>>
>> zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/Zab1_0Test.java
>> >>>> Wed Dec 28 14:55:37 2011
>> >>>> > @@ -212,6 +212,10 @@ public class Zab1_0Test {
>> >>>> >         }
>> >>>> >         public void closeAll() {
>> >>>> >         }
>> >>>> > +               @Override
>> >>>> > +               public int getNumAliveConnections() {
>> >>>> > +                       return 0;
>> >>>> > +               }
>> >>>> >     }
>> >>>> >     static Socket[] getSocketPair() throws IOException {
>> >>>> >         ServerSocket ss = new ServerSocket();
>> >>>> >
>> >>>> > Modified:
>> >>>>
>> zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java
>> >>>> > URL:
>> >>>>
>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>> >>>> >
>> >>>>
>> ==============================================================================
>> >>>> > ---
>> >>>>
>> zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java
>> >>>> (original)
>> >>>> > +++
>> >>>>
>> zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java
>> >>>> Wed Dec 28 14:55:37 2011
>> >>>> > @@ -94,6 +94,9 @@ public class FourLetterWordsTest extends
>> >>>> >         verify("srvr", "Outstanding");
>> >>>> >         verify("cons", "queued");
>> >>>> >         verify("mntr", "zk_server_state\tstandalone");
>> >>>> > +        verify("mntr", "num_alive_connections");
>> >>>> > +        verify("stat", "Connections");
>> >>>> > +        verify("srvr", "Connections");
>> >>>> >     }
>> >>>> >
>> >>>> >     private String sendRequest(String cmd) throws IOException {
>> >>>> > @@ -136,6 +139,8 @@ public class FourLetterWordsTest extends
>> >>>> >         line = in.readLine();
>> >>>> >         Assert.assertTrue(Pattern.matches("^Sent: \\d+$", line));
>> >>>> >         line = in.readLine();
>> >>>> > +        Assert.assertTrue(Pattern.matches("^Connections: \\d+$",
>> >>>> line));
>> >>>> > +        line = in.readLine();
>> >>>> >         Assert.assertTrue(Pattern.matches("^Outstanding: \\d+$",
>> line));
>> >>>> >         line = in.readLine();
>> >>>> >         Assert.assertTrue(Pattern.matches("^Zxid: 0x[\\da-fA-F]+$",
>> >>>> line));
>> >>>> >
>> >>>> >
>> >>>>
>> >>>
>>

Re: svn commit: r1225200 - in /zookeeper/trunk: ./ src/java/main/org/apache/zookeeper/server/ src/java/test/org/apache/zookeeper/server/quorum/ src/java/test/org/apache/zookeeper/test/

Posted by Camille Fournier <ca...@apache.org>.
I don't think creating it as a flat sync is a good idea, so if we want this
I think we need to refactor that structure to be concurrent.

C
On Dec 28, 2011 2:24 PM, "Patrick Hunt" <ph...@apache.org> wrote:

> I think it needs to be fixed. It's obviously incorrect. Also if
> someone changes the underlying implementation at some point it might
> bite them.
>
> Given it wasn't applied to 3.4 branch yet I'd suggest revert, fix the
> patch, then reapply to both branches. (that's easiest/bulletproof imo)
>
> I'd recommend a new ticket to fix the issues you identified (refactor,
> etc...) Neha was looking for further items to work on, this would be a
> good one.
>
> Patrick
>
> On Wed, Dec 28, 2011 at 11:18 AM, Camille Fournier <ca...@apache.org>
> wrote:
> > Also, Pat, the JIRA is still open. I will look to revert in a minute
> > although I think the sync changes may necessitate a new JIRA entirely.
> >
> > On Wed, Dec 28, 2011 at 1:31 PM, Camille Fournier <ca...@apache.org>
> wrote:
> >> After looking for a few mins, here are my observations:
> >>
> >> The implementation of HashSet in jdk 1.6 uses an underlying HashMap,
> which
> >> uses a bog-standard int for the size. So, I completely agree that we can
> >> get invalid results for a point in time. But does anyone really care
> about
> >> the *exact* moment-in-time number of cnxns in the system, in a system
> where
> >> cnxns are coming and going? At best you'll see a value that will likely
> be
> >> out of date the moment you read it.
> >>
> >> But, if we're going to do this, I do think there may be a case for
> >> refactoring to a concurrent data structure given that we are randomly
> >> syncing on the cnxns set in a way that makes adding additional
> interactions
> >> with it error prone in this way. And we should definitely remove that
> >> getConnections method, if anyone ever iterated over that set they would
> be
> >> in a sad concurrency situation.
> >> Seems possibly worth a whole new ticket to do this. What do you think?
> >>
> >> Thanks,
> >> C
> >>
> >> On Wed, Dec 28, 2011 at 1:12 PM, Camille Fournier <camille@apache.org
> >wrote:
> >>
> >>> I'm not sure it's meaningful enough to be worth the sync overhead. We
> >>> should look into that. The alternative if we must is using a proper
> >>> concurrent collection. Neha, any thoughts?
> >>>
> >>> C
> >>> On Dec 28, 2011 12:45 PM, "Patrick Hunt" <ph...@apache.org> wrote:
> >>>
> >>>> I believe there is a bug in this commit. The "cnxns" size() call is
> >>>> not being synchronized. This will lead to invalid results at best, at
> >>>> worst outright failure (hard to say w/o knowing the implementation of
> >>>> HashSet).
> >>>>
> >>>> Camille can you work with Neha to get this fixed? Perhaps in the
> >>>> meantime (if it's going to take a while) you can revert this change,
> >>>> re-open the jira, update the patch, and reapply at some later time?
> >>>>
> >>>> Patrick
> >>>>
> >>>> On Wed, Dec 28, 2011 at 6:55 AM,  <ca...@apache.org> wrote:
> >>>> > Author: camille
> >>>> > Date: Wed Dec 28 14:55:37 2011
> >>>> > New Revision: 1225200
> >>>> >
> >>>> > URL: http://svn.apache.org/viewvc?rev=1225200&view=rev
> >>>> > Log:
> >>>> > ZOOKEEPER-1321: Add number of client connections metric in JMX and
> srvr
> >>>> (Neha Narkhede via camille)
> >>>> >
> >>>> > Modified:
> >>>> >    zookeeper/trunk/CHANGES.txt
> >>>> >
> >>>>
>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java
> >>>> >
> >>>>
>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java
> >>>> >
> >>>>
>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java
> >>>> >
> >>>>
>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java
> >>>> >
> >>>>
>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java
> >>>> >
> >>>>
>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerStats.java
> >>>> >
> >>>>
>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java
> >>>> >
> >>>>
>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java
> >>>> >
> >>>>
>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java
> >>>> >
> >>>>
>  zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/Zab1_0Test.java
> >>>> >
> >>>>
>  zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java
> >>>> >
> >>>> > Modified: zookeeper/trunk/CHANGES.txt
> >>>> > URL:
> >>>>
> http://svn.apache.org/viewvc/zookeeper/trunk/CHANGES.txt?rev=1225200&r1=1225199&r2=1225200&view=diff
> >>>> >
> >>>>
> ==============================================================================
> >>>> > --- zookeeper/trunk/CHANGES.txt (original)
> >>>> > +++ zookeeper/trunk/CHANGES.txt Wed Dec 28 14:55:37 2011
> >>>> > @@ -162,6 +162,8 @@ IMPROVEMENTS:
> >>>> >
> >>>> >   ZOOKEEPER-1342. quorum Listener & LearnerCnxAcceptor are missing
> >>>> >   thread names (Rakesh R via phunt)
> >>>> > +
> >>>> > +  ZOOKEEPER-1321. Add number of client connections metric in JMX
> and
> >>>> srvr (Neha Narkhede via camille)
> >>>> >
> >>>> >  Release 3.4.0 -
> >>>> >
> >>>> >
> >>>> > Modified:
> >>>>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java
> >>>> > URL:
> >>>>
> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java?rev=1225200&r1=1225199&r2=1225200&view=diff
> >>>> >
> >>>>
> ==============================================================================
> >>>> > ---
> >>>>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java
> >>>> (original)
> >>>> > +++
> >>>>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java
> >>>> Wed Dec 28 14:55:37 2011
> >>>> > @@ -749,7 +749,8 @@ public class NIOServerCnxn extends Serve
> >>>> >
> >>>> >             print("packets_received", stats.getPacketsReceived());
> >>>> >             print("packets_sent", stats.getPacketsSent());
> >>>> > -
> >>>> > +            print("num_alive_connections",
> >>>> stats.getNumAliveClientConnections());
> >>>> > +
> >>>> >             print("outstanding_requests",
> >>>> stats.getOutstandingRequests());
> >>>> >
> >>>> >             print("server_state", stats.getServerState());
> >>>> >
> >>>> > Modified:
> >>>>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java
> >>>> > URL:
> >>>>
> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java?rev=1225200&r1=1225199&r2=1225200&view=diff
> >>>> >
> >>>>
> ==============================================================================
> >>>> > ---
> >>>>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java
> >>>> (original)
> >>>> > +++
> >>>>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java
> >>>> Wed Dec 28 14:55:37 2011
> >>>> > @@ -32,14 +32,14 @@ import java.util.HashMap;
> >>>> >  import java.util.HashSet;
> >>>> >  import java.util.Set;
> >>>> >
> >>>> > +import javax.security.auth.login.Configuration;
> >>>> > +import javax.security.auth.login.LoginException;
> >>>> > +
> >>>> >  import org.apache.zookeeper.Login;
> >>>> >  import org.apache.zookeeper.server.auth.SaslServerCallbackHandler;
> >>>> >  import org.slf4j.Logger;
> >>>> >  import org.slf4j.LoggerFactory;
> >>>> >
> >>>> > -import javax.security.auth.login.Configuration;
> >>>> > -import javax.security.auth.login.LoginException;
> >>>> > -
> >>>> >  public class NIOServerCnxnFactory extends ServerCnxnFactory
> implements
> >>>> Runnable {
> >>>> >     private static final Logger LOG =
> >>>> LoggerFactory.getLogger(NIOServerCnxnFactory.class);
> >>>> >
> >>>> > @@ -78,7 +78,6 @@ public class NIOServerCnxnFactory extend
> >>>> >
> >>>> >     int maxClientCnxns = 60;
> >>>> >
> >>>> > -
> >>>> >     /**
> >>>> >      * Construct a new server connection factory which will accept
> an
> >>>> unlimited number
> >>>> >      * of concurrent connections from each client (up to the file
> >>>> descriptor
> >>>> > @@ -122,7 +121,7 @@ public class NIOServerCnxnFactory extend
> >>>> >     public void setMaxClientCnxnsPerHost(int max) {
> >>>> >         maxClientCnxns = max;
> >>>> >     }
> >>>> > -
> >>>> > +
> >>>> >     @Override
> >>>> >     public void start() {
> >>>> >         // ensure thread is started once and only once
> >>>> > @@ -187,7 +186,7 @@ public class NIOServerCnxnFactory extend
> >>>> >             return s.size();
> >>>> >         }
> >>>> >     }
> >>>> > -
> >>>> > +
> >>>> >     public void run() {
> >>>> >         while (!ss.socket().isClosed()) {
> >>>> >             try {
> >>>> > @@ -323,4 +322,8 @@ public class NIOServerCnxnFactory extend
> >>>> >         return cnxns;
> >>>> >     }
> >>>> >
> >>>> > +    @Override
> >>>> > +    public int getNumAliveConnections() {
> >>>> > +       return cnxns.size();
> >>>> > +    }
> >>>> >  }
> >>>> >
> >>>> > Modified:
> >>>>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java
> >>>> > URL:
> >>>>
> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java?rev=1225200&r1=1225199&r2=1225200&view=diff
> >>>> >
> >>>>
> ==============================================================================
> >>>> > ---
> >>>>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java
> >>>> (original)
> >>>> > +++
> >>>>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java
> >>>> Wed Dec 28 14:55:37 2011
> >>>> > @@ -560,7 +560,8 @@ public class NettyServerCnxn extends Ser
> >>>> >
> >>>> >             print("packets_received", stats.getPacketsReceived());
> >>>> >             print("packets_sent", stats.getPacketsSent());
> >>>> > -
> >>>> > +            print("num_alive_connections",
> >>>> stats.getNumAliveClientConnections());
> >>>> > +
> >>>> >             print("outstanding_requests",
> >>>> stats.getOutstandingRequests());
> >>>> >
> >>>> >             print("server_state", stats.getServerState());
> >>>> >
> >>>> > Modified:
> >>>>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java
> >>>> > URL:
> >>>>
> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java?rev=1225200&r1=1225199&r2=1225200&view=diff
> >>>> >
> >>>>
> ==============================================================================
> >>>> > ---
> >>>>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java
> >>>> (original)
> >>>> > +++
> >>>>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java
> >>>> Wed Dec 28 14:55:37 2011
> >>>> > @@ -411,5 +411,10 @@ public class NettyServerCnxnFactory exte
> >>>> >             }
> >>>> >         }
> >>>> >     }
> >>>> > +
> >>>> > +    @Override
> >>>> > +    public int getNumAliveConnections() {
> >>>> > +       return cnxns.size();
> >>>> > +    }
> >>>> >
> >>>> >  }
> >>>> >
> >>>> > Modified:
> >>>>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java
> >>>> > URL:
> >>>>
> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java?rev=1225200&r1=1225199&r2=1225200&view=diff
> >>>> >
> >>>>
> ==============================================================================
> >>>> > ---
> >>>>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java
> >>>> (original)
> >>>> > +++
> >>>>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java
> >>>> Wed Dec 28 14:55:37 2011
> >>>> > @@ -24,15 +24,16 @@ import java.nio.ByteBuffer;
> >>>> >  import java.util.HashMap;
> >>>> >
> >>>> >  import javax.management.JMException;
> >>>> > -import org.slf4j.Logger;
> >>>> > -import org.slf4j.LoggerFactory;
> >>>> > -import org.apache.zookeeper.jmx.MBeanRegistry;
> >>>> > +
> >>>> >  import org.apache.zookeeper.Login;
> >>>> > +import org.apache.zookeeper.jmx.MBeanRegistry;
> >>>> >  import org.apache.zookeeper.server.auth.SaslServerCallbackHandler;
> >>>> > +import org.slf4j.Logger;
> >>>> > +import org.slf4j.LoggerFactory;
> >>>> >
> >>>> >  public abstract class ServerCnxnFactory {
> >>>> >
> >>>> > -    public static final String ZOOKEEPER_SERVER_CNXN_FACTORY =
> >>>> "zookeeper.serverCnxnFactory";
> >>>> > +    public static final String ZOOKEEPER_SERVER_CNXN_FACTORY =
> >>>> "zookeeper.serverCnxnFactory";
> >>>> >
> >>>> >     public interface PacketProcessor {
> >>>> >         public void processPacket(ByteBuffer packet, ServerCnxn
> src);
> >>>> > @@ -49,6 +50,8 @@ public abstract class ServerCnxnFactory
> >>>> >
> >>>> >     public abstract Iterable<ServerCnxn> getConnections();
> >>>> >
> >>>> > +    public abstract int getNumAliveConnections();
> >>>> > +
> >>>> >     public abstract void closeSession(long sessionId);
> >>>> >
> >>>> >     public abstract void configure(InetSocketAddress addr,
> >>>> >
> >>>> > Modified:
> >>>>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerStats.java
> >>>> > URL:
> >>>>
> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerStats.java?rev=1225200&r1=1225199&r2=1225200&view=diff
> >>>> >
> >>>>
> ==============================================================================
> >>>> > ---
> >>>>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerStats.java
> >>>> (original)
> >>>> > +++
> >>>>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerStats.java
> >>>> Wed Dec 28 14:55:37 2011
> >>>> > @@ -19,6 +19,7 @@
> >>>> >  package org.apache.zookeeper.server;
> >>>> >
> >>>> >
> >>>> > +
> >>>> >  /**
> >>>> >  * Basic Server Statistics
> >>>> >  */
> >>>> > @@ -29,13 +30,14 @@ public class ServerStats {
> >>>> >     private long minLatency = Long.MAX_VALUE;
> >>>> >     private long totalLatency = 0;
> >>>> >     private long count = 0;
> >>>> > -
> >>>> > +
> >>>> >     private final Provider provider;
> >>>> >
> >>>> >     public interface Provider {
> >>>> >         public long getOutstandingRequests();
> >>>> >         public long getLastProcessedZxid();
> >>>> >         public String getState();
> >>>> > +        public int getNumAliveConnections();
> >>>> >     }
> >>>> >
> >>>> >     public ServerStats(Provider provider) {
> >>>> > @@ -75,9 +77,14 @@ public class ServerStats {
> >>>> >     }
> >>>> >
> >>>> >     public String getServerState() {
> >>>> > -        return provider.getState();
> >>>> > +       return provider.getState();
> >>>> >     }
> >>>> > -
> >>>> > +
> >>>> > +    /** The number of client connections alive to this server */
> >>>> > +    public int getNumAliveClientConnections() {
> >>>> > +       return provider.getNumAliveConnections();
> >>>> > +    }
> >>>> > +
> >>>> >     @Override
> >>>> >     public String toString(){
> >>>> >         StringBuilder sb = new StringBuilder();
> >>>> > @@ -85,6 +92,8 @@ public class ServerStats {
> >>>> >                 + getAvgLatency() + "/" + getMaxLatency() + "\n");
> >>>> >         sb.append("Received: " + getPacketsReceived() + "\n");
> >>>> >         sb.append("Sent: " + getPacketsSent() + "\n");
> >>>> > +        sb.append("Connections: " + getNumAliveClientConnections()
> +
> >>>> "\n");
> >>>> > +
> >>>> >         if (provider != null) {
> >>>> >             sb.append("Outstanding: " + getOutstandingRequests() +
> >>>> "\n");
> >>>> >             sb.append("Zxid: 0x"+
> >>>> Long.toHexString(getLastProcessedZxid())+ "\n");
> >>>> > @@ -123,7 +132,6 @@ public class ServerStats {
> >>>> >         packetsReceived = 0;
> >>>> >         packetsSent = 0;
> >>>> >     }
> >>>> > -
> >>>> >     synchronized public void reset() {
> >>>> >         resetLatency();
> >>>> >         resetRequestCounters();
> >>>> >
> >>>> > Modified:
> >>>>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java
> >>>> > URL:
> >>>>
> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java?rev=1225200&r1=1225199&r2=1225200&view=diff
> >>>> >
> >>>>
> ==============================================================================
> >>>> > ---
> >>>>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java
> >>>> (original)
> >>>> > +++
> >>>>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java
> >>>> Wed Dec 28 14:55:37 2011
> >>>> > @@ -109,7 +109,7 @@ public class ZooKeeperServer implements
> >>>> >     private ServerCnxnFactory serverCnxnFactory;
> >>>> >
> >>>> >     private final ServerStats serverStats;
> >>>> > -
> >>>> > +
> >>>> >     void removeCnxn(ServerCnxn cnxn) {
> >>>> >         zkDb.removeCnxn(cnxn);
> >>>> >     }
> >>>> > @@ -254,7 +254,6 @@ public class ZooKeeperServer implements
> >>>> >         }
> >>>> >     }
> >>>> >
> >>>> > -
> >>>> >     /**
> >>>> >      * This should be called from a synchronized block on this!
> >>>> >      */
> >>>> > @@ -678,6 +677,14 @@ public class ZooKeeperServer implements
> >>>> >     }
> >>>> >
> >>>> >     /**
> >>>> > +     * return the total number of client connections that are alive
> >>>> > +     * to this server
> >>>> > +     */
> >>>> > +    public int getNumAliveConnections() {
> >>>> > +       return serverCnxnFactory.getNumAliveConnections();
> >>>> > +    }
> >>>> > +
> >>>> > +    /**
> >>>> >      * trunccate the log to get in sync with others
> >>>> >      * if in a quorum
> >>>> >      * @param zxid the zxid that it needs to get in sync
> >>>> >
> >>>> > Modified:
> >>>>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java
> >>>> > URL:
> >>>>
> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java?rev=1225200&r1=1225199&r2=1225200&view=diff
> >>>> >
> >>>>
> ==============================================================================
> >>>> > ---
> >>>>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java
> >>>> (original)
> >>>> > +++
> >>>>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java
> >>>> Wed Dec 28 14:55:37 2011
> >>>> > @@ -140,4 +140,8 @@ public class ZooKeeperServerBean impleme
> >>>> >         serverStats.resetRequestCounters();
> >>>> >         serverStats.resetLatency();
> >>>> >     }
> >>>> > +
> >>>> > +       public long getNumAliveConnections() {
> >>>> > +               return zks.getNumAliveConnections();
> >>>> > +       }
> >>>> >  }
> >>>> >
> >>>> > Modified:
> >>>>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java
> >>>> > URL:
> >>>>
> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java?rev=1225200&r1=1225199&r2=1225200&view=diff
> >>>> >
> >>>>
> ==============================================================================
> >>>> > ---
> >>>>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java
> >>>> (original)
> >>>> > +++
> >>>>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java
> >>>> Wed Dec 28 14:55:37 2011
> >>>> > @@ -103,4 +103,8 @@ public interface ZooKeeperServerMXBean {
> >>>> >      * Reset max latency statistics only.
> >>>> >      */
> >>>> >     public void resetMaxLatency();
> >>>> > +    /**
> >>>> > +     * @return number of alive client connections
> >>>> > +     */
> >>>> > +    public long getNumAliveConnections();
> >>>> >  }
> >>>> >
> >>>> > Modified:
> >>>>
> zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/Zab1_0Test.java
> >>>> > URL:
> >>>>
> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/Zab1_0Test.java?rev=1225200&r1=1225199&r2=1225200&view=diff
> >>>> >
> >>>>
> ==============================================================================
> >>>> > ---
> >>>>
> zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/Zab1_0Test.java
> >>>> (original)
> >>>> > +++
> >>>>
> zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/Zab1_0Test.java
> >>>> Wed Dec 28 14:55:37 2011
> >>>> > @@ -212,6 +212,10 @@ public class Zab1_0Test {
> >>>> >         }
> >>>> >         public void closeAll() {
> >>>> >         }
> >>>> > +               @Override
> >>>> > +               public int getNumAliveConnections() {
> >>>> > +                       return 0;
> >>>> > +               }
> >>>> >     }
> >>>> >     static Socket[] getSocketPair() throws IOException {
> >>>> >         ServerSocket ss = new ServerSocket();
> >>>> >
> >>>> > Modified:
> >>>>
> zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java
> >>>> > URL:
> >>>>
> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java?rev=1225200&r1=1225199&r2=1225200&view=diff
> >>>> >
> >>>>
> ==============================================================================
> >>>> > ---
> >>>>
> zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java
> >>>> (original)
> >>>> > +++
> >>>>
> zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java
> >>>> Wed Dec 28 14:55:37 2011
> >>>> > @@ -94,6 +94,9 @@ public class FourLetterWordsTest extends
> >>>> >         verify("srvr", "Outstanding");
> >>>> >         verify("cons", "queued");
> >>>> >         verify("mntr", "zk_server_state\tstandalone");
> >>>> > +        verify("mntr", "num_alive_connections");
> >>>> > +        verify("stat", "Connections");
> >>>> > +        verify("srvr", "Connections");
> >>>> >     }
> >>>> >
> >>>> >     private String sendRequest(String cmd) throws IOException {
> >>>> > @@ -136,6 +139,8 @@ public class FourLetterWordsTest extends
> >>>> >         line = in.readLine();
> >>>> >         Assert.assertTrue(Pattern.matches("^Sent: \\d+$", line));
> >>>> >         line = in.readLine();
> >>>> > +        Assert.assertTrue(Pattern.matches("^Connections: \\d+$",
> >>>> line));
> >>>> > +        line = in.readLine();
> >>>> >         Assert.assertTrue(Pattern.matches("^Outstanding: \\d+$",
> line));
> >>>> >         line = in.readLine();
> >>>> >         Assert.assertTrue(Pattern.matches("^Zxid: 0x[\\da-fA-F]+$",
> >>>> line));
> >>>> >
> >>>> >
> >>>>
> >>>
>

Re: svn commit: r1225200 - in /zookeeper/trunk: ./ src/java/main/org/apache/zookeeper/server/ src/java/test/org/apache/zookeeper/server/quorum/ src/java/test/org/apache/zookeeper/test/

Posted by Patrick Hunt <ph...@apache.org>.
On Wed, Dec 28, 2011 at 12:58 PM, Ted Yu <yu...@gmail.com> wrote:
> w.r.t. getConnections() method, I think we can keep it - just clone a new
> Set and return the clone.
> In javadoc, we document that getConnections() incurs additional cost in
> cloning.

Sounds reasonable but given there are no callers of this function why
keep it? I'd still rather we remove it given it's dead code. Perhaps
there are locations where we should be using and aren't?

>
> On Wed, Dec 28, 2011 at 11:24 AM, Patrick Hunt <ph...@apache.org> wrote:
>
>> I think it needs to be fixed. It's obviously incorrect. Also if
>> someone changes the underlying implementation at some point it might
>> bite them.
>>
>> Given it wasn't applied to 3.4 branch yet I'd suggest revert, fix the
>> patch, then reapply to both branches. (that's easiest/bulletproof imo)
>>
>> I'd recommend a new ticket to fix the issues you identified (refactor,
>> etc...) Neha was looking for further items to work on, this would be a
>> good one.
>>
>> Patrick
>>
>> On Wed, Dec 28, 2011 at 11:18 AM, Camille Fournier <ca...@apache.org>
>> wrote:
>> > Also, Pat, the JIRA is still open. I will look to revert in a minute
>> > although I think the sync changes may necessitate a new JIRA entirely.
>> >
>> > On Wed, Dec 28, 2011 at 1:31 PM, Camille Fournier <ca...@apache.org>
>> wrote:
>> >> After looking for a few mins, here are my observations:
>> >>
>> >> The implementation of HashSet in jdk 1.6 uses an underlying HashMap,
>> which
>> >> uses a bog-standard int for the size. So, I completely agree that we can
>> >> get invalid results for a point in time. But does anyone really care
>> about
>> >> the *exact* moment-in-time number of cnxns in the system, in a system
>> where
>> >> cnxns are coming and going? At best you'll see a value that will likely
>> be
>> >> out of date the moment you read it.
>> >>
>> >> But, if we're going to do this, I do think there may be a case for
>> >> refactoring to a concurrent data structure given that we are randomly
>> >> syncing on the cnxns set in a way that makes adding additional
>> interactions
>> >> with it error prone in this way. And we should definitely remove that
>> >> getConnections method, if anyone ever iterated over that set they would
>> be
>> >> in a sad concurrency situation.
>> >> Seems possibly worth a whole new ticket to do this. What do you think?
>> >>
>> >> Thanks,
>> >> C
>> >>
>> >> On Wed, Dec 28, 2011 at 1:12 PM, Camille Fournier <camille@apache.org
>> >wrote:
>> >>
>> >>> I'm not sure it's meaningful enough to be worth the sync overhead. We
>> >>> should look into that. The alternative if we must is using a proper
>> >>> concurrent collection. Neha, any thoughts?
>> >>>
>> >>> C
>> >>> On Dec 28, 2011 12:45 PM, "Patrick Hunt" <ph...@apache.org> wrote:
>> >>>
>> >>>> I believe there is a bug in this commit. The "cnxns" size() call is
>> >>>> not being synchronized. This will lead to invalid results at best, at
>> >>>> worst outright failure (hard to say w/o knowing the implementation of
>> >>>> HashSet).
>> >>>>
>> >>>> Camille can you work with Neha to get this fixed? Perhaps in the
>> >>>> meantime (if it's going to take a while) you can revert this change,
>> >>>> re-open the jira, update the patch, and reapply at some later time?
>> >>>>
>> >>>> Patrick
>> >>>>
>> >>>> On Wed, Dec 28, 2011 at 6:55 AM,  <ca...@apache.org> wrote:
>> >>>> > Author: camille
>> >>>> > Date: Wed Dec 28 14:55:37 2011
>> >>>> > New Revision: 1225200
>> >>>> >
>> >>>> > URL: http://svn.apache.org/viewvc?rev=1225200&view=rev
>> >>>> > Log:
>> >>>> > ZOOKEEPER-1321: Add number of client connections metric in JMX and
>> srvr
>> >>>> (Neha Narkhede via camille)
>> >>>> >
>> >>>> > Modified:
>> >>>> >    zookeeper/trunk/CHANGES.txt
>> >>>> >
>> >>>>
>>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java
>> >>>> >
>> >>>>
>>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java
>> >>>> >
>> >>>>
>>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java
>> >>>> >
>> >>>>
>>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java
>> >>>> >
>> >>>>
>>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java
>> >>>> >
>> >>>>
>>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerStats.java
>> >>>> >
>> >>>>
>>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java
>> >>>> >
>> >>>>
>>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java
>> >>>> >
>> >>>>
>>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java
>> >>>> >
>> >>>>
>>  zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/Zab1_0Test.java
>> >>>> >
>> >>>>
>>  zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java
>> >>>> >
>> >>>> > Modified: zookeeper/trunk/CHANGES.txt
>> >>>> > URL:
>> >>>>
>> http://svn.apache.org/viewvc/zookeeper/trunk/CHANGES.txt?rev=1225200&r1=1225199&r2=1225200&view=diff
>> >>>> >
>> >>>>
>> ==============================================================================
>> >>>> > --- zookeeper/trunk/CHANGES.txt (original)
>> >>>> > +++ zookeeper/trunk/CHANGES.txt Wed Dec 28 14:55:37 2011
>> >>>> > @@ -162,6 +162,8 @@ IMPROVEMENTS:
>> >>>> >
>> >>>> >   ZOOKEEPER-1342. quorum Listener & LearnerCnxAcceptor are missing
>> >>>> >   thread names (Rakesh R via phunt)
>> >>>> > +
>> >>>> > +  ZOOKEEPER-1321. Add number of client connections metric in JMX
>> and
>> >>>> srvr (Neha Narkhede via camille)
>> >>>> >
>> >>>> >  Release 3.4.0 -
>> >>>> >
>> >>>> >
>> >>>> > Modified:
>> >>>>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java
>> >>>> > URL:
>> >>>>
>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>> >>>> >
>> >>>>
>> ==============================================================================
>> >>>> > ---
>> >>>>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java
>> >>>> (original)
>> >>>> > +++
>> >>>>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java
>> >>>> Wed Dec 28 14:55:37 2011
>> >>>> > @@ -749,7 +749,8 @@ public class NIOServerCnxn extends Serve
>> >>>> >
>> >>>> >             print("packets_received", stats.getPacketsReceived());
>> >>>> >             print("packets_sent", stats.getPacketsSent());
>> >>>> > -
>> >>>> > +            print("num_alive_connections",
>> >>>> stats.getNumAliveClientConnections());
>> >>>> > +
>> >>>> >             print("outstanding_requests",
>> >>>> stats.getOutstandingRequests());
>> >>>> >
>> >>>> >             print("server_state", stats.getServerState());
>> >>>> >
>> >>>> > Modified:
>> >>>>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java
>> >>>> > URL:
>> >>>>
>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>> >>>> >
>> >>>>
>> ==============================================================================
>> >>>> > ---
>> >>>>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java
>> >>>> (original)
>> >>>> > +++
>> >>>>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java
>> >>>> Wed Dec 28 14:55:37 2011
>> >>>> > @@ -32,14 +32,14 @@ import java.util.HashMap;
>> >>>> >  import java.util.HashSet;
>> >>>> >  import java.util.Set;
>> >>>> >
>> >>>> > +import javax.security.auth.login.Configuration;
>> >>>> > +import javax.security.auth.login.LoginException;
>> >>>> > +
>> >>>> >  import org.apache.zookeeper.Login;
>> >>>> >  import org.apache.zookeeper.server.auth.SaslServerCallbackHandler;
>> >>>> >  import org.slf4j.Logger;
>> >>>> >  import org.slf4j.LoggerFactory;
>> >>>> >
>> >>>> > -import javax.security.auth.login.Configuration;
>> >>>> > -import javax.security.auth.login.LoginException;
>> >>>> > -
>> >>>> >  public class NIOServerCnxnFactory extends ServerCnxnFactory
>> implements
>> >>>> Runnable {
>> >>>> >     private static final Logger LOG =
>> >>>> LoggerFactory.getLogger(NIOServerCnxnFactory.class);
>> >>>> >
>> >>>> > @@ -78,7 +78,6 @@ public class NIOServerCnxnFactory extend
>> >>>> >
>> >>>> >     int maxClientCnxns = 60;
>> >>>> >
>> >>>> > -
>> >>>> >     /**
>> >>>> >      * Construct a new server connection factory which will accept
>> an
>> >>>> unlimited number
>> >>>> >      * of concurrent connections from each client (up to the file
>> >>>> descriptor
>> >>>> > @@ -122,7 +121,7 @@ public class NIOServerCnxnFactory extend
>> >>>> >     public void setMaxClientCnxnsPerHost(int max) {
>> >>>> >         maxClientCnxns = max;
>> >>>> >     }
>> >>>> > -
>> >>>> > +
>> >>>> >     @Override
>> >>>> >     public void start() {
>> >>>> >         // ensure thread is started once and only once
>> >>>> > @@ -187,7 +186,7 @@ public class NIOServerCnxnFactory extend
>> >>>> >             return s.size();
>> >>>> >         }
>> >>>> >     }
>> >>>> > -
>> >>>> > +
>> >>>> >     public void run() {
>> >>>> >         while (!ss.socket().isClosed()) {
>> >>>> >             try {
>> >>>> > @@ -323,4 +322,8 @@ public class NIOServerCnxnFactory extend
>> >>>> >         return cnxns;
>> >>>> >     }
>> >>>> >
>> >>>> > +    @Override
>> >>>> > +    public int getNumAliveConnections() {
>> >>>> > +       return cnxns.size();
>> >>>> > +    }
>> >>>> >  }
>> >>>> >
>> >>>> > Modified:
>> >>>>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java
>> >>>> > URL:
>> >>>>
>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>> >>>> >
>> >>>>
>> ==============================================================================
>> >>>> > ---
>> >>>>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java
>> >>>> (original)
>> >>>> > +++
>> >>>>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java
>> >>>> Wed Dec 28 14:55:37 2011
>> >>>> > @@ -560,7 +560,8 @@ public class NettyServerCnxn extends Ser
>> >>>> >
>> >>>> >             print("packets_received", stats.getPacketsReceived());
>> >>>> >             print("packets_sent", stats.getPacketsSent());
>> >>>> > -
>> >>>> > +            print("num_alive_connections",
>> >>>> stats.getNumAliveClientConnections());
>> >>>> > +
>> >>>> >             print("outstanding_requests",
>> >>>> stats.getOutstandingRequests());
>> >>>> >
>> >>>> >             print("server_state", stats.getServerState());
>> >>>> >
>> >>>> > Modified:
>> >>>>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java
>> >>>> > URL:
>> >>>>
>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>> >>>> >
>> >>>>
>> ==============================================================================
>> >>>> > ---
>> >>>>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java
>> >>>> (original)
>> >>>> > +++
>> >>>>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java
>> >>>> Wed Dec 28 14:55:37 2011
>> >>>> > @@ -411,5 +411,10 @@ public class NettyServerCnxnFactory exte
>> >>>> >             }
>> >>>> >         }
>> >>>> >     }
>> >>>> > +
>> >>>> > +    @Override
>> >>>> > +    public int getNumAliveConnections() {
>> >>>> > +       return cnxns.size();
>> >>>> > +    }
>> >>>> >
>> >>>> >  }
>> >>>> >
>> >>>> > Modified:
>> >>>>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java
>> >>>> > URL:
>> >>>>
>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>> >>>> >
>> >>>>
>> ==============================================================================
>> >>>> > ---
>> >>>>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java
>> >>>> (original)
>> >>>> > +++
>> >>>>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java
>> >>>> Wed Dec 28 14:55:37 2011
>> >>>> > @@ -24,15 +24,16 @@ import java.nio.ByteBuffer;
>> >>>> >  import java.util.HashMap;
>> >>>> >
>> >>>> >  import javax.management.JMException;
>> >>>> > -import org.slf4j.Logger;
>> >>>> > -import org.slf4j.LoggerFactory;
>> >>>> > -import org.apache.zookeeper.jmx.MBeanRegistry;
>> >>>> > +
>> >>>> >  import org.apache.zookeeper.Login;
>> >>>> > +import org.apache.zookeeper.jmx.MBeanRegistry;
>> >>>> >  import org.apache.zookeeper.server.auth.SaslServerCallbackHandler;
>> >>>> > +import org.slf4j.Logger;
>> >>>> > +import org.slf4j.LoggerFactory;
>> >>>> >
>> >>>> >  public abstract class ServerCnxnFactory {
>> >>>> >
>> >>>> > -    public static final String ZOOKEEPER_SERVER_CNXN_FACTORY =
>> >>>> "zookeeper.serverCnxnFactory";
>> >>>> > +    public static final String ZOOKEEPER_SERVER_CNXN_FACTORY =
>> >>>> "zookeeper.serverCnxnFactory";
>> >>>> >
>> >>>> >     public interface PacketProcessor {
>> >>>> >         public void processPacket(ByteBuffer packet, ServerCnxn
>> src);
>> >>>> > @@ -49,6 +50,8 @@ public abstract class ServerCnxnFactory
>> >>>> >
>> >>>> >     public abstract Iterable<ServerCnxn> getConnections();
>> >>>> >
>> >>>> > +    public abstract int getNumAliveConnections();
>> >>>> > +
>> >>>> >     public abstract void closeSession(long sessionId);
>> >>>> >
>> >>>> >     public abstract void configure(InetSocketAddress addr,
>> >>>> >
>> >>>> > Modified:
>> >>>>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerStats.java
>> >>>> > URL:
>> >>>>
>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerStats.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>> >>>> >
>> >>>>
>> ==============================================================================
>> >>>> > ---
>> >>>>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerStats.java
>> >>>> (original)
>> >>>> > +++
>> >>>>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerStats.java
>> >>>> Wed Dec 28 14:55:37 2011
>> >>>> > @@ -19,6 +19,7 @@
>> >>>> >  package org.apache.zookeeper.server;
>> >>>> >
>> >>>> >
>> >>>> > +
>> >>>> >  /**
>> >>>> >  * Basic Server Statistics
>> >>>> >  */
>> >>>> > @@ -29,13 +30,14 @@ public class ServerStats {
>> >>>> >     private long minLatency = Long.MAX_VALUE;
>> >>>> >     private long totalLatency = 0;
>> >>>> >     private long count = 0;
>> >>>> > -
>> >>>> > +
>> >>>> >     private final Provider provider;
>> >>>> >
>> >>>> >     public interface Provider {
>> >>>> >         public long getOutstandingRequests();
>> >>>> >         public long getLastProcessedZxid();
>> >>>> >         public String getState();
>> >>>> > +        public int getNumAliveConnections();
>> >>>> >     }
>> >>>> >
>> >>>> >     public ServerStats(Provider provider) {
>> >>>> > @@ -75,9 +77,14 @@ public class ServerStats {
>> >>>> >     }
>> >>>> >
>> >>>> >     public String getServerState() {
>> >>>> > -        return provider.getState();
>> >>>> > +       return provider.getState();
>> >>>> >     }
>> >>>> > -
>> >>>> > +
>> >>>> > +    /** The number of client connections alive to this server */
>> >>>> > +    public int getNumAliveClientConnections() {
>> >>>> > +       return provider.getNumAliveConnections();
>> >>>> > +    }
>> >>>> > +
>> >>>> >     @Override
>> >>>> >     public String toString(){
>> >>>> >         StringBuilder sb = new StringBuilder();
>> >>>> > @@ -85,6 +92,8 @@ public class ServerStats {
>> >>>> >                 + getAvgLatency() + "/" + getMaxLatency() + "\n");
>> >>>> >         sb.append("Received: " + getPacketsReceived() + "\n");
>> >>>> >         sb.append("Sent: " + getPacketsSent() + "\n");
>> >>>> > +        sb.append("Connections: " + getNumAliveClientConnections()
>> +
>> >>>> "\n");
>> >>>> > +
>> >>>> >         if (provider != null) {
>> >>>> >             sb.append("Outstanding: " + getOutstandingRequests() +
>> >>>> "\n");
>> >>>> >             sb.append("Zxid: 0x"+
>> >>>> Long.toHexString(getLastProcessedZxid())+ "\n");
>> >>>> > @@ -123,7 +132,6 @@ public class ServerStats {
>> >>>> >         packetsReceived = 0;
>> >>>> >         packetsSent = 0;
>> >>>> >     }
>> >>>> > -
>> >>>> >     synchronized public void reset() {
>> >>>> >         resetLatency();
>> >>>> >         resetRequestCounters();
>> >>>> >
>> >>>> > Modified:
>> >>>>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java
>> >>>> > URL:
>> >>>>
>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>> >>>> >
>> >>>>
>> ==============================================================================
>> >>>> > ---
>> >>>>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java
>> >>>> (original)
>> >>>> > +++
>> >>>>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java
>> >>>> Wed Dec 28 14:55:37 2011
>> >>>> > @@ -109,7 +109,7 @@ public class ZooKeeperServer implements
>> >>>> >     private ServerCnxnFactory serverCnxnFactory;
>> >>>> >
>> >>>> >     private final ServerStats serverStats;
>> >>>> > -
>> >>>> > +
>> >>>> >     void removeCnxn(ServerCnxn cnxn) {
>> >>>> >         zkDb.removeCnxn(cnxn);
>> >>>> >     }
>> >>>> > @@ -254,7 +254,6 @@ public class ZooKeeperServer implements
>> >>>> >         }
>> >>>> >     }
>> >>>> >
>> >>>> > -
>> >>>> >     /**
>> >>>> >      * This should be called from a synchronized block on this!
>> >>>> >      */
>> >>>> > @@ -678,6 +677,14 @@ public class ZooKeeperServer implements
>> >>>> >     }
>> >>>> >
>> >>>> >     /**
>> >>>> > +     * return the total number of client connections that are alive
>> >>>> > +     * to this server
>> >>>> > +     */
>> >>>> > +    public int getNumAliveConnections() {
>> >>>> > +       return serverCnxnFactory.getNumAliveConnections();
>> >>>> > +    }
>> >>>> > +
>> >>>> > +    /**
>> >>>> >      * trunccate the log to get in sync with others
>> >>>> >      * if in a quorum
>> >>>> >      * @param zxid the zxid that it needs to get in sync
>> >>>> >
>> >>>> > Modified:
>> >>>>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java
>> >>>> > URL:
>> >>>>
>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>> >>>> >
>> >>>>
>> ==============================================================================
>> >>>> > ---
>> >>>>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java
>> >>>> (original)
>> >>>> > +++
>> >>>>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java
>> >>>> Wed Dec 28 14:55:37 2011
>> >>>> > @@ -140,4 +140,8 @@ public class ZooKeeperServerBean impleme
>> >>>> >         serverStats.resetRequestCounters();
>> >>>> >         serverStats.resetLatency();
>> >>>> >     }
>> >>>> > +
>> >>>> > +       public long getNumAliveConnections() {
>> >>>> > +               return zks.getNumAliveConnections();
>> >>>> > +       }
>> >>>> >  }
>> >>>> >
>> >>>> > Modified:
>> >>>>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java
>> >>>> > URL:
>> >>>>
>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>> >>>> >
>> >>>>
>> ==============================================================================
>> >>>> > ---
>> >>>>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java
>> >>>> (original)
>> >>>> > +++
>> >>>>
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java
>> >>>> Wed Dec 28 14:55:37 2011
>> >>>> > @@ -103,4 +103,8 @@ public interface ZooKeeperServerMXBean {
>> >>>> >      * Reset max latency statistics only.
>> >>>> >      */
>> >>>> >     public void resetMaxLatency();
>> >>>> > +    /**
>> >>>> > +     * @return number of alive client connections
>> >>>> > +     */
>> >>>> > +    public long getNumAliveConnections();
>> >>>> >  }
>> >>>> >
>> >>>> > Modified:
>> >>>>
>> zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/Zab1_0Test.java
>> >>>> > URL:
>> >>>>
>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/Zab1_0Test.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>> >>>> >
>> >>>>
>> ==============================================================================
>> >>>> > ---
>> >>>>
>> zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/Zab1_0Test.java
>> >>>> (original)
>> >>>> > +++
>> >>>>
>> zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/Zab1_0Test.java
>> >>>> Wed Dec 28 14:55:37 2011
>> >>>> > @@ -212,6 +212,10 @@ public class Zab1_0Test {
>> >>>> >         }
>> >>>> >         public void closeAll() {
>> >>>> >         }
>> >>>> > +               @Override
>> >>>> > +               public int getNumAliveConnections() {
>> >>>> > +                       return 0;
>> >>>> > +               }
>> >>>> >     }
>> >>>> >     static Socket[] getSocketPair() throws IOException {
>> >>>> >         ServerSocket ss = new ServerSocket();
>> >>>> >
>> >>>> > Modified:
>> >>>>
>> zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java
>> >>>> > URL:
>> >>>>
>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>> >>>> >
>> >>>>
>> ==============================================================================
>> >>>> > ---
>> >>>>
>> zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java
>> >>>> (original)
>> >>>> > +++
>> >>>>
>> zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java
>> >>>> Wed Dec 28 14:55:37 2011
>> >>>> > @@ -94,6 +94,9 @@ public class FourLetterWordsTest extends
>> >>>> >         verify("srvr", "Outstanding");
>> >>>> >         verify("cons", "queued");
>> >>>> >         verify("mntr", "zk_server_state\tstandalone");
>> >>>> > +        verify("mntr", "num_alive_connections");
>> >>>> > +        verify("stat", "Connections");
>> >>>> > +        verify("srvr", "Connections");
>> >>>> >     }
>> >>>> >
>> >>>> >     private String sendRequest(String cmd) throws IOException {
>> >>>> > @@ -136,6 +139,8 @@ public class FourLetterWordsTest extends
>> >>>> >         line = in.readLine();
>> >>>> >         Assert.assertTrue(Pattern.matches("^Sent: \\d+$", line));
>> >>>> >         line = in.readLine();
>> >>>> > +        Assert.assertTrue(Pattern.matches("^Connections: \\d+$",
>> >>>> line));
>> >>>> > +        line = in.readLine();
>> >>>> >         Assert.assertTrue(Pattern.matches("^Outstanding: \\d+$",
>> line));
>> >>>> >         line = in.readLine();
>> >>>> >         Assert.assertTrue(Pattern.matches("^Zxid: 0x[\\da-fA-F]+$",
>> >>>> line));
>> >>>> >
>> >>>> >
>> >>>>
>> >>>
>>

Re: svn commit: r1225200 - in /zookeeper/trunk: ./ src/java/main/org/apache/zookeeper/server/ src/java/test/org/apache/zookeeper/server/quorum/ src/java/test/org/apache/zookeeper/test/

Posted by Ted Yu <yu...@gmail.com>.
w.r.t. getConnections() method, I think we can keep it - just clone a new
Set and return the clone.
In javadoc, we document that getConnections() incurs additional cost in
cloning.

Cheers

On Wed, Dec 28, 2011 at 11:24 AM, Patrick Hunt <ph...@apache.org> wrote:

> I think it needs to be fixed. It's obviously incorrect. Also if
> someone changes the underlying implementation at some point it might
> bite them.
>
> Given it wasn't applied to 3.4 branch yet I'd suggest revert, fix the
> patch, then reapply to both branches. (that's easiest/bulletproof imo)
>
> I'd recommend a new ticket to fix the issues you identified (refactor,
> etc...) Neha was looking for further items to work on, this would be a
> good one.
>
> Patrick
>
> On Wed, Dec 28, 2011 at 11:18 AM, Camille Fournier <ca...@apache.org>
> wrote:
> > Also, Pat, the JIRA is still open. I will look to revert in a minute
> > although I think the sync changes may necessitate a new JIRA entirely.
> >
> > On Wed, Dec 28, 2011 at 1:31 PM, Camille Fournier <ca...@apache.org>
> wrote:
> >> After looking for a few mins, here are my observations:
> >>
> >> The implementation of HashSet in jdk 1.6 uses an underlying HashMap,
> which
> >> uses a bog-standard int for the size. So, I completely agree that we can
> >> get invalid results for a point in time. But does anyone really care
> about
> >> the *exact* moment-in-time number of cnxns in the system, in a system
> where
> >> cnxns are coming and going? At best you'll see a value that will likely
> be
> >> out of date the moment you read it.
> >>
> >> But, if we're going to do this, I do think there may be a case for
> >> refactoring to a concurrent data structure given that we are randomly
> >> syncing on the cnxns set in a way that makes adding additional
> interactions
> >> with it error prone in this way. And we should definitely remove that
> >> getConnections method, if anyone ever iterated over that set they would
> be
> >> in a sad concurrency situation.
> >> Seems possibly worth a whole new ticket to do this. What do you think?
> >>
> >> Thanks,
> >> C
> >>
> >> On Wed, Dec 28, 2011 at 1:12 PM, Camille Fournier <camille@apache.org
> >wrote:
> >>
> >>> I'm not sure it's meaningful enough to be worth the sync overhead. We
> >>> should look into that. The alternative if we must is using a proper
> >>> concurrent collection. Neha, any thoughts?
> >>>
> >>> C
> >>> On Dec 28, 2011 12:45 PM, "Patrick Hunt" <ph...@apache.org> wrote:
> >>>
> >>>> I believe there is a bug in this commit. The "cnxns" size() call is
> >>>> not being synchronized. This will lead to invalid results at best, at
> >>>> worst outright failure (hard to say w/o knowing the implementation of
> >>>> HashSet).
> >>>>
> >>>> Camille can you work with Neha to get this fixed? Perhaps in the
> >>>> meantime (if it's going to take a while) you can revert this change,
> >>>> re-open the jira, update the patch, and reapply at some later time?
> >>>>
> >>>> Patrick
> >>>>
> >>>> On Wed, Dec 28, 2011 at 6:55 AM,  <ca...@apache.org> wrote:
> >>>> > Author: camille
> >>>> > Date: Wed Dec 28 14:55:37 2011
> >>>> > New Revision: 1225200
> >>>> >
> >>>> > URL: http://svn.apache.org/viewvc?rev=1225200&view=rev
> >>>> > Log:
> >>>> > ZOOKEEPER-1321: Add number of client connections metric in JMX and
> srvr
> >>>> (Neha Narkhede via camille)
> >>>> >
> >>>> > Modified:
> >>>> >    zookeeper/trunk/CHANGES.txt
> >>>> >
> >>>>
>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java
> >>>> >
> >>>>
>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java
> >>>> >
> >>>>
>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java
> >>>> >
> >>>>
>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java
> >>>> >
> >>>>
>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java
> >>>> >
> >>>>
>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerStats.java
> >>>> >
> >>>>
>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java
> >>>> >
> >>>>
>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java
> >>>> >
> >>>>
>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java
> >>>> >
> >>>>
>  zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/Zab1_0Test.java
> >>>> >
> >>>>
>  zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java
> >>>> >
> >>>> > Modified: zookeeper/trunk/CHANGES.txt
> >>>> > URL:
> >>>>
> http://svn.apache.org/viewvc/zookeeper/trunk/CHANGES.txt?rev=1225200&r1=1225199&r2=1225200&view=diff
> >>>> >
> >>>>
> ==============================================================================
> >>>> > --- zookeeper/trunk/CHANGES.txt (original)
> >>>> > +++ zookeeper/trunk/CHANGES.txt Wed Dec 28 14:55:37 2011
> >>>> > @@ -162,6 +162,8 @@ IMPROVEMENTS:
> >>>> >
> >>>> >   ZOOKEEPER-1342. quorum Listener & LearnerCnxAcceptor are missing
> >>>> >   thread names (Rakesh R via phunt)
> >>>> > +
> >>>> > +  ZOOKEEPER-1321. Add number of client connections metric in JMX
> and
> >>>> srvr (Neha Narkhede via camille)
> >>>> >
> >>>> >  Release 3.4.0 -
> >>>> >
> >>>> >
> >>>> > Modified:
> >>>>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java
> >>>> > URL:
> >>>>
> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java?rev=1225200&r1=1225199&r2=1225200&view=diff
> >>>> >
> >>>>
> ==============================================================================
> >>>> > ---
> >>>>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java
> >>>> (original)
> >>>> > +++
> >>>>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java
> >>>> Wed Dec 28 14:55:37 2011
> >>>> > @@ -749,7 +749,8 @@ public class NIOServerCnxn extends Serve
> >>>> >
> >>>> >             print("packets_received", stats.getPacketsReceived());
> >>>> >             print("packets_sent", stats.getPacketsSent());
> >>>> > -
> >>>> > +            print("num_alive_connections",
> >>>> stats.getNumAliveClientConnections());
> >>>> > +
> >>>> >             print("outstanding_requests",
> >>>> stats.getOutstandingRequests());
> >>>> >
> >>>> >             print("server_state", stats.getServerState());
> >>>> >
> >>>> > Modified:
> >>>>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java
> >>>> > URL:
> >>>>
> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java?rev=1225200&r1=1225199&r2=1225200&view=diff
> >>>> >
> >>>>
> ==============================================================================
> >>>> > ---
> >>>>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java
> >>>> (original)
> >>>> > +++
> >>>>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java
> >>>> Wed Dec 28 14:55:37 2011
> >>>> > @@ -32,14 +32,14 @@ import java.util.HashMap;
> >>>> >  import java.util.HashSet;
> >>>> >  import java.util.Set;
> >>>> >
> >>>> > +import javax.security.auth.login.Configuration;
> >>>> > +import javax.security.auth.login.LoginException;
> >>>> > +
> >>>> >  import org.apache.zookeeper.Login;
> >>>> >  import org.apache.zookeeper.server.auth.SaslServerCallbackHandler;
> >>>> >  import org.slf4j.Logger;
> >>>> >  import org.slf4j.LoggerFactory;
> >>>> >
> >>>> > -import javax.security.auth.login.Configuration;
> >>>> > -import javax.security.auth.login.LoginException;
> >>>> > -
> >>>> >  public class NIOServerCnxnFactory extends ServerCnxnFactory
> implements
> >>>> Runnable {
> >>>> >     private static final Logger LOG =
> >>>> LoggerFactory.getLogger(NIOServerCnxnFactory.class);
> >>>> >
> >>>> > @@ -78,7 +78,6 @@ public class NIOServerCnxnFactory extend
> >>>> >
> >>>> >     int maxClientCnxns = 60;
> >>>> >
> >>>> > -
> >>>> >     /**
> >>>> >      * Construct a new server connection factory which will accept
> an
> >>>> unlimited number
> >>>> >      * of concurrent connections from each client (up to the file
> >>>> descriptor
> >>>> > @@ -122,7 +121,7 @@ public class NIOServerCnxnFactory extend
> >>>> >     public void setMaxClientCnxnsPerHost(int max) {
> >>>> >         maxClientCnxns = max;
> >>>> >     }
> >>>> > -
> >>>> > +
> >>>> >     @Override
> >>>> >     public void start() {
> >>>> >         // ensure thread is started once and only once
> >>>> > @@ -187,7 +186,7 @@ public class NIOServerCnxnFactory extend
> >>>> >             return s.size();
> >>>> >         }
> >>>> >     }
> >>>> > -
> >>>> > +
> >>>> >     public void run() {
> >>>> >         while (!ss.socket().isClosed()) {
> >>>> >             try {
> >>>> > @@ -323,4 +322,8 @@ public class NIOServerCnxnFactory extend
> >>>> >         return cnxns;
> >>>> >     }
> >>>> >
> >>>> > +    @Override
> >>>> > +    public int getNumAliveConnections() {
> >>>> > +       return cnxns.size();
> >>>> > +    }
> >>>> >  }
> >>>> >
> >>>> > Modified:
> >>>>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java
> >>>> > URL:
> >>>>
> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java?rev=1225200&r1=1225199&r2=1225200&view=diff
> >>>> >
> >>>>
> ==============================================================================
> >>>> > ---
> >>>>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java
> >>>> (original)
> >>>> > +++
> >>>>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java
> >>>> Wed Dec 28 14:55:37 2011
> >>>> > @@ -560,7 +560,8 @@ public class NettyServerCnxn extends Ser
> >>>> >
> >>>> >             print("packets_received", stats.getPacketsReceived());
> >>>> >             print("packets_sent", stats.getPacketsSent());
> >>>> > -
> >>>> > +            print("num_alive_connections",
> >>>> stats.getNumAliveClientConnections());
> >>>> > +
> >>>> >             print("outstanding_requests",
> >>>> stats.getOutstandingRequests());
> >>>> >
> >>>> >             print("server_state", stats.getServerState());
> >>>> >
> >>>> > Modified:
> >>>>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java
> >>>> > URL:
> >>>>
> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java?rev=1225200&r1=1225199&r2=1225200&view=diff
> >>>> >
> >>>>
> ==============================================================================
> >>>> > ---
> >>>>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java
> >>>> (original)
> >>>> > +++
> >>>>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java
> >>>> Wed Dec 28 14:55:37 2011
> >>>> > @@ -411,5 +411,10 @@ public class NettyServerCnxnFactory exte
> >>>> >             }
> >>>> >         }
> >>>> >     }
> >>>> > +
> >>>> > +    @Override
> >>>> > +    public int getNumAliveConnections() {
> >>>> > +       return cnxns.size();
> >>>> > +    }
> >>>> >
> >>>> >  }
> >>>> >
> >>>> > Modified:
> >>>>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java
> >>>> > URL:
> >>>>
> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java?rev=1225200&r1=1225199&r2=1225200&view=diff
> >>>> >
> >>>>
> ==============================================================================
> >>>> > ---
> >>>>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java
> >>>> (original)
> >>>> > +++
> >>>>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java
> >>>> Wed Dec 28 14:55:37 2011
> >>>> > @@ -24,15 +24,16 @@ import java.nio.ByteBuffer;
> >>>> >  import java.util.HashMap;
> >>>> >
> >>>> >  import javax.management.JMException;
> >>>> > -import org.slf4j.Logger;
> >>>> > -import org.slf4j.LoggerFactory;
> >>>> > -import org.apache.zookeeper.jmx.MBeanRegistry;
> >>>> > +
> >>>> >  import org.apache.zookeeper.Login;
> >>>> > +import org.apache.zookeeper.jmx.MBeanRegistry;
> >>>> >  import org.apache.zookeeper.server.auth.SaslServerCallbackHandler;
> >>>> > +import org.slf4j.Logger;
> >>>> > +import org.slf4j.LoggerFactory;
> >>>> >
> >>>> >  public abstract class ServerCnxnFactory {
> >>>> >
> >>>> > -    public static final String ZOOKEEPER_SERVER_CNXN_FACTORY =
> >>>> "zookeeper.serverCnxnFactory";
> >>>> > +    public static final String ZOOKEEPER_SERVER_CNXN_FACTORY =
> >>>> "zookeeper.serverCnxnFactory";
> >>>> >
> >>>> >     public interface PacketProcessor {
> >>>> >         public void processPacket(ByteBuffer packet, ServerCnxn
> src);
> >>>> > @@ -49,6 +50,8 @@ public abstract class ServerCnxnFactory
> >>>> >
> >>>> >     public abstract Iterable<ServerCnxn> getConnections();
> >>>> >
> >>>> > +    public abstract int getNumAliveConnections();
> >>>> > +
> >>>> >     public abstract void closeSession(long sessionId);
> >>>> >
> >>>> >     public abstract void configure(InetSocketAddress addr,
> >>>> >
> >>>> > Modified:
> >>>>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerStats.java
> >>>> > URL:
> >>>>
> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerStats.java?rev=1225200&r1=1225199&r2=1225200&view=diff
> >>>> >
> >>>>
> ==============================================================================
> >>>> > ---
> >>>>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerStats.java
> >>>> (original)
> >>>> > +++
> >>>>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerStats.java
> >>>> Wed Dec 28 14:55:37 2011
> >>>> > @@ -19,6 +19,7 @@
> >>>> >  package org.apache.zookeeper.server;
> >>>> >
> >>>> >
> >>>> > +
> >>>> >  /**
> >>>> >  * Basic Server Statistics
> >>>> >  */
> >>>> > @@ -29,13 +30,14 @@ public class ServerStats {
> >>>> >     private long minLatency = Long.MAX_VALUE;
> >>>> >     private long totalLatency = 0;
> >>>> >     private long count = 0;
> >>>> > -
> >>>> > +
> >>>> >     private final Provider provider;
> >>>> >
> >>>> >     public interface Provider {
> >>>> >         public long getOutstandingRequests();
> >>>> >         public long getLastProcessedZxid();
> >>>> >         public String getState();
> >>>> > +        public int getNumAliveConnections();
> >>>> >     }
> >>>> >
> >>>> >     public ServerStats(Provider provider) {
> >>>> > @@ -75,9 +77,14 @@ public class ServerStats {
> >>>> >     }
> >>>> >
> >>>> >     public String getServerState() {
> >>>> > -        return provider.getState();
> >>>> > +       return provider.getState();
> >>>> >     }
> >>>> > -
> >>>> > +
> >>>> > +    /** The number of client connections alive to this server */
> >>>> > +    public int getNumAliveClientConnections() {
> >>>> > +       return provider.getNumAliveConnections();
> >>>> > +    }
> >>>> > +
> >>>> >     @Override
> >>>> >     public String toString(){
> >>>> >         StringBuilder sb = new StringBuilder();
> >>>> > @@ -85,6 +92,8 @@ public class ServerStats {
> >>>> >                 + getAvgLatency() + "/" + getMaxLatency() + "\n");
> >>>> >         sb.append("Received: " + getPacketsReceived() + "\n");
> >>>> >         sb.append("Sent: " + getPacketsSent() + "\n");
> >>>> > +        sb.append("Connections: " + getNumAliveClientConnections()
> +
> >>>> "\n");
> >>>> > +
> >>>> >         if (provider != null) {
> >>>> >             sb.append("Outstanding: " + getOutstandingRequests() +
> >>>> "\n");
> >>>> >             sb.append("Zxid: 0x"+
> >>>> Long.toHexString(getLastProcessedZxid())+ "\n");
> >>>> > @@ -123,7 +132,6 @@ public class ServerStats {
> >>>> >         packetsReceived = 0;
> >>>> >         packetsSent = 0;
> >>>> >     }
> >>>> > -
> >>>> >     synchronized public void reset() {
> >>>> >         resetLatency();
> >>>> >         resetRequestCounters();
> >>>> >
> >>>> > Modified:
> >>>>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java
> >>>> > URL:
> >>>>
> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java?rev=1225200&r1=1225199&r2=1225200&view=diff
> >>>> >
> >>>>
> ==============================================================================
> >>>> > ---
> >>>>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java
> >>>> (original)
> >>>> > +++
> >>>>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java
> >>>> Wed Dec 28 14:55:37 2011
> >>>> > @@ -109,7 +109,7 @@ public class ZooKeeperServer implements
> >>>> >     private ServerCnxnFactory serverCnxnFactory;
> >>>> >
> >>>> >     private final ServerStats serverStats;
> >>>> > -
> >>>> > +
> >>>> >     void removeCnxn(ServerCnxn cnxn) {
> >>>> >         zkDb.removeCnxn(cnxn);
> >>>> >     }
> >>>> > @@ -254,7 +254,6 @@ public class ZooKeeperServer implements
> >>>> >         }
> >>>> >     }
> >>>> >
> >>>> > -
> >>>> >     /**
> >>>> >      * This should be called from a synchronized block on this!
> >>>> >      */
> >>>> > @@ -678,6 +677,14 @@ public class ZooKeeperServer implements
> >>>> >     }
> >>>> >
> >>>> >     /**
> >>>> > +     * return the total number of client connections that are alive
> >>>> > +     * to this server
> >>>> > +     */
> >>>> > +    public int getNumAliveConnections() {
> >>>> > +       return serverCnxnFactory.getNumAliveConnections();
> >>>> > +    }
> >>>> > +
> >>>> > +    /**
> >>>> >      * trunccate the log to get in sync with others
> >>>> >      * if in a quorum
> >>>> >      * @param zxid the zxid that it needs to get in sync
> >>>> >
> >>>> > Modified:
> >>>>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java
> >>>> > URL:
> >>>>
> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java?rev=1225200&r1=1225199&r2=1225200&view=diff
> >>>> >
> >>>>
> ==============================================================================
> >>>> > ---
> >>>>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java
> >>>> (original)
> >>>> > +++
> >>>>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java
> >>>> Wed Dec 28 14:55:37 2011
> >>>> > @@ -140,4 +140,8 @@ public class ZooKeeperServerBean impleme
> >>>> >         serverStats.resetRequestCounters();
> >>>> >         serverStats.resetLatency();
> >>>> >     }
> >>>> > +
> >>>> > +       public long getNumAliveConnections() {
> >>>> > +               return zks.getNumAliveConnections();
> >>>> > +       }
> >>>> >  }
> >>>> >
> >>>> > Modified:
> >>>>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java
> >>>> > URL:
> >>>>
> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java?rev=1225200&r1=1225199&r2=1225200&view=diff
> >>>> >
> >>>>
> ==============================================================================
> >>>> > ---
> >>>>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java
> >>>> (original)
> >>>> > +++
> >>>>
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java
> >>>> Wed Dec 28 14:55:37 2011
> >>>> > @@ -103,4 +103,8 @@ public interface ZooKeeperServerMXBean {
> >>>> >      * Reset max latency statistics only.
> >>>> >      */
> >>>> >     public void resetMaxLatency();
> >>>> > +    /**
> >>>> > +     * @return number of alive client connections
> >>>> > +     */
> >>>> > +    public long getNumAliveConnections();
> >>>> >  }
> >>>> >
> >>>> > Modified:
> >>>>
> zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/Zab1_0Test.java
> >>>> > URL:
> >>>>
> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/Zab1_0Test.java?rev=1225200&r1=1225199&r2=1225200&view=diff
> >>>> >
> >>>>
> ==============================================================================
> >>>> > ---
> >>>>
> zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/Zab1_0Test.java
> >>>> (original)
> >>>> > +++
> >>>>
> zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/Zab1_0Test.java
> >>>> Wed Dec 28 14:55:37 2011
> >>>> > @@ -212,6 +212,10 @@ public class Zab1_0Test {
> >>>> >         }
> >>>> >         public void closeAll() {
> >>>> >         }
> >>>> > +               @Override
> >>>> > +               public int getNumAliveConnections() {
> >>>> > +                       return 0;
> >>>> > +               }
> >>>> >     }
> >>>> >     static Socket[] getSocketPair() throws IOException {
> >>>> >         ServerSocket ss = new ServerSocket();
> >>>> >
> >>>> > Modified:
> >>>>
> zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java
> >>>> > URL:
> >>>>
> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java?rev=1225200&r1=1225199&r2=1225200&view=diff
> >>>> >
> >>>>
> ==============================================================================
> >>>> > ---
> >>>>
> zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java
> >>>> (original)
> >>>> > +++
> >>>>
> zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java
> >>>> Wed Dec 28 14:55:37 2011
> >>>> > @@ -94,6 +94,9 @@ public class FourLetterWordsTest extends
> >>>> >         verify("srvr", "Outstanding");
> >>>> >         verify("cons", "queued");
> >>>> >         verify("mntr", "zk_server_state\tstandalone");
> >>>> > +        verify("mntr", "num_alive_connections");
> >>>> > +        verify("stat", "Connections");
> >>>> > +        verify("srvr", "Connections");
> >>>> >     }
> >>>> >
> >>>> >     private String sendRequest(String cmd) throws IOException {
> >>>> > @@ -136,6 +139,8 @@ public class FourLetterWordsTest extends
> >>>> >         line = in.readLine();
> >>>> >         Assert.assertTrue(Pattern.matches("^Sent: \\d+$", line));
> >>>> >         line = in.readLine();
> >>>> > +        Assert.assertTrue(Pattern.matches("^Connections: \\d+$",
> >>>> line));
> >>>> > +        line = in.readLine();
> >>>> >         Assert.assertTrue(Pattern.matches("^Outstanding: \\d+$",
> line));
> >>>> >         line = in.readLine();
> >>>> >         Assert.assertTrue(Pattern.matches("^Zxid: 0x[\\da-fA-F]+$",
> >>>> line));
> >>>> >
> >>>> >
> >>>>
> >>>
>

Re: svn commit: r1225200 - in /zookeeper/trunk: ./ src/java/main/org/apache/zookeeper/server/ src/java/test/org/apache/zookeeper/server/quorum/ src/java/test/org/apache/zookeeper/test/

Posted by Patrick Hunt <ph...@apache.org>.
I think it needs to be fixed. It's obviously incorrect. Also if
someone changes the underlying implementation at some point it might
bite them.

Given it wasn't applied to 3.4 branch yet I'd suggest revert, fix the
patch, then reapply to both branches. (that's easiest/bulletproof imo)

I'd recommend a new ticket to fix the issues you identified (refactor,
etc...) Neha was looking for further items to work on, this would be a
good one.

Patrick

On Wed, Dec 28, 2011 at 11:18 AM, Camille Fournier <ca...@apache.org> wrote:
> Also, Pat, the JIRA is still open. I will look to revert in a minute
> although I think the sync changes may necessitate a new JIRA entirely.
>
> On Wed, Dec 28, 2011 at 1:31 PM, Camille Fournier <ca...@apache.org> wrote:
>> After looking for a few mins, here are my observations:
>>
>> The implementation of HashSet in jdk 1.6 uses an underlying HashMap, which
>> uses a bog-standard int for the size. So, I completely agree that we can
>> get invalid results for a point in time. But does anyone really care about
>> the *exact* moment-in-time number of cnxns in the system, in a system where
>> cnxns are coming and going? At best you'll see a value that will likely be
>> out of date the moment you read it.
>>
>> But, if we're going to do this, I do think there may be a case for
>> refactoring to a concurrent data structure given that we are randomly
>> syncing on the cnxns set in a way that makes adding additional interactions
>> with it error prone in this way. And we should definitely remove that
>> getConnections method, if anyone ever iterated over that set they would be
>> in a sad concurrency situation.
>> Seems possibly worth a whole new ticket to do this. What do you think?
>>
>> Thanks,
>> C
>>
>> On Wed, Dec 28, 2011 at 1:12 PM, Camille Fournier <ca...@apache.org>wrote:
>>
>>> I'm not sure it's meaningful enough to be worth the sync overhead. We
>>> should look into that. The alternative if we must is using a proper
>>> concurrent collection. Neha, any thoughts?
>>>
>>> C
>>> On Dec 28, 2011 12:45 PM, "Patrick Hunt" <ph...@apache.org> wrote:
>>>
>>>> I believe there is a bug in this commit. The "cnxns" size() call is
>>>> not being synchronized. This will lead to invalid results at best, at
>>>> worst outright failure (hard to say w/o knowing the implementation of
>>>> HashSet).
>>>>
>>>> Camille can you work with Neha to get this fixed? Perhaps in the
>>>> meantime (if it's going to take a while) you can revert this change,
>>>> re-open the jira, update the patch, and reapply at some later time?
>>>>
>>>> Patrick
>>>>
>>>> On Wed, Dec 28, 2011 at 6:55 AM,  <ca...@apache.org> wrote:
>>>> > Author: camille
>>>> > Date: Wed Dec 28 14:55:37 2011
>>>> > New Revision: 1225200
>>>> >
>>>> > URL: http://svn.apache.org/viewvc?rev=1225200&view=rev
>>>> > Log:
>>>> > ZOOKEEPER-1321: Add number of client connections metric in JMX and srvr
>>>> (Neha Narkhede via camille)
>>>> >
>>>> > Modified:
>>>> >    zookeeper/trunk/CHANGES.txt
>>>> >
>>>>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java
>>>> >
>>>>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java
>>>> >
>>>>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java
>>>> >
>>>>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java
>>>> >
>>>>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java
>>>> >
>>>>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerStats.java
>>>> >
>>>>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java
>>>> >
>>>>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java
>>>> >
>>>>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java
>>>> >
>>>>  zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/Zab1_0Test.java
>>>> >
>>>>  zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java
>>>> >
>>>> > Modified: zookeeper/trunk/CHANGES.txt
>>>> > URL:
>>>> http://svn.apache.org/viewvc/zookeeper/trunk/CHANGES.txt?rev=1225200&r1=1225199&r2=1225200&view=diff
>>>> >
>>>> ==============================================================================
>>>> > --- zookeeper/trunk/CHANGES.txt (original)
>>>> > +++ zookeeper/trunk/CHANGES.txt Wed Dec 28 14:55:37 2011
>>>> > @@ -162,6 +162,8 @@ IMPROVEMENTS:
>>>> >
>>>> >   ZOOKEEPER-1342. quorum Listener & LearnerCnxAcceptor are missing
>>>> >   thread names (Rakesh R via phunt)
>>>> > +
>>>> > +  ZOOKEEPER-1321. Add number of client connections metric in JMX and
>>>> srvr (Neha Narkhede via camille)
>>>> >
>>>> >  Release 3.4.0 -
>>>> >
>>>> >
>>>> > Modified:
>>>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java
>>>> > URL:
>>>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>>>> >
>>>> ==============================================================================
>>>> > ---
>>>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java
>>>> (original)
>>>> > +++
>>>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java
>>>> Wed Dec 28 14:55:37 2011
>>>> > @@ -749,7 +749,8 @@ public class NIOServerCnxn extends Serve
>>>> >
>>>> >             print("packets_received", stats.getPacketsReceived());
>>>> >             print("packets_sent", stats.getPacketsSent());
>>>> > -
>>>> > +            print("num_alive_connections",
>>>> stats.getNumAliveClientConnections());
>>>> > +
>>>> >             print("outstanding_requests",
>>>> stats.getOutstandingRequests());
>>>> >
>>>> >             print("server_state", stats.getServerState());
>>>> >
>>>> > Modified:
>>>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java
>>>> > URL:
>>>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>>>> >
>>>> ==============================================================================
>>>> > ---
>>>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java
>>>> (original)
>>>> > +++
>>>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java
>>>> Wed Dec 28 14:55:37 2011
>>>> > @@ -32,14 +32,14 @@ import java.util.HashMap;
>>>> >  import java.util.HashSet;
>>>> >  import java.util.Set;
>>>> >
>>>> > +import javax.security.auth.login.Configuration;
>>>> > +import javax.security.auth.login.LoginException;
>>>> > +
>>>> >  import org.apache.zookeeper.Login;
>>>> >  import org.apache.zookeeper.server.auth.SaslServerCallbackHandler;
>>>> >  import org.slf4j.Logger;
>>>> >  import org.slf4j.LoggerFactory;
>>>> >
>>>> > -import javax.security.auth.login.Configuration;
>>>> > -import javax.security.auth.login.LoginException;
>>>> > -
>>>> >  public class NIOServerCnxnFactory extends ServerCnxnFactory implements
>>>> Runnable {
>>>> >     private static final Logger LOG =
>>>> LoggerFactory.getLogger(NIOServerCnxnFactory.class);
>>>> >
>>>> > @@ -78,7 +78,6 @@ public class NIOServerCnxnFactory extend
>>>> >
>>>> >     int maxClientCnxns = 60;
>>>> >
>>>> > -
>>>> >     /**
>>>> >      * Construct a new server connection factory which will accept an
>>>> unlimited number
>>>> >      * of concurrent connections from each client (up to the file
>>>> descriptor
>>>> > @@ -122,7 +121,7 @@ public class NIOServerCnxnFactory extend
>>>> >     public void setMaxClientCnxnsPerHost(int max) {
>>>> >         maxClientCnxns = max;
>>>> >     }
>>>> > -
>>>> > +
>>>> >     @Override
>>>> >     public void start() {
>>>> >         // ensure thread is started once and only once
>>>> > @@ -187,7 +186,7 @@ public class NIOServerCnxnFactory extend
>>>> >             return s.size();
>>>> >         }
>>>> >     }
>>>> > -
>>>> > +
>>>> >     public void run() {
>>>> >         while (!ss.socket().isClosed()) {
>>>> >             try {
>>>> > @@ -323,4 +322,8 @@ public class NIOServerCnxnFactory extend
>>>> >         return cnxns;
>>>> >     }
>>>> >
>>>> > +    @Override
>>>> > +    public int getNumAliveConnections() {
>>>> > +       return cnxns.size();
>>>> > +    }
>>>> >  }
>>>> >
>>>> > Modified:
>>>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java
>>>> > URL:
>>>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>>>> >
>>>> ==============================================================================
>>>> > ---
>>>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java
>>>> (original)
>>>> > +++
>>>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java
>>>> Wed Dec 28 14:55:37 2011
>>>> > @@ -560,7 +560,8 @@ public class NettyServerCnxn extends Ser
>>>> >
>>>> >             print("packets_received", stats.getPacketsReceived());
>>>> >             print("packets_sent", stats.getPacketsSent());
>>>> > -
>>>> > +            print("num_alive_connections",
>>>> stats.getNumAliveClientConnections());
>>>> > +
>>>> >             print("outstanding_requests",
>>>> stats.getOutstandingRequests());
>>>> >
>>>> >             print("server_state", stats.getServerState());
>>>> >
>>>> > Modified:
>>>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java
>>>> > URL:
>>>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>>>> >
>>>> ==============================================================================
>>>> > ---
>>>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java
>>>> (original)
>>>> > +++
>>>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java
>>>> Wed Dec 28 14:55:37 2011
>>>> > @@ -411,5 +411,10 @@ public class NettyServerCnxnFactory exte
>>>> >             }
>>>> >         }
>>>> >     }
>>>> > +
>>>> > +    @Override
>>>> > +    public int getNumAliveConnections() {
>>>> > +       return cnxns.size();
>>>> > +    }
>>>> >
>>>> >  }
>>>> >
>>>> > Modified:
>>>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java
>>>> > URL:
>>>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>>>> >
>>>> ==============================================================================
>>>> > ---
>>>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java
>>>> (original)
>>>> > +++
>>>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java
>>>> Wed Dec 28 14:55:37 2011
>>>> > @@ -24,15 +24,16 @@ import java.nio.ByteBuffer;
>>>> >  import java.util.HashMap;
>>>> >
>>>> >  import javax.management.JMException;
>>>> > -import org.slf4j.Logger;
>>>> > -import org.slf4j.LoggerFactory;
>>>> > -import org.apache.zookeeper.jmx.MBeanRegistry;
>>>> > +
>>>> >  import org.apache.zookeeper.Login;
>>>> > +import org.apache.zookeeper.jmx.MBeanRegistry;
>>>> >  import org.apache.zookeeper.server.auth.SaslServerCallbackHandler;
>>>> > +import org.slf4j.Logger;
>>>> > +import org.slf4j.LoggerFactory;
>>>> >
>>>> >  public abstract class ServerCnxnFactory {
>>>> >
>>>> > -    public static final String ZOOKEEPER_SERVER_CNXN_FACTORY =
>>>> "zookeeper.serverCnxnFactory";
>>>> > +    public static final String ZOOKEEPER_SERVER_CNXN_FACTORY =
>>>> "zookeeper.serverCnxnFactory";
>>>> >
>>>> >     public interface PacketProcessor {
>>>> >         public void processPacket(ByteBuffer packet, ServerCnxn src);
>>>> > @@ -49,6 +50,8 @@ public abstract class ServerCnxnFactory
>>>> >
>>>> >     public abstract Iterable<ServerCnxn> getConnections();
>>>> >
>>>> > +    public abstract int getNumAliveConnections();
>>>> > +
>>>> >     public abstract void closeSession(long sessionId);
>>>> >
>>>> >     public abstract void configure(InetSocketAddress addr,
>>>> >
>>>> > Modified:
>>>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerStats.java
>>>> > URL:
>>>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerStats.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>>>> >
>>>> ==============================================================================
>>>> > ---
>>>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerStats.java
>>>> (original)
>>>> > +++
>>>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerStats.java
>>>> Wed Dec 28 14:55:37 2011
>>>> > @@ -19,6 +19,7 @@
>>>> >  package org.apache.zookeeper.server;
>>>> >
>>>> >
>>>> > +
>>>> >  /**
>>>> >  * Basic Server Statistics
>>>> >  */
>>>> > @@ -29,13 +30,14 @@ public class ServerStats {
>>>> >     private long minLatency = Long.MAX_VALUE;
>>>> >     private long totalLatency = 0;
>>>> >     private long count = 0;
>>>> > -
>>>> > +
>>>> >     private final Provider provider;
>>>> >
>>>> >     public interface Provider {
>>>> >         public long getOutstandingRequests();
>>>> >         public long getLastProcessedZxid();
>>>> >         public String getState();
>>>> > +        public int getNumAliveConnections();
>>>> >     }
>>>> >
>>>> >     public ServerStats(Provider provider) {
>>>> > @@ -75,9 +77,14 @@ public class ServerStats {
>>>> >     }
>>>> >
>>>> >     public String getServerState() {
>>>> > -        return provider.getState();
>>>> > +       return provider.getState();
>>>> >     }
>>>> > -
>>>> > +
>>>> > +    /** The number of client connections alive to this server */
>>>> > +    public int getNumAliveClientConnections() {
>>>> > +       return provider.getNumAliveConnections();
>>>> > +    }
>>>> > +
>>>> >     @Override
>>>> >     public String toString(){
>>>> >         StringBuilder sb = new StringBuilder();
>>>> > @@ -85,6 +92,8 @@ public class ServerStats {
>>>> >                 + getAvgLatency() + "/" + getMaxLatency() + "\n");
>>>> >         sb.append("Received: " + getPacketsReceived() + "\n");
>>>> >         sb.append("Sent: " + getPacketsSent() + "\n");
>>>> > +        sb.append("Connections: " + getNumAliveClientConnections() +
>>>> "\n");
>>>> > +
>>>> >         if (provider != null) {
>>>> >             sb.append("Outstanding: " + getOutstandingRequests() +
>>>> "\n");
>>>> >             sb.append("Zxid: 0x"+
>>>> Long.toHexString(getLastProcessedZxid())+ "\n");
>>>> > @@ -123,7 +132,6 @@ public class ServerStats {
>>>> >         packetsReceived = 0;
>>>> >         packetsSent = 0;
>>>> >     }
>>>> > -
>>>> >     synchronized public void reset() {
>>>> >         resetLatency();
>>>> >         resetRequestCounters();
>>>> >
>>>> > Modified:
>>>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java
>>>> > URL:
>>>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>>>> >
>>>> ==============================================================================
>>>> > ---
>>>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java
>>>> (original)
>>>> > +++
>>>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java
>>>> Wed Dec 28 14:55:37 2011
>>>> > @@ -109,7 +109,7 @@ public class ZooKeeperServer implements
>>>> >     private ServerCnxnFactory serverCnxnFactory;
>>>> >
>>>> >     private final ServerStats serverStats;
>>>> > -
>>>> > +
>>>> >     void removeCnxn(ServerCnxn cnxn) {
>>>> >         zkDb.removeCnxn(cnxn);
>>>> >     }
>>>> > @@ -254,7 +254,6 @@ public class ZooKeeperServer implements
>>>> >         }
>>>> >     }
>>>> >
>>>> > -
>>>> >     /**
>>>> >      * This should be called from a synchronized block on this!
>>>> >      */
>>>> > @@ -678,6 +677,14 @@ public class ZooKeeperServer implements
>>>> >     }
>>>> >
>>>> >     /**
>>>> > +     * return the total number of client connections that are alive
>>>> > +     * to this server
>>>> > +     */
>>>> > +    public int getNumAliveConnections() {
>>>> > +       return serverCnxnFactory.getNumAliveConnections();
>>>> > +    }
>>>> > +
>>>> > +    /**
>>>> >      * trunccate the log to get in sync with others
>>>> >      * if in a quorum
>>>> >      * @param zxid the zxid that it needs to get in sync
>>>> >
>>>> > Modified:
>>>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java
>>>> > URL:
>>>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>>>> >
>>>> ==============================================================================
>>>> > ---
>>>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java
>>>> (original)
>>>> > +++
>>>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java
>>>> Wed Dec 28 14:55:37 2011
>>>> > @@ -140,4 +140,8 @@ public class ZooKeeperServerBean impleme
>>>> >         serverStats.resetRequestCounters();
>>>> >         serverStats.resetLatency();
>>>> >     }
>>>> > +
>>>> > +       public long getNumAliveConnections() {
>>>> > +               return zks.getNumAliveConnections();
>>>> > +       }
>>>> >  }
>>>> >
>>>> > Modified:
>>>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java
>>>> > URL:
>>>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>>>> >
>>>> ==============================================================================
>>>> > ---
>>>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java
>>>> (original)
>>>> > +++
>>>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java
>>>> Wed Dec 28 14:55:37 2011
>>>> > @@ -103,4 +103,8 @@ public interface ZooKeeperServerMXBean {
>>>> >      * Reset max latency statistics only.
>>>> >      */
>>>> >     public void resetMaxLatency();
>>>> > +    /**
>>>> > +     * @return number of alive client connections
>>>> > +     */
>>>> > +    public long getNumAliveConnections();
>>>> >  }
>>>> >
>>>> > Modified:
>>>> zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/Zab1_0Test.java
>>>> > URL:
>>>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/Zab1_0Test.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>>>> >
>>>> ==============================================================================
>>>> > ---
>>>> zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/Zab1_0Test.java
>>>> (original)
>>>> > +++
>>>> zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/Zab1_0Test.java
>>>> Wed Dec 28 14:55:37 2011
>>>> > @@ -212,6 +212,10 @@ public class Zab1_0Test {
>>>> >         }
>>>> >         public void closeAll() {
>>>> >         }
>>>> > +               @Override
>>>> > +               public int getNumAliveConnections() {
>>>> > +                       return 0;
>>>> > +               }
>>>> >     }
>>>> >     static Socket[] getSocketPair() throws IOException {
>>>> >         ServerSocket ss = new ServerSocket();
>>>> >
>>>> > Modified:
>>>> zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java
>>>> > URL:
>>>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>>>> >
>>>> ==============================================================================
>>>> > ---
>>>> zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java
>>>> (original)
>>>> > +++
>>>> zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java
>>>> Wed Dec 28 14:55:37 2011
>>>> > @@ -94,6 +94,9 @@ public class FourLetterWordsTest extends
>>>> >         verify("srvr", "Outstanding");
>>>> >         verify("cons", "queued");
>>>> >         verify("mntr", "zk_server_state\tstandalone");
>>>> > +        verify("mntr", "num_alive_connections");
>>>> > +        verify("stat", "Connections");
>>>> > +        verify("srvr", "Connections");
>>>> >     }
>>>> >
>>>> >     private String sendRequest(String cmd) throws IOException {
>>>> > @@ -136,6 +139,8 @@ public class FourLetterWordsTest extends
>>>> >         line = in.readLine();
>>>> >         Assert.assertTrue(Pattern.matches("^Sent: \\d+$", line));
>>>> >         line = in.readLine();
>>>> > +        Assert.assertTrue(Pattern.matches("^Connections: \\d+$",
>>>> line));
>>>> > +        line = in.readLine();
>>>> >         Assert.assertTrue(Pattern.matches("^Outstanding: \\d+$", line));
>>>> >         line = in.readLine();
>>>> >         Assert.assertTrue(Pattern.matches("^Zxid: 0x[\\da-fA-F]+$",
>>>> line));
>>>> >
>>>> >
>>>>
>>>

Re: svn commit: r1225200 - in /zookeeper/trunk: ./ src/java/main/org/apache/zookeeper/server/ src/java/test/org/apache/zookeeper/server/quorum/ src/java/test/org/apache/zookeeper/test/

Posted by Camille Fournier <ca...@apache.org>.
Also, Pat, the JIRA is still open. I will look to revert in a minute
although I think the sync changes may necessitate a new JIRA entirely.

On Wed, Dec 28, 2011 at 1:31 PM, Camille Fournier <ca...@apache.org> wrote:
> After looking for a few mins, here are my observations:
>
> The implementation of HashSet in jdk 1.6 uses an underlying HashMap, which
> uses a bog-standard int for the size. So, I completely agree that we can
> get invalid results for a point in time. But does anyone really care about
> the *exact* moment-in-time number of cnxns in the system, in a system where
> cnxns are coming and going? At best you'll see a value that will likely be
> out of date the moment you read it.
>
> But, if we're going to do this, I do think there may be a case for
> refactoring to a concurrent data structure given that we are randomly
> syncing on the cnxns set in a way that makes adding additional interactions
> with it error prone in this way. And we should definitely remove that
> getConnections method, if anyone ever iterated over that set they would be
> in a sad concurrency situation.
> Seems possibly worth a whole new ticket to do this. What do you think?
>
> Thanks,
> C
>
> On Wed, Dec 28, 2011 at 1:12 PM, Camille Fournier <ca...@apache.org>wrote:
>
>> I'm not sure it's meaningful enough to be worth the sync overhead. We
>> should look into that. The alternative if we must is using a proper
>> concurrent collection. Neha, any thoughts?
>>
>> C
>> On Dec 28, 2011 12:45 PM, "Patrick Hunt" <ph...@apache.org> wrote:
>>
>>> I believe there is a bug in this commit. The "cnxns" size() call is
>>> not being synchronized. This will lead to invalid results at best, at
>>> worst outright failure (hard to say w/o knowing the implementation of
>>> HashSet).
>>>
>>> Camille can you work with Neha to get this fixed? Perhaps in the
>>> meantime (if it's going to take a while) you can revert this change,
>>> re-open the jira, update the patch, and reapply at some later time?
>>>
>>> Patrick
>>>
>>> On Wed, Dec 28, 2011 at 6:55 AM,  <ca...@apache.org> wrote:
>>> > Author: camille
>>> > Date: Wed Dec 28 14:55:37 2011
>>> > New Revision: 1225200
>>> >
>>> > URL: http://svn.apache.org/viewvc?rev=1225200&view=rev
>>> > Log:
>>> > ZOOKEEPER-1321: Add number of client connections metric in JMX and srvr
>>> (Neha Narkhede via camille)
>>> >
>>> > Modified:
>>> >    zookeeper/trunk/CHANGES.txt
>>> >
>>>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java
>>> >
>>>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java
>>> >
>>>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java
>>> >
>>>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java
>>> >
>>>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java
>>> >
>>>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerStats.java
>>> >
>>>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java
>>> >
>>>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java
>>> >
>>>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java
>>> >
>>>  zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/Zab1_0Test.java
>>> >
>>>  zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java
>>> >
>>> > Modified: zookeeper/trunk/CHANGES.txt
>>> > URL:
>>> http://svn.apache.org/viewvc/zookeeper/trunk/CHANGES.txt?rev=1225200&r1=1225199&r2=1225200&view=diff
>>> >
>>> ==============================================================================
>>> > --- zookeeper/trunk/CHANGES.txt (original)
>>> > +++ zookeeper/trunk/CHANGES.txt Wed Dec 28 14:55:37 2011
>>> > @@ -162,6 +162,8 @@ IMPROVEMENTS:
>>> >
>>> >   ZOOKEEPER-1342. quorum Listener & LearnerCnxAcceptor are missing
>>> >   thread names (Rakesh R via phunt)
>>> > +
>>> > +  ZOOKEEPER-1321. Add number of client connections metric in JMX and
>>> srvr (Neha Narkhede via camille)
>>> >
>>> >  Release 3.4.0 -
>>> >
>>> >
>>> > Modified:
>>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java
>>> > URL:
>>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>>> >
>>> ==============================================================================
>>> > ---
>>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java
>>> (original)
>>> > +++
>>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java
>>> Wed Dec 28 14:55:37 2011
>>> > @@ -749,7 +749,8 @@ public class NIOServerCnxn extends Serve
>>> >
>>> >             print("packets_received", stats.getPacketsReceived());
>>> >             print("packets_sent", stats.getPacketsSent());
>>> > -
>>> > +            print("num_alive_connections",
>>> stats.getNumAliveClientConnections());
>>> > +
>>> >             print("outstanding_requests",
>>> stats.getOutstandingRequests());
>>> >
>>> >             print("server_state", stats.getServerState());
>>> >
>>> > Modified:
>>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java
>>> > URL:
>>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>>> >
>>> ==============================================================================
>>> > ---
>>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java
>>> (original)
>>> > +++
>>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java
>>> Wed Dec 28 14:55:37 2011
>>> > @@ -32,14 +32,14 @@ import java.util.HashMap;
>>> >  import java.util.HashSet;
>>> >  import java.util.Set;
>>> >
>>> > +import javax.security.auth.login.Configuration;
>>> > +import javax.security.auth.login.LoginException;
>>> > +
>>> >  import org.apache.zookeeper.Login;
>>> >  import org.apache.zookeeper.server.auth.SaslServerCallbackHandler;
>>> >  import org.slf4j.Logger;
>>> >  import org.slf4j.LoggerFactory;
>>> >
>>> > -import javax.security.auth.login.Configuration;
>>> > -import javax.security.auth.login.LoginException;
>>> > -
>>> >  public class NIOServerCnxnFactory extends ServerCnxnFactory implements
>>> Runnable {
>>> >     private static final Logger LOG =
>>> LoggerFactory.getLogger(NIOServerCnxnFactory.class);
>>> >
>>> > @@ -78,7 +78,6 @@ public class NIOServerCnxnFactory extend
>>> >
>>> >     int maxClientCnxns = 60;
>>> >
>>> > -
>>> >     /**
>>> >      * Construct a new server connection factory which will accept an
>>> unlimited number
>>> >      * of concurrent connections from each client (up to the file
>>> descriptor
>>> > @@ -122,7 +121,7 @@ public class NIOServerCnxnFactory extend
>>> >     public void setMaxClientCnxnsPerHost(int max) {
>>> >         maxClientCnxns = max;
>>> >     }
>>> > -
>>> > +
>>> >     @Override
>>> >     public void start() {
>>> >         // ensure thread is started once and only once
>>> > @@ -187,7 +186,7 @@ public class NIOServerCnxnFactory extend
>>> >             return s.size();
>>> >         }
>>> >     }
>>> > -
>>> > +
>>> >     public void run() {
>>> >         while (!ss.socket().isClosed()) {
>>> >             try {
>>> > @@ -323,4 +322,8 @@ public class NIOServerCnxnFactory extend
>>> >         return cnxns;
>>> >     }
>>> >
>>> > +    @Override
>>> > +    public int getNumAliveConnections() {
>>> > +       return cnxns.size();
>>> > +    }
>>> >  }
>>> >
>>> > Modified:
>>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java
>>> > URL:
>>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>>> >
>>> ==============================================================================
>>> > ---
>>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java
>>> (original)
>>> > +++
>>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java
>>> Wed Dec 28 14:55:37 2011
>>> > @@ -560,7 +560,8 @@ public class NettyServerCnxn extends Ser
>>> >
>>> >             print("packets_received", stats.getPacketsReceived());
>>> >             print("packets_sent", stats.getPacketsSent());
>>> > -
>>> > +            print("num_alive_connections",
>>> stats.getNumAliveClientConnections());
>>> > +
>>> >             print("outstanding_requests",
>>> stats.getOutstandingRequests());
>>> >
>>> >             print("server_state", stats.getServerState());
>>> >
>>> > Modified:
>>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java
>>> > URL:
>>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>>> >
>>> ==============================================================================
>>> > ---
>>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java
>>> (original)
>>> > +++
>>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java
>>> Wed Dec 28 14:55:37 2011
>>> > @@ -411,5 +411,10 @@ public class NettyServerCnxnFactory exte
>>> >             }
>>> >         }
>>> >     }
>>> > +
>>> > +    @Override
>>> > +    public int getNumAliveConnections() {
>>> > +       return cnxns.size();
>>> > +    }
>>> >
>>> >  }
>>> >
>>> > Modified:
>>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java
>>> > URL:
>>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>>> >
>>> ==============================================================================
>>> > ---
>>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java
>>> (original)
>>> > +++
>>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java
>>> Wed Dec 28 14:55:37 2011
>>> > @@ -24,15 +24,16 @@ import java.nio.ByteBuffer;
>>> >  import java.util.HashMap;
>>> >
>>> >  import javax.management.JMException;
>>> > -import org.slf4j.Logger;
>>> > -import org.slf4j.LoggerFactory;
>>> > -import org.apache.zookeeper.jmx.MBeanRegistry;
>>> > +
>>> >  import org.apache.zookeeper.Login;
>>> > +import org.apache.zookeeper.jmx.MBeanRegistry;
>>> >  import org.apache.zookeeper.server.auth.SaslServerCallbackHandler;
>>> > +import org.slf4j.Logger;
>>> > +import org.slf4j.LoggerFactory;
>>> >
>>> >  public abstract class ServerCnxnFactory {
>>> >
>>> > -    public static final String ZOOKEEPER_SERVER_CNXN_FACTORY =
>>> "zookeeper.serverCnxnFactory";
>>> > +    public static final String ZOOKEEPER_SERVER_CNXN_FACTORY =
>>> "zookeeper.serverCnxnFactory";
>>> >
>>> >     public interface PacketProcessor {
>>> >         public void processPacket(ByteBuffer packet, ServerCnxn src);
>>> > @@ -49,6 +50,8 @@ public abstract class ServerCnxnFactory
>>> >
>>> >     public abstract Iterable<ServerCnxn> getConnections();
>>> >
>>> > +    public abstract int getNumAliveConnections();
>>> > +
>>> >     public abstract void closeSession(long sessionId);
>>> >
>>> >     public abstract void configure(InetSocketAddress addr,
>>> >
>>> > Modified:
>>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerStats.java
>>> > URL:
>>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerStats.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>>> >
>>> ==============================================================================
>>> > ---
>>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerStats.java
>>> (original)
>>> > +++
>>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerStats.java
>>> Wed Dec 28 14:55:37 2011
>>> > @@ -19,6 +19,7 @@
>>> >  package org.apache.zookeeper.server;
>>> >
>>> >
>>> > +
>>> >  /**
>>> >  * Basic Server Statistics
>>> >  */
>>> > @@ -29,13 +30,14 @@ public class ServerStats {
>>> >     private long minLatency = Long.MAX_VALUE;
>>> >     private long totalLatency = 0;
>>> >     private long count = 0;
>>> > -
>>> > +
>>> >     private final Provider provider;
>>> >
>>> >     public interface Provider {
>>> >         public long getOutstandingRequests();
>>> >         public long getLastProcessedZxid();
>>> >         public String getState();
>>> > +        public int getNumAliveConnections();
>>> >     }
>>> >
>>> >     public ServerStats(Provider provider) {
>>> > @@ -75,9 +77,14 @@ public class ServerStats {
>>> >     }
>>> >
>>> >     public String getServerState() {
>>> > -        return provider.getState();
>>> > +       return provider.getState();
>>> >     }
>>> > -
>>> > +
>>> > +    /** The number of client connections alive to this server */
>>> > +    public int getNumAliveClientConnections() {
>>> > +       return provider.getNumAliveConnections();
>>> > +    }
>>> > +
>>> >     @Override
>>> >     public String toString(){
>>> >         StringBuilder sb = new StringBuilder();
>>> > @@ -85,6 +92,8 @@ public class ServerStats {
>>> >                 + getAvgLatency() + "/" + getMaxLatency() + "\n");
>>> >         sb.append("Received: " + getPacketsReceived() + "\n");
>>> >         sb.append("Sent: " + getPacketsSent() + "\n");
>>> > +        sb.append("Connections: " + getNumAliveClientConnections() +
>>> "\n");
>>> > +
>>> >         if (provider != null) {
>>> >             sb.append("Outstanding: " + getOutstandingRequests() +
>>> "\n");
>>> >             sb.append("Zxid: 0x"+
>>> Long.toHexString(getLastProcessedZxid())+ "\n");
>>> > @@ -123,7 +132,6 @@ public class ServerStats {
>>> >         packetsReceived = 0;
>>> >         packetsSent = 0;
>>> >     }
>>> > -
>>> >     synchronized public void reset() {
>>> >         resetLatency();
>>> >         resetRequestCounters();
>>> >
>>> > Modified:
>>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java
>>> > URL:
>>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>>> >
>>> ==============================================================================
>>> > ---
>>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java
>>> (original)
>>> > +++
>>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java
>>> Wed Dec 28 14:55:37 2011
>>> > @@ -109,7 +109,7 @@ public class ZooKeeperServer implements
>>> >     private ServerCnxnFactory serverCnxnFactory;
>>> >
>>> >     private final ServerStats serverStats;
>>> > -
>>> > +
>>> >     void removeCnxn(ServerCnxn cnxn) {
>>> >         zkDb.removeCnxn(cnxn);
>>> >     }
>>> > @@ -254,7 +254,6 @@ public class ZooKeeperServer implements
>>> >         }
>>> >     }
>>> >
>>> > -
>>> >     /**
>>> >      * This should be called from a synchronized block on this!
>>> >      */
>>> > @@ -678,6 +677,14 @@ public class ZooKeeperServer implements
>>> >     }
>>> >
>>> >     /**
>>> > +     * return the total number of client connections that are alive
>>> > +     * to this server
>>> > +     */
>>> > +    public int getNumAliveConnections() {
>>> > +       return serverCnxnFactory.getNumAliveConnections();
>>> > +    }
>>> > +
>>> > +    /**
>>> >      * trunccate the log to get in sync with others
>>> >      * if in a quorum
>>> >      * @param zxid the zxid that it needs to get in sync
>>> >
>>> > Modified:
>>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java
>>> > URL:
>>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>>> >
>>> ==============================================================================
>>> > ---
>>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java
>>> (original)
>>> > +++
>>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java
>>> Wed Dec 28 14:55:37 2011
>>> > @@ -140,4 +140,8 @@ public class ZooKeeperServerBean impleme
>>> >         serverStats.resetRequestCounters();
>>> >         serverStats.resetLatency();
>>> >     }
>>> > +
>>> > +       public long getNumAliveConnections() {
>>> > +               return zks.getNumAliveConnections();
>>> > +       }
>>> >  }
>>> >
>>> > Modified:
>>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java
>>> > URL:
>>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>>> >
>>> ==============================================================================
>>> > ---
>>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java
>>> (original)
>>> > +++
>>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java
>>> Wed Dec 28 14:55:37 2011
>>> > @@ -103,4 +103,8 @@ public interface ZooKeeperServerMXBean {
>>> >      * Reset max latency statistics only.
>>> >      */
>>> >     public void resetMaxLatency();
>>> > +    /**
>>> > +     * @return number of alive client connections
>>> > +     */
>>> > +    public long getNumAliveConnections();
>>> >  }
>>> >
>>> > Modified:
>>> zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/Zab1_0Test.java
>>> > URL:
>>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/Zab1_0Test.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>>> >
>>> ==============================================================================
>>> > ---
>>> zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/Zab1_0Test.java
>>> (original)
>>> > +++
>>> zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/Zab1_0Test.java
>>> Wed Dec 28 14:55:37 2011
>>> > @@ -212,6 +212,10 @@ public class Zab1_0Test {
>>> >         }
>>> >         public void closeAll() {
>>> >         }
>>> > +               @Override
>>> > +               public int getNumAliveConnections() {
>>> > +                       return 0;
>>> > +               }
>>> >     }
>>> >     static Socket[] getSocketPair() throws IOException {
>>> >         ServerSocket ss = new ServerSocket();
>>> >
>>> > Modified:
>>> zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java
>>> > URL:
>>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>>> >
>>> ==============================================================================
>>> > ---
>>> zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java
>>> (original)
>>> > +++
>>> zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java
>>> Wed Dec 28 14:55:37 2011
>>> > @@ -94,6 +94,9 @@ public class FourLetterWordsTest extends
>>> >         verify("srvr", "Outstanding");
>>> >         verify("cons", "queued");
>>> >         verify("mntr", "zk_server_state\tstandalone");
>>> > +        verify("mntr", "num_alive_connections");
>>> > +        verify("stat", "Connections");
>>> > +        verify("srvr", "Connections");
>>> >     }
>>> >
>>> >     private String sendRequest(String cmd) throws IOException {
>>> > @@ -136,6 +139,8 @@ public class FourLetterWordsTest extends
>>> >         line = in.readLine();
>>> >         Assert.assertTrue(Pattern.matches("^Sent: \\d+$", line));
>>> >         line = in.readLine();
>>> > +        Assert.assertTrue(Pattern.matches("^Connections: \\d+$",
>>> line));
>>> > +        line = in.readLine();
>>> >         Assert.assertTrue(Pattern.matches("^Outstanding: \\d+$", line));
>>> >         line = in.readLine();
>>> >         Assert.assertTrue(Pattern.matches("^Zxid: 0x[\\da-fA-F]+$",
>>> line));
>>> >
>>> >
>>>
>>

Re: svn commit: r1225200 - in /zookeeper/trunk: ./ src/java/main/org/apache/zookeeper/server/ src/java/test/org/apache/zookeeper/server/quorum/ src/java/test/org/apache/zookeeper/test/

Posted by Camille Fournier <ca...@apache.org>.
After looking for a few mins, here are my observations:

The implementation of HashSet in jdk 1.6 uses an underlying HashMap, which
uses a bog-standard int for the size. So, I completely agree that we can
get invalid results for a point in time. But does anyone really care about
the *exact* moment-in-time number of cnxns in the system, in a system where
cnxns are coming and going? At best you'll see a value that will likely be
out of date the moment you read it.

But, if we're going to do this, I do think there may be a case for
refactoring to a concurrent data structure given that we are randomly
syncing on the cnxns set in a way that makes adding additional interactions
with it error prone in this way. And we should definitely remove that
getConnections method, if anyone ever iterated over that set they would be
in a sad concurrency situation.
Seems possibly worth a whole new ticket to do this. What do you think?

Thanks,
C

On Wed, Dec 28, 2011 at 1:12 PM, Camille Fournier <ca...@apache.org>wrote:

> I'm not sure it's meaningful enough to be worth the sync overhead. We
> should look into that. The alternative if we must is using a proper
> concurrent collection. Neha, any thoughts?
>
> C
> On Dec 28, 2011 12:45 PM, "Patrick Hunt" <ph...@apache.org> wrote:
>
>> I believe there is a bug in this commit. The "cnxns" size() call is
>> not being synchronized. This will lead to invalid results at best, at
>> worst outright failure (hard to say w/o knowing the implementation of
>> HashSet).
>>
>> Camille can you work with Neha to get this fixed? Perhaps in the
>> meantime (if it's going to take a while) you can revert this change,
>> re-open the jira, update the patch, and reapply at some later time?
>>
>> Patrick
>>
>> On Wed, Dec 28, 2011 at 6:55 AM,  <ca...@apache.org> wrote:
>> > Author: camille
>> > Date: Wed Dec 28 14:55:37 2011
>> > New Revision: 1225200
>> >
>> > URL: http://svn.apache.org/viewvc?rev=1225200&view=rev
>> > Log:
>> > ZOOKEEPER-1321: Add number of client connections metric in JMX and srvr
>> (Neha Narkhede via camille)
>> >
>> > Modified:
>> >    zookeeper/trunk/CHANGES.txt
>> >
>>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java
>> >
>>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java
>> >
>>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java
>> >
>>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java
>> >
>>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java
>> >
>>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerStats.java
>> >
>>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java
>> >
>>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java
>> >
>>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java
>> >
>>  zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/Zab1_0Test.java
>> >
>>  zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java
>> >
>> > Modified: zookeeper/trunk/CHANGES.txt
>> > URL:
>> http://svn.apache.org/viewvc/zookeeper/trunk/CHANGES.txt?rev=1225200&r1=1225199&r2=1225200&view=diff
>> >
>> ==============================================================================
>> > --- zookeeper/trunk/CHANGES.txt (original)
>> > +++ zookeeper/trunk/CHANGES.txt Wed Dec 28 14:55:37 2011
>> > @@ -162,6 +162,8 @@ IMPROVEMENTS:
>> >
>> >   ZOOKEEPER-1342. quorum Listener & LearnerCnxAcceptor are missing
>> >   thread names (Rakesh R via phunt)
>> > +
>> > +  ZOOKEEPER-1321. Add number of client connections metric in JMX and
>> srvr (Neha Narkhede via camille)
>> >
>> >  Release 3.4.0 -
>> >
>> >
>> > Modified:
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java
>> > URL:
>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>> >
>> ==============================================================================
>> > ---
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java
>> (original)
>> > +++
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java
>> Wed Dec 28 14:55:37 2011
>> > @@ -749,7 +749,8 @@ public class NIOServerCnxn extends Serve
>> >
>> >             print("packets_received", stats.getPacketsReceived());
>> >             print("packets_sent", stats.getPacketsSent());
>> > -
>> > +            print("num_alive_connections",
>> stats.getNumAliveClientConnections());
>> > +
>> >             print("outstanding_requests",
>> stats.getOutstandingRequests());
>> >
>> >             print("server_state", stats.getServerState());
>> >
>> > Modified:
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java
>> > URL:
>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>> >
>> ==============================================================================
>> > ---
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java
>> (original)
>> > +++
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java
>> Wed Dec 28 14:55:37 2011
>> > @@ -32,14 +32,14 @@ import java.util.HashMap;
>> >  import java.util.HashSet;
>> >  import java.util.Set;
>> >
>> > +import javax.security.auth.login.Configuration;
>> > +import javax.security.auth.login.LoginException;
>> > +
>> >  import org.apache.zookeeper.Login;
>> >  import org.apache.zookeeper.server.auth.SaslServerCallbackHandler;
>> >  import org.slf4j.Logger;
>> >  import org.slf4j.LoggerFactory;
>> >
>> > -import javax.security.auth.login.Configuration;
>> > -import javax.security.auth.login.LoginException;
>> > -
>> >  public class NIOServerCnxnFactory extends ServerCnxnFactory implements
>> Runnable {
>> >     private static final Logger LOG =
>> LoggerFactory.getLogger(NIOServerCnxnFactory.class);
>> >
>> > @@ -78,7 +78,6 @@ public class NIOServerCnxnFactory extend
>> >
>> >     int maxClientCnxns = 60;
>> >
>> > -
>> >     /**
>> >      * Construct a new server connection factory which will accept an
>> unlimited number
>> >      * of concurrent connections from each client (up to the file
>> descriptor
>> > @@ -122,7 +121,7 @@ public class NIOServerCnxnFactory extend
>> >     public void setMaxClientCnxnsPerHost(int max) {
>> >         maxClientCnxns = max;
>> >     }
>> > -
>> > +
>> >     @Override
>> >     public void start() {
>> >         // ensure thread is started once and only once
>> > @@ -187,7 +186,7 @@ public class NIOServerCnxnFactory extend
>> >             return s.size();
>> >         }
>> >     }
>> > -
>> > +
>> >     public void run() {
>> >         while (!ss.socket().isClosed()) {
>> >             try {
>> > @@ -323,4 +322,8 @@ public class NIOServerCnxnFactory extend
>> >         return cnxns;
>> >     }
>> >
>> > +    @Override
>> > +    public int getNumAliveConnections() {
>> > +       return cnxns.size();
>> > +    }
>> >  }
>> >
>> > Modified:
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java
>> > URL:
>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>> >
>> ==============================================================================
>> > ---
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java
>> (original)
>> > +++
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java
>> Wed Dec 28 14:55:37 2011
>> > @@ -560,7 +560,8 @@ public class NettyServerCnxn extends Ser
>> >
>> >             print("packets_received", stats.getPacketsReceived());
>> >             print("packets_sent", stats.getPacketsSent());
>> > -
>> > +            print("num_alive_connections",
>> stats.getNumAliveClientConnections());
>> > +
>> >             print("outstanding_requests",
>> stats.getOutstandingRequests());
>> >
>> >             print("server_state", stats.getServerState());
>> >
>> > Modified:
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java
>> > URL:
>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>> >
>> ==============================================================================
>> > ---
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java
>> (original)
>> > +++
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java
>> Wed Dec 28 14:55:37 2011
>> > @@ -411,5 +411,10 @@ public class NettyServerCnxnFactory exte
>> >             }
>> >         }
>> >     }
>> > +
>> > +    @Override
>> > +    public int getNumAliveConnections() {
>> > +       return cnxns.size();
>> > +    }
>> >
>> >  }
>> >
>> > Modified:
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java
>> > URL:
>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>> >
>> ==============================================================================
>> > ---
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java
>> (original)
>> > +++
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java
>> Wed Dec 28 14:55:37 2011
>> > @@ -24,15 +24,16 @@ import java.nio.ByteBuffer;
>> >  import java.util.HashMap;
>> >
>> >  import javax.management.JMException;
>> > -import org.slf4j.Logger;
>> > -import org.slf4j.LoggerFactory;
>> > -import org.apache.zookeeper.jmx.MBeanRegistry;
>> > +
>> >  import org.apache.zookeeper.Login;
>> > +import org.apache.zookeeper.jmx.MBeanRegistry;
>> >  import org.apache.zookeeper.server.auth.SaslServerCallbackHandler;
>> > +import org.slf4j.Logger;
>> > +import org.slf4j.LoggerFactory;
>> >
>> >  public abstract class ServerCnxnFactory {
>> >
>> > -    public static final String ZOOKEEPER_SERVER_CNXN_FACTORY =
>> "zookeeper.serverCnxnFactory";
>> > +    public static final String ZOOKEEPER_SERVER_CNXN_FACTORY =
>> "zookeeper.serverCnxnFactory";
>> >
>> >     public interface PacketProcessor {
>> >         public void processPacket(ByteBuffer packet, ServerCnxn src);
>> > @@ -49,6 +50,8 @@ public abstract class ServerCnxnFactory
>> >
>> >     public abstract Iterable<ServerCnxn> getConnections();
>> >
>> > +    public abstract int getNumAliveConnections();
>> > +
>> >     public abstract void closeSession(long sessionId);
>> >
>> >     public abstract void configure(InetSocketAddress addr,
>> >
>> > Modified:
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerStats.java
>> > URL:
>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerStats.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>> >
>> ==============================================================================
>> > ---
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerStats.java
>> (original)
>> > +++
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerStats.java
>> Wed Dec 28 14:55:37 2011
>> > @@ -19,6 +19,7 @@
>> >  package org.apache.zookeeper.server;
>> >
>> >
>> > +
>> >  /**
>> >  * Basic Server Statistics
>> >  */
>> > @@ -29,13 +30,14 @@ public class ServerStats {
>> >     private long minLatency = Long.MAX_VALUE;
>> >     private long totalLatency = 0;
>> >     private long count = 0;
>> > -
>> > +
>> >     private final Provider provider;
>> >
>> >     public interface Provider {
>> >         public long getOutstandingRequests();
>> >         public long getLastProcessedZxid();
>> >         public String getState();
>> > +        public int getNumAliveConnections();
>> >     }
>> >
>> >     public ServerStats(Provider provider) {
>> > @@ -75,9 +77,14 @@ public class ServerStats {
>> >     }
>> >
>> >     public String getServerState() {
>> > -        return provider.getState();
>> > +       return provider.getState();
>> >     }
>> > -
>> > +
>> > +    /** The number of client connections alive to this server */
>> > +    public int getNumAliveClientConnections() {
>> > +       return provider.getNumAliveConnections();
>> > +    }
>> > +
>> >     @Override
>> >     public String toString(){
>> >         StringBuilder sb = new StringBuilder();
>> > @@ -85,6 +92,8 @@ public class ServerStats {
>> >                 + getAvgLatency() + "/" + getMaxLatency() + "\n");
>> >         sb.append("Received: " + getPacketsReceived() + "\n");
>> >         sb.append("Sent: " + getPacketsSent() + "\n");
>> > +        sb.append("Connections: " + getNumAliveClientConnections() +
>> "\n");
>> > +
>> >         if (provider != null) {
>> >             sb.append("Outstanding: " + getOutstandingRequests() +
>> "\n");
>> >             sb.append("Zxid: 0x"+
>> Long.toHexString(getLastProcessedZxid())+ "\n");
>> > @@ -123,7 +132,6 @@ public class ServerStats {
>> >         packetsReceived = 0;
>> >         packetsSent = 0;
>> >     }
>> > -
>> >     synchronized public void reset() {
>> >         resetLatency();
>> >         resetRequestCounters();
>> >
>> > Modified:
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java
>> > URL:
>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>> >
>> ==============================================================================
>> > ---
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java
>> (original)
>> > +++
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java
>> Wed Dec 28 14:55:37 2011
>> > @@ -109,7 +109,7 @@ public class ZooKeeperServer implements
>> >     private ServerCnxnFactory serverCnxnFactory;
>> >
>> >     private final ServerStats serverStats;
>> > -
>> > +
>> >     void removeCnxn(ServerCnxn cnxn) {
>> >         zkDb.removeCnxn(cnxn);
>> >     }
>> > @@ -254,7 +254,6 @@ public class ZooKeeperServer implements
>> >         }
>> >     }
>> >
>> > -
>> >     /**
>> >      * This should be called from a synchronized block on this!
>> >      */
>> > @@ -678,6 +677,14 @@ public class ZooKeeperServer implements
>> >     }
>> >
>> >     /**
>> > +     * return the total number of client connections that are alive
>> > +     * to this server
>> > +     */
>> > +    public int getNumAliveConnections() {
>> > +       return serverCnxnFactory.getNumAliveConnections();
>> > +    }
>> > +
>> > +    /**
>> >      * trunccate the log to get in sync with others
>> >      * if in a quorum
>> >      * @param zxid the zxid that it needs to get in sync
>> >
>> > Modified:
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java
>> > URL:
>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>> >
>> ==============================================================================
>> > ---
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java
>> (original)
>> > +++
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java
>> Wed Dec 28 14:55:37 2011
>> > @@ -140,4 +140,8 @@ public class ZooKeeperServerBean impleme
>> >         serverStats.resetRequestCounters();
>> >         serverStats.resetLatency();
>> >     }
>> > +
>> > +       public long getNumAliveConnections() {
>> > +               return zks.getNumAliveConnections();
>> > +       }
>> >  }
>> >
>> > Modified:
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java
>> > URL:
>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>> >
>> ==============================================================================
>> > ---
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java
>> (original)
>> > +++
>> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java
>> Wed Dec 28 14:55:37 2011
>> > @@ -103,4 +103,8 @@ public interface ZooKeeperServerMXBean {
>> >      * Reset max latency statistics only.
>> >      */
>> >     public void resetMaxLatency();
>> > +    /**
>> > +     * @return number of alive client connections
>> > +     */
>> > +    public long getNumAliveConnections();
>> >  }
>> >
>> > Modified:
>> zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/Zab1_0Test.java
>> > URL:
>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/Zab1_0Test.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>> >
>> ==============================================================================
>> > ---
>> zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/Zab1_0Test.java
>> (original)
>> > +++
>> zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/Zab1_0Test.java
>> Wed Dec 28 14:55:37 2011
>> > @@ -212,6 +212,10 @@ public class Zab1_0Test {
>> >         }
>> >         public void closeAll() {
>> >         }
>> > +               @Override
>> > +               public int getNumAliveConnections() {
>> > +                       return 0;
>> > +               }
>> >     }
>> >     static Socket[] getSocketPair() throws IOException {
>> >         ServerSocket ss = new ServerSocket();
>> >
>> > Modified:
>> zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java
>> > URL:
>> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java?rev=1225200&r1=1225199&r2=1225200&view=diff
>> >
>> ==============================================================================
>> > ---
>> zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java
>> (original)
>> > +++
>> zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java
>> Wed Dec 28 14:55:37 2011
>> > @@ -94,6 +94,9 @@ public class FourLetterWordsTest extends
>> >         verify("srvr", "Outstanding");
>> >         verify("cons", "queued");
>> >         verify("mntr", "zk_server_state\tstandalone");
>> > +        verify("mntr", "num_alive_connections");
>> > +        verify("stat", "Connections");
>> > +        verify("srvr", "Connections");
>> >     }
>> >
>> >     private String sendRequest(String cmd) throws IOException {
>> > @@ -136,6 +139,8 @@ public class FourLetterWordsTest extends
>> >         line = in.readLine();
>> >         Assert.assertTrue(Pattern.matches("^Sent: \\d+$", line));
>> >         line = in.readLine();
>> > +        Assert.assertTrue(Pattern.matches("^Connections: \\d+$",
>> line));
>> > +        line = in.readLine();
>> >         Assert.assertTrue(Pattern.matches("^Outstanding: \\d+$", line));
>> >         line = in.readLine();
>> >         Assert.assertTrue(Pattern.matches("^Zxid: 0x[\\da-fA-F]+$",
>> line));
>> >
>> >
>>
>

Re: svn commit: r1225200 - in /zookeeper/trunk: ./ src/java/main/org/apache/zookeeper/server/ src/java/test/org/apache/zookeeper/server/quorum/ src/java/test/org/apache/zookeeper/test/

Posted by Camille Fournier <ca...@apache.org>.
I'm not sure it's meaningful enough to be worth the sync overhead. We
should look into that. The alternative if we must is using a proper
concurrent collection. Neha, any thoughts?

C
On Dec 28, 2011 12:45 PM, "Patrick Hunt" <ph...@apache.org> wrote:

> I believe there is a bug in this commit. The "cnxns" size() call is
> not being synchronized. This will lead to invalid results at best, at
> worst outright failure (hard to say w/o knowing the implementation of
> HashSet).
>
> Camille can you work with Neha to get this fixed? Perhaps in the
> meantime (if it's going to take a while) you can revert this change,
> re-open the jira, update the patch, and reapply at some later time?
>
> Patrick
>
> On Wed, Dec 28, 2011 at 6:55 AM,  <ca...@apache.org> wrote:
> > Author: camille
> > Date: Wed Dec 28 14:55:37 2011
> > New Revision: 1225200
> >
> > URL: http://svn.apache.org/viewvc?rev=1225200&view=rev
> > Log:
> > ZOOKEEPER-1321: Add number of client connections metric in JMX and srvr
> (Neha Narkhede via camille)
> >
> > Modified:
> >    zookeeper/trunk/CHANGES.txt
> >
>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java
> >
>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java
> >
>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java
> >
>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java
> >
>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java
> >
>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerStats.java
> >
>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java
> >
>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java
> >
>  zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java
> >
>  zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/Zab1_0Test.java
> >
>  zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java
> >
> > Modified: zookeeper/trunk/CHANGES.txt
> > URL:
> http://svn.apache.org/viewvc/zookeeper/trunk/CHANGES.txt?rev=1225200&r1=1225199&r2=1225200&view=diff
> >
> ==============================================================================
> > --- zookeeper/trunk/CHANGES.txt (original)
> > +++ zookeeper/trunk/CHANGES.txt Wed Dec 28 14:55:37 2011
> > @@ -162,6 +162,8 @@ IMPROVEMENTS:
> >
> >   ZOOKEEPER-1342. quorum Listener & LearnerCnxAcceptor are missing
> >   thread names (Rakesh R via phunt)
> > +
> > +  ZOOKEEPER-1321. Add number of client connections metric in JMX and
> srvr (Neha Narkhede via camille)
> >
> >  Release 3.4.0 -
> >
> >
> > Modified:
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java
> > URL:
> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java?rev=1225200&r1=1225199&r2=1225200&view=diff
> >
> ==============================================================================
> > ---
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java
> (original)
> > +++
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java
> Wed Dec 28 14:55:37 2011
> > @@ -749,7 +749,8 @@ public class NIOServerCnxn extends Serve
> >
> >             print("packets_received", stats.getPacketsReceived());
> >             print("packets_sent", stats.getPacketsSent());
> > -
> > +            print("num_alive_connections",
> stats.getNumAliveClientConnections());
> > +
> >             print("outstanding_requests",
> stats.getOutstandingRequests());
> >
> >             print("server_state", stats.getServerState());
> >
> > Modified:
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java
> > URL:
> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java?rev=1225200&r1=1225199&r2=1225200&view=diff
> >
> ==============================================================================
> > ---
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java
> (original)
> > +++
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java
> Wed Dec 28 14:55:37 2011
> > @@ -32,14 +32,14 @@ import java.util.HashMap;
> >  import java.util.HashSet;
> >  import java.util.Set;
> >
> > +import javax.security.auth.login.Configuration;
> > +import javax.security.auth.login.LoginException;
> > +
> >  import org.apache.zookeeper.Login;
> >  import org.apache.zookeeper.server.auth.SaslServerCallbackHandler;
> >  import org.slf4j.Logger;
> >  import org.slf4j.LoggerFactory;
> >
> > -import javax.security.auth.login.Configuration;
> > -import javax.security.auth.login.LoginException;
> > -
> >  public class NIOServerCnxnFactory extends ServerCnxnFactory implements
> Runnable {
> >     private static final Logger LOG =
> LoggerFactory.getLogger(NIOServerCnxnFactory.class);
> >
> > @@ -78,7 +78,6 @@ public class NIOServerCnxnFactory extend
> >
> >     int maxClientCnxns = 60;
> >
> > -
> >     /**
> >      * Construct a new server connection factory which will accept an
> unlimited number
> >      * of concurrent connections from each client (up to the file
> descriptor
> > @@ -122,7 +121,7 @@ public class NIOServerCnxnFactory extend
> >     public void setMaxClientCnxnsPerHost(int max) {
> >         maxClientCnxns = max;
> >     }
> > -
> > +
> >     @Override
> >     public void start() {
> >         // ensure thread is started once and only once
> > @@ -187,7 +186,7 @@ public class NIOServerCnxnFactory extend
> >             return s.size();
> >         }
> >     }
> > -
> > +
> >     public void run() {
> >         while (!ss.socket().isClosed()) {
> >             try {
> > @@ -323,4 +322,8 @@ public class NIOServerCnxnFactory extend
> >         return cnxns;
> >     }
> >
> > +    @Override
> > +    public int getNumAliveConnections() {
> > +       return cnxns.size();
> > +    }
> >  }
> >
> > Modified:
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java
> > URL:
> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java?rev=1225200&r1=1225199&r2=1225200&view=diff
> >
> ==============================================================================
> > ---
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java
> (original)
> > +++
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java
> Wed Dec 28 14:55:37 2011
> > @@ -560,7 +560,8 @@ public class NettyServerCnxn extends Ser
> >
> >             print("packets_received", stats.getPacketsReceived());
> >             print("packets_sent", stats.getPacketsSent());
> > -
> > +            print("num_alive_connections",
> stats.getNumAliveClientConnections());
> > +
> >             print("outstanding_requests",
> stats.getOutstandingRequests());
> >
> >             print("server_state", stats.getServerState());
> >
> > Modified:
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java
> > URL:
> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java?rev=1225200&r1=1225199&r2=1225200&view=diff
> >
> ==============================================================================
> > ---
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java
> (original)
> > +++
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java
> Wed Dec 28 14:55:37 2011
> > @@ -411,5 +411,10 @@ public class NettyServerCnxnFactory exte
> >             }
> >         }
> >     }
> > +
> > +    @Override
> > +    public int getNumAliveConnections() {
> > +       return cnxns.size();
> > +    }
> >
> >  }
> >
> > Modified:
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java
> > URL:
> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java?rev=1225200&r1=1225199&r2=1225200&view=diff
> >
> ==============================================================================
> > ---
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java
> (original)
> > +++
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java
> Wed Dec 28 14:55:37 2011
> > @@ -24,15 +24,16 @@ import java.nio.ByteBuffer;
> >  import java.util.HashMap;
> >
> >  import javax.management.JMException;
> > -import org.slf4j.Logger;
> > -import org.slf4j.LoggerFactory;
> > -import org.apache.zookeeper.jmx.MBeanRegistry;
> > +
> >  import org.apache.zookeeper.Login;
> > +import org.apache.zookeeper.jmx.MBeanRegistry;
> >  import org.apache.zookeeper.server.auth.SaslServerCallbackHandler;
> > +import org.slf4j.Logger;
> > +import org.slf4j.LoggerFactory;
> >
> >  public abstract class ServerCnxnFactory {
> >
> > -    public static final String ZOOKEEPER_SERVER_CNXN_FACTORY =
> "zookeeper.serverCnxnFactory";
> > +    public static final String ZOOKEEPER_SERVER_CNXN_FACTORY =
> "zookeeper.serverCnxnFactory";
> >
> >     public interface PacketProcessor {
> >         public void processPacket(ByteBuffer packet, ServerCnxn src);
> > @@ -49,6 +50,8 @@ public abstract class ServerCnxnFactory
> >
> >     public abstract Iterable<ServerCnxn> getConnections();
> >
> > +    public abstract int getNumAliveConnections();
> > +
> >     public abstract void closeSession(long sessionId);
> >
> >     public abstract void configure(InetSocketAddress addr,
> >
> > Modified:
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerStats.java
> > URL:
> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerStats.java?rev=1225200&r1=1225199&r2=1225200&view=diff
> >
> ==============================================================================
> > ---
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerStats.java
> (original)
> > +++
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerStats.java
> Wed Dec 28 14:55:37 2011
> > @@ -19,6 +19,7 @@
> >  package org.apache.zookeeper.server;
> >
> >
> > +
> >  /**
> >  * Basic Server Statistics
> >  */
> > @@ -29,13 +30,14 @@ public class ServerStats {
> >     private long minLatency = Long.MAX_VALUE;
> >     private long totalLatency = 0;
> >     private long count = 0;
> > -
> > +
> >     private final Provider provider;
> >
> >     public interface Provider {
> >         public long getOutstandingRequests();
> >         public long getLastProcessedZxid();
> >         public String getState();
> > +        public int getNumAliveConnections();
> >     }
> >
> >     public ServerStats(Provider provider) {
> > @@ -75,9 +77,14 @@ public class ServerStats {
> >     }
> >
> >     public String getServerState() {
> > -        return provider.getState();
> > +       return provider.getState();
> >     }
> > -
> > +
> > +    /** The number of client connections alive to this server */
> > +    public int getNumAliveClientConnections() {
> > +       return provider.getNumAliveConnections();
> > +    }
> > +
> >     @Override
> >     public String toString(){
> >         StringBuilder sb = new StringBuilder();
> > @@ -85,6 +92,8 @@ public class ServerStats {
> >                 + getAvgLatency() + "/" + getMaxLatency() + "\n");
> >         sb.append("Received: " + getPacketsReceived() + "\n");
> >         sb.append("Sent: " + getPacketsSent() + "\n");
> > +        sb.append("Connections: " + getNumAliveClientConnections() +
> "\n");
> > +
> >         if (provider != null) {
> >             sb.append("Outstanding: " + getOutstandingRequests() + "\n");
> >             sb.append("Zxid: 0x"+
> Long.toHexString(getLastProcessedZxid())+ "\n");
> > @@ -123,7 +132,6 @@ public class ServerStats {
> >         packetsReceived = 0;
> >         packetsSent = 0;
> >     }
> > -
> >     synchronized public void reset() {
> >         resetLatency();
> >         resetRequestCounters();
> >
> > Modified:
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java
> > URL:
> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java?rev=1225200&r1=1225199&r2=1225200&view=diff
> >
> ==============================================================================
> > ---
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java
> (original)
> > +++
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java
> Wed Dec 28 14:55:37 2011
> > @@ -109,7 +109,7 @@ public class ZooKeeperServer implements
> >     private ServerCnxnFactory serverCnxnFactory;
> >
> >     private final ServerStats serverStats;
> > -
> > +
> >     void removeCnxn(ServerCnxn cnxn) {
> >         zkDb.removeCnxn(cnxn);
> >     }
> > @@ -254,7 +254,6 @@ public class ZooKeeperServer implements
> >         }
> >     }
> >
> > -
> >     /**
> >      * This should be called from a synchronized block on this!
> >      */
> > @@ -678,6 +677,14 @@ public class ZooKeeperServer implements
> >     }
> >
> >     /**
> > +     * return the total number of client connections that are alive
> > +     * to this server
> > +     */
> > +    public int getNumAliveConnections() {
> > +       return serverCnxnFactory.getNumAliveConnections();
> > +    }
> > +
> > +    /**
> >      * trunccate the log to get in sync with others
> >      * if in a quorum
> >      * @param zxid the zxid that it needs to get in sync
> >
> > Modified:
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java
> > URL:
> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java?rev=1225200&r1=1225199&r2=1225200&view=diff
> >
> ==============================================================================
> > ---
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java
> (original)
> > +++
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java
> Wed Dec 28 14:55:37 2011
> > @@ -140,4 +140,8 @@ public class ZooKeeperServerBean impleme
> >         serverStats.resetRequestCounters();
> >         serverStats.resetLatency();
> >     }
> > +
> > +       public long getNumAliveConnections() {
> > +               return zks.getNumAliveConnections();
> > +       }
> >  }
> >
> > Modified:
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java
> > URL:
> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java?rev=1225200&r1=1225199&r2=1225200&view=diff
> >
> ==============================================================================
> > ---
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java
> (original)
> > +++
> zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java
> Wed Dec 28 14:55:37 2011
> > @@ -103,4 +103,8 @@ public interface ZooKeeperServerMXBean {
> >      * Reset max latency statistics only.
> >      */
> >     public void resetMaxLatency();
> > +    /**
> > +     * @return number of alive client connections
> > +     */
> > +    public long getNumAliveConnections();
> >  }
> >
> > Modified:
> zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/Zab1_0Test.java
> > URL:
> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/Zab1_0Test.java?rev=1225200&r1=1225199&r2=1225200&view=diff
> >
> ==============================================================================
> > ---
> zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/Zab1_0Test.java
> (original)
> > +++
> zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/Zab1_0Test.java
> Wed Dec 28 14:55:37 2011
> > @@ -212,6 +212,10 @@ public class Zab1_0Test {
> >         }
> >         public void closeAll() {
> >         }
> > +               @Override
> > +               public int getNumAliveConnections() {
> > +                       return 0;
> > +               }
> >     }
> >     static Socket[] getSocketPair() throws IOException {
> >         ServerSocket ss = new ServerSocket();
> >
> > Modified:
> zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java
> > URL:
> http://svn.apache.org/viewvc/zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java?rev=1225200&r1=1225199&r2=1225200&view=diff
> >
> ==============================================================================
> > ---
> zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java
> (original)
> > +++
> zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java
> Wed Dec 28 14:55:37 2011
> > @@ -94,6 +94,9 @@ public class FourLetterWordsTest extends
> >         verify("srvr", "Outstanding");
> >         verify("cons", "queued");
> >         verify("mntr", "zk_server_state\tstandalone");
> > +        verify("mntr", "num_alive_connections");
> > +        verify("stat", "Connections");
> > +        verify("srvr", "Connections");
> >     }
> >
> >     private String sendRequest(String cmd) throws IOException {
> > @@ -136,6 +139,8 @@ public class FourLetterWordsTest extends
> >         line = in.readLine();
> >         Assert.assertTrue(Pattern.matches("^Sent: \\d+$", line));
> >         line = in.readLine();
> > +        Assert.assertTrue(Pattern.matches("^Connections: \\d+$", line));
> > +        line = in.readLine();
> >         Assert.assertTrue(Pattern.matches("^Outstanding: \\d+$", line));
> >         line = in.readLine();
> >         Assert.assertTrue(Pattern.matches("^Zxid: 0x[\\da-fA-F]+$",
> line));
> >
> >
>

Re: svn commit: r1225200 - in /zookeeper/trunk: ./ src/java/main/org/apache/zookeeper/server/ src/java/test/org/apache/zookeeper/server/quorum/ src/java/test/org/apache/zookeeper/test/

Posted by Patrick Hunt <ph...@apache.org>.
I believe there is a bug in this commit. The "cnxns" size() call is
not being synchronized. This will lead to invalid results at best, at
worst outright failure (hard to say w/o knowing the implementation of
HashSet).

Camille can you work with Neha to get this fixed? Perhaps in the
meantime (if it's going to take a while) you can revert this change,
re-open the jira, update the patch, and reapply at some later time?

Patrick

On Wed, Dec 28, 2011 at 6:55 AM,  <ca...@apache.org> wrote:
> Author: camille
> Date: Wed Dec 28 14:55:37 2011
> New Revision: 1225200
>
> URL: http://svn.apache.org/viewvc?rev=1225200&view=rev
> Log:
> ZOOKEEPER-1321: Add number of client connections metric in JMX and srvr (Neha Narkhede via camille)
>
> Modified:
>    zookeeper/trunk/CHANGES.txt
>    zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java
>    zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java
>    zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java
>    zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java
>    zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java
>    zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerStats.java
>    zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java
>    zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java
>    zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java
>    zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/Zab1_0Test.java
>    zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java
>
> Modified: zookeeper/trunk/CHANGES.txt
> URL: http://svn.apache.org/viewvc/zookeeper/trunk/CHANGES.txt?rev=1225200&r1=1225199&r2=1225200&view=diff
> ==============================================================================
> --- zookeeper/trunk/CHANGES.txt (original)
> +++ zookeeper/trunk/CHANGES.txt Wed Dec 28 14:55:37 2011
> @@ -162,6 +162,8 @@ IMPROVEMENTS:
>
>   ZOOKEEPER-1342. quorum Listener & LearnerCnxAcceptor are missing
>   thread names (Rakesh R via phunt)
> +
> +  ZOOKEEPER-1321. Add number of client connections metric in JMX and srvr (Neha Narkhede via camille)
>
>  Release 3.4.0 -
>
>
> Modified: zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java
> URL: http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java?rev=1225200&r1=1225199&r2=1225200&view=diff
> ==============================================================================
> --- zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java (original)
> +++ zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxn.java Wed Dec 28 14:55:37 2011
> @@ -749,7 +749,8 @@ public class NIOServerCnxn extends Serve
>
>             print("packets_received", stats.getPacketsReceived());
>             print("packets_sent", stats.getPacketsSent());
> -
> +            print("num_alive_connections", stats.getNumAliveClientConnections());
> +
>             print("outstanding_requests", stats.getOutstandingRequests());
>
>             print("server_state", stats.getServerState());
>
> Modified: zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java
> URL: http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java?rev=1225200&r1=1225199&r2=1225200&view=diff
> ==============================================================================
> --- zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java (original)
> +++ zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NIOServerCnxnFactory.java Wed Dec 28 14:55:37 2011
> @@ -32,14 +32,14 @@ import java.util.HashMap;
>  import java.util.HashSet;
>  import java.util.Set;
>
> +import javax.security.auth.login.Configuration;
> +import javax.security.auth.login.LoginException;
> +
>  import org.apache.zookeeper.Login;
>  import org.apache.zookeeper.server.auth.SaslServerCallbackHandler;
>  import org.slf4j.Logger;
>  import org.slf4j.LoggerFactory;
>
> -import javax.security.auth.login.Configuration;
> -import javax.security.auth.login.LoginException;
> -
>  public class NIOServerCnxnFactory extends ServerCnxnFactory implements Runnable {
>     private static final Logger LOG = LoggerFactory.getLogger(NIOServerCnxnFactory.class);
>
> @@ -78,7 +78,6 @@ public class NIOServerCnxnFactory extend
>
>     int maxClientCnxns = 60;
>
> -
>     /**
>      * Construct a new server connection factory which will accept an unlimited number
>      * of concurrent connections from each client (up to the file descriptor
> @@ -122,7 +121,7 @@ public class NIOServerCnxnFactory extend
>     public void setMaxClientCnxnsPerHost(int max) {
>         maxClientCnxns = max;
>     }
> -
> +
>     @Override
>     public void start() {
>         // ensure thread is started once and only once
> @@ -187,7 +186,7 @@ public class NIOServerCnxnFactory extend
>             return s.size();
>         }
>     }
> -
> +
>     public void run() {
>         while (!ss.socket().isClosed()) {
>             try {
> @@ -323,4 +322,8 @@ public class NIOServerCnxnFactory extend
>         return cnxns;
>     }
>
> +    @Override
> +    public int getNumAliveConnections() {
> +       return cnxns.size();
> +    }
>  }
>
> Modified: zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java
> URL: http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java?rev=1225200&r1=1225199&r2=1225200&view=diff
> ==============================================================================
> --- zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java (original)
> +++ zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxn.java Wed Dec 28 14:55:37 2011
> @@ -560,7 +560,8 @@ public class NettyServerCnxn extends Ser
>
>             print("packets_received", stats.getPacketsReceived());
>             print("packets_sent", stats.getPacketsSent());
> -
> +            print("num_alive_connections", stats.getNumAliveClientConnections());
> +
>             print("outstanding_requests", stats.getOutstandingRequests());
>
>             print("server_state", stats.getServerState());
>
> Modified: zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java
> URL: http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java?rev=1225200&r1=1225199&r2=1225200&view=diff
> ==============================================================================
> --- zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java (original)
> +++ zookeeper/trunk/src/java/main/org/apache/zookeeper/server/NettyServerCnxnFactory.java Wed Dec 28 14:55:37 2011
> @@ -411,5 +411,10 @@ public class NettyServerCnxnFactory exte
>             }
>         }
>     }
> +
> +    @Override
> +    public int getNumAliveConnections() {
> +       return cnxns.size();
> +    }
>
>  }
>
> Modified: zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java
> URL: http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java?rev=1225200&r1=1225199&r2=1225200&view=diff
> ==============================================================================
> --- zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java (original)
> +++ zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerCnxnFactory.java Wed Dec 28 14:55:37 2011
> @@ -24,15 +24,16 @@ import java.nio.ByteBuffer;
>  import java.util.HashMap;
>
>  import javax.management.JMException;
> -import org.slf4j.Logger;
> -import org.slf4j.LoggerFactory;
> -import org.apache.zookeeper.jmx.MBeanRegistry;
> +
>  import org.apache.zookeeper.Login;
> +import org.apache.zookeeper.jmx.MBeanRegistry;
>  import org.apache.zookeeper.server.auth.SaslServerCallbackHandler;
> +import org.slf4j.Logger;
> +import org.slf4j.LoggerFactory;
>
>  public abstract class ServerCnxnFactory {
>
> -    public static final String ZOOKEEPER_SERVER_CNXN_FACTORY = "zookeeper.serverCnxnFactory";
> +    public static final String ZOOKEEPER_SERVER_CNXN_FACTORY = "zookeeper.serverCnxnFactory";
>
>     public interface PacketProcessor {
>         public void processPacket(ByteBuffer packet, ServerCnxn src);
> @@ -49,6 +50,8 @@ public abstract class ServerCnxnFactory
>
>     public abstract Iterable<ServerCnxn> getConnections();
>
> +    public abstract int getNumAliveConnections();
> +
>     public abstract void closeSession(long sessionId);
>
>     public abstract void configure(InetSocketAddress addr,
>
> Modified: zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerStats.java
> URL: http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerStats.java?rev=1225200&r1=1225199&r2=1225200&view=diff
> ==============================================================================
> --- zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerStats.java (original)
> +++ zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ServerStats.java Wed Dec 28 14:55:37 2011
> @@ -19,6 +19,7 @@
>  package org.apache.zookeeper.server;
>
>
> +
>  /**
>  * Basic Server Statistics
>  */
> @@ -29,13 +30,14 @@ public class ServerStats {
>     private long minLatency = Long.MAX_VALUE;
>     private long totalLatency = 0;
>     private long count = 0;
> -
> +
>     private final Provider provider;
>
>     public interface Provider {
>         public long getOutstandingRequests();
>         public long getLastProcessedZxid();
>         public String getState();
> +        public int getNumAliveConnections();
>     }
>
>     public ServerStats(Provider provider) {
> @@ -75,9 +77,14 @@ public class ServerStats {
>     }
>
>     public String getServerState() {
> -        return provider.getState();
> +       return provider.getState();
>     }
> -
> +
> +    /** The number of client connections alive to this server */
> +    public int getNumAliveClientConnections() {
> +       return provider.getNumAliveConnections();
> +    }
> +
>     @Override
>     public String toString(){
>         StringBuilder sb = new StringBuilder();
> @@ -85,6 +92,8 @@ public class ServerStats {
>                 + getAvgLatency() + "/" + getMaxLatency() + "\n");
>         sb.append("Received: " + getPacketsReceived() + "\n");
>         sb.append("Sent: " + getPacketsSent() + "\n");
> +        sb.append("Connections: " + getNumAliveClientConnections() + "\n");
> +
>         if (provider != null) {
>             sb.append("Outstanding: " + getOutstandingRequests() + "\n");
>             sb.append("Zxid: 0x"+ Long.toHexString(getLastProcessedZxid())+ "\n");
> @@ -123,7 +132,6 @@ public class ServerStats {
>         packetsReceived = 0;
>         packetsSent = 0;
>     }
> -
>     synchronized public void reset() {
>         resetLatency();
>         resetRequestCounters();
>
> Modified: zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java
> URL: http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java?rev=1225200&r1=1225199&r2=1225200&view=diff
> ==============================================================================
> --- zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java (original)
> +++ zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java Wed Dec 28 14:55:37 2011
> @@ -109,7 +109,7 @@ public class ZooKeeperServer implements
>     private ServerCnxnFactory serverCnxnFactory;
>
>     private final ServerStats serverStats;
> -
> +
>     void removeCnxn(ServerCnxn cnxn) {
>         zkDb.removeCnxn(cnxn);
>     }
> @@ -254,7 +254,6 @@ public class ZooKeeperServer implements
>         }
>     }
>
> -
>     /**
>      * This should be called from a synchronized block on this!
>      */
> @@ -678,6 +677,14 @@ public class ZooKeeperServer implements
>     }
>
>     /**
> +     * return the total number of client connections that are alive
> +     * to this server
> +     */
> +    public int getNumAliveConnections() {
> +       return serverCnxnFactory.getNumAliveConnections();
> +    }
> +
> +    /**
>      * trunccate the log to get in sync with others
>      * if in a quorum
>      * @param zxid the zxid that it needs to get in sync
>
> Modified: zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java
> URL: http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java?rev=1225200&r1=1225199&r2=1225200&view=diff
> ==============================================================================
> --- zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java (original)
> +++ zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerBean.java Wed Dec 28 14:55:37 2011
> @@ -140,4 +140,8 @@ public class ZooKeeperServerBean impleme
>         serverStats.resetRequestCounters();
>         serverStats.resetLatency();
>     }
> +
> +       public long getNumAliveConnections() {
> +               return zks.getNumAliveConnections();
> +       }
>  }
>
> Modified: zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java
> URL: http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java?rev=1225200&r1=1225199&r2=1225200&view=diff
> ==============================================================================
> --- zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java (original)
> +++ zookeeper/trunk/src/java/main/org/apache/zookeeper/server/ZooKeeperServerMXBean.java Wed Dec 28 14:55:37 2011
> @@ -103,4 +103,8 @@ public interface ZooKeeperServerMXBean {
>      * Reset max latency statistics only.
>      */
>     public void resetMaxLatency();
> +    /**
> +     * @return number of alive client connections
> +     */
> +    public long getNumAliveConnections();
>  }
>
> Modified: zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/Zab1_0Test.java
> URL: http://svn.apache.org/viewvc/zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/Zab1_0Test.java?rev=1225200&r1=1225199&r2=1225200&view=diff
> ==============================================================================
> --- zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/Zab1_0Test.java (original)
> +++ zookeeper/trunk/src/java/test/org/apache/zookeeper/server/quorum/Zab1_0Test.java Wed Dec 28 14:55:37 2011
> @@ -212,6 +212,10 @@ public class Zab1_0Test {
>         }
>         public void closeAll() {
>         }
> +               @Override
> +               public int getNumAliveConnections() {
> +                       return 0;
> +               }
>     }
>     static Socket[] getSocketPair() throws IOException {
>         ServerSocket ss = new ServerSocket();
>
> Modified: zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java
> URL: http://svn.apache.org/viewvc/zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java?rev=1225200&r1=1225199&r2=1225200&view=diff
> ==============================================================================
> --- zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java (original)
> +++ zookeeper/trunk/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java Wed Dec 28 14:55:37 2011
> @@ -94,6 +94,9 @@ public class FourLetterWordsTest extends
>         verify("srvr", "Outstanding");
>         verify("cons", "queued");
>         verify("mntr", "zk_server_state\tstandalone");
> +        verify("mntr", "num_alive_connections");
> +        verify("stat", "Connections");
> +        verify("srvr", "Connections");
>     }
>
>     private String sendRequest(String cmd) throws IOException {
> @@ -136,6 +139,8 @@ public class FourLetterWordsTest extends
>         line = in.readLine();
>         Assert.assertTrue(Pattern.matches("^Sent: \\d+$", line));
>         line = in.readLine();
> +        Assert.assertTrue(Pattern.matches("^Connections: \\d+$", line));
> +        line = in.readLine();
>         Assert.assertTrue(Pattern.matches("^Outstanding: \\d+$", line));
>         line = in.readLine();
>         Assert.assertTrue(Pattern.matches("^Zxid: 0x[\\da-fA-F]+$", line));
>
>