use of alluxio.grpc.SnapshotMetadata 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 alluxio.grpc.SnapshotMetadata 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;
}
Aggregations