Repository: incubator-geode Updated Branches: refs/heads/feature/GEODE-77 e7a6a28b2 -> 43a368831
GEODE-77 fixing test issues and an error in GMSMember.compareTo Project: http://git-wip-us.apache.org/repos/asf/incubator-geode/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-geode/commit/43a36883 Tree: http://git-wip-us.apache.org/repos/asf/incubator-geode/tree/43a36883 Diff: http://git-wip-us.apache.org/repos/asf/incubator-geode/diff/43a36883 Branch: refs/heads/feature/GEODE-77 Commit: 43a368831d350f58bb3b7ba40d9292b0157eaa7e Parents: e7a6a28 Author: Bruce Schuchardt <[email protected]> Authored: Tue Sep 15 10:02:48 2015 -0700 Committer: Bruce Schuchardt <[email protected]> Committed: Tue Sep 15 10:02:48 2015 -0700 ---------------------------------------------------------------------- .../internal/DistributionManager.java | 4 +- .../internal/direct/DirectChannel.java | 4 +- .../membership/InternalDistributedMember.java | 8 +- .../internal/membership/NetView.java | 4 +- .../internal/membership/gms/GMSMember.java | 12 - .../membership/gms/GMSMemberFactory.java | 7 +- .../membership/gms/auth/GMSAuthenticator.java | 14 +- .../gms/locator/FindCoordinatorRequest.java | 12 +- .../gms/locator/FindCoordinatorResponse.java | 11 +- .../membership/gms/locator/GMSLocator.java | 15 +- .../membership/gms/membership/GMSJoinLeave.java | 18 +- .../gms/messenger/JGroupsMessenger.java | 4 +- .../gms/mgr/GMSMembershipManager.java | 18 +- .../gemfire/internal/i18n/LocalizedStrings.java | 3 +- .../MemoryThresholdsOffHeapDUnitTest.java | 4 +- .../DistributedAckRegionCCEDUnitTest.java | 4 - .../DistributedNoAckRegionCCEDUnitTest.java | 5 - .../cache30/GlobalRegionCCEDUnitTest.java | 3 - .../gemfire/cache30/MultiVMRegionTestCase.java | 216 ----------------- .../distributed/DistributedSystemDUnitTest.java | 45 ---- .../gemfire/distributed/LocatorDUnitTest.java | 148 ------------ .../membership/MembershipJUnitTest.java | 7 +- .../gms/locator/GMSLocatorJUnitTest.java | 15 +- .../gms/membership/StatRecorderJUnitTest.java | 14 +- .../internal/cache/Bug33726JUnitTest.java | 2 + .../versions/RegionVersionVectorJUnitTest.java | 231 ++++++++++++++++++- .../gemfire/memcached/IntegrationJUnitTest.java | 2 + 27 files changed, 339 insertions(+), 491 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/43a36883/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/DistributionManager.java ---------------------------------------------------------------------- diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/DistributionManager.java b/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/DistributionManager.java index ef8fcb1..fdd8092 100644 --- a/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/DistributionManager.java +++ b/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/DistributionManager.java @@ -3395,8 +3395,8 @@ public class DistributionManager // message.setRecipient(DistributionManager.this.getId()); - if (logger.isTraceEnabled()) { - logger.trace("Received message '{}' from <{}>", message, message.getSender()); + if (logger.isDebugEnabled()) { + logger.debug("Received message '{}' from <{}>", message, message.getSender()); } scheduleIncomingMessage(message); } http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/43a36883/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/direct/DirectChannel.java ---------------------------------------------------------------------- diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/direct/DirectChannel.java b/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/direct/DirectChannel.java index acfb060..22b97cb 100644 --- a/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/direct/DirectChannel.java +++ b/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/direct/DirectChannel.java @@ -457,8 +457,8 @@ public class DirectChannel { } try { - if (logger.isTraceEnabled(LogMarker.DM)) { - logger.trace(LogMarker.DM, "{}{}) to {} peers ({}) via tcp/ip", + if (logger.isDebugEnabled()) { + logger.debug("{}{}) to {} peers ({}) via tcp/ip", (retry ? "Retrying send (" : "Sending ("), msg, cons.size(), cons); } DMStats stats = getDMStats(); http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/43a36883/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/InternalDistributedMember.java ---------------------------------------------------------------------- diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/InternalDistributedMember.java b/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/InternalDistributedMember.java index d29fe97..c18d237 100755 --- a/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/InternalDistributedMember.java +++ b/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/InternalDistributedMember.java @@ -653,8 +653,12 @@ public final class InternalDistributedMember } } - return this.netMbr.compareTo(other.netMbr); - + if (this.netMbr != null && other.netMbr != null) { + return this.netMbr.compareTo(other.netMbr); + } else { + return 0; + } + // purposely avoid comparing roles // @todo Add durableClientAttributes to compare } http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/43a36883/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/NetView.java ---------------------------------------------------------------------- diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/NetView.java b/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/NetView.java index 60be680..b2867db 100644 --- a/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/NetView.java +++ b/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/NetView.java @@ -336,8 +336,8 @@ public class NetView implements DataSerializableFixedID { * that were members of the given view. Admin-only members are * not counted */ - public List<InternalDistributedMember> getActualCrashedMembers(NetView oldView) { - List<InternalDistributedMember> result = new ArrayList<>(this.crashedMembers.size()); + public Set<InternalDistributedMember> getActualCrashedMembers(NetView oldView) { + Set<InternalDistributedMember> result = new HashSet<>(this.crashedMembers.size()); for (InternalDistributedMember mbr : this.crashedMembers) { if ((mbr.getVmKind() != DistributionManager.ADMIN_ONLY_DM_TYPE) && oldView.contains(mbr)) { result.add(mbr); http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/43a36883/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/GMSMember.java ---------------------------------------------------------------------- diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/GMSMember.java b/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/GMSMember.java index 0cf2cc7..efd2067 100755 --- a/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/GMSMember.java +++ b/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/GMSMember.java @@ -246,18 +246,6 @@ public class GMSMember implements NetMember, DataSerializableFixedID { } else if (his.vmViewId < this.vmViewId) { result = 1; } - } else if (this.processId != 0 && his.processId != 0) { - // starting in 8.0 we also consider the processId. During startup - // we may have a message from a member that hasn't finished joining - // and address canonicalization may find an old address that has - // the same addr:port. Since the new member doesn't have a viewId - // its address will be equal to the old member's address unless - // we also pay attention to the processId. - if (this.processId < his.processId){ - result = -1; - } else if (his.processId < this.processId) { - result = 1; - } } } if (result == 0 && this.uuidMSBs != 0 && his.uuidMSBs != 0) { http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/43a36883/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/GMSMemberFactory.java ---------------------------------------------------------------------- diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/GMSMemberFactory.java b/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/GMSMemberFactory.java index 8b6be83..8d7cbbf 100755 --- a/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/GMSMemberFactory.java +++ b/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/GMSMemberFactory.java @@ -28,6 +28,8 @@ import com.gemstone.gemfire.internal.Version; import com.gemstone.gemfire.internal.admin.remote.RemoteTransportConfig; import com.gemstone.gemfire.internal.i18n.LocalizedStrings; import com.gemstone.gemfire.internal.tcp.ConnectionException; +import com.gemstone.gemfire.security.AuthenticationFailedException; +import com.gemstone.gemfire.security.AuthenticationRequiredException; /** * Create a new Member based on the given inputs. @@ -107,7 +109,10 @@ public class GMSMemberFactory implements MemberServices { catch (ConnectionException e) { throw new DistributionException(LocalizedStrings.JGroupMemberFactory_UNABLE_TO_CREATE_MEMBERSHIP_MANAGER.toLocalizedString(), e); } - catch (GemFireConfigException | SystemConnectException e) { + catch (GemFireConfigException + | SystemConnectException + | AuthenticationFailedException + | AuthenticationRequiredException e) { throw e; } catch (RuntimeException e) { http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/43a36883/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/auth/GMSAuthenticator.java ---------------------------------------------------------------------- diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/auth/GMSAuthenticator.java b/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/auth/GMSAuthenticator.java index 7e7072d..c4b822e 100755 --- a/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/auth/GMSAuthenticator.java +++ b/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/auth/GMSAuthenticator.java @@ -7,6 +7,7 @@ import com.gemstone.gemfire.distributed.internal.membership.NetView; import com.gemstone.gemfire.distributed.internal.membership.gms.Services; import com.gemstone.gemfire.distributed.internal.membership.gms.interfaces.Authenticator; import com.gemstone.gemfire.internal.ClassLoadUtil; +import com.gemstone.gemfire.internal.i18n.LocalizedStrings; import com.gemstone.gemfire.internal.logging.InternalLogWriter; import com.gemstone.gemfire.security.AuthInitialize; import com.gemstone.gemfire.security.AuthenticationFailedException; @@ -18,6 +19,7 @@ import java.security.Principal; import java.util.Properties; import java.util.Set; + // static messages import static com.gemstone.gemfire.internal.i18n.LocalizedStrings.HandShake_AUTHENTICATOR_INSTANCE_COULD_NOT_BE_OBTAINED; import static com.gemstone.gemfire.internal.i18n.LocalizedStrings.HandShake_FAILED_TO_ACQUIRE_AUTHENTICATOR_OBJECT; @@ -163,11 +165,19 @@ public class GMSAuthenticator implements Authenticator { */ @Override public Object getCredentials(InternalDistributedMember member) { - return getCredentials(member, securityProps); + try { + return getCredentials(member, securityProps); + } catch (Exception e) { + String authMethod = securityProps.getProperty(SECURITY_PEER_AUTH_INIT_NAME); + services.getSecurityLogWriter().warning( + LocalizedStrings.AUTH_FAILED_TO_OBTAIN_CREDENTIALS_IN_0_USING_AUTHINITIALIZE_1_2, + new Object[] {authMethod, e.getLocalizedMessage()}); + return null; + } } // for unit test - /* package */ Properties getCredentials(DistributedMember member, Properties secProps) { + Properties getCredentials(DistributedMember member, Properties secProps) { Properties credentials = null; String authMethod = secProps.getProperty(SECURITY_PEER_AUTH_INIT_NAME); try { http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/43a36883/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/locator/FindCoordinatorRequest.java ---------------------------------------------------------------------- diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/locator/FindCoordinatorRequest.java b/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/locator/FindCoordinatorRequest.java index 9af29a1..da79b03 100755 --- a/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/locator/FindCoordinatorRequest.java +++ b/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/locator/FindCoordinatorRequest.java @@ -16,14 +16,16 @@ public class FindCoordinatorRequest implements DataSerializableFixedID, PeerLoca private InternalDistributedMember memberID; private Collection<InternalDistributedMember> rejectedCoordinators; + private int lastViewId; public FindCoordinatorRequest(InternalDistributedMember myId) { this.memberID = myId; } - public FindCoordinatorRequest(InternalDistributedMember myId, Collection<InternalDistributedMember> rejectedCoordinators) { + public FindCoordinatorRequest(InternalDistributedMember myId, Collection<InternalDistributedMember> rejectedCoordinators, int lastViewId) { this.memberID = myId; this.rejectedCoordinators = rejectedCoordinators; + this.lastViewId = lastViewId; } public FindCoordinatorRequest() { @@ -38,11 +40,15 @@ public class FindCoordinatorRequest implements DataSerializableFixedID, PeerLoca return rejectedCoordinators; } + public int getLastViewId() { + return this.lastViewId; + } + @Override public String toString() { if (rejectedCoordinators != null) { return "FindCoordinatorRequest(memberID="+memberID - +", rejected="+rejectedCoordinators+")"; + +", rejected="+rejectedCoordinators+", lastViewId="+lastViewId+")"; } else { return "FindCoordinatorRequest(memberID="+memberID+")"; } @@ -62,12 +68,14 @@ public class FindCoordinatorRequest implements DataSerializableFixedID, PeerLoca public void toData(DataOutput out) throws IOException { DataSerializer.writeObject(this.memberID, out); DataSerializer.writeObject(this.rejectedCoordinators, out); + out.writeInt(lastViewId); } @Override public void fromData(DataInput in) throws IOException, ClassNotFoundException { this.memberID = DataSerializer.readObject(in); this.rejectedCoordinators = DataSerializer.readObject(in); + this.lastViewId = in.readInt(); } } http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/43a36883/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/locator/FindCoordinatorResponse.java ---------------------------------------------------------------------- diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/locator/FindCoordinatorResponse.java b/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/locator/FindCoordinatorResponse.java index ea443e6..61d2333 100755 --- a/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/locator/FindCoordinatorResponse.java +++ b/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/locator/FindCoordinatorResponse.java @@ -5,8 +5,6 @@ import java.io.DataOutput; import java.io.IOException; import com.gemstone.gemfire.DataSerializer; -import com.gemstone.gemfire.distributed.internal.DistributionManager; -import com.gemstone.gemfire.distributed.internal.HighPriorityDistributionMessage; import com.gemstone.gemfire.distributed.internal.membership.InternalDistributedMember; import com.gemstone.gemfire.internal.DataSerializableFixedID; import com.gemstone.gemfire.internal.Version; @@ -15,12 +13,13 @@ public class FindCoordinatorResponse implements DataSerializableFixedID { private InternalDistributedMember coordinator; private boolean fromView; + private int viewId; private boolean networkPartitionDetectionEnabled; private boolean usePreferredCoordinators; public FindCoordinatorResponse(InternalDistributedMember coordinator, - boolean fromView, + boolean fromView, int viewId, boolean networkPartitionDectionEnabled, boolean usePreferredCoordinators) { this.coordinator = coordinator; this.networkPartitionDetectionEnabled = networkPartitionDectionEnabled; @@ -47,6 +46,10 @@ public class FindCoordinatorResponse implements DataSerializableFixedID { return fromView; } + public int getViewId() { + return viewId; + } + @Override public String toString() { return "FindCoordinatorResponse(coordinator="+coordinator+")"; @@ -67,6 +70,7 @@ public class FindCoordinatorResponse implements DataSerializableFixedID { @Override public void toData(DataOutput out) throws IOException { DataSerializer.writeObject(coordinator, out); + out.writeInt(viewId); out.writeBoolean(fromView); out.writeBoolean(networkPartitionDetectionEnabled); out.writeBoolean(usePreferredCoordinators); @@ -75,6 +79,7 @@ public class FindCoordinatorResponse implements DataSerializableFixedID { @Override public void fromData(DataInput in) throws IOException, ClassNotFoundException { coordinator = DataSerializer.readObject(in); + int viewId = in.readInt(); fromView = in.readBoolean(); networkPartitionDetectionEnabled = in.readBoolean(); usePreferredCoordinators = in.readBoolean(); http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/43a36883/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/locator/GMSLocator.java ---------------------------------------------------------------------- diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/locator/GMSLocator.java b/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/locator/GMSLocator.java index 3296b80..7298b86 100755 --- a/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/locator/GMSLocator.java +++ b/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/locator/GMSLocator.java @@ -148,9 +148,16 @@ public class GMSLocator implements Locator, NetLocator { } boolean fromView = false; + int viewId = -1; if (view != null) { - coord = view.getCoordinator(findRequest.getRejectedCoordinators()); + viewId = view.getViewId(); + if (viewId > findRequest.getLastViewId()) { + // ignore the requests rejectedCoordinators if the view has changed + coord = view.getCoordinator(Collections.<InternalDistributedMember>emptyList()); + } else { + coord = view.getCoordinator(findRequest.getRejectedCoordinators()); + } logger.debug("Peer locator: coordinator from view is {}", coord); fromView = true; } @@ -183,7 +190,7 @@ public class GMSLocator implements Locator, NetLocator { logger.debug("Peer locator: coordinator from registrations is {}", coord); } } - response = new FindCoordinatorResponse(coord, fromView, + response = new FindCoordinatorResponse(coord, fromView, viewId, this.networkPartitionDetectionEnabled, this.usePreferredCoordinators); } } @@ -306,10 +313,8 @@ public class GMSLocator implements Locator, NetLocator { } Object o = DataSerializer.readObject(ois2); - if (!(o instanceof NetView)) { - return false; - } this.view = (NetView)o; + logger.info("Peer locator initial membership is " + view); return true; http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/43a36883/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/membership/GMSJoinLeave.java ---------------------------------------------------------------------- diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/membership/GMSJoinLeave.java b/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/membership/GMSJoinLeave.java index af99530..f64538c 100755 --- a/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/membership/GMSJoinLeave.java +++ b/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/membership/GMSJoinLeave.java @@ -158,6 +158,7 @@ public class GMSJoinLeave implements JoinLeave, MessageHandler { */ public boolean join() { Set<InternalDistributedMember> alreadyTried = new HashSet<>(); + int[] lastViewIdHolder = new int[] {-1}; if (Boolean.getBoolean(BYPASS_DISCOVERY)) { becomeCoordinator(); @@ -165,7 +166,7 @@ public class GMSJoinLeave implements JoinLeave, MessageHandler { } for (int tries=0; tries<JOIN_ATTEMPTS; tries++) { - InternalDistributedMember coord = findCoordinator(alreadyTried); + InternalDistributedMember coord = findCoordinator(alreadyTried, lastViewIdHolder); logger.debug("found possible coordinator {}", coord); if (coord != null) { if (coord.equals(this.localAddress)) { @@ -601,12 +602,12 @@ public class GMSJoinLeave implements JoinLeave, MessageHandler { * This contacts the locators to find out who the current coordinator is. * All locators are contacted. If they don't agree then we choose the oldest * coordinator and return it. - * @return */ - private InternalDistributedMember findCoordinator(Set<InternalDistributedMember> alreadyTried) { + private InternalDistributedMember findCoordinator(Set<InternalDistributedMember> alreadyTried, + int[] lastViewIdHolder) { assert this.localAddress != null; - FindCoordinatorRequest request = new FindCoordinatorRequest(this.localAddress, alreadyTried); + FindCoordinatorRequest request = new FindCoordinatorRequest(this.localAddress, alreadyTried, lastViewIdHolder[0]); Set<InternalDistributedMember> coordinators = new HashSet<InternalDistributedMember>(); long giveUpTime = System.currentTimeMillis() + (services.getConfig().getLocatorWaitTime() * 1000L); boolean anyResponses = false; @@ -622,6 +623,13 @@ public class GMSJoinLeave implements JoinLeave, MessageHandler { FindCoordinatorResponse response = (o instanceof FindCoordinatorResponse) ? (FindCoordinatorResponse)o : null; if (response != null && response.getCoordinator() != null) { anyResponses = false; + int viewId = response.getViewId(); + if (viewId > lastViewIdHolder[0]) { + // if the view has changed it is possible that a member + // that we already tried to join with will become coordinator + alreadyTried.clear(); + lastViewIdHolder[0] = viewId; + } coordinators.add(response.getCoordinator()); if (response.isFromView()) { GMSMember mbr = (GMSMember)this.localAddress.getNetMember(); @@ -694,7 +702,7 @@ public class GMSJoinLeave implements JoinLeave, MessageHandler { if (isNetworkPartition(newView)) { if (quorumRequired) { - List<InternalDistributedMember> crashes = newView.getActualCrashedMembers(currentView); + Set<InternalDistributedMember> crashes = newView.getActualCrashedMembers(currentView); services.getManager().forceDisconnect( LocalizedStrings.Network_partition_detected.toLocalizedString(crashes.size(), crashes)); return; http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/43a36883/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/messenger/JGroupsMessenger.java ---------------------------------------------------------------------- diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/messenger/JGroupsMessenger.java b/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/messenger/JGroupsMessenger.java index 2004598..7bd3048 100755 --- a/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/messenger/JGroupsMessenger.java +++ b/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/messenger/JGroupsMessenger.java @@ -409,8 +409,8 @@ public class JGroupsMessenger implements Messenger { filterOutgoingMessage(msg); - if (logger.isTraceEnabled()) { - logger.trace("JGroupsMessenger sending [{}] recipients: {}", msg, msg.getRecipientsDescription()); + if (logger.isDebugEnabled()) { + logger.debug("sending via UDP: [{}] recipients: {}", msg, msg.getRecipientsDescription()); } InternalDistributedMember[] destinations = msg.getRecipients(); http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/43a36883/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/mgr/GMSMembershipManager.java ---------------------------------------------------------------------- diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/mgr/GMSMembershipManager.java b/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/mgr/GMSMembershipManager.java index 200fd85..c8358d9 100755 --- a/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/mgr/GMSMembershipManager.java +++ b/gemfire-core/src/main/java/com/gemstone/gemfire/distributed/internal/membership/gms/mgr/GMSMembershipManager.java @@ -114,6 +114,13 @@ public class GMSMembershipManager implements MembershipManager, Manager private volatile DatagramSocket oldDSUDPSocket; /** + * thread-local used to force use of JGroups for communications, usually to + * avoid deadlock when conserve-sockets=true. Use of this should be removed + * when connection pools are implemented in the direct-channel + */ + private ThreadLocal<Boolean> forceUseJGroups = new ThreadLocal<Boolean>(); + + /** * Trick class to make the startup synch more * visible in stack traces * @@ -2122,7 +2129,9 @@ public class GMSMembershipManager implements MembershipManager, Manager useMcast = (msg.getMulticast() || allDestinations); } - if (useMcast || tcpDisabled) { + boolean sendViaJGroups = isForceUDPCommunications(); // enable when bug #46438 is fixed: || msg.sendViaJGroups(); + + if (useMcast || tcpDisabled || sendViaJGroups) { result = services.getMessenger().send(msg); } else { @@ -2140,9 +2149,14 @@ public class GMSMembershipManager implements MembershipManager, Manager // MembershipManager method @Override public void forceUDPMessagingForCurrentThread() { - // not currently supported by this manager + forceUseJGroups.set(null); } + private boolean isForceUDPCommunications() { + Boolean forced = forceUseJGroups.get(); + return forced == Boolean.TRUE; + } + // MembershipManager method @Override public void releaseUDPMessagingForCurrentThread() { http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/43a36883/gemfire-core/src/main/java/com/gemstone/gemfire/internal/i18n/LocalizedStrings.java ---------------------------------------------------------------------- diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/i18n/LocalizedStrings.java b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/i18n/LocalizedStrings.java index f146834..6230937 100644 --- a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/i18n/LocalizedStrings.java +++ b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/i18n/LocalizedStrings.java @@ -2134,7 +2134,8 @@ public class LocalizedStrings extends ParentLocalizedStrings { public static final StringId AUTH_PEER_AUTHENTICATION_FAILED = new StringId(6609, "Authentication failed. See coordinator [{0}] logs for details."); public static final StringId AUTH_PEER_AUTHENTICATION_MISSING_CREDENTIALS = new StringId(6610, "Failed to find credentials from [{0}] using Authenticator [{1}]"); public static final StringId AUTH_FAILED_TO_ACQUIRE_AUTHINITIALIZE_INSTANCE = new StringId(6611, "AuthInitialize instance could not be obtained"); - + public static final StringId AUTH_FAILED_TO_OBTAIN_CREDENTIALS_IN_0_USING_AUTHINITIALIZE_1_2 = new StringId(6612, "Failed to obtain credentials using AuthInitialize [{1}]. {2}"); + /** Testing strings, messageId 90000-99999 **/ /** These are simple messages for testing, translated with Babelfish. **/ http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/43a36883/gemfire-core/src/test/java/com/gemstone/gemfire/cache/management/MemoryThresholdsOffHeapDUnitTest.java ---------------------------------------------------------------------- diff --git a/gemfire-core/src/test/java/com/gemstone/gemfire/cache/management/MemoryThresholdsOffHeapDUnitTest.java b/gemfire-core/src/test/java/com/gemstone/gemfire/cache/management/MemoryThresholdsOffHeapDUnitTest.java index dd1e7e9..b2ba7fb 100644 --- a/gemfire-core/src/test/java/com/gemstone/gemfire/cache/management/MemoryThresholdsOffHeapDUnitTest.java +++ b/gemfire-core/src/test/java/com/gemstone/gemfire/cache/management/MemoryThresholdsOffHeapDUnitTest.java @@ -100,8 +100,8 @@ public class MemoryThresholdsOffHeapDUnitTest extends BridgeTestCase { @Override public void tearDown2() throws Exception { - super.tearDown2(); invokeInEveryVM(this.resetResourceManager); + super.tearDown2(); } private SerializableCallable resetResourceManager = new SerializableCallable() { @@ -1262,7 +1262,7 @@ public class MemoryThresholdsOffHeapDUnitTest extends BridgeTestCase { final int port1 = ports[0]; final int port2 = ports[1]; final int port3 = ports[2]; - final String regionName = "testEventOrger"; + final String regionName = "testEventOrder"; startCacheServer(server1, port1, 0f, 0f, regionName, false/*createPR*/, false/*notifyBySubscription*/, 0); http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/43a36883/gemfire-core/src/test/java/com/gemstone/gemfire/cache30/DistributedAckRegionCCEDUnitTest.java ---------------------------------------------------------------------- diff --git a/gemfire-core/src/test/java/com/gemstone/gemfire/cache30/DistributedAckRegionCCEDUnitTest.java b/gemfire-core/src/test/java/com/gemstone/gemfire/cache30/DistributedAckRegionCCEDUnitTest.java index fd92cf0..f73c007 100644 --- a/gemfire-core/src/test/java/com/gemstone/gemfire/cache30/DistributedAckRegionCCEDUnitTest.java +++ b/gemfire-core/src/test/java/com/gemstone/gemfire/cache30/DistributedAckRegionCCEDUnitTest.java @@ -124,10 +124,6 @@ public class DistributedAckRegionCCEDUnitTest extends DistributedAckRegionDUnitT // } // } - public void testRegionVersionVectors() throws Exception { - versionTestRegionVersionVectors(); - } - @Override public void testEntryTtlLocalDestroy() throws InterruptedException { http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/43a36883/gemfire-core/src/test/java/com/gemstone/gemfire/cache30/DistributedNoAckRegionCCEDUnitTest.java ---------------------------------------------------------------------- diff --git a/gemfire-core/src/test/java/com/gemstone/gemfire/cache30/DistributedNoAckRegionCCEDUnitTest.java b/gemfire-core/src/test/java/com/gemstone/gemfire/cache30/DistributedNoAckRegionCCEDUnitTest.java index a4bd50b..ba3cca4 100644 --- a/gemfire-core/src/test/java/com/gemstone/gemfire/cache30/DistributedNoAckRegionCCEDUnitTest.java +++ b/gemfire-core/src/test/java/com/gemstone/gemfire/cache30/DistributedNoAckRegionCCEDUnitTest.java @@ -364,11 +364,6 @@ public class DistributedNoAckRegionCCEDUnitTest extends } - public void testRegionVersionVectors() throws Exception { - versionTestRegionVersionVectors(); - } - - // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // these methods can be uncommented to inhibit test execution http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/43a36883/gemfire-core/src/test/java/com/gemstone/gemfire/cache30/GlobalRegionCCEDUnitTest.java ---------------------------------------------------------------------- diff --git a/gemfire-core/src/test/java/com/gemstone/gemfire/cache30/GlobalRegionCCEDUnitTest.java b/gemfire-core/src/test/java/com/gemstone/gemfire/cache30/GlobalRegionCCEDUnitTest.java index bbc4207..18d2a75 100644 --- a/gemfire-core/src/test/java/com/gemstone/gemfire/cache30/GlobalRegionCCEDUnitTest.java +++ b/gemfire-core/src/test/java/com/gemstone/gemfire/cache30/GlobalRegionCCEDUnitTest.java @@ -231,8 +231,5 @@ public class GlobalRegionCCEDUnitTest extends GlobalRegionDUnitTest { versionTestGetAllWithVersions(); } - public void testRegionVersionVectors() throws Exception { - versionTestRegionVersionVectors(); - } } http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/43a36883/gemfire-core/src/test/java/com/gemstone/gemfire/cache30/MultiVMRegionTestCase.java ---------------------------------------------------------------------- diff --git a/gemfire-core/src/test/java/com/gemstone/gemfire/cache30/MultiVMRegionTestCase.java b/gemfire-core/src/test/java/com/gemstone/gemfire/cache30/MultiVMRegionTestCase.java index c5e2821..45f598b 100644 --- a/gemfire-core/src/test/java/com/gemstone/gemfire/cache30/MultiVMRegionTestCase.java +++ b/gemfire-core/src/test/java/com/gemstone/gemfire/cache30/MultiVMRegionTestCase.java @@ -8969,222 +8969,6 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase { } - public void versionTestRegionVersionVectors() throws Exception { - // this is just a quick set of unit tests for basic RVV functionality - - final String local = DistributedTestCase.getIPLiteral(); - InternalDistributedMember server1 = new InternalDistributedMember(local, 101); - InternalDistributedMember server2 = new InternalDistributedMember(local, 102); - InternalDistributedMember server3 = new InternalDistributedMember(local, 103); - InternalDistributedMember server4 = new InternalDistributedMember(local, 104); - - RegionVersionVector rv1 = null; - - // (a) Test that an exception is mended when the versions that are missing are - // added - rv1 = new VMRegionVersionVector(server1); - rv1.recordVersion(server2, 1); - rv1.recordVersion(server2, 5); - rv1.recordVersion(server2, 8); - getLogWriter().info("for test (a) formed this RVV: " + rv1.fullToString()); - // there should now be two exceptions: 1-5 and 5-8 - assertEquals(8, rv1.getVersionForMember(server2)); - assertEquals(2, rv1.getExceptionCount(server2)); - rv1.recordVersion(server2, 3); - getLogWriter().info("for test (a) RVV is now: " + rv1.fullToString()); - assertEquals(8, rv1.getVersionForMember(server2)); - assertEquals(2, rv1.getExceptionCount(server2)); - rv1.recordVersion(server2, 4); - rv1.recordVersion(server2, 2); - getLogWriter().info("for test (a) RVV is now: " + rv1.fullToString()); - assertEquals(1, rv1.getExceptionCount(server2)); - rv1.recordVersion(server2, 6); - rv1.recordVersion(server2, 7); - getLogWriter().info("for test (a) RVV is now: " + rv1.fullToString()); - assertEquals(0, rv1.getExceptionCount(server2)); - - // (b) Test the contains() operation - rv1 = new VMRegionVersionVector(server1); - rv1.recordVersion(server2, 1); - rv1.recordVersion(server2, 5); - rv1.recordVersion(server2, 8); - rv1.recordVersion(server2, 10); - getLogWriter().info("for test (b) formed this RVV: " + rv1.fullToString()); - assertTrue(rv1.contains(server2, 1)); - assertTrue(rv1.contains(server2, 5)); - assertTrue(rv1.contains(server2, 8)); - assertTrue(rv1.contains(server2, 10)); - assertFalse(rv1.contains(server2, 2)); - assertFalse(rv1.contains(server2, 3)); - assertFalse(rv1.contains(server2, 4)); - assertFalse(rv1.contains(server2, 9)); - assertFalse(rv1.contains(server2, 11)); - rv1.recordVersion(server2, 3); - getLogWriter().info("for test (b) RVV is now: " + rv1.fullToString()); - assertTrue(rv1.contains(server2, 3)); - rv1.recordVersion(server2, 2); - getLogWriter().info("for test (b) RVV is now: " + rv1.fullToString()); - assertTrue(rv1.contains(server2, 2)); - assertTrue(rv1.contains(server2, 3)); - rv1.recordVersion(server2, 4); - getLogWriter().info("for test (b) RVV is now: " + rv1.fullToString()); - assertTrue(rv1.contains(server2, 1)); - assertTrue(rv1.contains(server2, 2)); - assertTrue(rv1.contains(server2, 3)); - assertTrue(rv1.contains(server2, 4)); - assertTrue(rv1.contains(server2, 5)); - rv1.recordVersion(server2, 11); - getLogWriter().info("for test (b) RVV is now: " + rv1.fullToString()); - assertTrue(rv1.contains(server2, 11)); - assertTrue(rv1.contains(server2, 10)); - getLogWriter().info("for test (b) RVV is now: " + rv1.fullToString()); - rv1.recordVersion(server2, 6); - assertTrue(rv1.contains(server2, 2)); - assertTrue(rv1.contains(server2, 5)); - assertTrue(rv1.contains(server2, 6)); - assertFalse(rv1.contains(server2, 7)); - assertTrue(rv1.contains(server2, 8)); - rv1.recordVersion(server2, 7); - getLogWriter().info("for test (b) RVV is now: " + rv1.fullToString()); - assertTrue(rv1.contains(server2, 7)); - rv1.recordVersion(server2, 9); - getLogWriter().info("for test (b) RVV is now: " + rv1.fullToString()); - assertTrue(rv1.contains(server2, 9)); - assertTrue(rv1.getExceptionCount(server2) == 0); - assertTrue(rv1.contains(server2, 8)); - - - // Test RVV comparisons for GII Delta - rv1 = new VMRegionVersionVector(server1); - rv1.recordVersion(server2, 1); - rv1.recordVersion(server2, 4); - rv1.recordVersion(server2, 8); - rv1.recordVersion(server2, 9); - rv1.recordVersion(server2, 10); - rv1.recordVersion(server2, 11); - rv1.recordVersion(server2, 12); - - rv1.recordVersion(server3, 2); - rv1.recordVersion(server3, 3); - rv1.recordVersion(server3, 4); - rv1.recordVersion(server3, 6); - rv1.recordVersion(server3, 7); - - RegionVersionVector rv2 = rv1.getCloneForTransmission(); - getLogWriter().info("rv1 is " + rv1.fullToString()); - getLogWriter().info("rv2 is " + rv2.fullToString()); - assertFalse(rv1.isNewerThanOrCanFillExceptionsFor(rv2)); - assertFalse(rv2.isNewerThanOrCanFillExceptionsFor(rv1)); - - rv1.recordVersion(server2, 6); - assertTrue(rv1.isNewerThanOrCanFillExceptionsFor(rv2)); - rv2.recordVersion(server2, 6); - assertFalse(rv1.isNewerThanOrCanFillExceptionsFor(rv2)); - - // fill an exception gap - rv1.recordVersion(server2, 5); - assertTrue(rv1.isNewerThanOrCanFillExceptionsFor(rv2)); - rv2.recordVersion(server2, 5); - assertFalse(rv1.isNewerThanOrCanFillExceptionsFor(rv2)); - rv1.recordVersion(server2, 7); - assertTrue(rv1.isNewerThanOrCanFillExceptionsFor(rv2)); - rv2.recordVersion(server2, 7); - assertFalse(rv1.isNewerThanOrCanFillExceptionsFor(rv2)); - - // add a more recent revision - rv1.recordVersion(server3, 8); - assertTrue(rv1.isNewerThanOrCanFillExceptionsFor(rv2)); - rv2.recordVersion(server3, 8); - assertFalse(rv1.isNewerThanOrCanFillExceptionsFor(rv2)); - - // fill another exception gap - rv1.recordVersion(server3, 5); - assertTrue(rv1.isNewerThanOrCanFillExceptionsFor(rv2)); - rv2.recordVersion(server3, 5); - assertFalse(rv1.isNewerThanOrCanFillExceptionsFor(rv2)); - - // test that old members are removed from the vector - InternalDistributedMember server5 = new InternalDistributedMember(local, 105); - rv1 = new VMRegionVersionVector(server1); - rv1.recordVersion(server2, 1); - rv1.recordVersion(server3, 1); - rv1.recordVersion(server4, 1); - rv1.recordVersion(server5, 1); - rv1.memberDeparted(server2, false); - rv1.memberDeparted(server4, true); - assertTrue(rv1.containsMember(server2)); - assertTrue(rv1.containsMember(server3)); - assertTrue(rv1.containsMember(server4)); - Set retain = new HashSet(); - retain.add(server2); // still have data from server2 - retain.add(server3); // still have data from server3 - // no data found from server4 in region - retain.add(server5); // still have data from server5 - rv1.removeOldMembers(retain); - assertFalse(rv1.containsMember(server4)); - - rv1.memberDeparted(server3, false); // {server2, server3(departed), server5} - - // Now test that departed members are transferred with GII. We simulate - // a new server, server6, doing a GII from server1 - - InternalDistributedMember server6 = new InternalDistributedMember(local, 106); - RegionVersionVector giiReceiverRVV = new VMRegionVersionVector(server6); - // the gii request will cause server1 to clone its RVV and send it to server6 - rv2 = rv1.getCloneForTransmission(); - // serialize/deserialize to mimic sending the rvv in a message - ByteArrayOutputStream baos = new ByteArrayOutputStream(1000); - DataOutputStream out = new DataOutputStream(baos); - DataSerializer.writeObject(rv2, out); - ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); - DataInputStream in = new DataInputStream(bais); - RegionVersionVector transmittedVector = (RegionVersionVector)DataSerializer.readObject(in); - // record the provider's rvv in the receiver of the image - giiReceiverRVV.recordVersions(transmittedVector); - // removedMembers in the receiver should hold {server4, server3}. Simulate - // another member departure to kick out server4 - assertTrue(giiReceiverRVV.containsMember(server2)); - assertTrue(giiReceiverRVV.containsMember(server5)); - assertTrue(giiReceiverRVV.containsMember(server3)); - assertTrue(giiReceiverRVV.isDepartedMember(server3)); - - // unit test for bit-set boundary. First boundary is 3/4 of bitset width, - // which is the amount dumped to the exceptions list when the bitset becomes full - rv1 = new VMRegionVersionVector(server1); - long bitSetRollPoint = RegionVersionHolder.BIT_SET_WIDTH + 1; - long boundary = RegionVersionHolder.BIT_SET_WIDTH * 3 / 4; - for (long i=1; i<boundary; i++) { - rv1.recordVersion(server2, i); - assertTrue(rv1.contains(server2, i)); - } - assertFalse(rv1.contains(server2, boundary+1)); - - RegionVersionVector.DEBUG = true; - - rv1.recordVersion(server2, bitSetRollPoint); - rv1.recordVersion(server2, bitSetRollPoint+1); // bitSet should be rolled at this point - RegionVersionHolder h = (RegionVersionHolder)rv1.getMemberToVersion().get(server2); - long versionBoundary = h.getBitSetVersionForTesting(); - assertEquals("expected holder bitset version to roll to this value", boundary-1, versionBoundary); - assertFalse(rv1.contains(server2, bitSetRollPoint-1)); - assertTrue(rv1.contains(server2, bitSetRollPoint)); - assertTrue(rv1.contains(server2, bitSetRollPoint+1)); - assertFalse(rv1.contains(server2, bitSetRollPoint+2)); - - assertTrue(rv1.contains(server2, boundary-1)); - assertFalse(rv1.contains(server2, boundary)); - assertFalse(rv1.contains(server2, boundary+1)); - - // now test the merge - getLogWriter().info("testing merge for " + rv1.fullToString()); - assertEquals(1, rv1.getExceptionCount(server2)); // one exception from boundary-1 to bitSetRollPoint - assertFalse(rv1.contains(server2, bitSetRollPoint-1)); - assertTrue(rv1.contains(server2, bitSetRollPoint)); - assertTrue(rv1.contains(server2, bitSetRollPoint+1)); - assertFalse(rv1.contains(server2, bitSetRollPoint+2)); - - } - protected boolean waitForAsyncProcessing(AsyncInvocation async, String expectedError) { boolean failed = false; http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/43a36883/gemfire-core/src/test/java/com/gemstone/gemfire/distributed/DistributedSystemDUnitTest.java ---------------------------------------------------------------------- diff --git a/gemfire-core/src/test/java/com/gemstone/gemfire/distributed/DistributedSystemDUnitTest.java b/gemfire-core/src/test/java/com/gemstone/gemfire/distributed/DistributedSystemDUnitTest.java index 3ebc72a..195c29c 100644 --- a/gemfire-core/src/test/java/com/gemstone/gemfire/distributed/DistributedSystemDUnitTest.java +++ b/gemfire-core/src/test/java/com/gemstone/gemfire/distributed/DistributedSystemDUnitTest.java @@ -407,51 +407,6 @@ public class DistributedSystemDUnitTest extends DistributedTestCase { } } - static volatile String problem; - - public void testInterruptedWhileConnecting() throws Exception { - fail("testInterruptedWhileConnecting must be reimplemented for the new GMS"); - } - public void _testInterruptedWhileConnecting() throws Exception { -// Runnable r = new Runnable() { -// public void run() { -// ClientGmsImpl.SLOW_JOIN_LOCK = new Object(); -// ClientGmsImpl.SLOW_JOIN = true; -// try { -// assertTrue("should be disconnected at this point", InternalDistributedSystem.getConnectedInstance() == null); -// getSystem(); -// problem = "a connection to the distributed system was established but it should have failed"; -// } catch (SystemConnectException e) { -// if (!e.getMessage().endsWith(ExternalStrings.ClientGmsImpl_JOIN_INTERRUPTED.getRawText())) { -// problem = "got a system connect exception but it was for the wrong reason"; -// getLogWriter().info("wrong exception thrown: '" + e.getMessage() + "' (wanted '"+ -// ExternalStrings.ClientGmsImpl_JOIN_INTERRUPTED.getRawText()+"')", e); -// } -// } finally { -// ClientGmsImpl.SLOW_JOIN = false; -// ClientGmsImpl.SLOW_JOIN_LOCK = null; -// } -// } -// }; -// Thread connectThread = new Thread(r, "testInterruptedWhileConnecting connect thread"); -// ClientGmsImpl.SLOW_JOIN = false; -// connectThread.start(); -// while (ClientGmsImpl.SLOW_JOIN == false) { -// pause(1000); -// } -// pause(5000); -// connectThread.interrupt(); -// connectThread.join(60000); -// getLogWriter().info("done waiting for connectThread. Thread is " + -// (connectThread.isAlive()? "still alive" : "stopped")); -// if (ClientGmsImpl.SLOW_JOIN) { -// problem = "failed to either connect or get an exception - one of these should have happened"; -// dumpMyThreads(getLogWriter()); -// } -// if (problem != null) { -// fail(problem); -// } - } } http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/43a36883/gemfire-core/src/test/java/com/gemstone/gemfire/distributed/LocatorDUnitTest.java ---------------------------------------------------------------------- diff --git a/gemfire-core/src/test/java/com/gemstone/gemfire/distributed/LocatorDUnitTest.java b/gemfire-core/src/test/java/com/gemstone/gemfire/distributed/LocatorDUnitTest.java index 0145efb..845e6a6 100644 --- a/gemfire-core/src/test/java/com/gemstone/gemfire/distributed/LocatorDUnitTest.java +++ b/gemfire-core/src/test/java/com/gemstone/gemfire/distributed/LocatorDUnitTest.java @@ -580,154 +580,6 @@ public class LocatorDUnitTest extends DistributedTestCase { } } - /** - * this is very similar to testLeadAndCoordFailure but forced-disconnects aren't - * generated. Network partition detection is not enabled and we merely look - * to see if surviving members notify listeners that quorum was lost. - * <p> - * we start two locators with admin distributed systems, then start - * two regular distributed members. - * <p> - * We kill the second locator (which is not - * the view coordinator) and then kill the non-lead member. That should be - * okay - the lead and remaining locator continue to run. - * <p> - * We then kill the lead member and demonstrate that the original locator - * (which is now the sole remaining member) notifies listeners. - */ - public void testQuorumLossNotification() throws Exception { - addExpectedException("Possible loss of quorum due"); - disconnectAllFromDS(); - Host host = Host.getHost(0); - VM vm1 = host.getVM(1); - VM vm2 = host.getVM(2); - VM locvm3 = host.getVM(3); - Locator locator = null; - - final int port1 = AvailablePort.getRandomAvailablePort(AvailablePort.SOCKET); - final int port2 = AvailablePort.getRandomAvailablePort(AvailablePort.SOCKET); - deleteLocatorStateFile(port1, port2); - final String host0 = getServerHostName(host); - final String locators = host0 + "[" + port1 + "]," + - host0 + "[" + port2 + "]"; - final Properties properties = new Properties(); - properties.put("mcast-port", "0"); - properties.put("locators", locators); - properties.put("enable-network-partition-detection", "false"); - properties.put("disable-auto-reconnect", "true"); - properties.put("member-timeout", "2000"); - properties.put(DistributionConfig.ENABLE_CLUSTER_CONFIGURATION_NAME, "false"); - - try { - final String uname = getUniqueName(); - File logFile = new File(""); - locator = Locator.startLocatorAndDS(port1, logFile, properties); - final DistributedSystem sys = locator.getDistributedSystem(); - locvm3.invoke(new SerializableRunnable() { - public void run() { - File lf = new File(""); - try { - Locator.startLocatorAndDS(port2, lf, properties); - } - catch (IOException ios) { - fail("Unable to start locator2", ios); - } - } - }); - - Object[] connectArgs = new Object[]{ properties }; - - SerializableRunnable crashLocator = - new SerializableRunnable("Crash locator") { - public void run() { - Locator loc = Locator.getLocators().iterator().next(); - DistributedSystem msys = loc.getDistributedSystem(); - loc.stop(); - } - }; - - - assertTrue(MembershipManagerHelper.getLeadMember(sys) == null); - - DistributedMember mem1 = (DistributedMember)vm1.invoke(this.getClass(), - "getDistributedMember", connectArgs); - vm2.invoke(this.getClass(), - "getDistributedMember", connectArgs); - assertLeadMember(mem1, sys, 5000); - - assertEquals(sys.getDistributedMember(), MembershipManagerHelper.getCoordinator(sys)); - - // crash the second vm. Should be okay - crashDistributedSystem(vm2); - - assertTrue("Distributed system should not have disconnected", - vm1.invokeBoolean(LocatorDUnitTest.class, "isSystemConnected")); - - // ensure quorumLost is properly invoked - DistributionManager dm = (DistributionManager)((InternalDistributedSystem)sys).getDistributionManager(); - final MyMembershipListener listener = new MyMembershipListener(); - dm.addMembershipListener(listener); - - MembershipManagerHelper.inhibitForcedDisconnectLogging(true); - try { - // a new view won't be installed for 10 seconds (5*member-timeout of 2000) - // so we'll detect loss of two members in one view - fail("slow view casting must be implemented for the jgroups replacement"); -// GMS.TEST_HOOK_SLOW_VIEW_CASTING=10; - - // disconnect the first vm and locator to demonstrate that the third vm and the - // locator notice the failure and notify of quorum loss - locvm3.invoke(crashLocator); - crashDistributedSystem(vm1); - - /* This vm is watching vm1, which is watching vm2 which is watching locvm. - * It will take 3 * (3 * member-timeout) milliseconds to detect the full - * failure and eject the lost members from the view. - */ - - // quorumLost should be invoked when we detect the loss of the other members - WaitCriterion ev = new WaitCriterion() { - public boolean done() { - return !listener.quorumLostInvoked; - } - public String description() { - return null; - } - }; - DistributedTestCase.waitForCriterion(ev, 12 * 2000, 200, true); - } finally { - MembershipManagerHelper.inhibitForcedDisconnectLogging(false); - } - - // now close the locator so we can read its log file and verify that a quorum-loss notification was issued - if (sys.isConnected()) { - locator.stop(); - } - - try { - FileReader fr = new FileReader(logFile); - LineNumberReader in = new LineNumberReader(fr); - String line; - boolean found = false; - while ((line = in.readLine()) != null) { - if (line.contains("Possible loss of quorum due to the loss of") && line.startsWith("[severe")) { - getLogWriter().info("Found severe-level quorum loss notification as expected on line " + in.getLineNumber()); - found = true; - break; - } - } - assertTrue("expected severe-level quorum loss notification in " + logFile.getName(), found); - } catch (IOException e) { - fail("unexpected exception", e); - } - } - finally { - if (locator != null) { - locator.stop(); - } - disconnectAllFromDS(); - } - } /** * test lead member failure and normal coordinator shutdown with network partition detection http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/43a36883/gemfire-core/src/test/java/com/gemstone/gemfire/distributed/internal/membership/MembershipJUnitTest.java ---------------------------------------------------------------------- diff --git a/gemfire-core/src/test/java/com/gemstone/gemfire/distributed/internal/membership/MembershipJUnitTest.java b/gemfire-core/src/test/java/com/gemstone/gemfire/distributed/internal/membership/MembershipJUnitTest.java index 7f43557..c1a1070 100755 --- a/gemfire-core/src/test/java/com/gemstone/gemfire/distributed/internal/membership/MembershipJUnitTest.java +++ b/gemfire-core/src/test/java/com/gemstone/gemfire/distributed/internal/membership/MembershipJUnitTest.java @@ -121,7 +121,7 @@ public class MembershipJUnitTest extends TestCase { // System.out.println("failed mbrs = " + failedMembers); // System.out.println("failed weight = " + failedWeight); assertEquals("failure weight calculation is incorrect", 10, failedWeight); - List<InternalDistributedMember> actual = newView.getActualCrashedMembers(lastView); + Set<InternalDistributedMember> actual = newView.getActualCrashedMembers(lastView); assertTrue(!actual.contains(members[members.length-2])); } @@ -179,8 +179,9 @@ public class MembershipJUnitTest extends TestCase { DMStats stats2 = mock(DMStats.class); m2 = MemberFactory.newMembershipManager(listener2, config, transport, stats2); - assert m2.getView().size() == 2; - assert m1.getView().size() == 2; + assert m2.getView().size() == 2 : "view = " + m2.getView(); + assert m1.getView().size() == 2 : "view = " + m1.getView(); + assert m1.getView().getCreator().equals(m2.getView().getCreator()); assert m1.getView().getViewId() == m2.getView().getViewId(); m2.shutdown(); http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/43a36883/gemfire-core/src/test/java/com/gemstone/gemfire/distributed/internal/membership/gms/locator/GMSLocatorJUnitTest.java ---------------------------------------------------------------------- diff --git a/gemfire-core/src/test/java/com/gemstone/gemfire/distributed/internal/membership/gms/locator/GMSLocatorJUnitTest.java b/gemfire-core/src/test/java/com/gemstone/gemfire/distributed/internal/membership/gms/locator/GMSLocatorJUnitTest.java index 35a6e13..7e98866 100644 --- a/gemfire-core/src/test/java/com/gemstone/gemfire/distributed/internal/membership/gms/locator/GMSLocatorJUnitTest.java +++ b/gemfire-core/src/test/java/com/gemstone/gemfire/distributed/internal/membership/gms/locator/GMSLocatorJUnitTest.java @@ -43,18 +43,10 @@ public class GMSLocatorJUnitTest { @Before public void setUp() throws Exception { - String directory = ""; - boolean isWindows = false; - String os = System.getProperty("os.name"); - if (os != null) { - if (os.indexOf("Windows") != -1) { - isWindows = true; - } - } - if (!isWindows) { - directory = "/etc/"; + tempStateFile = new File("GMSLocatorJUnitTest_locator.dat"); + if (tempStateFile.exists()) { + tempStateFile.delete(); } - tempStateFile = File.createTempFile(directory+"tempLocator-", ".dat", new File("")); locator = new GMSLocator(null, tempStateFile, null, false, false, new LocatorStats()); // System.out.println("temp state file: " + tempStateFile); } @@ -71,6 +63,7 @@ public class GMSLocatorJUnitTest { oos.writeInt(fileStamp); oos.writeInt(ordinal); DataSerializer.writeObject(object, oos); + oos.flush(); } } http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/43a36883/gemfire-core/src/test/java/com/gemstone/gemfire/distributed/internal/membership/gms/membership/StatRecorderJUnitTest.java ---------------------------------------------------------------------- diff --git a/gemfire-core/src/test/java/com/gemstone/gemfire/distributed/internal/membership/gms/membership/StatRecorderJUnitTest.java b/gemfire-core/src/test/java/com/gemstone/gemfire/distributed/internal/membership/gms/membership/StatRecorderJUnitTest.java index 88fcbd2..99cba22 100755 --- a/gemfire-core/src/test/java/com/gemstone/gemfire/distributed/internal/membership/gms/membership/StatRecorderJUnitTest.java +++ b/gemfire-core/src/test/java/com/gemstone/gemfire/distributed/internal/membership/gms/membership/StatRecorderJUnitTest.java @@ -58,14 +58,14 @@ public class StatRecorderJUnitTest { Event evt = new Event(Event.MSG, msg); recorder.up(evt); - assert stats.ucastMessagesReceived == 1; + assert stats.ucastMessagesReceived == 1 : "stats.ucastMessagesReceived =" + stats.ucastMessagesReceived; recorder.down(evt); - assert stats.ucastMessagesSent == 1; + assert stats.ucastMessagesSent == 1 : "stats.ucastMessagesSent =" + stats.ucastMessagesSent; when(msg.getHeader(any(Short.class))).thenReturn(Header.createXmitReqHeader()); recorder.up(evt); - assert stats.ucastRetransmits == 1; + assert stats.ucastRetransmits == 1 : "stats.ucastRetransmits =" + stats.ucastRetransmits; } /** @@ -79,18 +79,18 @@ public class StatRecorderJUnitTest { Event evt = new Event(Event.MSG, msg); recorder.up(evt); - assert stats.mcastMessagesReceived == 1; + assert stats.mcastMessagesReceived == 1 : "mcastMessagesReceived = " + stats.mcastMessagesReceived; recorder.down(evt); - assert stats.mcastMessagesSent == 1; + assert stats.mcastMessagesSent == 1 : "mcastMessagesSent = " + stats.mcastMessagesSent; when(msg.getHeader(any(Short.class))).thenReturn(NakAckHeader2.createXmitRequestHeader(null)); recorder.up(evt); - assert stats.mcastRetransmitRequests == 1; + assert stats.mcastRetransmitRequests == 1 : "mcastRetransmitRequests = " + stats.mcastRetransmitRequests; when(msg.getHeader(any(Short.class))).thenReturn(NakAckHeader2.createXmitResponseHeader()); recorder.up(evt); - assert stats.mcastRetransmits == 1; + assert stats.mcastRetransmits == 1 : "mcastRetransmits = " + stats.mcastRetransmits; } http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/43a36883/gemfire-core/src/test/java/com/gemstone/gemfire/internal/cache/Bug33726JUnitTest.java ---------------------------------------------------------------------- diff --git a/gemfire-core/src/test/java/com/gemstone/gemfire/internal/cache/Bug33726JUnitTest.java b/gemfire-core/src/test/java/com/gemstone/gemfire/internal/cache/Bug33726JUnitTest.java index 3370e9c..b97bd0d 100755 --- a/gemfire-core/src/test/java/com/gemstone/gemfire/internal/cache/Bug33726JUnitTest.java +++ b/gemfire-core/src/test/java/com/gemstone/gemfire/internal/cache/Bug33726JUnitTest.java @@ -22,6 +22,7 @@ import com.gemstone.gemfire.cache.Region; import com.gemstone.gemfire.cache.RegionEvent; import com.gemstone.gemfire.cache.util.CacheListenerAdapter; import com.gemstone.gemfire.distributed.DistributedSystem; +import com.gemstone.gemfire.distributed.internal.DistributionConfig; import com.gemstone.gemfire.test.junit.categories.IntegrationTest; /** @@ -55,6 +56,7 @@ public class Bug33726JUnitTest{ @Test public void testAfterRegionCreate() { Properties props = new Properties(); + props.put(DistributionConfig.MCAST_PORT_NAME, "0"); DistributedSystem ds = DistributedSystem.connect(props); AttributesFactory factory = new AttributesFactory(); factory.setCacheListener(new TestCacheListener()); http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/43a36883/gemfire-core/src/test/java/com/gemstone/gemfire/internal/cache/versions/RegionVersionVectorJUnitTest.java ---------------------------------------------------------------------- diff --git a/gemfire-core/src/test/java/com/gemstone/gemfire/internal/cache/versions/RegionVersionVectorJUnitTest.java b/gemfire-core/src/test/java/com/gemstone/gemfire/internal/cache/versions/RegionVersionVectorJUnitTest.java index 6b3d4bb..892a9a2 100644 --- a/gemfire-core/src/test/java/com/gemstone/gemfire/internal/cache/versions/RegionVersionVectorJUnitTest.java +++ b/gemfire-core/src/test/java/com/gemstone/gemfire/internal/cache/versions/RegionVersionVectorJUnitTest.java @@ -8,22 +8,28 @@ package com.gemstone.gemfire.internal.cache.versions; import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; import java.io.DataInputStream; +import java.io.DataOutputStream; import java.io.IOException; -import java.util.BitSet; +import java.util.HashSet; import java.util.Map; -import java.util.TreeSet; - -import org.junit.experimental.categories.Category; +import java.util.Set; import junit.framework.TestCase; +import org.junit.experimental.categories.Category; + +import com.gemstone.gemfire.DataSerializer; +import com.gemstone.gemfire.distributed.internal.membership.InternalDistributedMember; import com.gemstone.gemfire.internal.HeapDataOutputStream; import com.gemstone.gemfire.internal.InternalDataSerializer; import com.gemstone.gemfire.internal.Version; import com.gemstone.gemfire.internal.cache.persistence.DiskStoreID; import com.gemstone.gemfire.test.junit.categories.UnitTest; +import dunit.DistributedTestCase; + @Category(UnitTest.class) public class RegionVersionVectorJUnitTest extends TestCase { @@ -38,6 +44,223 @@ public class RegionVersionVectorJUnitTest extends TestCase { doExceptionsWithContains(id1, rvv); } + @SuppressWarnings({ "unchecked", "rawtypes" }) + public void testRegionVersionVectors() throws Exception { + // this is just a quick set of unit tests for basic RVV functionality + + final String local = DistributedTestCase.getIPLiteral(); + InternalDistributedMember server1 = new InternalDistributedMember(local, 101); + InternalDistributedMember server2 = new InternalDistributedMember(local, 102); + InternalDistributedMember server3 = new InternalDistributedMember(local, 103); + InternalDistributedMember server4 = new InternalDistributedMember(local, 104); + + RegionVersionVector rv1 = null; + + // (a) Test that an exception is mended when the versions that are missing are + // added + rv1 = new VMRegionVersionVector(server1); + rv1.recordVersion(server2, 1); + rv1.recordVersion(server2, 5); + rv1.recordVersion(server2, 8); + System.out.println("for test (a) formed this RVV: " + rv1.fullToString()); + // there should now be two exceptions: 1-5 and 5-8 + assertEquals(8, rv1.getVersionForMember(server2)); + assertEquals(2, rv1.getExceptionCount(server2)); + rv1.recordVersion(server2, 3); + System.out.println("for test (a) RVV is now: " + rv1.fullToString()); + assertEquals(8, rv1.getVersionForMember(server2)); + assertEquals(2, rv1.getExceptionCount(server2)); + rv1.recordVersion(server2, 4); + rv1.recordVersion(server2, 2); + System.out.println("for test (a) RVV is now: " + rv1.fullToString()); + assertEquals(1, rv1.getExceptionCount(server2)); + rv1.recordVersion(server2, 6); + rv1.recordVersion(server2, 7); + System.out.println("for test (a) RVV is now: " + rv1.fullToString()); + assertEquals(0, rv1.getExceptionCount(server2)); + + // (b) Test the contains() operation + rv1 = new VMRegionVersionVector(server1); + rv1.recordVersion(server2, 1); + rv1.recordVersion(server2, 5); + rv1.recordVersion(server2, 8); + rv1.recordVersion(server2, 10); + System.out.println("for test (b) formed this RVV: " + rv1.fullToString()); + assertTrue(rv1.contains(server2, 1)); + assertTrue(rv1.contains(server2, 5)); + assertTrue(rv1.contains(server2, 8)); + assertTrue(rv1.contains(server2, 10)); + assertFalse(rv1.contains(server2, 2)); + assertFalse(rv1.contains(server2, 3)); + assertFalse(rv1.contains(server2, 4)); + assertFalse(rv1.contains(server2, 9)); + assertFalse(rv1.contains(server2, 11)); + rv1.recordVersion(server2, 3); + System.out.println("for test (b) RVV is now: " + rv1.fullToString()); + assertTrue(rv1.contains(server2, 3)); + rv1.recordVersion(server2, 2); + System.out.println("for test (b) RVV is now: " + rv1.fullToString()); + assertTrue(rv1.contains(server2, 2)); + assertTrue(rv1.contains(server2, 3)); + rv1.recordVersion(server2, 4); + System.out.println("for test (b) RVV is now: " + rv1.fullToString()); + assertTrue(rv1.contains(server2, 1)); + assertTrue(rv1.contains(server2, 2)); + assertTrue(rv1.contains(server2, 3)); + assertTrue(rv1.contains(server2, 4)); + assertTrue(rv1.contains(server2, 5)); + rv1.recordVersion(server2, 11); + System.out.println("for test (b) RVV is now: " + rv1.fullToString()); + assertTrue(rv1.contains(server2, 11)); + assertTrue(rv1.contains(server2, 10)); + System.out.println("for test (b) RVV is now: " + rv1.fullToString()); + rv1.recordVersion(server2, 6); + assertTrue(rv1.contains(server2, 2)); + assertTrue(rv1.contains(server2, 5)); + assertTrue(rv1.contains(server2, 6)); + assertFalse(rv1.contains(server2, 7)); + assertTrue(rv1.contains(server2, 8)); + rv1.recordVersion(server2, 7); + System.out.println("for test (b) RVV is now: " + rv1.fullToString()); + assertTrue(rv1.contains(server2, 7)); + rv1.recordVersion(server2, 9); + System.out.println("for test (b) RVV is now: " + rv1.fullToString()); + assertTrue(rv1.contains(server2, 9)); + assertTrue(rv1.getExceptionCount(server2) == 0); + assertTrue(rv1.contains(server2, 8)); + + + // Test RVV comparisons for GII Delta + rv1 = new VMRegionVersionVector(server1); + rv1.recordVersion(server2, 1); + rv1.recordVersion(server2, 4); + rv1.recordVersion(server2, 8); + rv1.recordVersion(server2, 9); + rv1.recordVersion(server2, 10); + rv1.recordVersion(server2, 11); + rv1.recordVersion(server2, 12); + + rv1.recordVersion(server3, 2); + rv1.recordVersion(server3, 3); + rv1.recordVersion(server3, 4); + rv1.recordVersion(server3, 6); + rv1.recordVersion(server3, 7); + + RegionVersionVector rv2 = rv1.getCloneForTransmission(); + System.out.println("rv1 is " + rv1.fullToString()); + System.out.println("rv2 is " + rv2.fullToString()); + assertFalse(rv1.isNewerThanOrCanFillExceptionsFor(rv2)); + assertFalse(rv2.isNewerThanOrCanFillExceptionsFor(rv1)); + + rv1.recordVersion(server2, 6); + assertTrue(rv1.isNewerThanOrCanFillExceptionsFor(rv2)); + rv2.recordVersion(server2, 6); + assertFalse(rv1.isNewerThanOrCanFillExceptionsFor(rv2)); + + // fill an exception gap + rv1.recordVersion(server2, 5); + assertTrue(rv1.isNewerThanOrCanFillExceptionsFor(rv2)); + rv2.recordVersion(server2, 5); + assertFalse(rv1.isNewerThanOrCanFillExceptionsFor(rv2)); + rv1.recordVersion(server2, 7); + assertTrue(rv1.isNewerThanOrCanFillExceptionsFor(rv2)); + rv2.recordVersion(server2, 7); + assertFalse(rv1.isNewerThanOrCanFillExceptionsFor(rv2)); + + // add a more recent revision + rv1.recordVersion(server3, 8); + assertTrue(rv1.isNewerThanOrCanFillExceptionsFor(rv2)); + rv2.recordVersion(server3, 8); + assertFalse(rv1.isNewerThanOrCanFillExceptionsFor(rv2)); + + // fill another exception gap + rv1.recordVersion(server3, 5); + assertTrue(rv1.isNewerThanOrCanFillExceptionsFor(rv2)); + rv2.recordVersion(server3, 5); + assertFalse(rv1.isNewerThanOrCanFillExceptionsFor(rv2)); + + // test that old members are removed from the vector + InternalDistributedMember server5 = new InternalDistributedMember(local, 105); + rv1 = new VMRegionVersionVector(server1); + rv1.recordVersion(server2, 1); + rv1.recordVersion(server3, 1); + rv1.recordVersion(server4, 1); + rv1.recordVersion(server5, 1); + rv1.memberDeparted(server2, false); + rv1.memberDeparted(server4, true); + assertTrue(rv1.containsMember(server2)); + assertTrue(rv1.containsMember(server3)); + assertTrue(rv1.containsMember(server4)); + Set retain = new HashSet(); + retain.add(server2); // still have data from server2 + retain.add(server3); // still have data from server3 + // no data found from server4 in region + retain.add(server5); // still have data from server5 + rv1.removeOldMembers(retain); + assertFalse(rv1.containsMember(server4)); + + rv1.memberDeparted(server3, false); // {server2, server3(departed), server5} + + // Now test that departed members are transferred with GII. We simulate + // a new server, server6, doing a GII from server1 + + InternalDistributedMember server6 = new InternalDistributedMember(local, 106); + RegionVersionVector giiReceiverRVV = new VMRegionVersionVector(server6); + // the gii request will cause server1 to clone its RVV and send it to server6 + rv2 = rv1.getCloneForTransmission(); + // serialize/deserialize to mimic sending the rvv in a message + ByteArrayOutputStream baos = new ByteArrayOutputStream(1000); + DataOutputStream out = new DataOutputStream(baos); + DataSerializer.writeObject(rv2, out); + ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); + DataInputStream in = new DataInputStream(bais); + RegionVersionVector transmittedVector = (RegionVersionVector)DataSerializer.readObject(in); + // record the provider's rvv in the receiver of the image + giiReceiverRVV.recordVersions(transmittedVector); + // removedMembers in the receiver should hold {server4, server3}. Simulate + // another member departure to kick out server4 + assertTrue(giiReceiverRVV.containsMember(server2)); + assertTrue(giiReceiverRVV.containsMember(server5)); + assertTrue(giiReceiverRVV.containsMember(server3)); + assertTrue(giiReceiverRVV.isDepartedMember(server3)); + + // unit test for bit-set boundary. First boundary is 3/4 of bitset width, + // which is the amount dumped to the exceptions list when the bitset becomes full + rv1 = new VMRegionVersionVector(server1); + long bitSetRollPoint = RegionVersionHolder.BIT_SET_WIDTH + 1; + long boundary = RegionVersionHolder.BIT_SET_WIDTH * 3 / 4; + for (long i=1; i<boundary; i++) { + rv1.recordVersion(server2, i); + assertTrue(rv1.contains(server2, i)); + } + assertFalse(rv1.contains(server2, boundary+1)); + + RegionVersionVector.DEBUG = true; + + rv1.recordVersion(server2, bitSetRollPoint); + rv1.recordVersion(server2, bitSetRollPoint+1); // bitSet should be rolled at this point + RegionVersionHolder h = (RegionVersionHolder)rv1.getMemberToVersion().get(server2); + long versionBoundary = h.getBitSetVersionForTesting(); + assertEquals("expected holder bitset version to roll to this value", boundary-1, versionBoundary); + assertFalse(rv1.contains(server2, bitSetRollPoint-1)); + assertTrue(rv1.contains(server2, bitSetRollPoint)); + assertTrue(rv1.contains(server2, bitSetRollPoint+1)); + assertFalse(rv1.contains(server2, bitSetRollPoint+2)); + + assertTrue(rv1.contains(server2, boundary-1)); + assertFalse(rv1.contains(server2, boundary)); + assertFalse(rv1.contains(server2, boundary+1)); + + // now test the merge + System.out.println("testing merge for " + rv1.fullToString()); + assertEquals(1, rv1.getExceptionCount(server2)); // one exception from boundary-1 to bitSetRollPoint + assertFalse(rv1.contains(server2, bitSetRollPoint-1)); + assertTrue(rv1.contains(server2, bitSetRollPoint)); + assertTrue(rv1.contains(server2, bitSetRollPoint+1)); + assertFalse(rv1.contains(server2, bitSetRollPoint+2)); + + } + public void testRVVSerialization() throws IOException, ClassNotFoundException { DiskStoreID ownerId = new DiskStoreID(0, 0); DiskStoreID id1 = new DiskStoreID(0, 1); http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/43a36883/gemfire-core/src/test/java/com/gemstone/gemfire/memcached/IntegrationJUnitTest.java ---------------------------------------------------------------------- diff --git a/gemfire-core/src/test/java/com/gemstone/gemfire/memcached/IntegrationJUnitTest.java b/gemfire-core/src/test/java/com/gemstone/gemfire/memcached/IntegrationJUnitTest.java index 0a19abc..d4769ad 100644 --- a/gemfire-core/src/test/java/com/gemstone/gemfire/memcached/IntegrationJUnitTest.java +++ b/gemfire-core/src/test/java/com/gemstone/gemfire/memcached/IntegrationJUnitTest.java @@ -25,6 +25,7 @@ import net.spy.memcached.MemcachedClient; import com.gemstone.gemfire.cache.Cache; import com.gemstone.gemfire.cache.CacheFactory; +import com.gemstone.gemfire.distributed.internal.DistributionConfig; import com.gemstone.gemfire.internal.AvailablePortHelper; import com.gemstone.gemfire.test.junit.categories.IntegrationTest; @@ -65,6 +66,7 @@ public class IntegrationJUnitTest { final int port = AvailablePortHelper.getRandomAvailableTCPPort(); props.setProperty("memcached-port", port+""); props.setProperty("memcached-bind-address", "127.0.0.1"); + props.put(DistributionConfig.MCAST_PORT_NAME, "0"); CacheFactory cf = new CacheFactory(props); Cache cache = cf.create();
