Set<InternalDistributedMember> crashes = newView.getActualCrashedMembers(currentView); forceDisconnect(LocalizedStrings.Network_partition_detected.toLocalizedString(crashes.size(), crashes)); shutdown = true; List<InternalDistributedMember> failures = new ArrayList<>(currentView.getCrashedMembers().size() + unresponsive.size()); if (conflictingView != null && !conflictingView.getCreator().equals(localAddress) && conflictingView.getViewId() > newView.getViewId() && (lastConflictingView == null || conflictingView.getViewId() > lastConflictingView.getViewId())) { lastConflictingView = conflictingView; logger.info("adding these crashed members from a conflicting view to the crash-set for the next view: {}\nconflicting view: {}", unresponsive, conflictingView); failures.addAll(conflictingView.getCrashedMembers()); List<InternalDistributedMember> newMembers = conflictingView.getNewMembers(); if (!newMembers.isEmpty()) { logger.info("adding these new members from a conflicting view to the new view: {}", newMembers); for (InternalDistributedMember mbr: newMembers) { int port = conflictingView.getFailureDetectionPort(mbr); newView.add(mbr); newView.setFailureDetectionPort(mbr, port); joinReqs.add(mbr); if (conflictingView.getViewId() >= newView.getViewId()) { newView = new NetView(newView, conflictingView.getViewId()+1); List<InternalDistributedMember> newMembers = new ArrayList<>(newView.getMembers()); newMembers.removeAll(removalReqs); NetView tempView = new NetView(localAddress, newView.getViewId() + 1, newMembers, leaveReqs, removalReqs); for (InternalDistributedMember mbr: newView.getMembers()) {
NetView result = new NetView(v.size(), v.getViewNumber()); result.setCreator(v.getCreator()); for (int i = 0; i < v.size(); i ++) { InternalDistributedMember m = (InternalDistributedMember)v.elementAt(i); if (isShunned(m)) { result.add(m); result.setLeadMember(v.getLeadMember()); return result;
/** * Transfer the failure-detection ports from another view to this one * @param otherView */ 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; } } }
if (currentView == null || currentView.getViewId() < v.getViewId()) { int viewId = Math.max(initialView.getViewId(),v.getViewId()); viewId += 1; NetView newView = new NetView(initialView, viewId); newMembers = v.getNewMembers(currentView); } else { newMembers = v.getMembers(); newView.add(newMember); newView.setFailureDetectionPort(newMember, v.getFailureDetectionPort(newMember));
if (!v.contains(mbr) && mbr.getVmViewId() < v.getViewId()) { logger.debug("ignoring leave request from old member"); return; NetView check = new NetView(v, v.getViewId() + 1); check.remove(incomingRequest.getMemberID()); synchronized (removedMembers) { check.removeAll(removedMembers); check.addCrashedMembers(removedMembers); check.removeAll(leftMembers); if (check.getCoordinator().equals(localAddress)) { synchronized(viewInstallationLock) { becomeCoordinator(incomingRequest.getMemberID());
msg.append(newView); msg.append("} on " + address.toString()); if (!newView.contains(address)) { logger.info(LocalizedMessage.create( LocalizedStrings.GroupMembershipService_THE_MEMBER_WITH_ID_0_IS_NO_LONGER_IN_MY_OWN_VIEW_1, for (InternalDistributedMember mbr: newView.getMembers()) { Version itsVersion = mbr.getVersionObject(); if (itsVersion != null && itsVersion.compareTo(version) < 0) { latestView = new NetView(newView, newView.getViewId()); for (int i = 0; i < newView.getMembers().size(); i++) { // additions InternalDistributedMember m = (InternalDistributedMember)newView.getMembers().get(i); if (priorView.contains(m) || wasSurprise) { continue; // already seen for (int i = 0; i < priorView.getMembers().size(); i++) { // departures InternalDistributedMember m = (InternalDistributedMember)priorView.getMembers().get(i); if (newView.contains(m)) { continue; // still alive newView.getCrashedMembers().contains(m) || suspectedMembers.containsKey(m) , "departed membership view"); if (!latestView.contains(entry.getKey())) { latestView.add(entry.getKey());
msg.append(newViewId).append(") {"); msg.append(DistributionManager.printView(newView)); if (newView.getCrashedMembers().size() > 0) { msg.append(" with unexpected departures ["); for (Iterator it=newView.getCrashedMembers().iterator(); it.hasNext(); ) { msg.append(it.next()); if (it.hasNext()) { if (!newView.contains(myMemberId)) logger.info( LocalizedStrings.JGroupMembershipManager_THE_MEMBER_WITH_ID_0_IS_NO_LONGER_IN_MY_OWN_VIEW_1, for (int i = 0; i < newView.size(); i++) { // additions InternalDistributedMember m = newView.elementAt(i); if (newView.contains(m)) { continue; // still alive newView.getCrashedMembers().contains(m) || suspectedMembers.containsKey(m) , "departed JGroups view"); if (!latestView.contains(entry.getKey())) { latestView.add(entry.getKey());
private void removeMembersFromCollectionIfNotInView(Collection<InternalDistributedMember> members, NetView currentView) { Iterator<InternalDistributedMember> iterator = members.iterator(); while (iterator.hasNext()) { if (!currentView.contains(iterator.next())) { iterator.remove(); } } }
if (latestView.contains(member)) { NetView newView = new NetView(latestView, latestView.getViewNumber()); newView.remove(member); latestView = newView;
public void installView(NetView newView) { if (currentView != null && currentView.getViewId() >= newView.getViewId()) { for (InternalDistributedMember mbr : newView.getMembers()) { if (this.localAddress.equals(mbr)) { found = true; Set<InternalDistributedMember> crashes = newView.getActualCrashedMembers(currentView); forceDisconnect(LocalizedStrings.Network_partition_detected.toLocalizedString(crashes.size(), crashes)); return; if (!newView.getCreator().equals(this.localAddress)) { if (newView.shouldBeCoordinator(this.localAddress)) { becomeCoordinator(); } else if (this.isCoordinator) { it.remove(); } else if (m instanceof LeaveRequestMessage) { if (!currentView.contains(((LeaveRequestMessage) m).getMemberID())) { it.remove(); if (!currentView.contains(((RemoveMemberMessage) m).getMemberID())) { it.remove();
/** * Returns a copy (possibly not current) of the current * view (a list of {@link DistributedMember}s) */ public NetView getView() { // Grab the latest view under a mutex... NetView v; latestViewLock.readLock().lock(); v = latestView; latestViewLock.readLock().unlock(); NetView result = new NetView(v, v.getViewId()); for (InternalDistributedMember m: v.getMembers()) { if (isShunned(m)) { result.remove(m); } } return result; }
if (latestView.contains(member)) { return true; return true; if (latestView.getViewNumber() > member.getVmViewId()) { LocalizedStrings.DEBUG, "Membership: Received message from surprise member: <" + member + ">. My view number is " + latestView.getViewNumber() + " its is " + member.getVmViewId()); NetView newMembers = new NetView(latestView, latestView.getViewNumber()); newMembers.add(member); latestView = newMembers;
boolean sendView(NetView view, List<InternalDistributedMember> newMembers, boolean preparing, ViewReplyProcessor rp) { int id = view.getViewId(); InstallViewMessage msg = new InstallViewMessage(view, services.getAuthenticator().getCredentials(this.localAddress), preparing); Set<InternalDistributedMember> recips = new HashSet<>(view.getMembers()); if (!view.getCrashedMembers().isEmpty()) { recips = new HashSet<>(recips); recips.addAll(view.getCrashedMembers()); int[] ports = view.getFailureDetectionPorts(); int numMembers = view.size(); for (int i=0; i<numMembers; i++) { if (i > 0) { pendingRemovals.removeAll(view.getCrashedMembers()); rp.initialize(id, responders); rp.processPendingRequests(pendingLeaves, pendingRemovals);
List<InternalDistributedMember> oldMembers; if (oldView != null) { oldMembers = new ArrayList<>(oldView.getMembers()); } else { oldMembers = Collections.emptyList(); mbrs = new ArrayList<InternalDistributedMember>(); } else { viewNumber = currentView.getViewId() + 1; mbrs = new ArrayList<InternalDistributedMember>(oldMembers); newView = new NetView(localAddress, viewNumber, mbrs, leaveReqs, new HashSet<InternalDistributedMember>(removalReqs)); for (InternalDistributedMember mbr: joinReqs) { if (mbrs.contains(mbr)) { newView.setFailureDetectionPort(mbr, joinPorts.get(mbr)); newView.setFailureDetectionPorts(currentView); if (joinReqs.isEmpty() && newView.getMembers().equals(currentView.getMembers())) { logger.info("membership hasn't changed - aborting new view {}", newView); return; mbr.setVmViewId(newView.getViewId()); mbr.getNetMember().setSplitBrainEnabled(services.getConfig().isNetworkPartitionDetectionEnabled()); prepareAndSendView(newView, joinReqs, leaveReqs, newView.getCrashedMembers());
if (latestView.contains(member)) { return true; logger.warn("adding a surprise member that has not yet joined the distributed system: " + member, new Exception("stack trace")); if (latestView.getViewId() > member.getVmViewId()) { NetView newMembers = new NetView(latestView, latestView.getViewId()); newMembers.add(member); latestView = newMembers;
calculatedLen = v.size(); calculatedMembers = new LinkedList<GMSMember>(); for (int i = 0; i < calculatedLen; i ++) { InternalDistributedMember m = (InternalDistributedMember)v.get(i); calculatedMembers.add((GMSMember)m.getNetMember()); for (int i = 0; i < destinations.length; i ++) { InternalDistributedMember d = destinations[i]; if (!newView.contains(d)) { logger.debug("messenger: member has left the view: {} view is now {}", d, newView); result.add(d);
NetView members = new NetView(v.getMembers().size(), v.getVid().getId()); JGroupMember m = new JGroupMember(a); InternalDistributedMember d = new InternalDistributedMember(m); members.add(d); if (leadmember != null && leadmember.equals(a)) { members.setLeadMember(m); members.setCreator(m); snmem.add(d); members.setCrashedMembers(snmem);
if (currentView == null) { NetView newView = new NetView(this.localAddress); newView.setFailureDetectionPort(localAddress, services.getHealthMonitor().getFailureDetectionPort()); this.localAddress.setVmViewId(0); installView(newView); synchronized(viewInstallationLock) { int rand = testing? 0 : NetView.RANDOM.nextInt(10); int viewNumber = currentView.getViewId() + 5 + rand; if (this.localAddress.getVmViewId() < 0) { this.localAddress.setVmViewId(viewNumber); List<InternalDistributedMember> mbrs = new ArrayList<>(currentView.getMembers()); if (!mbrs.contains(localAddress)) { mbrs.add(localAddress); newView = new NetView(this.localAddress, viewNumber, mbrs, leaving, removals); newView.setFailureDetectionPorts(currentView); newView.setFailureDetectionPort(this.localAddress, services.getHealthMonitor().getFailureDetectionPort()); viewCreator.setInitialView(newView, newView.getNewMembers(), leaving, removals); viewCreator.setDaemon(true); viewCreator.start();
void sendCurrentView() { NetView v = currentView; if (v != null) { InstallViewMessage msg = new InstallViewMessage(v, services.getAuthenticator().getCredentials(localAddress)); Collection<InternalDistributedMember> recips = new ArrayList<>(v.size() + v.getCrashedMembers().size()); recips.addAll(v.getMembers()); recips.remove(localAddress); recips.addAll(v.getCrashedMembers()); msg.setRecipients(recips); // use sendUnreliably since we are sending to crashed members & // don't want any retransmission tasks set up for them services.getMessenger().sendUnreliably(msg); } }