This is an automated email from the ASF dual-hosted git repository.

bschuchardt pushed a commit to branch feature/GEODE-6883-mcast-problems
in repository https://gitbox.apache.org/repos/asf/geode.git

commit 43f02f07b05a62da6219a592a8b86a348682a3ec
Author: Bruce Schuchardt <[email protected]>
AuthorDate: Wed Aug 7 14:13:44 2019 -0700

    GEODE-6883 refactor GMS classes
    
    refactoring to remove references to InternalDistributedMember or
    DistributionMessage in "gms" packages caused failures when
    multicast is enabled on Regions.
    
    Queued messages received during startup have partial sender identifiers
    and these need to have their isPartial bit set correctly so they won't
    be treated as full identifiers.
---
 .../cache30/DistributedMulticastRegionDUnitTest.java   |  5 ++---
 .../internal/membership/InternalDistributedMember.java |  4 ++--
 .../internal/membership/MembershipView.java            | 18 ++++++++++++++++++
 .../distributed/internal/membership/NetMember.java     |  3 +++
 .../internal/membership/adapter/GMSMemberAdapter.java  |  5 +++++
 .../membership/adapter/GMSMembershipManager.java       |  1 +
 .../distributed/internal/membership/gms/GMSMember.java | 15 +++++++++++----
 .../membership/gms/messenger/JGroupsMessenger.java     |  2 +-
 8 files changed, 43 insertions(+), 10 deletions(-)

diff --git 
a/geode-core/src/distributedTest/java/org/apache/geode/cache30/DistributedMulticastRegionDUnitTest.java
 
b/geode-core/src/distributedTest/java/org/apache/geode/cache30/DistributedMulticastRegionDUnitTest.java
index 2e2b7ff..fcb4727 100755
--- 
a/geode-core/src/distributedTest/java/org/apache/geode/cache30/DistributedMulticastRegionDUnitTest.java
+++ 
b/geode-core/src/distributedTest/java/org/apache/geode/cache30/DistributedMulticastRegionDUnitTest.java
@@ -35,7 +35,6 @@ import java.util.concurrent.TimeUnit;
 
 import org.assertj.core.api.Assertions;
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 
 import org.apache.geode.cache.AttributesFactory;
@@ -133,7 +132,6 @@ public class DistributedMulticastRegionDUnitTest extends 
JUnit4CacheTestCase {
     closeLocator();
   }
 
-  @Ignore
   @Test
   public void testMulticastAfterReconnect() {
     final String name = "mcastRegion";
@@ -166,7 +164,7 @@ public class DistributedMulticastRegionDUnitTest extends 
JUnit4CacheTestCase {
 
     DistributedTestUtils.crashDistributedSystem(vm1);
     vm0.invoke(doPuts);
-    vm1.invoke(() -> {
+    vm1.invoke("wait for vm1 to reconnect", () -> {
       basicGetCache().waitUntilReconnected(30, TimeUnit.SECONDS);
       assertNotNull(basicGetCache().getReconnectedCache());
       cache = (InternalCache) basicGetCache().getReconnectedCache();
@@ -281,6 +279,7 @@ public class DistributedMulticastRegionDUnitTest extends 
JUnit4CacheTestCase {
   @Override
   public Properties getDistributedSystemProperties() {
     Properties p = new Properties();
+    p.put(NAME, "vm" + VM.getCurrentVMNum());
     p.put(DISABLE_AUTO_RECONNECT, "false");
     p.put(MAX_WAIT_TIME_RECONNECT, "20");
     p.put(STATISTIC_SAMPLING_ENABLED, "true");
diff --git 
a/geode-core/src/main/java/org/apache/geode/distributed/internal/membership/InternalDistributedMember.java
 
b/geode-core/src/main/java/org/apache/geode/distributed/internal/membership/InternalDistributedMember.java
index bd14909..7327829 100755
--- 
a/geode-core/src/main/java/org/apache/geode/distributed/internal/membership/InternalDistributedMember.java
+++ 
b/geode-core/src/main/java/org/apache/geode/distributed/internal/membership/InternalDistributedMember.java
@@ -174,7 +174,7 @@ public class InternalDistributedMember implements 
DistributedMember, Externaliza
   public InternalDistributedMember(NetMember m) {
     netMbr = m;
 
-    if (netMbr.getHostName() == null) {
+    if (netMbr.getHostName() == null || netMbr.isPartial()) {
       String hostName = SocketCreator.resolve_dns ? 
SocketCreator.getHostName(m.getInetAddress())
           : m.getInetAddress().getHostAddress();
       netMbr.setHostName(hostName);
@@ -187,7 +187,7 @@ public class InternalDistributedMember implements 
DistributedMember, Externaliza
       this.versionObj = Version.CURRENT;
     }
     cachedToString = null;
-    this.isPartial = false;
+    this.isPartial = m.isPartial();
   }
 
   /**
diff --git 
a/geode-core/src/main/java/org/apache/geode/distributed/internal/membership/MembershipView.java
 
b/geode-core/src/main/java/org/apache/geode/distributed/internal/membership/MembershipView.java
index 9371cae..096b62d 100644
--- 
a/geode-core/src/main/java/org/apache/geode/distributed/internal/membership/MembershipView.java
+++ 
b/geode-core/src/main/java/org/apache/geode/distributed/internal/membership/MembershipView.java
@@ -148,6 +148,24 @@ public class MembershipView {
     return null;
   }
 
+
+  /**
+   * Returns the ID from this view that is equal to the argument. If no such 
ID exists the argument
+   * is returned.
+   */
+  public synchronized InternalDistributedMember 
getCanonicalID(InternalDistributedMember id) {
+    if (hashedMembers.contains(id)) {
+      for (InternalDistributedMember m : this.members) {
+        if (id.equals(m)) {
+          return m;
+        }
+      }
+    }
+    return id;
+  }
+
+
+
   public InternalDistributedMember getCoordinator() {
     for (InternalDistributedMember addr : members) {
       if (addr.getNetMember().preferredForCoordinator()) {
diff --git 
a/geode-core/src/main/java/org/apache/geode/distributed/internal/membership/NetMember.java
 
b/geode-core/src/main/java/org/apache/geode/distributed/internal/membership/NetMember.java
index 920db7c..1623bd7 100755
--- 
a/geode-core/src/main/java/org/apache/geode/distributed/internal/membership/NetMember.java
+++ 
b/geode-core/src/main/java/org/apache/geode/distributed/internal/membership/NetMember.java
@@ -109,4 +109,7 @@ public interface NetMember extends Comparable<NetMember> {
   void setHostName(String hostName);
 
   String getHostName();
+
+  /** is this a partial ID created without full identifier information? */
+  boolean isPartial();
 }
diff --git 
a/geode-core/src/main/java/org/apache/geode/distributed/internal/membership/adapter/GMSMemberAdapter.java
 
b/geode-core/src/main/java/org/apache/geode/distributed/internal/membership/adapter/GMSMemberAdapter.java
index 978fdef..a06e362 100644
--- 
a/geode-core/src/main/java/org/apache/geode/distributed/internal/membership/adapter/GMSMemberAdapter.java
+++ 
b/geode-core/src/main/java/org/apache/geode/distributed/internal/membership/adapter/GMSMemberAdapter.java
@@ -171,6 +171,11 @@ public class GMSMemberAdapter implements NetMember {
   }
 
   @Override
+  public boolean isPartial() {
+    return gmsMember.isPartial();
+  }
+
+  @Override
   public void setDurableClientAttributes(DurableClientAttributes attributes) {
     durableClientAttributes = attributes;
     if (attributes != null) {
diff --git 
a/geode-core/src/main/java/org/apache/geode/distributed/internal/membership/adapter/GMSMembershipManager.java
 
b/geode-core/src/main/java/org/apache/geode/distributed/internal/membership/adapter/GMSMembershipManager.java
index 881866c..3893e41 100644
--- 
a/geode-core/src/main/java/org/apache/geode/distributed/internal/membership/adapter/GMSMembershipManager.java
+++ 
b/geode-core/src/main/java/org/apache/geode/distributed/internal/membership/adapter/GMSMembershipManager.java
@@ -1151,6 +1151,7 @@ public class GMSMembershipManager implements 
MembershipManager {
 
     if (o.isDistributionMessage()) { // normal message
       try {
+        o.dmsg.setSender(latestView.getCanonicalID(o.dmsg.getSender()));
         dispatchMessage(o.dmsg);
       } catch (MemberShunnedException e) {
         // message from non-member - ignore
diff --git 
a/geode-core/src/main/java/org/apache/geode/distributed/internal/membership/gms/GMSMember.java
 
b/geode-core/src/main/java/org/apache/geode/distributed/internal/membership/gms/GMSMember.java
index bacae83..71ec3a1 100755
--- 
a/geode-core/src/main/java/org/apache/geode/distributed/internal/membership/gms/GMSMember.java
+++ 
b/geode-core/src/main/java/org/apache/geode/distributed/internal/membership/gms/GMSMember.java
@@ -64,6 +64,11 @@ public class GMSMember implements DataSerializableFixedID {
   private String durableId;
   private int durableTimeout;
 
+  private boolean isPartial; // transient state - created with 
readEssentialData
+
+  public boolean isPartial() {
+    return isPartial;
+  }
 
   // Used only by Externalization
   public GMSMember() {}
@@ -340,10 +345,11 @@ public class GMSMember implements DataSerializableFixedID 
{
     StringBuilder sb = new StringBuilder(100);
     String uuid = formatUUID();
 
-    
sb.append("GMSMember[addr=").append(inetAddr).append(";port=").append(udpPort)
-        
.append(";kind=").append(vmKind).append(";processId=").append(";viewId=").append(vmViewId)
-        .append(processId).append(";v").append(versionOrdinal).append(";name=")
-        .append(name).append(uuid).append(";weight=").append(memberWeight)
+    sb.append("GMSMember[name=").append(name)
+        .append(";addr=").append(inetAddr).append(";port=").append(udpPort)
+        
.append(";kind=").append(vmKind).append(";processId=").append(processId)
+        .append(";viewId=").append(vmViewId)
+        .append(";version=").append(versionOrdinal).append(uuid)
         .append("]");
     return sb.toString();
   }
@@ -620,6 +626,7 @@ public class GMSMember implements DataSerializableFixedID {
     if 
(InternalDataSerializer.getVersionForDataStream(in).compareTo(Version.GEODE_1_2_0)
 >= 0) {
       this.vmKind = in.readByte();
     }
+    this.isPartial = true;
   }
 
 
diff --git 
a/geode-core/src/main/java/org/apache/geode/distributed/internal/membership/gms/messenger/JGroupsMessenger.java
 
b/geode-core/src/main/java/org/apache/geode/distributed/internal/membership/gms/messenger/JGroupsMessenger.java
index 6e396e8..8b0dcf6 100644
--- 
a/geode-core/src/main/java/org/apache/geode/distributed/internal/membership/gms/messenger/JGroupsMessenger.java
+++ 
b/geode-core/src/main/java/org/apache/geode/distributed/internal/membership/gms/messenger/JGroupsMessenger.java
@@ -1170,7 +1170,7 @@ public class JGroupsMessenger implements Messenger {
           try {
             Digest digest = new Digest();
             digest.readFrom(dis);
-            logger.trace("installing JGroups message digest {}", digest);
+            logger.trace("installing JGroups message digest {} from {}", 
digest, m);
             this.myChannel.getProtocolStack().getTopProtocol()
                 .down(new Event(Event.MERGE_DIGEST, digest));
             jrsp.setMessengerData(null);

Reply via email to