private ConsistentHash suspect(Member member) { ConsistentHash newConsistentHash = atomicConsistentHash.updateAndGet(consistentHash -> consistentHash.without(member)); consistentHashChangeListener.onConsistentHashChanged(newConsistentHash); return newConsistentHash; }
/** * Update the local member and all the other remote members known by the * {@link org.springframework.cloud.client.discovery.DiscoveryClient} to be able to have an as up-to-date awareness * of which actions which members can handle. This function is automatically triggered by an (unused) * {@link org.springframework.cloud.client.discovery.event.InstanceRegisteredEvent}. Upon this event we may assume * that the application has fully start up. Because of this we can update the local member with the correct name and * {@link java.net.URI}, as initially these were not provided by the * {@link org.springframework.cloud.client.serviceregistry.Registration} yet. * * @param event an unused {@link org.springframework.cloud.client.discovery.event.InstanceRegisteredEvent}, serves * as a trigger for this function * @see SpringCloudCommandRouter#buildMember(ServiceInstance) */ @EventListener @SuppressWarnings("UnusedParameters") public void resetLocalMembership(InstanceRegisteredEvent event) { registered = true; Member startUpPhaseLocalMember = atomicConsistentHash.get().getMembers().stream() .filter(Member::local) .findFirst() .orElseThrow(() -> new IllegalStateException( "There should be no scenario where the local member does not exist." )); if (logger.isDebugEnabled()) { logger.debug("Resetting local membership for [{}].", startUpPhaseLocalMember); } updateMemberships(); atomicConsistentHash.updateAndGet(consistentHash -> consistentHash.without(startUpPhaseLocalMember)); }
@Override public synchronized void viewAccepted(final View view) { if (currentView == null) { currentView = view; logger.info("Local segment ({}) joined the cluster. Broadcasting configuration.", channel.getAddress()); try { broadCastMembership(membershipVersion.get(), true); joinedCondition.markJoined(); } catch (Exception e) { throw new MembershipUpdateFailedException("Failed to broadcast my settings", e); } } else if (!view.equals(currentView)) { Address[][] diff = View.diff(currentView, view); Address[] joined = diff[0]; Address[] left = diff[1]; currentView = view; Address localAddress = channel.getAddress(); stream(left).forEach(lm -> updateConsistentHash(ch -> { VersionedMember member = members.get(lm); if (member == null) { return ch; } return ch.without(member); })); stream(left).forEach(members::remove); stream(joined).filter(member -> !member.equals(localAddress)) .forEach(member -> sendMyConfigurationTo(member, true, membershipVersion.get())); } currentView = view; }
@Override public synchronized void viewAccepted(final View view) { if (currentView == null) { currentView = view; logger.info("Local segment ({}) joined the cluster. Broadcasting configuration.", channel.getAddress()); try { broadCastMembership(membershipVersion.get(), true); joinedCondition.markJoined(); } catch (Exception e) { throw new MembershipUpdateFailedException("Failed to broadcast my settings", e); } } else if (!view.equals(currentView)) { Address[][] diff = View.diff(currentView, view); Address[] joined = diff[0]; Address[] left = diff[1]; currentView = view; Address localAddress = channel.getAddress(); stream(left).forEach(lm -> updateConsistentHash(ch -> { VersionedMember member = members.get(lm); if (member == null) { return ch; } return ch.without(member); })); stream(left).forEach(members::remove); stream(joined).filter(member -> !member.equals(localAddress)) .forEach(member -> sendMyConfigurationTo(member, true, membershipVersion.get())); } currentView = view; }