private boolean isNew(final InternalDistributedMember m) { return !latestView.contains(m) && !surpriseMembers.containsKey(m); }
@Override public boolean memberExists(DistributedMember m) { latestViewReadLock.lock(); NetView v = latestView; latestViewReadLock.unlock(); return v.contains(m); }
private void removeMembersFromCollectionIfNotInView(Collection<InternalDistributedMember> members, NetView currentView) { Iterator<InternalDistributedMember> iterator = members.iterator(); while (iterator.hasNext()) { if (!currentView.contains(iterator.next())) { iterator.remove(); } } }
/** * returns the members of this views crashedMembers collection that were members of the given * view. Admin-only members are not counted */ public Set<InternalDistributedMember> getActualCrashedMembers(NetView oldView) { Set<InternalDistributedMember> result = new HashSet<>(this.crashedMembers.size()); result.addAll(this.crashedMembers.stream() .filter(mbr -> (mbr.getVmKind() != ClusterDistributionManager.ADMIN_ONLY_DM_TYPE)) .filter(mbr -> oldView == null || oldView.contains(mbr)).collect(Collectors.toList())); return result; }
@Override public synchronized void installView(NetView newView) { synchronized (suspectRequestsInView) { suspectRequestsInView.clear(); } for (Iterator<InternalDistributedMember> it = memberTimeStamps.keySet().iterator(); it .hasNext();) { if (!newView.contains(it.next())) { it.remove(); } } for (Iterator<InternalDistributedMember> it = suspectedMemberIds.keySet().iterator(); it .hasNext();) { if (!newView.contains(it.next())) { it.remove(); } } currentView = newView; setNextNeighbor(newView, null); }
} else if (latestView.contains(remoteId)) {
@Override public boolean isMemberLeaving(DistributedMember mbr) { if (getPendingRequestIDs(LEAVE_REQUEST_MESSAGE).contains(mbr) || getPendingRequestIDs(REMOVE_MEMBER_REQUEST).contains(mbr) || !currentView.contains(mbr)) { return true; } synchronized (removedMembers) { if (removedMembers.contains(mbr)) { return true; } } synchronized (leftMembers) { if (leftMembers.contains(mbr)) { return true; } } return false; }
@Override public boolean done() { return !getMembershipManager(sys).getView().contains(member); }
if (latestView.contains(mm)) {
/** * performs a "final" health check on the member. If failure-detection socket information is * available for the member (in the view) then we attempt to connect to its socket and ask if it's * the expected member. Otherwise we send a heartbeat request and wait for a reply. */ private void checkIfAvailable(final InternalDistributedMember initiator, List<SuspectRequest> sMembers, final NetView cv) { for (final SuspectRequest sr : sMembers) { final InternalDistributedMember mbr = sr.getSuspectMember(); if (!cv.contains(mbr) || membersInFinalCheck.contains(mbr)) { continue; } if (mbr.equals(localAddress)) { continue;// self } final String reason = sr.getReason(); logger.debug("Scheduling availability check for member {}; reason={}", mbr, reason); // its a coordinator checkExecutor.execute(() -> { try { inlineCheckIfAvailable(initiator, cv, true, mbr, reason); } catch (CancelException e) { // shutting down } catch (Exception e) { logger.info("Unexpected exception while verifying member", e); } }); } }
if (latestView.contains(member)) { NetView newView = new NetView(latestView, latestView.getViewId()); newView.remove(member);
/** * 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); } }
/** * Transfer the failure-detection ports from another view to this one */ public void setFailureDetectionPorts(NetView otherView) { int[] ports = otherView.getFailureDetectionPorts(); if (ports != null) { int idx = 0; int portsSize = ports.length; for (InternalDistributedMember mbr : otherView.getMembers()) { if (contains(mbr)) { // unit tests create views w/o failure detection ports, so we must check the length // of the array if (idx < portsSize) { setFailureDetectionPort(mbr, ports[idx]); } else { setFailureDetectionPort(mbr, -1); } } idx += 1; } } }
/** * 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 testRemoveMembers() throws Exception { int numMembers = members.size(); NetView view = new NetView(members.get(0), 2, new ArrayList<>(members)); setFailureDetectionPorts(view); for (int i = 1; i < numMembers; i += 2) { view.remove(members.get(i)); assertFalse(view.contains(members.get(i))); } List<InternalDistributedMember> remainingMembers = view.getMembers(); int num = remainingMembers.size(); for (int i = 0; i < num; i++) { InternalDistributedMember mbr = remainingMembers.get(i); assertEquals(mbr.getPort(), view.getFailureDetectionPort(mbr)); } }
@Test public void testRemoveAll() throws Exception { int numMembers = members.size(); NetView view = new NetView(members.get(0), 2, new ArrayList<>(members)); setFailureDetectionPorts(view); Collection<InternalDistributedMember> removals = new ArrayList<>(numMembers / 2); for (int i = 1; i < numMembers; i += 2) { removals.add(members.get(i)); } view.removeAll(removals); for (InternalDistributedMember mbr : removals) { assertFalse(view.contains(mbr)); } assertEquals(numMembers - removals.size(), view.size()); List<InternalDistributedMember> remainingMembers = view.getMembers(); int num = remainingMembers.size(); for (int i = 0; i < num; i++) { InternalDistributedMember mbr = remainingMembers.get(i); assertEquals(mbr.getPort(), view.getFailureDetectionPort(mbr)); } }
@Override public void remove(InternalDistributedMember m, String reason) { NetView v = this.currentView; services.getCancelCriterion().checkCancelInProgress(null); if (v != null && v.contains(m)) { Set<InternalDistributedMember> filter = new HashSet<>(); filter.add(m); RemoveMemberMessage msg = new RemoveMemberMessage(v.getPreferredCoordinators(filter, getMemberID(), 5), m, reason); msg.setSender(this.localAddress); processRemoveRequest(msg); if (!this.isCoordinator) { msg.resetRecipients(); msg.setRecipients(v.getPreferredCoordinators(Collections.emptySet(), localAddress, ServiceConfig.SMALL_CLUSTER_SIZE + 1)); services.getMessenger().send(msg); } } else { RemoveMemberMessage msg = new RemoveMemberMessage(m, m, reason); services.getMessenger().send(msg); } }
private void ackView(InstallViewMessage m) { if (!playingDead && m.getView().contains(m.getView().getCreator())) { services.getMessenger() .send(new ViewAckMessage(m.getSender(), m.getView().getViewId(), m.isPreparing())); } }
if (currentView != null && !currentView.contains(m.getSender())) { if (this.preparedView == null || !this.preparedView.contains(m.getSender())) { logger.info("Ignoring the view {} from member {}, which is not in my current view {} ", view, m.getSender(), currentView); if (isJoined && currentView != null && !view.contains(this.localAddress)) { logger.fatal( "This member is no longer in the membership view. My ID is {} and the new view is {}",
+ services.getCancelCriterion().isCancelInProgress()); if (!v.contains(mbr) && mbr.getVmViewId() < v.getViewId()) { logger.info("ignoring leave request from old member"); return;