Search in sources :

Example 1 with PhiAccrualFailureDetector

use of io.atomix.cluster.impl.PhiAccrualFailureDetector in project atomix by atomix.

the class HeartbeatMembershipProtocol method sendHeartbeat.

/**
 * Sends a heartbeat to the given peer.
 */
private CompletableFuture<Void> sendHeartbeat(GossipMember member) {
    return bootstrapService.getMessagingService().sendAndReceive(member.address(), HEARTBEAT_MESSAGE, SERIALIZER.encode(localMember)).whenCompleteAsync((response, error) -> {
        if (error == null) {
            Collection<GossipMember> remoteMembers = SERIALIZER.decode(response);
            for (GossipMember remoteMember : remoteMembers) {
                if (!remoteMember.id().equals(localMember.id())) {
                    updateMember(remoteMember, remoteMember.id().equals(member.id()));
                }
            }
        } else {
            LOGGER.debug("{} - Sending heartbeat to {} failed", localMember.id(), member, error);
            if (member.isReachable()) {
                member.setReachable(false);
                post(new GroupMembershipEvent(GroupMembershipEvent.Type.REACHABILITY_CHANGED, member));
            }
            PhiAccrualFailureDetector failureDetector = failureDetectors.computeIfAbsent(member.id(), n -> new PhiAccrualFailureDetector());
            double phi = failureDetector.phi();
            if (phi >= config.getPhiFailureThreshold() || (phi == 0.0 && System.currentTimeMillis() - failureDetector.lastUpdated() > config.getFailureTimeout().toMillis())) {
                if (members.remove(member.id()) != null) {
                    failureDetectors.remove(member.id());
                    post(new GroupMembershipEvent(GroupMembershipEvent.Type.MEMBER_REMOVED, member));
                }
            }
        }
    }, heartbeatScheduler).exceptionally(e -> null).thenApply(v -> null);
}
Also used : Node(io.atomix.cluster.Node) ScheduledFuture(java.util.concurrent.ScheduledFuture) AbstractListenerManager(io.atomix.utils.event.AbstractListenerManager) Address(io.atomix.utils.net.Address) NodeDiscoveryEvent(io.atomix.cluster.discovery.NodeDiscoveryEvent) LoggerFactory(org.slf4j.LoggerFactory) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) CompletableFuture(java.util.concurrent.CompletableFuture) NodeDiscoveryService(io.atomix.cluster.discovery.NodeDiscoveryService) Threads.namedThreads(io.atomix.utils.concurrent.Threads.namedThreads) Lists(com.google.common.collect.Lists) Namespaces(io.atomix.utils.serializer.Namespaces) Map(java.util.Map) ScheduledExecutorService(java.util.concurrent.ScheduledExecutorService) MemberId(io.atomix.cluster.MemberId) Futures(io.atomix.utils.concurrent.Futures) ExecutorService(java.util.concurrent.ExecutorService) ImmutableSet(com.google.common.collect.ImmutableSet) Logger(org.slf4j.Logger) Properties(java.util.Properties) Collection(java.util.Collection) NodeDiscoveryEventListener(io.atomix.cluster.discovery.NodeDiscoveryEventListener) Set(java.util.Set) Version(io.atomix.utils.Version) Maps(com.google.common.collect.Maps) Member(io.atomix.cluster.Member) Collectors(java.util.stream.Collectors) Executors(java.util.concurrent.Executors) PhiAccrualFailureDetector(io.atomix.cluster.impl.PhiAccrualFailureDetector) Objects(java.util.Objects) TimeUnit(java.util.concurrent.TimeUnit) Stream(java.util.stream.Stream) Namespace(io.atomix.utils.serializer.Namespace) AddressSerializer(io.atomix.cluster.impl.AddressSerializer) Serializer(io.atomix.utils.serializer.Serializer) BootstrapService(io.atomix.cluster.BootstrapService) PhiAccrualFailureDetector(io.atomix.cluster.impl.PhiAccrualFailureDetector)

Aggregations

ImmutableSet (com.google.common.collect.ImmutableSet)1 Lists (com.google.common.collect.Lists)1 Maps (com.google.common.collect.Maps)1 BootstrapService (io.atomix.cluster.BootstrapService)1 Member (io.atomix.cluster.Member)1 MemberId (io.atomix.cluster.MemberId)1 Node (io.atomix.cluster.Node)1 NodeDiscoveryEvent (io.atomix.cluster.discovery.NodeDiscoveryEvent)1 NodeDiscoveryEventListener (io.atomix.cluster.discovery.NodeDiscoveryEventListener)1 NodeDiscoveryService (io.atomix.cluster.discovery.NodeDiscoveryService)1 AddressSerializer (io.atomix.cluster.impl.AddressSerializer)1 PhiAccrualFailureDetector (io.atomix.cluster.impl.PhiAccrualFailureDetector)1 Version (io.atomix.utils.Version)1 Futures (io.atomix.utils.concurrent.Futures)1 Threads.namedThreads (io.atomix.utils.concurrent.Threads.namedThreads)1 AbstractListenerManager (io.atomix.utils.event.AbstractListenerManager)1 Address (io.atomix.utils.net.Address)1 Namespace (io.atomix.utils.serializer.Namespace)1 Namespaces (io.atomix.utils.serializer.Namespaces)1 Serializer (io.atomix.utils.serializer.Serializer)1