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,  <[email protected]> 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));
>
>

Reply via email to