blob: 43691bcc9aafc95bbc84dc5d677abdc7d2399fd4 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.hadoop.hdfs.protocolPB;
import org.apache.hadoop.thirdparty.protobuf.RpcController;
import org.apache.hadoop.thirdparty.protobuf.ServiceException;
import org.apache.hadoop.classification.InterfaceAudience;
import org.apache.hadoop.classification.InterfaceStability;
import org.apache.hadoop.hdfs.protocol.Block;
import org.apache.hadoop.hdfs.protocol.ProvidedStorageLocation;
import org.apache.hadoop.hdfs.protocol.proto.AliasMapProtocolProtos.KeyValueProto;
import org.apache.hadoop.hdfs.protocol.proto.AliasMapProtocolProtos.ReadResponseProto;
import org.apache.hadoop.hdfs.protocol.proto.AliasMapProtocolProtos.WriteRequestProto;
import org.apache.hadoop.hdfs.protocol.proto.AliasMapProtocolProtos.WriteResponseProto;
import org.apache.hadoop.hdfs.protocol.proto.HdfsProtos.BlockProto;
import org.apache.hadoop.hdfs.server.aliasmap.InMemoryAliasMapProtocol;
import org.apache.hadoop.hdfs.server.common.FileRegion;
import java.io.IOException;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
import static org.apache.hadoop.hdfs.protocol.proto.AliasMapProtocolProtos.*;
import static org.apache.hadoop.hdfs.server.aliasmap.InMemoryAliasMap.*;
/**
* AliasMapProtocolServerSideTranslatorPB is responsible for translating RPC
* calls and forwarding them to the internal InMemoryAliasMap.
*/
@InterfaceAudience.Private
@InterfaceStability.Unstable
public class AliasMapProtocolServerSideTranslatorPB
implements AliasMapProtocolPB {
private final InMemoryAliasMapProtocol aliasMap;
public AliasMapProtocolServerSideTranslatorPB(
InMemoryAliasMapProtocol aliasMap) {
this.aliasMap = aliasMap;
}
private static final WriteResponseProto VOID_WRITE_RESPONSE =
WriteResponseProto.newBuilder().build();
@Override
public WriteResponseProto write(RpcController controller,
WriteRequestProto request) throws ServiceException {
try {
FileRegion toWrite =
PBHelper.convert(request.getKeyValuePair());
aliasMap.write(toWrite.getBlock(), toWrite.getProvidedStorageLocation());
return VOID_WRITE_RESPONSE;
} catch (IOException e) {
throw new ServiceException(e);
}
}
@Override
public ReadResponseProto read(RpcController controller,
ReadRequestProto request) throws ServiceException {
try {
Block toRead = PBHelperClient.convert(request.getKey());
Optional<ProvidedStorageLocation> optionalResult =
aliasMap.read(toRead);
ReadResponseProto.Builder builder = ReadResponseProto.newBuilder();
if (optionalResult.isPresent()) {
ProvidedStorageLocation providedStorageLocation = optionalResult.get();
builder.setValue(PBHelperClient.convert(providedStorageLocation));
}
return builder.build();
} catch (IOException e) {
throw new ServiceException(e);
}
}
@Override
public ListResponseProto list(RpcController controller,
ListRequestProto request) throws ServiceException {
try {
BlockProto marker = request.getMarker();
IterationResult iterationResult;
if (marker.isInitialized()) {
iterationResult =
aliasMap.list(Optional.of(PBHelperClient.convert(marker)));
} else {
iterationResult = aliasMap.list(Optional.empty());
}
ListResponseProto.Builder responseBuilder =
ListResponseProto.newBuilder();
List<FileRegion> fileRegions = iterationResult.getFileRegions();
List<KeyValueProto> keyValueProtos = fileRegions.stream()
.map(PBHelper::convert).collect(Collectors.toList());
responseBuilder.addAllFileRegions(keyValueProtos);
Optional<Block> nextMarker = iterationResult.getNextBlock();
nextMarker
.map(m -> responseBuilder.setNextMarker(PBHelperClient.convert(m)));
return responseBuilder.build();
} catch (IOException e) {
throw new ServiceException(e);
}
}
public BlockPoolResponseProto getBlockPoolId(RpcController controller,
BlockPoolRequestProto req) throws ServiceException {
try {
String bpid = aliasMap.getBlockPoolId();
return BlockPoolResponseProto.newBuilder().setBlockPoolId(bpid).build();
} catch (IOException e) {
throw new ServiceException(e);
}
}
}