Details
-
Bug
-
Status: Closed
-
Major
-
Resolution: Fixed
-
None
-
None
-
None
Description
Within the documentation, both in Configure Gateway Receivers and gfsh create gateway-receiver, we state that only one gateway-receiver is allowed per member. However, there is no enforcement of this rule within the code nor within the schema for the cache.xml file, so the user might end up having more than one gateway-receiver per host.
It's unknown which gateway-receiver is going to be used after a restart, making it hard to configure firewall rules between clusters, if any. The following exception is also printed in the logs whenever we try to register (only the first one is succesfull) the MBean for the gateway-receiver:
[warning 2017/11/16 15:27:46.156 PST host1-server1 <Function Execution Processor1> tid=0x44] javax.management.InstanceAlreadyExistsException: GemFire:service=GatewayReceiver,type=Member,member=host1-server1 org.apache.geode.management.ManagementException: javax.management.InstanceAlreadyExistsException: GemFire:service=GatewayReceiver,type=Member,member=host1-server1 at org.apache.geode.management.internal.MBeanJMXAdapter.registerMBean(MBeanJMXAdapter.java:110) at org.apache.geode.management.internal.SystemManagementService.registerInternalMBean(SystemManagementService.java:368) at org.apache.geode.management.internal.beans.ManagementAdapter.createGatewayReceiverMBean(ManagementAdapter.java:471) at org.apache.geode.management.internal.beans.ManagementAdapter.handleGatewayReceiverStart(ManagementAdapter.java:493) at org.apache.geode.management.internal.beans.ManagementListener.handleEvent(ManagementListener.java:134) at org.apache.geode.distributed.internal.InternalDistributedSystem.notifyResourceEventListeners(InternalDistributedSystem.java:2175) at org.apache.geode.distributed.internal.InternalDistributedSystem.handleResourceEvent(InternalDistributedSystem.java:562) at org.apache.geode.internal.cache.wan.GatewayReceiverImpl.start(GatewayReceiverImpl.java:194) at org.apache.geode.internal.cache.wan.GatewayReceiverFactoryImpl.create(GatewayReceiverFactoryImpl.java:141) at org.apache.geode.management.internal.cli.functions.GatewayReceiverCreateFunction.createGatewayReceiver(GatewayReceiverCreateFunction.java:164) at org.apache.geode.management.internal.cli.functions.GatewayReceiverCreateFunction.execute(GatewayReceiverCreateFunction.java:63) at org.apache.geode.internal.cache.MemberFunctionStreamingMessage.process(MemberFunctionStreamingMessage.java:186) at org.apache.geode.distributed.internal.DistributionMessage.scheduleAction(DistributionMessage.java:374) at org.apache.geode.distributed.internal.DistributionMessage$1.run(DistributionMessage.java:440) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at org.apache.geode.distributed.internal.DistributionManager.runUntilShutdown(DistributionManager.java:668) at org.apache.geode.distributed.internal.DistributionManager$9$1.run(DistributionManager.java:1114) at java.lang.Thread.run(Thread.java:745) Caused by: javax.management.InstanceAlreadyExistsException: GemFire:service=GatewayReceiver,type=Member,member=host1-server1 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.geode.management.internal.MBeanJMXAdapter.registerMBean(MBeanJMXAdapter.java:105) ... 18 more
The fix implies:
. Change the maxOccurs attribute from unbounded to 1 in the cache-1.0.xsd file.
. Add the validation to the GatewayReceiverFactoryImpl.create() method, as this is the single entry point for GatewayReceiver instance creations.
Attachments
Issue Links
- links to