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);
