Uploaded image for project: 'Geode'
  1. Geode
  2. GEODE-3987

Enforce the uniqueness of a single gateway-receiver per member

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Major
    • Resolution: Fixed
    • None
    • 1.4.0
    • 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

          Activity

            People

              jjramos Juan Ramos
              jjramos Juan Ramos
              Votes:
              1 Vote for this issue
              Watchers:
              3 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved: