[ 
https://issues.apache.org/jira/browse/GEODE-8202?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17259274#comment-17259274
 ] 

ASF GitHub Bot commented on GEODE-8202:
---------------------------------------

boglesby commented on pull request #5600:
URL: https://github.com/apache/geode/pull/5600#issuecomment-754953043


   I'm still reviewing these changes, but here are a few things I see.
   
   I can run a test like:
   
   1. Start server 1 with a gateway sender with 
enforce-threads-connect-same-receiver=true
   2. Start server 1 with a gateway sender with 
enforce-threads-connect-same-receiver=false
   
   The servers successfully start up in this case, but I don't think they 
should with these conflicting property values.
   
   The gfsh commands look like:
   ```
   start server --name=server-A-1 --group=server-A-1 
--locators=localhost[10331] --mcast-port=0 --server-port=0
   
   start server --name=server-A-2 --group=server-A-2 
--locators=localhost[10331] --mcast-port=0 --server-port=0
   
   create gateway-sender --id=B --group=server-A-1 
--remote-distributed-system-id=2 --enforce-threads-connect-same-receiver=true
   
   create gateway-sender --id=B --group=server-A-2 
--remote-distributed-system-id=2 --enforce-threads-connect-same-receiver=false
   ```
   The generated xml looks like:
   
   server-A-1:
   ```
   <cache ...>
     <gateway-sender enforce-threads-connect-same-receiver="true" id="B" .../>
   </cache>
   ```
   server-A-2:
   ```
   <cache ...>
     <gateway-sender enforce-threads-connect-same-receiver="false" id="B" .../>
   </cache>
   ```
   Here is an example where conflicting gateway sender parameters cause the 
startup to fail:
   ```
   create gateway-sender --id=B --group=server-A-1 
--remote-distributed-system-id=2 --parallel=true
   
   create gateway-sender --id=B --group=server-A-2 
--remote-distributed-system-id=2 --parallel=false
   ```
   This error message is logged:
   ```
   Executing - create gateway-sender --id=B --group=server-A-2 
--remote-distributed-system-id=2 --parallel=false
   
     Member   | Status | Message
   ---------- | ------ | 
--------------------------------------------------------------------------------------------------------------------------------------------------------------
   server-A-2 | ERROR  |  java.lang.IllegalStateException: Cannot create 
Gateway Sender B as serial gateway sender because another cache has the same 
sender as parallel gateway sender
   
   And this error message is in the logs:
   
   [error 2021/01/05 12:05:51.385 PST server-A-2 <Function Execution 
Processor2> tid=0x3f] Cannot create Gateway Sender B as serial gateway sender 
because another cache has the same sender as parallel gateway sender
   java.lang.IllegalStateException: Cannot create Gateway Sender B as serial 
gateway sender because another cache has the same sender as parallel gateway 
sender
        at Remote Member '10.166.145.67(server-A-1:89588)<v1>:41001' in 
org.apache.geode.internal.cache.wan.GatewaySenderAdvisor.checkCompatibility(GatewaySenderAdvisor.java:125)
        at Remote Member '10.166.145.67(server-A-1:89588)<v1>:41001' in 
org.apache.geode.internal.cache.wan.GatewaySenderAdvisor.profileCreated(GatewaySenderAdvisor.java:105)
        at Remote Member '10.166.145.67(server-A-1:89588)<v1>:41001' in 
org.apache.geode.distributed.internal.DistributionAdvisor.doPutProfile(DistributionAdvisor.java:625)
        at Remote Member '10.166.145.67(server-A-1:89588)<v1>:41001' in 
org.apache.geode.distributed.internal.DistributionAdvisor.putProfile(DistributionAdvisor.java:523)
        at Remote Member '10.166.145.67(server-A-1:89588)<v1>:41001' in 
org.apache.geode.distributed.internal.DistributionAdvisor.putProfile(DistributionAdvisor.java:518)
        at Remote Member '10.166.145.67(server-A-1:89588)<v1>:41001' in 
org.apache.geode.distributed.internal.DistributionAdvisor$Profile.handleDistributionAdvisee(DistributionAdvisor.java:1537)
        at Remote Member '10.166.145.67(server-A-1:89588)<v1>:41001' in 
org.apache.geode.internal.cache.wan.GatewaySenderAdvisor$GatewaySenderProfile.processIncoming(GatewaySenderAdvisor.java:708)
        at 
org.apache.geode.distributed.internal.ReplyException.handleCause(ReplyException.java:86)
        at 
org.apache.geode.internal.cache.UpdateAttributesProcessor.waitForProfileResponse(UpdateAttributesProcessor.java:113)
        at 
org.apache.geode.internal.cache.UpdateAttributesProcessor.distribute(UpdateAttributesProcessor.java:99)
        at 
org.apache.geode.internal.cache.GemFireCacheImpl.addGatewaySender(GemFireCacheImpl.java:3732)
        at 
org.apache.geode.internal.cache.wan.GatewaySenderFactoryImpl.create(GatewaySenderFactoryImpl.java:300)
        at 
org.apache.geode.management.internal.cli.functions.GatewaySenderCreateFunction.createGatewaySender(GatewaySenderCreateFunction.java:183)
        at 
org.apache.geode.management.internal.cli.functions.GatewaySenderCreateFunction.execute(GatewaySenderCreateFunction.java:60)
   ```
   Something similar should happen with the 
enforce-threads-connect-same-receiver property.
   
   This check and error message are coming from 
GatewaySenderAdvisor.checkCompatibility.
   
   GatewaySenderProfile needs to be updated to include 
enforceThreadsConnectSameReceiver. Here are some changes that do this:
   ```
   diff --git 
a/geode-core/src/main/java/org/apache/geode/internal/cache/wan/GatewaySenderAdvisor.java
 
b/geode-core/src/main/java/org/apache/geode/internal/cache/wan/GatewaySenderAdvisor.java
   index adf80cb1e5..dc70a0ae6b 100644
   --- 
a/geode-core/src/main/java/org/apache/geode/internal/cache/wan/GatewaySenderAdvisor.java
   +++ 
b/geode-core/src/main/java/org/apache/geode/internal/cache/wan/GatewaySenderAdvisor.java
   @@ -232,6 +232,14 @@ public class GatewaySenderAdvisor extends 
DistributionAdvisor {
                  "Cannot create Gateway Sender %s with isDiskSynchronous %s 
because another cache has the same Gateway Sender defined with 
isDiskSynchronous %s",
                  sp.Id, sp.isDiskSynchronous, sender.isDiskSynchronous()));
        }
   +
   +    if (sp.enforceThreadsConnectSameReceiver != 
sender.getEnforceThreadsConnectSameReceiver()) {
   +      throw new IllegalStateException(
   +          String.format(
   +              "Cannot create Gateway Sender %s with 
enforceThreadsConnectSameReceiver %s because another cache has the same Gateway 
Sender defined with enforceThreadsConnectSameReceiver %s",
   +              sp.Id, sp.enforceThreadsConnectSameReceiver,
   +              sender.getEnforceThreadsConnectSameReceiver()));
   +    }
      }
    
      /**
   @@ -532,6 +540,8 @@ public class GatewaySenderAdvisor extends 
DistributionAdvisor {
    
        public ServerLocation serverLocation;
    
   +    public boolean enforceThreadsConnectSameReceiver = false;
   +
        public GatewaySenderProfile(InternalDistributedMember memberId, int 
version) {
          super(memberId, version);
        }
   @@ -578,6 +588,7 @@ public class GatewaySenderAdvisor extends 
DistributionAdvisor {
            this.serverLocation = new ServerLocation();
            InternalDataSerializer.invokeFromData(this.serverLocation, in);
          }
   +      this.enforceThreadsConnectSameReceiver = in.readBoolean();
        }
    
        @Override
   @@ -617,6 +628,7 @@ public class GatewaySenderAdvisor extends 
DistributionAdvisor {
          if (serverLocationFound) {
            InternalDataSerializer.invokeToData(serverLocation, out);
          }
   +      out.writeBoolean(enforceThreadsConnectSameReceiver);
        }
    
        public void fromDataPre_GFE_8_0_0_0(DataInput in, 
DeserializationContext context)
   diff --git 
a/geode-wan/src/main/java/org/apache/geode/internal/cache/wan/serial/SerialGatewaySenderImpl.java
 
b/geode-wan/src/main/java/org/apache/geode/internal/cache/wan/serial/SerialGatewaySenderImpl.java
   index 7c93836667..1b5206b532 100644
   --- 
a/geode-wan/src/main/java/org/apache/geode/internal/cache/wan/serial/SerialGatewaySenderImpl.java
   +++ 
b/geode-wan/src/main/java/org/apache/geode/internal/cache/wan/serial/SerialGatewaySenderImpl.java
   @@ -230,6 +230,7 @@ public class SerialGatewaySenderImpl extends 
AbstractRemoteGatewaySender {
        pf.dispatcherThreads = getDispatcherThreads();
        pf.orderPolicy = getOrderPolicy();
        pf.serverLocation = this.getServerLocation();
   +    pf.enforceThreadsConnectSameReceiver = 
getEnforceThreadsConnectSameReceiver();
      }
    
      @Override
   ```
   With these changes, gfsh logs this error message:
   ```
   Executing - create gateway-sender --id=B --group=server-A-2 
--remote-distributed-system-id=2 --enforce-threads-connect-same-receiver=false
   
     Member   | Status | Message
   ---------- | ------ | 
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
   server-A-2 | ERROR  |  java.lang.IllegalStateException: Cannot create 
Gateway Sender B with enforceThreadsConnectSameReceiver false because another 
cache has the same Gateway Sender defined with 
enforceThreadsConnectSameReceiver true
   ```
   There might be a problem with these changes as written though. gfsh prevents 
gateway senders from being created while all the members are not the current 
version, but thats not true for GemFire xml. 
   
   If I run a test like this with these changes:
   
   1. Start locator with an older version
   2. Start several servers with GemFire xml
   3. Bounce locator to a newer version
   4. Start server with the newer version
   
   In this case, I see an exception like this in the new server when it tries 
to deserialize a GatewaySenderProfile from an older member:
   ```
   [fatal 2021/01/05 14:01:51.543 PST server-A-new <P2P message reader for 
10.166.145.67(server-A-2:97374)<v2>:41002(version:GEODE 1.13.0) shared 
unordered uid=12 local port=41102 remote port=63358> tid=0x2b] Error 
deserializing message
   java.nio.BufferUnderflowException
        at java.nio.Buffer.nextGetIndex(Buffer.java:500)
        at java.nio.DirectByteBuffer.get(DirectByteBuffer.java:249)
        at 
org.apache.geode.internal.tcp.ByteBufferInputStream$ByteBufferByteSource.get(ByteBufferInputStream.java:206)
        at 
org.apache.geode.internal.tcp.ByteBufferInputStream.readBoolean(ByteBufferInputStream.java:878)
        at 
org.apache.geode.internal.cache.wan.GatewaySenderAdvisor$GatewaySenderProfile.fromData(GatewaySenderAdvisor.java:592)
   ```
   I'm not sure if this case needs to be supported. If so, then the 
GatewaySenderProfile toData/fromData will have to handle versioning.
   
   btw - this same change might need to be made for the groupTransactionEvents 
property.


----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


> New option for serial gw sender threads start when receivers share ip and port
> ------------------------------------------------------------------------------
>
>                 Key: GEODE-8202
>                 URL: https://issues.apache.org/jira/browse/GEODE-8202
>             Project: Geode
>          Issue Type: Improvement
>            Reporter: Alberto Bustamante Reyes
>            Assignee: Alberto Bustamante Reyes
>            Priority: Major
>              Labels: pull-request-available
>
> RFC: 
> [https://cwiki.apache.org/confluence/display/GEODE/New+option+for+serial+gw+sender+dispatcher+threads+start|https://cwiki.apache.org/confluence/display/GEODE/New+option+for+serial+gw+sender+dispatcher+threads+start]



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to