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
019package org.apache.hadoop.hdfs.protocolPB;
020
021import java.io.IOException;
022import java.util.List;
023
024import org.apache.hadoop.hdfs.protocol.DatanodeID;
025import org.apache.hadoop.hdfs.protocol.LocatedBlock;
026import org.apache.hadoop.hdfs.protocol.proto.DatanodeProtocolProtos.BlockReceivedAndDeletedRequestProto;
027import org.apache.hadoop.hdfs.protocol.proto.DatanodeProtocolProtos.BlockReceivedAndDeletedResponseProto;
028import org.apache.hadoop.hdfs.protocol.proto.DatanodeProtocolProtos.BlockReportRequestProto;
029import org.apache.hadoop.hdfs.protocol.proto.DatanodeProtocolProtos.BlockReportResponseProto;
030import org.apache.hadoop.hdfs.protocol.proto.DatanodeProtocolProtos.CommitBlockSynchronizationRequestProto;
031import org.apache.hadoop.hdfs.protocol.proto.DatanodeProtocolProtos.CommitBlockSynchronizationResponseProto;
032import org.apache.hadoop.hdfs.protocol.proto.DatanodeProtocolProtos.ErrorReportRequestProto;
033import org.apache.hadoop.hdfs.protocol.proto.DatanodeProtocolProtos.ErrorReportResponseProto;
034import org.apache.hadoop.hdfs.protocol.proto.DatanodeProtocolProtos.HeartbeatRequestProto;
035import org.apache.hadoop.hdfs.protocol.proto.DatanodeProtocolProtos.HeartbeatResponseProto;
036import org.apache.hadoop.hdfs.protocol.proto.DatanodeProtocolProtos.ReceivedDeletedBlockInfoProto;
037import org.apache.hadoop.hdfs.protocol.proto.DatanodeProtocolProtos.RegisterDatanodeRequestProto;
038import org.apache.hadoop.hdfs.protocol.proto.DatanodeProtocolProtos.RegisterDatanodeResponseProto;
039import org.apache.hadoop.hdfs.protocol.proto.DatanodeProtocolProtos.ReportBadBlocksRequestProto;
040import org.apache.hadoop.hdfs.protocol.proto.DatanodeProtocolProtos.ReportBadBlocksResponseProto;
041import org.apache.hadoop.hdfs.protocol.proto.DatanodeProtocolProtos.StorageBlockReportProto;
042import org.apache.hadoop.hdfs.protocol.proto.DatanodeProtocolProtos.StorageReceivedDeletedBlocksProto;
043import org.apache.hadoop.hdfs.protocol.proto.DatanodeProtocolProtos.StorageReportProto;
044import org.apache.hadoop.hdfs.protocol.proto.HdfsProtos.DatanodeIDProto;
045import org.apache.hadoop.hdfs.protocol.proto.HdfsProtos.LocatedBlockProto;
046import org.apache.hadoop.hdfs.protocol.proto.HdfsProtos.VersionRequestProto;
047import org.apache.hadoop.hdfs.protocol.proto.HdfsProtos.VersionResponseProto;
048import org.apache.hadoop.hdfs.server.protocol.DatanodeCommand;
049import org.apache.hadoop.hdfs.server.protocol.DatanodeProtocol;
050import org.apache.hadoop.hdfs.server.protocol.DatanodeRegistration;
051import org.apache.hadoop.hdfs.server.protocol.HeartbeatResponse;
052import org.apache.hadoop.hdfs.server.protocol.NamespaceInfo;
053import org.apache.hadoop.hdfs.server.protocol.ReceivedDeletedBlockInfo;
054import org.apache.hadoop.hdfs.server.protocol.StorageBlockReport;
055import org.apache.hadoop.hdfs.server.protocol.StorageReceivedDeletedBlocks;
056import org.apache.hadoop.hdfs.server.protocol.StorageReport;
057
058import com.google.protobuf.RpcController;
059import com.google.protobuf.ServiceException;
060
061public 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}