@Override public synchronized boolean equals(Object arg0) { if (arg0 == this) { return true; } if (!(arg0 instanceof NetView)) { return false; } return this.members.equals(((NetView) arg0).getMembers()); }
public List<InternalDistributedMember> getMembers() { if (view != null) { return new ArrayList<InternalDistributedMember>(view.getMembers()); } else { synchronized(registrants) { return new ArrayList<InternalDistributedMember>(registrants); } } }
/** * return members that are i this view but not the given old view */ public List<InternalDistributedMember> getNewMembers(NetView olderView) { List<InternalDistributedMember> result = new ArrayList<InternalDistributedMember>(members); result.removeAll(olderView.getMembers()); return result; }
public boolean memberExists(DistributedMember m) { latestViewLock.readLock().lock(); NetView v = latestView; latestViewLock.readLock().unlock(); return v.getMembers().contains(m); }
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); } } } }
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); }
/** * Sends a message declaring a network partition to the * members of the given view via Messenger * * @param view */ 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); } }
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); } } } }
@Override public void installView(NetView v) { if (latestViewId < 0 && !isConnected()) { if (this.directChannel != null) { this.directChannel.setMembershipSize(v.getMembers().size()); } latestViewId = v.getViewId(); latestView = v; logger.debug("MembershipManager: initial view is {}", latestView); } else { handleOrDeferViewEvent(v); } }
/** * 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; }
@Override public synchronized boolean checkForQuorum(long timeout) throws InterruptedException { if (quorumAchieved) { return true; } if (isDebugEnabled) { logger.debug("beginning quorum check with {}", this); } try { sendPingMessages(); quorumAchieved = waitForResponses(lastView.getMembers().size(), timeout); // If we did not achieve full quorum, calculate if we achieved quorum if (!quorumAchieved) { quorumAchieved = calculateQuorum(); } } finally { } return quorumAchieved; }
List<InternalDistributedMember> remaining = new ArrayList<InternalDistributedMember>(view.getMembers()); remaining.removeAll(failures);
public List<InternalDistributedMember> getViewMembers() { NetView result = null; DistributionChannel ch = this.channel; if (ch != null) { MembershipManager mgr = ch.getMembershipManager(); if (mgr != null) { result = mgr.getView(); } } if (result == null) { result = new NetView(); } return result.getMembers(); } /* implementation of DM.getOldestMember */
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); } }
public void initialize() { receivedAcks = new ConcurrentHashSet<InternalDistributedMember>(); pingPonger = new GMSPingPonger(); // UUID logicalAddress = (UUID) channel.getAddress(); // IpAddress ipaddr = (IpAddress) channel.down(new Event(Event.GET_PHYSICAL_ADDRESS)); // // myAddress = new JGAddress(logicalAddress, ipaddr); myAddress = (JGAddress)channel.down(new Event(Event.GET_LOCAL_ADDRESS)); addressConversionMap = new ConcurrentHashMap<SocketAddress, InternalDistributedMember>(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(); }
@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<JGAddress>(v.size()); for (InternalDistributedMember idm: v.getMembers()) { mbrs.add(new JGAddress(idm)); } ViewId vid = new ViewId(new JGAddress(v.getCoordinator()), v.getViewId()); View jgv = new View(vid, new ArrayList<Address>(mbrs)); logger.trace("installing JGroups view: {}", jgv); this.myChannel.down(new Event(Event.VIEW_CHANGE, jgv)); addressesWithioExceptionsProcessed.clear(); }
/** * returns the member ID for the given GMSMember object */ private InternalDistributedMember getMemberFromView(GMSMember jgId, short version) { NetView v = services.getJoinLeave().getView(); if (v != null) { for (InternalDistributedMember m: v.getMembers()) { if (((GMSMember)m.getNetMember()).equals(jgId)) { return m; } } } return new InternalDistributedMember(jgId); }
/** * 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; } } }
JGAddress jgMbr = (JGAddress)dest; if (jgMbr != null && v != null) { List<InternalDistributedMember> members = v.getMembers(); InternalDistributedMember recipient = null; for (InternalDistributedMember mbr: members) {
newMembers = v.getNewMembers(currentView); } else { newMembers = v.getMembers();