Search in sources :

Example 6 with Member

use of io.scalecube.cluster.Member in project scalecube by scalecube.

the class FailureDetectorImpl method onPingReq.

/**
 * Listens to PING_REQ message and sends PING to requested cluster member.
 */
private void onPingReq(Message message) {
    LOGGER.trace("Received PingReq: {}", message);
    PingData data = message.data();
    Member target = data.getTo();
    Member originalIssuer = data.getFrom();
    String correlationId = message.correlationId();
    PingData pingReqData = new PingData(membership.member(), target, originalIssuer);
    Message pingMessage = Message.withData(pingReqData).qualifier(PING).correlationId(correlationId).build();
    LOGGER.trace("Send transit Ping to {}", target.address());
    transport.send(target.address(), pingMessage);
}
Also used : Message(io.scalecube.transport.Message) Member(io.scalecube.cluster.Member)

Example 7 with Member

use of io.scalecube.cluster.Member in project scalecube by scalecube.

the class FailureDetectorImpl method onTransitPingAck.

/**
 * Listens to ACK with message containing ORIGINAL_ISSUER then converts message to plain ACK and sends it to
 * ORIGINAL_ISSUER.
 */
private void onTransitPingAck(Message message) {
    LOGGER.trace("Received transit PingAck: {}", message);
    PingData data = message.data();
    Member target = data.getOriginalIssuer();
    String correlationId = message.correlationId();
    PingData originalAckData = new PingData(target, data.getTo());
    Message originalAckMessage = Message.withData(originalAckData).qualifier(PING_ACK).correlationId(correlationId).build();
    LOGGER.trace("Resend transit PingAck to {}", target.address());
    transport.send(target.address(), originalAckMessage);
}
Also used : Message(io.scalecube.transport.Message) Member(io.scalecube.cluster.Member)

Example 8 with Member

use of io.scalecube.cluster.Member in project scalecube by scalecube.

the class MembershipProtocolImpl method onUpdateMetadata.

private void onUpdateMetadata(Map<String, String> metadata) {
    // Update local member reference
    Member curMember = memberRef.get();
    String memberId = curMember.id();
    Member newMember = new Member(memberId, curMember.address(), metadata);
    memberRef.set(newMember);
    // Update membership table
    MembershipRecord curRecord = membershipTable.get(memberId);
    MembershipRecord newRecord = new MembershipRecord(newMember, ALIVE, curRecord.incarnation() + 1);
    membershipTable.put(memberId, newRecord);
    // Emit membership updated event
    subject.onNext(MembershipEvent.createUpdated(curMember, newMember));
    // Spread new membership record over the cluster
    spreadMembershipGossip(newRecord);
}
Also used : Member(io.scalecube.cluster.Member)

Example 9 with Member

use of io.scalecube.cluster.Member in project scalecube by scalecube.

the class MembershipProtocolImpl method start.

/**
 * Starts running cluster membership protocol. After started it begins to receive and send cluster membership messages
 */
public CompletableFuture<Void> start() {
    // Init membership table with local member record
    Member member = memberRef.get();
    MembershipRecord localMemberRecord = new MembershipRecord(member, ALIVE, 0);
    membershipTable.put(member.id(), localMemberRecord);
    // Listen to incoming SYNC requests from other members
    onSyncRequestSubscriber = Subscribers.create(this::onSync, this::onError);
    transport.listen().observeOn(scheduler).filter(msg -> SYNC.equals(msg.qualifier())).filter(this::checkSyncGroup).subscribe(onSyncRequestSubscriber);
    // Listen to incoming SYNC ACK responses from other members
    onSyncAckResponseSubscriber = Subscribers.create(this::onSyncAck, this::onError);
    transport.listen().observeOn(scheduler).filter(msg -> SYNC_ACK.equals(msg.qualifier())).filter(// filter out initial sync
    msg -> msg.correlationId() == null).filter(this::checkSyncGroup).subscribe(onSyncAckResponseSubscriber);
    // Listen to events from failure detector
    onFdEventSubscriber = Subscribers.create(this::onFailureDetectorEvent, this::onError);
    failureDetector.listen().observeOn(scheduler).subscribe(onFdEventSubscriber);
    // Listen to membership gossips
    onGossipRequestSubscriber = Subscribers.create(this::onMembershipGossip, this::onError);
    gossipProtocol.listen().observeOn(scheduler).filter(msg -> MEMBERSHIP_GOSSIP.equals(msg.qualifier())).subscribe(onGossipRequestSubscriber);
    // Make initial sync with all seed members
    return doInitialSync();
}
Also used : ThreadFactoryBuilder(com.google.common.util.concurrent.ThreadFactoryBuilder) FailureDetector(io.scalecube.cluster.fdetector.FailureDetector) ScheduledFuture(java.util.concurrent.ScheduledFuture) Address(io.scalecube.transport.Address) LoggerFactory(org.slf4j.LoggerFactory) HashMap(java.util.HashMap) CompletableFuture(java.util.concurrent.CompletableFuture) AtomicReference(java.util.concurrent.atomic.AtomicReference) Observable(rx.Observable) ArrayList(java.util.ArrayList) HashSet(java.util.HashSet) ImmutableList(com.google.common.collect.ImmutableList) Map(java.util.Map) ThreadLocalRandom(java.util.concurrent.ThreadLocalRandom) Schedulers(rx.schedulers.Schedulers) ScheduledExecutorService(java.util.concurrent.ScheduledExecutorService) Transport(io.scalecube.transport.Transport) Message(io.scalecube.transport.Message) Subscribers(rx.observers.Subscribers) ClusterMath(io.scalecube.cluster.ClusterMath) GossipProtocol(io.scalecube.cluster.gossip.GossipProtocol) Logger(org.slf4j.Logger) Subscriber(rx.Subscriber) Collection(java.util.Collection) Set(java.util.Set) FailureDetectorEvent(io.scalecube.cluster.fdetector.FailureDetectorEvent) Scheduler(rx.Scheduler) DEAD(io.scalecube.cluster.membership.MemberStatus.DEAD) Subject(rx.subjects.Subject) Executors(java.util.concurrent.Executors) TimeUnit(java.util.concurrent.TimeUnit) List(java.util.List) ALIVE(io.scalecube.cluster.membership.MemberStatus.ALIVE) Member(io.scalecube.cluster.Member) Preconditions(com.google.common.base.Preconditions) PublishSubject(rx.subjects.PublishSubject) Collections(java.util.Collections) Member(io.scalecube.cluster.Member)

Example 10 with Member

use of io.scalecube.cluster.Member in project scalecube by scalecube.

the class FailureDetectorTest method listenNextEventFor.

private Future<List<FailureDetectorEvent>> listenNextEventFor(FailureDetectorImpl fd, List<Address> addresses) {
    addresses = new ArrayList<>(addresses);
    // exclude self
    addresses.remove(fd.getTransport().address());
    checkArgument(!addresses.isEmpty());
    List<CompletableFuture<FailureDetectorEvent>> resultFuture = new ArrayList<>();
    for (final Address member : addresses) {
        final CompletableFuture<FailureDetectorEvent> future = new CompletableFuture<>();
        fd.listen().filter(event -> event.member().address() == member).subscribe(future::complete);
        resultFuture.add(future);
    }
    return allOf(resultFuture);
}
Also used : Arrays(java.util.Arrays) Address(io.scalecube.transport.Address) MembershipProtocol(io.scalecube.cluster.membership.MembershipProtocol) Collection(java.util.Collection) Assert.assertTrue(org.junit.Assert.assertTrue) Test(org.junit.Test) CompletableFuture(java.util.concurrent.CompletableFuture) MemberStatus(io.scalecube.cluster.membership.MemberStatus) SUSPECT(io.scalecube.cluster.membership.MemberStatus.SUSPECT) Collectors(java.util.stream.Collectors) ArrayList(java.util.ArrayList) TimeUnit(java.util.concurrent.TimeUnit) Preconditions.checkArgument(com.google.common.base.Preconditions.checkArgument) ClusterConfig(io.scalecube.cluster.ClusterConfig) List(java.util.List) Future(java.util.concurrent.Future) Lists(com.google.common.collect.Lists) ALIVE(io.scalecube.cluster.membership.MemberStatus.ALIVE) Member(io.scalecube.cluster.Member) Transport(io.scalecube.transport.Transport) TransportConfig(io.scalecube.transport.TransportConfig) DummyMembershipProtocol(io.scalecube.cluster.membership.DummyMembershipProtocol) BaseTest(io.scalecube.testlib.BaseTest) Assert.assertEquals(org.junit.Assert.assertEquals) CompletableFuture(java.util.concurrent.CompletableFuture) Address(io.scalecube.transport.Address) ArrayList(java.util.ArrayList)

Aggregations

Member (io.scalecube.cluster.Member)17 Message (io.scalecube.transport.Message)8 TimeUnit (java.util.concurrent.TimeUnit)7 ArrayList (java.util.ArrayList)6 List (java.util.List)6 Preconditions.checkArgument (com.google.common.base.Preconditions.checkArgument)5 Transport (io.scalecube.transport.Transport)5 MemberStatus (io.scalecube.cluster.membership.MemberStatus)4 MembershipProtocol (io.scalecube.cluster.membership.MembershipProtocol)4 BaseTest (io.scalecube.testlib.BaseTest)4 Address (io.scalecube.transport.Address)4 Collections (java.util.Collections)4 Test (org.junit.Test)4 Logger (org.slf4j.Logger)4 LoggerFactory (org.slf4j.LoggerFactory)4 ThreadFactoryBuilder (com.google.common.util.concurrent.ThreadFactoryBuilder)3 ALIVE (io.scalecube.cluster.membership.MemberStatus.ALIVE)3 Collection (java.util.Collection)3 Map (java.util.Map)3 Executors (java.util.concurrent.Executors)3