1 /**
2  * Licensed to the Apache Software Foundation (ASF) under one
3  * or more contributor license agreements.  See the NOTICE file
4  * distributed with this work for additional information
5  * regarding copyright ownership.  The ASF licenses this file
6  * to you under the Apache License, Version 2.0 (the
7  * "License"); you may not use this file except in compliance
8  * with the License.  You may obtain a copy of the License at
9  *
10  *     http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  */
18 package org.apache.hadoop.hdfs.protocolPB;
19 
20 import java.io.IOException;
21 
22 import org.apache.hadoop.hdfs.protocol.DatanodeInfo;
23 import org.apache.hadoop.hdfs.protocol.proto.HdfsProtos.VersionRequestProto;
24 import org.apache.hadoop.hdfs.protocol.proto.HdfsProtos.VersionResponseProto;
25 import org.apache.hadoop.hdfs.protocol.proto.NamenodeProtocolProtos;
26 import org.apache.hadoop.hdfs.protocol.proto.NamenodeProtocolProtos.EndCheckpointRequestProto;
27 import org.apache.hadoop.hdfs.protocol.proto.NamenodeProtocolProtos.EndCheckpointResponseProto;
28 import org.apache.hadoop.hdfs.protocol.proto.NamenodeProtocolProtos.ErrorReportRequestProto;
29 import org.apache.hadoop.hdfs.protocol.proto.NamenodeProtocolProtos.ErrorReportResponseProto;
30 import org.apache.hadoop.hdfs.protocol.proto.NamenodeProtocolProtos.GetBlockKeysRequestProto;
31 import org.apache.hadoop.hdfs.protocol.proto.NamenodeProtocolProtos.GetBlockKeysResponseProto;
32 import org.apache.hadoop.hdfs.protocol.proto.NamenodeProtocolProtos.GetBlocksRequestProto;
33 import org.apache.hadoop.hdfs.protocol.proto.NamenodeProtocolProtos.GetBlocksResponseProto;
34 import org.apache.hadoop.hdfs.protocol.proto.NamenodeProtocolProtos.GetEditLogManifestRequestProto;
35 import org.apache.hadoop.hdfs.protocol.proto.NamenodeProtocolProtos.GetEditLogManifestResponseProto;
36 import org.apache.hadoop.hdfs.protocol.proto.NamenodeProtocolProtos.GetMostRecentCheckpointTxIdRequestProto;
37 import org.apache.hadoop.hdfs.protocol.proto.NamenodeProtocolProtos.GetMostRecentCheckpointTxIdResponseProto;
38 import org.apache.hadoop.hdfs.protocol.proto.NamenodeProtocolProtos.GetTransactionIdRequestProto;
39 import org.apache.hadoop.hdfs.protocol.proto.NamenodeProtocolProtos.GetTransactionIdResponseProto;
40 import org.apache.hadoop.hdfs.protocol.proto.NamenodeProtocolProtos.IsUpgradeFinalizedRequestProto;
41 import org.apache.hadoop.hdfs.protocol.proto.NamenodeProtocolProtos.IsUpgradeFinalizedResponseProto;
42 import org.apache.hadoop.hdfs.protocol.proto.NamenodeProtocolProtos.RegisterRequestProto;
43 import org.apache.hadoop.hdfs.protocol.proto.NamenodeProtocolProtos.RegisterResponseProto;
44 import org.apache.hadoop.hdfs.protocol.proto.NamenodeProtocolProtos.RollEditLogRequestProto;
45 import org.apache.hadoop.hdfs.protocol.proto.NamenodeProtocolProtos.RollEditLogResponseProto;
46 import org.apache.hadoop.hdfs.protocol.proto.NamenodeProtocolProtos.StartCheckpointRequestProto;
47 import org.apache.hadoop.hdfs.protocol.proto.NamenodeProtocolProtos.StartCheckpointResponseProto;
48 import org.apache.hadoop.hdfs.security.token.block.ExportedBlockKeys;
49 import org.apache.hadoop.hdfs.server.namenode.CheckpointSignature;
50 import org.apache.hadoop.hdfs.server.protocol.BlocksWithLocations;
51 import org.apache.hadoop.hdfs.server.protocol.NamenodeCommand;
52 import org.apache.hadoop.hdfs.server.protocol.NamenodeProtocol;
53 import org.apache.hadoop.hdfs.server.protocol.NamenodeRegistration;
54 import org.apache.hadoop.hdfs.server.protocol.NamespaceInfo;
55 import org.apache.hadoop.hdfs.server.protocol.RemoteEditLogManifest;
56 
57 import com.google.protobuf.RpcController;
58 import com.google.protobuf.ServiceException;
59 
60 /**
61  * Implementation for protobuf service that forwards requests
62  * received on {@link NamenodeProtocolPB} to the
63  * {@link NamenodeProtocol} server implementation.
64  */
65 public class NamenodeProtocolServerSideTranslatorPB implements
66     NamenodeProtocolPB {
67   private final NamenodeProtocol impl;
68 
69   private final static ErrorReportResponseProto VOID_ERROR_REPORT_RESPONSE =
70   ErrorReportResponseProto.newBuilder().build();
71 
72   private final static EndCheckpointResponseProto VOID_END_CHECKPOINT_RESPONSE =
73   EndCheckpointResponseProto.newBuilder().build();
74 
NamenodeProtocolServerSideTranslatorPB(NamenodeProtocol impl)75   public NamenodeProtocolServerSideTranslatorPB(NamenodeProtocol impl) {
76     this.impl = impl;
77   }
78 
79   @Override
getBlocks(RpcController unused, GetBlocksRequestProto request)80   public GetBlocksResponseProto getBlocks(RpcController unused,
81       GetBlocksRequestProto request) throws ServiceException {
82     DatanodeInfo dnInfo = new DatanodeInfo(PBHelper.convert(request
83         .getDatanode()));
84     BlocksWithLocations blocks;
85     try {
86       blocks = impl.getBlocks(dnInfo, request.getSize());
87     } catch (IOException e) {
88       throw new ServiceException(e);
89     }
90     return GetBlocksResponseProto.newBuilder()
91         .setBlocks(PBHelper.convert(blocks)).build();
92   }
93 
94   @Override
getBlockKeys(RpcController unused, GetBlockKeysRequestProto request)95   public GetBlockKeysResponseProto getBlockKeys(RpcController unused,
96       GetBlockKeysRequestProto request) throws ServiceException {
97     ExportedBlockKeys keys;
98     try {
99       keys = impl.getBlockKeys();
100     } catch (IOException e) {
101       throw new ServiceException(e);
102     }
103     GetBlockKeysResponseProto.Builder builder =
104         GetBlockKeysResponseProto.newBuilder();
105     if (keys != null) {
106       builder.setKeys(PBHelper.convert(keys));
107     }
108     return builder.build();
109   }
110 
111   @Override
getTransactionId(RpcController unused, GetTransactionIdRequestProto request)112   public GetTransactionIdResponseProto getTransactionId(RpcController unused,
113       GetTransactionIdRequestProto request) throws ServiceException {
114     long txid;
115     try {
116       txid = impl.getTransactionID();
117     } catch (IOException e) {
118       throw new ServiceException(e);
119     }
120     return GetTransactionIdResponseProto.newBuilder().setTxId(txid).build();
121   }
122 
123   @Override
getMostRecentCheckpointTxId( RpcController unused, GetMostRecentCheckpointTxIdRequestProto request)124   public GetMostRecentCheckpointTxIdResponseProto getMostRecentCheckpointTxId(
125       RpcController unused, GetMostRecentCheckpointTxIdRequestProto request)
126       throws ServiceException {
127     long txid;
128     try {
129       txid = impl.getMostRecentCheckpointTxId();
130     } catch (IOException e) {
131       throw new ServiceException(e);
132     }
133     return GetMostRecentCheckpointTxIdResponseProto.newBuilder().setTxId(txid).build();
134   }
135 
136 
137   @Override
rollEditLog(RpcController unused, RollEditLogRequestProto request)138   public RollEditLogResponseProto rollEditLog(RpcController unused,
139       RollEditLogRequestProto request) throws ServiceException {
140     CheckpointSignature signature;
141     try {
142       signature = impl.rollEditLog();
143     } catch (IOException e) {
144       throw new ServiceException(e);
145     }
146     return RollEditLogResponseProto.newBuilder()
147         .setSignature(PBHelper.convert(signature)).build();
148   }
149 
150   @Override
errorReport(RpcController unused, ErrorReportRequestProto request)151   public ErrorReportResponseProto errorReport(RpcController unused,
152       ErrorReportRequestProto request) throws ServiceException {
153     try {
154       impl.errorReport(PBHelper.convert(request.getRegistration()),
155           request.getErrorCode(), request.getMsg());
156     } catch (IOException e) {
157       throw new ServiceException(e);
158     }
159     return VOID_ERROR_REPORT_RESPONSE;
160   }
161 
162   @Override
registerSubordinateNamenode( RpcController unused, RegisterRequestProto request)163   public RegisterResponseProto registerSubordinateNamenode(
164       RpcController unused, RegisterRequestProto request)
165       throws ServiceException {
166     NamenodeRegistration reg;
167     try {
168       reg = impl.registerSubordinateNamenode(
169           PBHelper.convert(request.getRegistration()));
170     } catch (IOException e) {
171       throw new ServiceException(e);
172     }
173     return RegisterResponseProto.newBuilder()
174         .setRegistration(PBHelper.convert(reg)).build();
175   }
176 
177   @Override
startCheckpoint(RpcController unused, StartCheckpointRequestProto request)178   public StartCheckpointResponseProto startCheckpoint(RpcController unused,
179       StartCheckpointRequestProto request) throws ServiceException {
180     NamenodeCommand cmd;
181     try {
182       cmd = impl.startCheckpoint(PBHelper.convert(request.getRegistration()));
183     } catch (IOException e) {
184       throw new ServiceException(e);
185     }
186     return StartCheckpointResponseProto.newBuilder()
187         .setCommand(PBHelper.convert(cmd)).build();
188   }
189 
190   @Override
endCheckpoint(RpcController unused, EndCheckpointRequestProto request)191   public EndCheckpointResponseProto endCheckpoint(RpcController unused,
192       EndCheckpointRequestProto request) throws ServiceException {
193     try {
194       impl.endCheckpoint(PBHelper.convert(request.getRegistration()),
195           PBHelper.convert(request.getSignature()));
196     } catch (IOException e) {
197       throw new ServiceException(e);
198     }
199     return VOID_END_CHECKPOINT_RESPONSE;
200   }
201 
202   @Override
getEditLogManifest( RpcController unused, GetEditLogManifestRequestProto request)203   public GetEditLogManifestResponseProto getEditLogManifest(
204       RpcController unused, GetEditLogManifestRequestProto request)
205       throws ServiceException {
206     RemoteEditLogManifest manifest;
207     try {
208       manifest = impl.getEditLogManifest(request.getSinceTxId());
209     } catch (IOException e) {
210       throw new ServiceException(e);
211     }
212     return GetEditLogManifestResponseProto.newBuilder()
213         .setManifest(PBHelper.convert(manifest)).build();
214   }
215 
216   @Override
versionRequest(RpcController controller, VersionRequestProto request)217   public VersionResponseProto versionRequest(RpcController controller,
218       VersionRequestProto request) throws ServiceException {
219     NamespaceInfo info;
220     try {
221       info = impl.versionRequest();
222     } catch (IOException e) {
223       throw new ServiceException(e);
224     }
225     return VersionResponseProto.newBuilder()
226         .setInfo(PBHelper.convert(info)).build();
227   }
228 
229   @Override
isUpgradeFinalized( RpcController controller, IsUpgradeFinalizedRequestProto request)230   public IsUpgradeFinalizedResponseProto isUpgradeFinalized(
231       RpcController controller, IsUpgradeFinalizedRequestProto request)
232       throws ServiceException {
233     boolean isUpgradeFinalized;
234     try {
235       isUpgradeFinalized = impl.isUpgradeFinalized();
236     } catch (IOException e) {
237       throw new ServiceException(e);
238     }
239     return IsUpgradeFinalizedResponseProto.newBuilder()
240         .setIsUpgradeFinalized(isUpgradeFinalized).build();
241   }
242 }
243