alluxio.master.block.BlockMasterWorkerServiceHandler Maven / Gradle / Ivy
/*
* The Alluxio Open Foundation licenses this work under the Apache License, version 2.0
* (the "License"). You may not use this work except in compliance with the License, which is
* available at www.apache.org/licenses/LICENSE-2.0
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
* either express or implied, as more fully set forth in the License.
*
* See the NOTICE file distributed with this work for information regarding copyright ownership.
*/
package alluxio.master.block;
import alluxio.RpcUtils;
import alluxio.grpc.BlockHeartbeatPRequest;
import alluxio.grpc.BlockHeartbeatPResponse;
import alluxio.grpc.BlockMasterWorkerServiceGrpc;
import alluxio.grpc.CommitBlockInUfsPRequest;
import alluxio.grpc.CommitBlockInUfsPResponse;
import alluxio.grpc.CommitBlockPRequest;
import alluxio.grpc.CommitBlockPResponse;
import alluxio.grpc.GetWorkerIdPRequest;
import alluxio.grpc.GetWorkerIdPResponse;
import alluxio.grpc.GrpcUtils;
import alluxio.grpc.RegisterWorkerPOptions;
import alluxio.grpc.RegisterWorkerPRequest;
import alluxio.grpc.RegisterWorkerPResponse;
import alluxio.grpc.StorageList;
import alluxio.metrics.Metric;
import alluxio.proto.meta.Block;
import com.google.common.base.Preconditions;
import io.grpc.stub.StreamObserver;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* This class is a gRPC handler for block master RPCs invoked by an Alluxio worker.
*/
public final class BlockMasterWorkerServiceHandler extends
BlockMasterWorkerServiceGrpc.BlockMasterWorkerServiceImplBase {
private static final Logger LOG = LoggerFactory.getLogger(BlockMasterWorkerServiceHandler.class);
private final BlockMaster mBlockMaster;
/**
* Creates a new instance of {@link BlockMasterWorkerServiceHandler}.
*
* @param blockMaster the {@link BlockMaster} the handler uses internally
*/
public BlockMasterWorkerServiceHandler(BlockMaster blockMaster) {
Preconditions.checkNotNull(blockMaster, "blockMaster");
mBlockMaster = blockMaster;
}
@Override
public void blockHeartbeat(BlockHeartbeatPRequest request,
StreamObserver responseObserver) {
final long workerId = request.getWorkerId();
final Map capacityBytesOnTiers =
request.getOptions().getCapacityBytesOnTiersMap();
final Map usedBytesOnTiers = request.getUsedBytesOnTiersMap();
final List removedBlockIds = request.getRemovedBlockIdsList();
final Map lostStorageMap = request.getLostStorageMap();
final Map> addedBlocksMap =
request
.getAddedBlocksList()
.stream()
.collect(
Collectors.toMap(
e -> Block.BlockLocation.newBuilder().setTier(e.getKey().getTierAlias())
.setMediumType(e.getKey().getMediumType()).build(),
e -> e.getValue().getBlockIdList(),
(e1, e2) -> {
List e3 = new ArrayList<>(e1);
e3.addAll(e2);
return e3;
}));
final List metrics = request.getOptions().getMetricsList()
.stream().map(Metric::fromProto).collect(Collectors.toList());
RpcUtils.call(LOG, (RpcUtils.RpcCallableThrowsIOException) () ->
BlockHeartbeatPResponse.newBuilder().setCommand(mBlockMaster.workerHeartbeat(workerId,
capacityBytesOnTiers, usedBytesOnTiers, removedBlockIds, addedBlocksMap,
lostStorageMap, metrics)).build(),
"blockHeartbeat", "request=%s", responseObserver, request);
}
@Override
public void commitBlock(CommitBlockPRequest request,
StreamObserver responseObserver) {
final long workerId = request.getWorkerId();
final long usedBytesOnTier = request.getUsedBytesOnTier();
final String tierAlias = request.getTierAlias();
final long blockId = request.getBlockId();
final String mediumType = request.getMediumType();
final long length = request.getLength();
RpcUtils.call(LOG, (RpcUtils.RpcCallableThrowsIOException) () -> {
mBlockMaster.commitBlock(workerId, usedBytesOnTier, tierAlias,
mediumType, blockId, length);
return CommitBlockPResponse.getDefaultInstance();
}, "commitBlock", "request=%s", responseObserver, request);
}
@Override
public void commitBlockInUfs(CommitBlockInUfsPRequest request,
StreamObserver responseObserver) {
RpcUtils.call(LOG,
(RpcUtils.RpcCallableThrowsIOException) () -> {
mBlockMaster.commitBlockInUFS(request.getBlockId(), request.getLength());
return CommitBlockInUfsPResponse.getDefaultInstance();
}, "commitBlock", "request=%s", responseObserver, request);
}
@Override
public void getWorkerId(GetWorkerIdPRequest request,
StreamObserver responseObserver) {
RpcUtils.call(LOG, (RpcUtils.RpcCallableThrowsIOException) () -> {
return GetWorkerIdPResponse.newBuilder()
.setWorkerId(mBlockMaster.getWorkerId(GrpcUtils.fromProto(request.getWorkerNetAddress())))
.build();
}, "getWorkerId", "request=%s", responseObserver, request);
}
@Override
public void registerWorker(RegisterWorkerPRequest request,
StreamObserver responseObserver) {
final long workerId = request.getWorkerId();
final List storageTiers = request.getStorageTiersList();
final Map totalBytesOnTiers = request.getTotalBytesOnTiersMap();
final Map usedBytesOnTiers = request.getUsedBytesOnTiersMap();
final Map lostStorageMap = request.getLostStorageMap();
final Map> currBlocksOnLocationMap =
request
.getCurrentBlocksList()
.stream()
.collect(
Collectors.toMap(
e -> Block.BlockLocation.newBuilder().setTier(e.getKey().getTierAlias())
.setMediumType(e.getKey().getMediumType()).build(),
e -> e.getValue().getBlockIdList(),
(e1, e2) -> {
List e3 = new ArrayList<>(e1);
e3.addAll(e2);
return e3;
}));
RegisterWorkerPOptions options = request.getOptions();
RpcUtils.call(LOG,
(RpcUtils.RpcCallableThrowsIOException) () -> {
mBlockMaster.workerRegister(workerId, storageTiers, totalBytesOnTiers, usedBytesOnTiers,
currBlocksOnLocationMap, lostStorageMap, options);
return RegisterWorkerPResponse.getDefaultInstance();
}, "registerWorker", "request=%s", responseObserver, request);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy