@Override public synchronized boolean equals(Object other) { if (other == this) { return true; } if (other instanceof NetView) { return this.members.equals(((NetView) other).getMembers()); } return false; }
/** * return members that are i this view but not the given old view */ public List<InternalDistributedMember> getNewMembers(NetView olderView) { List<InternalDistributedMember> result = new ArrayList<>(members); result.removeAll(olderView.getMembers()); return result; }
public List<InternalDistributedMember> getMembers() { if (view != null) { return new ArrayList<>(view.getMembers()); } else { synchronized (registrants) { return new ArrayList<>(registrants); } } }
@Override public List<InternalDistributedMember> getViewMembers() { return membershipManager.getView().getMembers(); }
/** * Returns a copy (possibly not current) of the current view (a list of * {@link DistributedMember}s) */ @Override public NetView getView() { // Grab the latest view under a mutex... NetView v; latestViewReadLock.lock(); v = latestView; latestViewReadLock.unlock(); NetView result = new NetView(v, v.getViewId()); v.getMembers().stream().filter(this::isShunned).forEachOrdered(result::remove); return result; }
private void sendPingMessages() { // send a ping message to each member in the last view seen List<InternalDistributedMember> members = this.lastView.getMembers(); for (InternalDistributedMember addr : members) { if (!receivedAcks.contains(addr)) { JGAddress dest = new JGAddress(addr); if (isDebugEnabled) { logger.debug("quorum check: sending request to {}", addr); } try { pingPonger.sendPingMessage(channel, myAddress, dest); } catch (Exception e) { logger.debug("Failed sending Ping message to " + dest); } } } }
/** * Sends a message declaring a network partition to the members of the given view via Messenger * */ void sendNetworkPartitionMessage(NetView view) { List<InternalDistributedMember> recipients = new ArrayList<>(view.getMembers()); recipients.remove(localAddress); NetworkPartitionMessage msg = new NetworkPartitionMessage(recipients); try { services.getMessenger().send(msg); } catch (RuntimeException e) { logger.debug("unable to send network partition message - continuing", e); } }
@Override public InternalDistributedMember getMemberID(NetMember jgId) { NetView v = currentView; InternalDistributedMember ret = null; if (v != null) { ret = getMemId(jgId, v.getMembers()); } if (ret == null) { v = preparedView; if (v != null) { ret = getMemId(jgId, v.getMembers()); } } if (ret == null) { return new InternalDistributedMember(jgId); } return ret; }
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); }
@Override public synchronized boolean checkForQuorum(long timeout) throws InterruptedException { if (quorumAchieved) { return true; } if (isDebugEnabled) { logger.debug("beginning quorum check with {}", this); } sendPingMessages(); quorumAchieved = waitForResponses(lastView.getMembers().size(), timeout); // If we did not achieve full quorum, calculate if we achieved quorum if (!quorumAchieved) { quorumAchieved = calculateQuorum(); } return quorumAchieved; }
private void sendPeriodicHeartbeats() { while (!isStopping && !services.getCancelCriterion().isCancelInProgress()) { try { Thread.sleep(memberTimeout / LOGICAL_INTERVAL); } catch (InterruptedException e) { return; } NetView v = currentView; if (v != null) { List<InternalDistributedMember> mbrs = v.getMembers(); int index = mbrs.indexOf(localAddress); if (index < 0 || mbrs.size() < 2) { continue; } if (!playingDead) { sendHeartbeats(mbrs, index); } } } }
private void addPublicKeysToView(NetView view) { String sDHAlgo = services.getConfig().getDistributionConfig().getSecurityUDPDHAlgo(); if (sDHAlgo != null && !sDHAlgo.isEmpty()) { for (InternalDistributedMember mbr : view.getMembers()) { if (Objects.isNull(view.getPublicKey(mbr))) { byte[] pk = services.getMessenger().getPublicKey(mbr); view.setPublicKey(mbr, pk); } } } }
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); } } }
/** * 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; } } }
@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 testNullPublicKeysNotRetained() throws Exception { NetView view = new NetView(members.get(0), 2, new ArrayList<>(members)); setFailureDetectionPorts(view); NetView newView = new NetView(view, 3); for (InternalDistributedMember member : view.getMembers()) { view.setPublicKey(member, null); } newView.setPublicKeys(view); for (InternalDistributedMember member : view.getMembers()) { assertNull(newView.getPublicKey(member)); assertNull(view.getPublicKey(member)); } }
@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)); } }
@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)); }
@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()); }