private void sendSuspectRequest(final List<SuspectRequest> requests) { logger.debug("Sending suspect request for members {}", requests); List<InternalDistributedMember> recipients; if (currentView.size() > ServiceConfig.SMALL_CLUSTER_SIZE) { HashSet<InternalDistributedMember> filter = new HashSet<>(); for (Enumeration<InternalDistributedMember> e = suspectedMemberIds.keys(); e .hasMoreElements();) { filter.add(e.nextElement()); } filter.addAll( requests.stream().map(SuspectRequest::getSuspectMember).collect(Collectors.toList())); recipients = currentView.getPreferredCoordinators(filter, services.getJoinLeave().getMemberID(), ServiceConfig.SMALL_CLUSTER_SIZE + 1); } else { recipients = currentView.getMembers(); } logger.info("Sending suspect messages to {}", recipients); SuspectMembersMessage smm = new SuspectMembersMessage(recipients, requests); Set<InternalDistributedMember> failedRecipients; try { failedRecipients = services.getMessenger().send(smm); this.stats.incSuspectsSent(); } catch (CancelException e) { return; } if (failedRecipients != null && failedRecipients.size() > 0) { logger.info("Unable to send suspect message to {}", failedRecipients); } }
@Override public void leave() { synchronized (viewInstallationLock) { NetView view = currentView; isStopping = true; stopCoordinatorServices(); if (view != null) { if (view.size() > 1) { List<InternalDistributedMember> coords = view.getPreferredCoordinators(Collections.emptySet(), localAddress, 5); logger.debug("Sending my leave request to {}", coords); LeaveRequestMessage m = new LeaveRequestMessage(coords, this.localAddress, "this member is shutting down"); services.getMessenger().send(m); } // view.size } // view != null } }
public void initialize() { receivedAcks = new ConcurrentHashSet<>(); pingPonger = new GMSPingPonger(); myAddress = (JGAddress) channel.down(new Event(Event.GET_LOCAL_ADDRESS)); addressConversionMap = new ConcurrentHashMap<>(this.lastView.size()); List<InternalDistributedMember> members = this.lastView.getMembers(); for (InternalDistributedMember addr : members) { SocketAddress sockaddr = new InetSocketAddress(addr.getNetMember().getInetAddress(), addr.getPort()); addressConversionMap.put(sockaddr, addr); } isDebugEnabled = logger.isDebugEnabled(); resume(); }
void sendCurrentView() { NetView v = currentView; if (v != null) { InstallViewMessage msg = new InstallViewMessage(v, services.getAuthenticator().getCredentials(localAddress), false); 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); } } }
@Override public void installView(NetView v) { this.view = v; if (this.jgAddress.getVmViewId() < 0) { this.jgAddress.setVmViewId(this.localAddress.getVmViewId()); } List<JGAddress> mbrs = new ArrayList<>(v.size()); mbrs.addAll(v.getMembers().stream().map(JGAddress::new).collect(Collectors.toList())); ViewId vid = new ViewId(new JGAddress(v.getCoordinator()), v.getViewId()); View jgv = new View(vid, new ArrayList<>(mbrs)); logger.trace("installing view into JGroups stack: {}", jgv); this.myChannel.down(new Event(Event.VIEW_CHANGE, jgv)); addressesWithIoExceptionsProcessed.clear(); if (encrypt != null) { encrypt.installView(v); } synchronized (scheduledMcastSeqnos) { for (DistributedMember mbr : v.getCrashedMembers()) { scheduledMcastSeqnos.remove(mbr); } for (DistributedMember mbr : v.getShutdownMembers()) { scheduledMcastSeqnos.remove(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)); } }
calculatedLen = v.size(); calculatedMembers = new LinkedList<GMSMember>(); for (int i = 0; i < calculatedLen; i++) {
@Test public void testAddLotsOfMembers() throws Exception { NetView view = new NetView(members.get(0), 2, new ArrayList<>(members)); setFailureDetectionPorts(view); NetView copy = new NetView(view, 2); int oldSize = view.size(); for (int i = 0; i < 100; i++) { InternalDistributedMember mbr = new InternalDistributedMember(SocketCreator.getLocalHost(), 2000 + i); mbr.setVmKind(ClusterDistributionManager.NORMAL_DM_TYPE); mbr.setVmViewId(2); view.add(mbr); view.setFailureDetectionPort(mbr, 2000 + i); } assertEquals(oldSize + 100, view.size()); for (InternalDistributedMember mbr : view.getMembers()) { assertEquals(mbr.getPort(), view.getFailureDetectionPort(mbr)); } assertEquals(100, view.getNewMembers(copy).size()); }