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);
}
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);
}
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);
}
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();
}
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);
}
Aggregations