/** * test hook * <p> * The lead member is the eldest member with partition detection enabled. * <p> * If no members have partition detection enabled, there will be no lead member and this method * will return null. * * @return the lead member associated with the latest view */ @Override public DistributedMember getLeadMember() { latestViewReadLock.lock(); try { return latestView == null ? null : latestView.getLeadMember(); } finally { latestViewReadLock.unlock(); } }
private boolean calculateQuorum() { // quorum check int weight = getWeight(this.lastView.getMembers(), this.lastView.getLeadMember()); int ackedWeight = getWeight(receivedAcks, this.lastView.getLeadMember()); int lossThreshold = (int) Math.round((weight * this.partitionThreshold) / 100.0); if (isDebugEnabled) { logger.debug( "quorum check: contacted {} processes with {} member weight units. Threshold for a quorum is {}", receivedAcks.size(), ackedWeight, lossThreshold); } return (ackedWeight >= lossThreshold); }
public String toString() { InternalDistributedMember lead = getLeadMember();
/** * logs the weight of failed members wrt the given previous view */ public void logCrashedMemberWeights(NetView oldView, Logger log) { InternalDistributedMember lead = oldView.getLeadMember(); for (InternalDistributedMember mbr : this.crashedMembers) { if (!oldView.contains(mbr)) { continue; } int mbrWeight = mbr.getNetMember().getMemberWeight(); switch (mbr.getVmKind()) { case ClusterDistributionManager.NORMAL_DM_TYPE: if (lead != null && mbr.equals(lead)) { mbrWeight += 15; } else { mbrWeight += 10; } break; case ClusterDistributionManager.LOCATOR_DM_TYPE: mbrWeight += 3; break; case ClusterDistributionManager.ADMIN_ONLY_DM_TYPE: break; default: throw new IllegalStateException("Unknown member type: " + mbr.getVmKind()); } log.info(" " + mbr + " had a weight of " + mbrWeight); } }
/** * returns the weight of the members in this membership view */ public int memberWeight() { int result = 0; InternalDistributedMember lead = getLeadMember(); for (InternalDistributedMember mbr : this.members) { result += mbr.getNetMember().getMemberWeight(); switch (mbr.getVmKind()) { case ClusterDistributionManager.NORMAL_DM_TYPE: result += 10; if (lead != null && mbr.equals(lead)) { result += 5; } break; case ClusterDistributionManager.LOCATOR_DM_TYPE: result += 3; break; case ClusterDistributionManager.ADMIN_ONLY_DM_TYPE: break; default: throw new IllegalStateException("Unknown member type: " + mbr.getVmKind()); } } return result; }
/** * returns the weight of crashed members in this membership view with respect to the given * previous view */ public int getCrashedMemberWeight(NetView oldView) { int result = 0; InternalDistributedMember lead = oldView.getLeadMember(); for (InternalDistributedMember mbr : this.crashedMembers) { if (!oldView.contains(mbr)) { continue; } result += mbr.getNetMember().getMemberWeight(); switch (mbr.getVmKind()) { case ClusterDistributionManager.NORMAL_DM_TYPE: result += 10; if (lead != null && mbr.equals(lead)) { result += 5; } break; case ClusterDistributionManager.LOCATOR_DM_TYPE: result += 3; break; case ClusterDistributionManager.ADMIN_ONLY_DM_TYPE: break; default: throw new IllegalStateException("Unknown member type: " + mbr.getVmKind()); } } return result; }
@Test public void testCreateView() throws Exception { int numMembers = members.size(); NetView view = new NetView(members.get(0), 2, members); setFailureDetectionPorts(view); assertTrue(view.getCreator().equals(members.get(0))); assertEquals(2, view.getViewId()); assertEquals(members, view.getMembers()); assertEquals(0, view.getCrashedMembers().size()); assertEquals(members.get(1), view.getLeadMember()); // a locator can't be lead member assertEquals(0, view.getShutdownMembers().size()); assertEquals(1, view.getNewMembers().size()); assertEquals(members.get(numMembers - 1), view.getNewMembers().iterator().next()); assertEquals(members.get(0), view.getCoordinator()); for (int i = 0; i < numMembers; i++) { InternalDistributedMember mbr = members.get(i); assertEquals(mbr.getPort(), view.getFailureDetectionPort(mbr)); } assertFalse(view.shouldBeCoordinator(members.get(1))); assertTrue(view.shouldBeCoordinator(members.get(0))); assertEquals(members.get(numMembers - 1), view.getCoordinator(Collections.singletonList(members.get(0)))); members.get(numMembers - 1).getNetMember().setPreferredForCoordinator(false); assertEquals(members.get(1), view.getCoordinator(Collections.singletonList(members.get(0)))); members.get(numMembers - 1).getNetMember().setPreferredForCoordinator(true); List<InternalDistributedMember> preferred = view.getPreferredCoordinators( Collections.<InternalDistributedMember>singleton(members.get(1)), members.get(0), 2); assertEquals(2, preferred.size()); assertEquals(members.get(numMembers - 1), preferred.get(0)); }
@Test public void testCopyView() throws Exception { NetView view = new NetView(members.get(0), 2, new ArrayList<>(members)); setFailureDetectionPorts(view); NetView newView = new NetView(view, 3); assertTrue(newView.getCreator().equals(members.get(0))); assertEquals(3, newView.getViewId()); assertEquals(members, newView.getMembers()); assertEquals(0, newView.getCrashedMembers().size()); assertEquals(members.get(1), newView.getLeadMember()); // a locator can't be lead member assertEquals(0, newView.getShutdownMembers().size()); assertEquals(0, newView.getNewMembers().size()); assertTrue(newView.equals(view)); assertTrue(view.equals(newView)); newView.remove(members.get(1)); assertFalse(newView.equals(view)); }