001 /**
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements. See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership. The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the
007 * "License"); you may not use this file except in compliance
008 * with the License. You may obtain a copy of the License at
009 *
010 * http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing, software
013 * distributed under the License is distributed on an "AS IS" BASIS,
014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015 * See the License for the specific language governing permissions and
016 * limitations under the License.
017 */
018
019 package org.apache.hadoop.hdfs.protocolPB;
020
021 import java.io.IOException;
022 import java.util.List;
023
024 import org.apache.hadoop.hdfs.protocol.DatanodeID;
025 import org.apache.hadoop.hdfs.protocol.LocatedBlock;
026 import org.apache.hadoop.hdfs.protocol.proto.DatanodeProtocolProtos.BlockReceivedAndDeletedRequestProto;
027 import org.apache.hadoop.hdfs.protocol.proto.DatanodeProtocolProtos.BlockReceivedAndDeletedResponseProto;
028 import org.apache.hadoop.hdfs.protocol.proto.DatanodeProtocolProtos.BlockReportRequestProto;
029 import org.apache.hadoop.hdfs.protocol.proto.DatanodeProtocolProtos.BlockReportResponseProto;
030 import org.apache.hadoop.hdfs.protocol.proto.DatanodeProtocolProtos.CommitBlockSynchronizationRequestProto;
031 import org.apache.hadoop.hdfs.protocol.proto.DatanodeProtocolProtos.CommitBlockSynchronizationResponseProto;
032 import org.apache.hadoop.hdfs.protocol.proto.DatanodeProtocolProtos.ErrorReportRequestProto;
033 import org.apache.hadoop.hdfs.protocol.proto.DatanodeProtocolProtos.ErrorReportResponseProto;
034 import org.apache.hadoop.hdfs.protocol.proto.DatanodeProtocolProtos.HeartbeatRequestProto;
035 import org.apache.hadoop.hdfs.protocol.proto.DatanodeProtocolProtos.HeartbeatResponseProto;
036 import org.apache.hadoop.hdfs.protocol.proto.DatanodeProtocolProtos.ReceivedDeletedBlockInfoProto;
037 import org.apache.hadoop.hdfs.protocol.proto.DatanodeProtocolProtos.RegisterDatanodeRequestProto;
038 import org.apache.hadoop.hdfs.protocol.proto.DatanodeProtocolProtos.RegisterDatanodeResponseProto;
039 import org.apache.hadoop.hdfs.protocol.proto.DatanodeProtocolProtos.ReportBadBlocksRequestProto;
040 import org.apache.hadoop.hdfs.protocol.proto.DatanodeProtocolProtos.ReportBadBlocksResponseProto;
041 import org.apache.hadoop.hdfs.protocol.proto.DatanodeProtocolProtos.StorageBlockReportProto;
042 import org.apache.hadoop.hdfs.protocol.proto.DatanodeProtocolProtos.StorageReceivedDeletedBlocksProto;
043 import org.apache.hadoop.hdfs.protocol.proto.DatanodeProtocolProtos.StorageReportProto;
044 import org.apache.hadoop.hdfs.protocol.proto.HdfsProtos.DatanodeIDProto;
045 import org.apache.hadoop.hdfs.protocol.proto.HdfsProtos.LocatedBlockProto;
046 import org.apache.hadoop.hdfs.protocol.proto.HdfsProtos.VersionRequestProto;
047 import org.apache.hadoop.hdfs.protocol.proto.HdfsProtos.VersionResponseProto;
048 import org.apache.hadoop.hdfs.server.protocol.DatanodeCommand;
049 import org.apache.hadoop.hdfs.server.protocol.DatanodeProtocol;
050 import org.apache.hadoop.hdfs.server.protocol.DatanodeRegistration;
051 import org.apache.hadoop.hdfs.server.protocol.HeartbeatResponse;
052 import org.apache.hadoop.hdfs.server.protocol.NamespaceInfo;
053 import org.apache.hadoop.hdfs.server.protocol.ReceivedDeletedBlockInfo;
054 import org.apache.hadoop.hdfs.server.protocol.StorageBlockReport;
055 import org.apache.hadoop.hdfs.server.protocol.StorageReceivedDeletedBlocks;
056 import org.apache.hadoop.hdfs.server.protocol.StorageReport;
057
058 import com.google.protobuf.RpcController;
059 import com.google.protobuf.ServiceException;
060
061 public class DatanodeProtocolServerSideTranslatorPB implements
062 DatanodeProtocolPB {
063
064 private final DatanodeProtocol impl;
065 private static final ErrorReportResponseProto
066 VOID_ERROR_REPORT_RESPONSE_PROTO =
067 ErrorReportResponseProto.newBuilder().build();
068 private static final BlockReceivedAndDeletedResponseProto
069 VOID_BLOCK_RECEIVED_AND_DELETE_RESPONSE =
070 BlockReceivedAndDeletedResponseProto.newBuilder().build();
071 private static final ReportBadBlocksResponseProto
072 VOID_REPORT_BAD_BLOCK_RESPONSE =
073 ReportBadBlocksResponseProto.newBuilder().build();
074 private static final CommitBlockSynchronizationResponseProto
075 VOID_COMMIT_BLOCK_SYNCHRONIZATION_RESPONSE_PROTO =
076 CommitBlockSynchronizationResponseProto.newBuilder().build();
077
078 public DatanodeProtocolServerSideTranslatorPB(DatanodeProtocol impl) {
079 this.impl = impl;
080 }
081
082 @Override
083 public RegisterDatanodeResponseProto registerDatanode(
084 RpcController controller, RegisterDatanodeRequestProto request)
085 throws ServiceException {
086 DatanodeRegistration registration = PBHelper.convert(request
087 .getRegistration());
088 DatanodeRegistration registrationResp;
089 try {
090 registrationResp = impl.registerDatanode(registration);
091 } catch (IOException e) {
092 throw new ServiceException(e);
093 }
094 return RegisterDatanodeResponseProto.newBuilder()
095 .setRegistration(PBHelper.convert(registrationResp)).build();
096 }
097
098 @Override
099 public HeartbeatResponseProto sendHeartbeat(RpcController controller,
100 HeartbeatRequestProto request) throws ServiceException {
101 HeartbeatResponse response;
102 try {
103 List<StorageReportProto> list = request.getReportsList();
104 StorageReport[] report = new StorageReport[list.size()];
105 int i = 0;
106 for (StorageReportProto p : list) {
107 report[i++] = new StorageReport(p.getStorageID(), p.getFailed(),
108 p.getCapacity(), p.getDfsUsed(), p.getRemaining(),
109 p.getBlockPoolUsed());
110 }
111 response = impl.sendHeartbeat(PBHelper.convert(request.getRegistration()),
112 report, request.getXmitsInProgress(), request.getXceiverCount(),
113 request.getFailedVolumes());
114 } catch (IOException e) {
115 throw new ServiceException(e);
116 }
117 HeartbeatResponseProto.Builder builder = HeartbeatResponseProto
118 .newBuilder();
119 DatanodeCommand[] cmds = response.getCommands();
120 if (cmds != null) {
121 for (int i = 0; i < cmds.length; i++) {
122 if (cmds[i] != null) {
123 builder.addCmds(PBHelper.convert(cmds[i]));
124 }
125 }
126 }
127 builder.setHaStatus(PBHelper.convert(response.getNameNodeHaState()));
128 return builder.build();
129 }
130
131 @Override
132 public BlockReportResponseProto blockReport(RpcController controller,
133 BlockReportRequestProto request) throws ServiceException {
134 DatanodeCommand cmd = null;
135 StorageBlockReport[] report =
136 new StorageBlockReport[request.getReportsCount()];
137
138 int index = 0;
139 for (StorageBlockReportProto s : request.getReportsList()) {
140 List<Long> blockIds = s.getBlocksList();
141 long[] blocks = new long[blockIds.size()];
142 for (int i = 0; i < blockIds.size(); i++) {
143 blocks[i] = blockIds.get(i);
144 }
145 report[index++] = new StorageBlockReport(PBHelper.convert(s.getStorage()),
146 blocks);
147 }
148 try {
149 cmd = impl.blockReport(PBHelper.convert(request.getRegistration()),
150 request.getBlockPoolId(), report);
151 } catch (IOException e) {
152 throw new ServiceException(e);
153 }
154 BlockReportResponseProto.Builder builder =
155 BlockReportResponseProto.newBuilder();
156 if (cmd != null) {
157 builder.setCmd(PBHelper.convert(cmd));
158 }
159 return builder.build();
160 }
161
162 @Override
163 public BlockReceivedAndDeletedResponseProto blockReceivedAndDeleted(
164 RpcController controller, BlockReceivedAndDeletedRequestProto request)
165 throws ServiceException {
166 List<StorageReceivedDeletedBlocksProto> sBlocks = request.getBlocksList();
167 StorageReceivedDeletedBlocks[] info =
168 new StorageReceivedDeletedBlocks[sBlocks.size()];
169 for (int i = 0; i < sBlocks.size(); i++) {
170 StorageReceivedDeletedBlocksProto sBlock = sBlocks.get(i);
171 List<ReceivedDeletedBlockInfoProto> list = sBlock.getBlocksList();
172 ReceivedDeletedBlockInfo[] rdBlocks =
173 new ReceivedDeletedBlockInfo[list.size()];
174 for (int j = 0; j < list.size(); j++) {
175 rdBlocks[j] = PBHelper.convert(list.get(j));
176 }
177 info[i] = new StorageReceivedDeletedBlocks(sBlock.getStorageID(), rdBlocks);
178 }
179 try {
180 impl.blockReceivedAndDeleted(PBHelper.convert(request.getRegistration()),
181 request.getBlockPoolId(), info);
182 } catch (IOException e) {
183 throw new ServiceException(e);
184 }
185 return VOID_BLOCK_RECEIVED_AND_DELETE_RESPONSE;
186 }
187
188 @Override
189 public ErrorReportResponseProto errorReport(RpcController controller,
190 ErrorReportRequestProto request) throws ServiceException {
191 try {
192 impl.errorReport(PBHelper.convert(request.getRegistartion()),
193 request.getErrorCode(), request.getMsg());
194 } catch (IOException e) {
195 throw new ServiceException(e);
196 }
197 return VOID_ERROR_REPORT_RESPONSE_PROTO;
198 }
199
200 @Override
201 public VersionResponseProto versionRequest(RpcController controller,
202 VersionRequestProto request) throws ServiceException {
203 NamespaceInfo info;
204 try {
205 info = impl.versionRequest();
206 } catch (IOException e) {
207 throw new ServiceException(e);
208 }
209 return VersionResponseProto.newBuilder()
210 .setInfo(PBHelper.convert(info)).build();
211 }
212
213 @Override
214 public ReportBadBlocksResponseProto reportBadBlocks(RpcController controller,
215 ReportBadBlocksRequestProto request) throws ServiceException {
216 List<LocatedBlockProto> lbps = request.getBlocksList();
217 LocatedBlock [] blocks = new LocatedBlock [lbps.size()];
218 for(int i=0; i<lbps.size(); i++) {
219 blocks[i] = PBHelper.convert(lbps.get(i));
220 }
221 try {
222 impl.reportBadBlocks(blocks);
223 } catch (IOException e) {
224 throw new ServiceException(e);
225 }
226 return VOID_REPORT_BAD_BLOCK_RESPONSE;
227 }
228
229 @Override
230 public CommitBlockSynchronizationResponseProto commitBlockSynchronization(
231 RpcController controller, CommitBlockSynchronizationRequestProto request)
232 throws ServiceException {
233 List<DatanodeIDProto> dnprotos = request.getNewTaragetsList();
234 DatanodeID[] dns = new DatanodeID[dnprotos.size()];
235 for (int i = 0; i < dnprotos.size(); i++) {
236 dns[i] = PBHelper.convert(dnprotos.get(i));
237 }
238 final List<String> sidprotos = request.getNewTargetStoragesList();
239 final String[] storageIDs = sidprotos.toArray(new String[sidprotos.size()]);
240 try {
241 impl.commitBlockSynchronization(PBHelper.convert(request.getBlock()),
242 request.getNewGenStamp(), request.getNewLength(),
243 request.getCloseFile(), request.getDeleteBlock(), dns, storageIDs);
244 } catch (IOException e) {
245 throw new ServiceException(e);
246 }
247 return VOID_COMMIT_BLOCK_SYNCHRONIZATION_RESPONSE_PROTO;
248 }
249 }