Hello ZooKeeper community,
When running ZK (3.4.6) related tests in parallel in same JVM, multiple
servers although assigned a different local port clash when trying to
register JMX MBean for server (see [1]) - the two get assigned same MBean
name. Registering JMX MBean for ZooKeeperServer it seems cannot be
disabled, not even for tests.
Looking into ZooKeeperServerBean constructor, and
ZooKeeperServer.getClientPort one can see that the MBean name will clash
only when server connection factory is not bound to server, before startup
method of server connection factory gets called.
This is exactly what happens in startup methods of both
NIOServerCnxnFactory and NettyServerCnxnFactory, because of IMO wrong order
that the methods are being called. Instead of current [2] IMO it should be
[3] or at least [4].
Is my understanding wrong? If not, is this a (known) bug?
Kind regards,
Stevo Slavic
[1] example build output fragment with failing ZK server JMX MBean
registration
javax.management.InstanceAlreadyExistsException:
org.apache.ZooKeeperService:name0=StandaloneServer_port-1
at com.sun.jmx.mbeanserver.Repository.addMBean(Repository.java:437)
at
com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerWithRepository(DefaultMBeanServerInterceptor.java:1898)
at
com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerDynamicMBean(DefaultMBeanServerInterceptor.java:966)
at
com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerObject(DefaultMBeanServerInterceptor.java:900)
at
com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerMBean(DefaultMBeanServerInterceptor.java:324)
at
com.sun.jmx.mbeanserver.JmxMBeanServer.registerMBean(JmxMBeanServer.java:522)
at
org.apache.zookeeper.jmx.MBeanRegistry.register(MBeanRegistry.java:96)
at
org.apache.zookeeper.server.ZooKeeperServer.registerJMX(ZooKeeperServer.java:377)
at
org.apache.zookeeper.server.ZooKeeperServer.startup(ZooKeeperServer.java:410)
at
org.apache.zookeeper.server.NIOServerCnxnFactory.startup(NIOServerCnxnFactory.java:123)
[2]
@Override
public void startup(ZooKeeperServer zks) throws IOException,
InterruptedException {
start();
zks.startdata();
zks.startup();
setZooKeeperServer(zks);
[3]
@Override
public void startup(ZooKeeperServer zks) throws IOException,
InterruptedException {
start();
setZooKeeperServer(zks);
zks.startdata();
zks.startup();
[4]
@Override
public void startup(ZooKeeperServer zks) throws IOException,
InterruptedException {
start();
zks.startdata();
setZooKeeperServer(zks);
zks.startup();
When running ZK (3.4.6) related tests in parallel in same JVM, multiple
servers although assigned a different local port clash when trying to
register JMX MBean for server (see [1]) - the two get assigned same MBean
name. Registering JMX MBean for ZooKeeperServer it seems cannot be
disabled, not even for tests.
Looking into ZooKeeperServerBean constructor, and
ZooKeeperServer.getClientPort one can see that the MBean name will clash
only when server connection factory is not bound to server, before startup
method of server connection factory gets called.
This is exactly what happens in startup methods of both
NIOServerCnxnFactory and NettyServerCnxnFactory, because of IMO wrong order
that the methods are being called. Instead of current [2] IMO it should be
[3] or at least [4].
Is my understanding wrong? If not, is this a (known) bug?
Kind regards,
Stevo Slavic
[1] example build output fragment with failing ZK server JMX MBean
registration
javax.management.InstanceAlreadyExistsException:
org.apache.ZooKeeperService:name0=StandaloneServer_port-1
at com.sun.jmx.mbeanserver.Repository.addMBean(Repository.java:437)
at
com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerWithRepository(DefaultMBeanServerInterceptor.java:1898)
at
com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerDynamicMBean(DefaultMBeanServerInterceptor.java:966)
at
com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerObject(DefaultMBeanServerInterceptor.java:900)
at
com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerMBean(DefaultMBeanServerInterceptor.java:324)
at
com.sun.jmx.mbeanserver.JmxMBeanServer.registerMBean(JmxMBeanServer.java:522)
at
org.apache.zookeeper.jmx.MBeanRegistry.register(MBeanRegistry.java:96)
at
org.apache.zookeeper.server.ZooKeeperServer.registerJMX(ZooKeeperServer.java:377)
at
org.apache.zookeeper.server.ZooKeeperServer.startup(ZooKeeperServer.java:410)
at
org.apache.zookeeper.server.NIOServerCnxnFactory.startup(NIOServerCnxnFactory.java:123)
[2]
@Override
public void startup(ZooKeeperServer zks) throws IOException,
InterruptedException {
start();
zks.startdata();
zks.startup();
setZooKeeperServer(zks);
[3]
@Override
public void startup(ZooKeeperServer zks) throws IOException,
InterruptedException {
start();
setZooKeeperServer(zks);
zks.startdata();
zks.startup();
[4]
@Override
public void startup(ZooKeeperServer zks) throws IOException,
InterruptedException {
start();
zks.startdata();
setZooKeeperServer(zks);
zks.startup();