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 } }
@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); } }
@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)); }