|
@@ -0,0 +1,159 @@
|
|
|
|
+/**
|
|
|
|
+ * 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 java.io.IOException;
|
|
|
|
+
|
|
|
|
+import org.apache.hadoop.classification.InterfaceAudience;
|
|
|
|
+import org.apache.hadoop.hdfs.protocol.BlockLocalPathInfo;
|
|
|
|
+import org.apache.hadoop.hdfs.protocol.ClientDatanodeProtocol;
|
|
|
|
+import org.apache.hadoop.hdfs.protocol.proto.ClientDatanodeProtocolProtos.DeleteBlockPoolRequestProto;
|
|
|
|
+import org.apache.hadoop.hdfs.protocol.proto.ClientDatanodeProtocolProtos.DeleteBlockPoolResponseProto;
|
|
|
|
+import org.apache.hadoop.hdfs.protocol.proto.ClientDatanodeProtocolProtos.GetBlockLocalPathInfoRequestProto;
|
|
|
|
+import org.apache.hadoop.hdfs.protocol.proto.ClientDatanodeProtocolProtos.GetBlockLocalPathInfoResponseProto;
|
|
|
|
+import org.apache.hadoop.hdfs.protocol.proto.ClientDatanodeProtocolProtos.GetReplicaVisibleLengthRequestProto;
|
|
|
|
+import org.apache.hadoop.hdfs.protocol.proto.ClientDatanodeProtocolProtos.GetReplicaVisibleLengthResponseProto;
|
|
|
|
+import org.apache.hadoop.hdfs.protocol.proto.ClientDatanodeProtocolProtos.RefreshNamenodesRequestProto;
|
|
|
|
+import org.apache.hadoop.hdfs.protocol.proto.ClientDatanodeProtocolProtos.RefreshNamenodesResponseProto;
|
|
|
|
+import org.apache.hadoop.hdfs.protocolR23Compatible.ProtocolSignatureWritable;
|
|
|
|
+import org.apache.hadoop.ipc.ProtocolSignature;
|
|
|
|
+import org.apache.hadoop.ipc.RPC;
|
|
|
|
+import org.apache.hadoop.ipc.VersionedProtocol;
|
|
|
|
+
|
|
|
|
+import com.google.protobuf.RpcController;
|
|
|
|
+import com.google.protobuf.ServiceException;
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ * Implementation for protobuf service that forwards requests
|
|
|
|
+ * received on {@link ClientDatanodeProtocolPB} to the
|
|
|
|
+ * {@link ClientDatanodeProtocol} server implementation.
|
|
|
|
+ */
|
|
|
|
+@InterfaceAudience.Private
|
|
|
|
+public class ClientDatanodeProtocolServerSideTranslatorPB implements
|
|
|
|
+ ClientDatanodeProtocolPB {
|
|
|
|
+ private final static RefreshNamenodesResponseProto REFRESH_NAMENODE_RESP =
|
|
|
|
+ RefreshNamenodesResponseProto.newBuilder().build();
|
|
|
|
+ private final static DeleteBlockPoolResponseProto DELETE_BLOCKPOOL_RESP =
|
|
|
|
+ DeleteBlockPoolResponseProto.newBuilder().build();
|
|
|
|
+
|
|
|
|
+ private final ClientDatanodeProtocol impl;
|
|
|
|
+
|
|
|
|
+ public ClientDatanodeProtocolServerSideTranslatorPB(
|
|
|
|
+ ClientDatanodeProtocol impl) {
|
|
|
|
+ this.impl = impl;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public GetReplicaVisibleLengthResponseProto getReplicaVisibleLength(
|
|
|
|
+ RpcController unused, GetReplicaVisibleLengthRequestProto request)
|
|
|
|
+ throws ServiceException {
|
|
|
|
+ long len;
|
|
|
|
+ try {
|
|
|
|
+ len = impl.getReplicaVisibleLength(PBHelper.convert(request.getBlock()));
|
|
|
|
+ } catch (IOException e) {
|
|
|
|
+ throw new ServiceException(e);
|
|
|
|
+ }
|
|
|
|
+ return GetReplicaVisibleLengthResponseProto.newBuilder().setLength(len)
|
|
|
|
+ .build();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public RefreshNamenodesResponseProto refreshNamenode(
|
|
|
|
+ RpcController unused, RefreshNamenodesRequestProto request)
|
|
|
|
+ throws ServiceException {
|
|
|
|
+ try {
|
|
|
|
+ impl.refreshNamenodes();
|
|
|
|
+ } catch (IOException e) {
|
|
|
|
+ throw new ServiceException(e);
|
|
|
|
+ }
|
|
|
|
+ return REFRESH_NAMENODE_RESP;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public DeleteBlockPoolResponseProto deleteBlockPool(RpcController unused,
|
|
|
|
+ DeleteBlockPoolRequestProto request) throws ServiceException {
|
|
|
|
+ try {
|
|
|
|
+ impl.deleteBlockPool(request.getBlockPool(), request.getForce());
|
|
|
|
+ } catch (IOException e) {
|
|
|
|
+ throw new ServiceException(e);
|
|
|
|
+ }
|
|
|
|
+ return DELETE_BLOCKPOOL_RESP;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public GetBlockLocalPathInfoResponseProto getBlockLocalPathInfo(
|
|
|
|
+ RpcController unused, GetBlockLocalPathInfoRequestProto request)
|
|
|
|
+ throws ServiceException {
|
|
|
|
+ BlockLocalPathInfo resp;
|
|
|
|
+ try {
|
|
|
|
+ resp = impl.getBlockLocalPathInfo(PBHelper.convert(request.getBlock()), PBHelper.convert(request.getToken()));
|
|
|
|
+ } catch (IOException e) {
|
|
|
|
+ throw new ServiceException(e);
|
|
|
|
+ }
|
|
|
|
+ return GetBlockLocalPathInfoResponseProto.newBuilder()
|
|
|
|
+ .setBlock(PBHelper.convert(resp.getBlock()))
|
|
|
|
+ .setLocalPath(resp.getBlockPath()).setLocalMetaPath(resp.getMetaPath())
|
|
|
|
+ .build();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public long getProtocolVersion(String protocol, long clientVersion)
|
|
|
|
+ throws IOException {
|
|
|
|
+ return RPC.getProtocolVersion(ClientDatanodeProtocolPB.class);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * The client side will redirect getProtocolSignature to
|
|
|
|
+ * getProtocolSignature2.
|
|
|
|
+ *
|
|
|
|
+ * However the RPC layer below on the Server side will call getProtocolVersion
|
|
|
|
+ * and possibly in the future getProtocolSignature. Hence we still implement
|
|
|
|
+ * it even though the end client will never call this method.
|
|
|
|
+ *
|
|
|
|
+ * @see VersionedProtocol#getProtocolVersion
|
|
|
|
+ */
|
|
|
|
+ @Override
|
|
|
|
+ public ProtocolSignature getProtocolSignature(String protocol,
|
|
|
|
+ long clientVersion, int clientMethodsHash) throws IOException {
|
|
|
|
+ /**
|
|
|
|
+ * Don't forward this to the server. The protocol version and signature is
|
|
|
|
+ * that of {@link ClientDatanodeProtocol}
|
|
|
|
+ */
|
|
|
|
+ if (!protocol.equals(RPC.getProtocolName(ClientDatanodeProtocol.class))) {
|
|
|
|
+ throw new IOException("Namenode Serverside implements " +
|
|
|
|
+ RPC.getProtocolName(ClientDatanodeProtocol.class) +
|
|
|
|
+ ". The following requested protocol is unknown: " + protocol);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return ProtocolSignature.getProtocolSignature(clientMethodsHash,
|
|
|
|
+ RPC.getProtocolVersion(ClientDatanodeProtocolPB.class),
|
|
|
|
+ ClientDatanodeProtocolPB.class);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public ProtocolSignatureWritable getProtocolSignature2(String protocol,
|
|
|
|
+ long clientVersion, int clientMethodsHash) throws IOException {
|
|
|
|
+ /**
|
|
|
|
+ * Don't forward this to the server. The protocol version and signature is
|
|
|
|
+ * that of {@link ClientDatanodeProtocol}
|
|
|
|
+ */
|
|
|
|
+ return ProtocolSignatureWritable.convert(
|
|
|
|
+ this.getProtocolSignature(protocol, clientVersion, clientMethodsHash));
|
|
|
|
+ }
|
|
|
|
+}
|