use of org.apache.ratis.protocol.RaftPeerId in project alluxio by Alluxio.
the class SnapshotReplicationManager method requestInfo.
private void requestInfo() {
Preconditions.checkState(mDownloadState.get() == DownloadState.REQUEST_INFO);
try {
SingleFileSnapshotInfo latestSnapshot = mStorage.getLatestSnapshot();
SnapshotMetadata snapshotMetadata = latestSnapshot == null ? null : SnapshotMetadata.newBuilder().setSnapshotTerm(latestSnapshot.getTerm()).setSnapshotIndex(latestSnapshot.getIndex()).build();
// build SnapshotInfoRequests
Map<RaftPeerId, CompletableFuture<RaftClientReply>> jobs = mJournalSystem.getQuorumServerInfoList().stream().filter(server -> server.getServerState() == QuorumServerState.AVAILABLE).map(server -> RaftJournalUtils.getPeerId(server.getServerAddress().getHost(), server.getServerAddress().getRpcPort())).filter(peerId -> !peerId.equals(mJournalSystem.getLocalPeerId())).collect(Collectors.toMap(Function.identity(), peerId -> mJournalSystem.sendMessageAsync(peerId, toMessage(JournalQueryRequest.newBuilder().setSnapshotInfoRequest(GetSnapshotInfoRequest.getDefaultInstance()).build()))));
// query all secondary masters for information about their latest snapshot
for (Map.Entry<RaftPeerId, CompletableFuture<RaftClientReply>> job : jobs.entrySet()) {
RaftPeerId peerId = job.getKey();
try {
RaftClientReply reply = job.getValue().get();
if (reply.getException() != null) {
throw reply.getException();
}
JournalQueryResponse response = JournalQueryResponse.parseFrom(reply.getMessage().getContent().asReadOnlyByteBuffer());
if (!response.hasSnapshotInfoResponse()) {
throw new IOException("Invalid response for GetSnapshotInfoRequest " + response);
}
LOG.debug("Received snapshot info from follower {} - {}", peerId, response);
SnapshotMetadata latest = response.getSnapshotInfoResponse().getLatest();
if (snapshotMetadata == null || (latest.getSnapshotTerm() >= snapshotMetadata.getSnapshotTerm()) && latest.getSnapshotIndex() > snapshotMetadata.getSnapshotIndex()) {
mSnapshotCandidates.add(new Pair<>(latest, peerId));
}
} catch (Exception e) {
LOG.warn("Error while requesting snapshot info from {}: {}", peerId, e.toString());
}
}
} catch (Exception e) {
LogUtils.warnWithException(LOG, "Failed to request snapshot info from followers", e);
}
}
use of org.apache.ratis.protocol.RaftPeerId in project alluxio by Alluxio.
the class SnapshotReplicationManager method requestData.
private boolean requestData() {
Preconditions.checkState(mDownloadState.get() == DownloadState.REQUEST_DATA);
// request snapshots from the most recent to least recent
while (!mSnapshotCandidates.isEmpty()) {
Pair<SnapshotMetadata, RaftPeerId> candidate = mSnapshotCandidates.poll();
SnapshotMetadata metadata = candidate.getFirst();
RaftPeerId peerId = candidate.getSecond();
LOG.info("Request data from follower {} for snapshot (t: {}, i: {})", peerId, metadata.getSnapshotTerm(), metadata.getSnapshotIndex());
try {
RaftClientReply reply = mJournalSystem.sendMessageAsync(peerId, toMessage(JournalQueryRequest.newBuilder().setSnapshotRequest(GetSnapshotRequest.getDefaultInstance()).build())).get();
if (reply.getException() != null) {
throw reply.getException();
}
return true;
} catch (Exception e) {
LOG.warn("Failed to request snapshot data from {}: {}", peerId, e);
}
}
// return failure if there are no more candidates to ask snapshot from
return false;
}
use of org.apache.ratis.protocol.RaftPeerId in project incubator-ratis by apache.
the class NettyRpcService method sendRaftNettyServerRequestProto.
private RaftNettyServerReplyProto sendRaftNettyServerRequestProto(RaftRpcRequestProto request, RaftNettyServerRequestProto proto) throws IOException {
final RaftPeerId id = RaftPeerId.valueOf(request.getReplyId());
final NettyRpcProxy p = getProxies().getProxy(id);
try {
return p.send(request, proto);
} catch (ClosedChannelException cce) {
getProxies().resetProxy(id);
throw cce;
}
}
use of org.apache.ratis.protocol.RaftPeerId in project incubator-ratis by apache.
the class LeaderElection method waitForResults.
private ResultAndTerm waitForResults(final long electionTerm, final int submitted) throws InterruptedException {
final Timestamp timeout = new Timestamp().addTimeMs(server.getRandomTimeoutMs());
final List<RequestVoteReplyProto> responses = new ArrayList<>();
final List<Exception> exceptions = new ArrayList<>();
int waitForNum = submitted;
Collection<RaftPeerId> votedPeers = new ArrayList<>();
while (waitForNum > 0 && running && server.isCandidate()) {
final long waitTime = -timeout.elapsedTimeMs();
if (waitTime <= 0) {
return logAndReturn(Result.TIMEOUT, responses, exceptions, -1);
}
try {
final Future<RequestVoteReplyProto> future = service.poll(waitTime, TimeUnit.MILLISECONDS);
if (future == null) {
// poll timeout, continue to return Result.TIMEOUT
continue;
}
final RequestVoteReplyProto r = future.get();
responses.add(r);
if (r.getShouldShutdown()) {
return logAndReturn(Result.SHUTDOWN, responses, exceptions, -1);
}
if (r.getTerm() > electionTerm) {
return logAndReturn(Result.DISCOVERED_A_NEW_TERM, responses, exceptions, r.getTerm());
}
if (r.getServerReply().getSuccess()) {
votedPeers.add(RaftPeerId.valueOf(r.getServerReply().getReplyId()));
if (conf.hasMajority(votedPeers, server.getId())) {
return logAndReturn(Result.PASSED, responses, exceptions, -1);
}
}
} catch (ExecutionException e) {
LOG.info("{} got exception when requesting votes: {}", server.getId(), e);
LOG.trace("TRACE", e);
exceptions.add(e);
}
waitForNum--;
}
// received all the responses
return logAndReturn(Result.REJECTED, responses, exceptions, -1);
}
use of org.apache.ratis.protocol.RaftPeerId in project incubator-ratis by apache.
the class RaftTestUtil method changeLeader.
static RaftPeerId changeLeader(MiniRaftCluster cluster, RaftPeerId oldLeader) throws InterruptedException {
cluster.setBlockRequestsFrom(oldLeader.toString(), true);
try {
return JavaUtils.attempt(() -> {
final RaftPeerId newLeader = waitForLeader(cluster).getId();
Preconditions.assertTrue(!newLeader.equals(oldLeader), () -> "Failed to change leader: newLeader=" + newLeader + " equals oldLeader=" + oldLeader);
LOG.info("Changed leader from " + oldLeader + " to " + newLeader);
return newLeader;
}, 10, 100L, "changeLeader", LOG);
} finally {
cluster.setBlockRequestsFrom(oldLeader.toString(), false);
}
}
Aggregations