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.ProcessUpgradeRequestProto;
037    import org.apache.hadoop.hdfs.protocol.proto.DatanodeProtocolProtos.ProcessUpgradeResponseProto;
038    import org.apache.hadoop.hdfs.protocol.proto.DatanodeProtocolProtos.ReceivedDeletedBlockInfoProto;
039    import org.apache.hadoop.hdfs.protocol.proto.DatanodeProtocolProtos.RegisterDatanodeRequestProto;
040    import org.apache.hadoop.hdfs.protocol.proto.DatanodeProtocolProtos.RegisterDatanodeResponseProto;
041    import org.apache.hadoop.hdfs.protocol.proto.DatanodeProtocolProtos.ReportBadBlocksRequestProto;
042    import org.apache.hadoop.hdfs.protocol.proto.DatanodeProtocolProtos.ReportBadBlocksResponseProto;
043    import org.apache.hadoop.hdfs.protocol.proto.DatanodeProtocolProtos.StorageBlockReportProto;
044    import org.apache.hadoop.hdfs.protocol.proto.DatanodeProtocolProtos.StorageReceivedDeletedBlocksProto;
045    import org.apache.hadoop.hdfs.protocol.proto.DatanodeProtocolProtos.StorageReportProto;
046    import org.apache.hadoop.hdfs.protocol.proto.HdfsProtos.DatanodeIDProto;
047    import org.apache.hadoop.hdfs.protocol.proto.HdfsProtos.LocatedBlockProto;
048    import org.apache.hadoop.hdfs.protocol.proto.HdfsProtos.VersionRequestProto;
049    import org.apache.hadoop.hdfs.protocol.proto.HdfsProtos.VersionResponseProto;
050    import org.apache.hadoop.hdfs.server.protocol.DatanodeCommand;
051    import org.apache.hadoop.hdfs.server.protocol.DatanodeProtocol;
052    import org.apache.hadoop.hdfs.server.protocol.DatanodeRegistration;
053    import org.apache.hadoop.hdfs.server.protocol.HeartbeatResponse;
054    import org.apache.hadoop.hdfs.server.protocol.NamespaceInfo;
055    import org.apache.hadoop.hdfs.server.protocol.ReceivedDeletedBlockInfo;
056    import org.apache.hadoop.hdfs.server.protocol.StorageBlockReport;
057    import org.apache.hadoop.hdfs.server.protocol.StorageReceivedDeletedBlocks;
058    import org.apache.hadoop.hdfs.server.protocol.StorageReport;
059    import org.apache.hadoop.hdfs.server.protocol.UpgradeCommand;
060    
061    import com.google.protobuf.RpcController;
062    import com.google.protobuf.ServiceException;
063    
064    public class DatanodeProtocolServerSideTranslatorPB implements
065        DatanodeProtocolPB {
066    
067      private final DatanodeProtocol impl;
068      private static final ErrorReportResponseProto ERROR_REPORT_RESPONSE_PROTO = 
069          ErrorReportResponseProto.newBuilder().build();
070      private static final BlockReceivedAndDeletedResponseProto 
071          BLOCK_RECEIVED_AND_DELETE_RESPONSE = 
072              BlockReceivedAndDeletedResponseProto.newBuilder().build();
073      private static final ReportBadBlocksResponseProto REPORT_BAD_BLOCK_RESPONSE = 
074          ReportBadBlocksResponseProto.newBuilder().build();
075      private static final CommitBlockSynchronizationResponseProto 
076          COMMIT_BLOCK_SYNCHRONIZATION_RESPONSE_PROTO =
077              CommitBlockSynchronizationResponseProto.newBuilder().build();
078    
079      public DatanodeProtocolServerSideTranslatorPB(DatanodeProtocol impl) {
080        this.impl = impl;
081      }
082    
083      @Override
084      public RegisterDatanodeResponseProto registerDatanode(
085          RpcController controller, RegisterDatanodeRequestProto request)
086          throws ServiceException {
087        DatanodeRegistration registration = PBHelper.convert(request
088            .getRegistration());
089        DatanodeRegistration registrationResp;
090        try {
091          registrationResp = impl.registerDatanode(registration);
092        } catch (IOException e) {
093          throw new ServiceException(e);
094        }
095        return RegisterDatanodeResponseProto.newBuilder()
096            .setRegistration(PBHelper.convert(registrationResp)).build();
097      }
098    
099      @Override
100      public HeartbeatResponseProto sendHeartbeat(RpcController controller,
101          HeartbeatRequestProto request) throws ServiceException {
102        HeartbeatResponse response;
103        try {
104          List<StorageReportProto> list = request.getReportsList();
105          StorageReport[] report = new StorageReport[list.size()];
106          int i = 0;
107          for (StorageReportProto p : list) {
108            report[i++] = new StorageReport(p.getStorageID(), p.getFailed(),
109                p.getCapacity(), p.getDfsUsed(), p.getRemaining(),
110                p.getBlockPoolUsed());
111          }
112          response = impl.sendHeartbeat(PBHelper.convert(request.getRegistration()),
113              report, request.getXmitsInProgress(), request.getXceiverCount(),
114              request.getFailedVolumes());
115        } catch (IOException e) {
116          throw new ServiceException(e);
117        }
118        HeartbeatResponseProto.Builder builder = HeartbeatResponseProto
119            .newBuilder();
120        DatanodeCommand[] cmds = response.getCommands();
121        if (cmds != null) {
122          for (int i = 0; i < cmds.length; i++) {
123            if (cmds[i] != null) {
124              builder.addCmds(PBHelper.convert(cmds[i]));
125            }
126          }
127        }
128        builder.setHaStatus(PBHelper.convert(response.getNameNodeHaState()));
129        return builder.build();
130      }
131    
132      @Override
133      public BlockReportResponseProto blockReport(RpcController controller,
134          BlockReportRequestProto request) throws ServiceException {
135        DatanodeCommand cmd = null;
136        StorageBlockReport[] report = 
137            new StorageBlockReport[request.getReportsCount()];
138        
139        int index = 0;
140        for (StorageBlockReportProto s : request.getReportsList()) {
141          List<Long> blockIds = s.getBlocksList();
142          long[] blocks = new long[blockIds.size()];
143          for (int i = 0; i < blockIds.size(); i++) {
144            blocks[i] = blockIds.get(i);
145          }
146          report[index++] = new StorageBlockReport(PBHelper.convert(s.getStorage()),
147              blocks);
148        }
149        try {
150          cmd = impl.blockReport(PBHelper.convert(request.getRegistration()),
151              request.getBlockPoolId(), report);
152        } catch (IOException e) {
153          throw new ServiceException(e);
154        }
155        BlockReportResponseProto.Builder builder = 
156            BlockReportResponseProto.newBuilder();
157        if (cmd != null) {
158          builder.setCmd(PBHelper.convert(cmd));
159        }
160        return builder.build();
161      }
162    
163      @Override
164      public BlockReceivedAndDeletedResponseProto blockReceivedAndDeleted(
165          RpcController controller, BlockReceivedAndDeletedRequestProto request)
166          throws ServiceException {
167        List<StorageReceivedDeletedBlocksProto> sBlocks = request.getBlocksList();
168        StorageReceivedDeletedBlocks[] info = 
169            new StorageReceivedDeletedBlocks[sBlocks.size()];
170        for (int i = 0; i < sBlocks.size(); i++) {
171          StorageReceivedDeletedBlocksProto sBlock = sBlocks.get(i);
172          List<ReceivedDeletedBlockInfoProto> list = sBlock.getBlocksList();
173          ReceivedDeletedBlockInfo[] rdBlocks = 
174              new ReceivedDeletedBlockInfo[list.size()];
175          for (int j = 0; j < list.size(); j++) {
176            rdBlocks[j] = PBHelper.convert(list.get(j));
177          }
178          info[i] = new StorageReceivedDeletedBlocks(sBlock.getStorageID(), rdBlocks);
179        }
180        try {
181          impl.blockReceivedAndDeleted(PBHelper.convert(request.getRegistration()),
182              request.getBlockPoolId(), info);
183        } catch (IOException e) {
184          throw new ServiceException(e);
185        }
186        return BLOCK_RECEIVED_AND_DELETE_RESPONSE;
187      }
188    
189      @Override
190      public ErrorReportResponseProto errorReport(RpcController controller,
191          ErrorReportRequestProto request) throws ServiceException {
192        try {
193          impl.errorReport(PBHelper.convert(request.getRegistartion()),
194              request.getErrorCode(), request.getMsg());
195        } catch (IOException e) {
196          throw new ServiceException(e);
197        }
198        return ERROR_REPORT_RESPONSE_PROTO;
199      }
200    
201      @Override
202      public VersionResponseProto versionRequest(RpcController controller,
203          VersionRequestProto request) throws ServiceException {
204        NamespaceInfo info;
205        try {
206          info = impl.versionRequest();
207        } catch (IOException e) {
208          throw new ServiceException(e);
209        }
210        return VersionResponseProto.newBuilder()
211            .setInfo(PBHelper.convert(info)).build();
212      }
213    
214      @Override
215      public ProcessUpgradeResponseProto processUpgrade(RpcController controller,
216          ProcessUpgradeRequestProto request) throws ServiceException {
217        UpgradeCommand ret;
218        try {
219          UpgradeCommand cmd = request.hasCmd() ? PBHelper
220              .convert(request.getCmd()) : null;
221          ret = impl.processUpgradeCommand(cmd);
222        } catch (IOException e) {
223          throw new ServiceException(e);
224        }
225        ProcessUpgradeResponseProto.Builder builder = 
226            ProcessUpgradeResponseProto.newBuilder();
227        if (ret != null) {
228          builder.setCmd(PBHelper.convert(ret));
229        }
230        return builder.build();
231      }
232    
233      @Override
234      public ReportBadBlocksResponseProto reportBadBlocks(RpcController controller,
235          ReportBadBlocksRequestProto request) throws ServiceException {
236        List<LocatedBlockProto> lbps = request.getBlocksList();
237        LocatedBlock [] blocks = new LocatedBlock [lbps.size()];
238        for(int i=0; i<lbps.size(); i++) {
239          blocks[i] = PBHelper.convert(lbps.get(i));
240        }
241        try {
242          impl.reportBadBlocks(blocks);
243        } catch (IOException e) {
244          throw new ServiceException(e);
245        }
246        return REPORT_BAD_BLOCK_RESPONSE;
247      }
248    
249      @Override
250      public CommitBlockSynchronizationResponseProto commitBlockSynchronization(
251          RpcController controller, CommitBlockSynchronizationRequestProto request)
252          throws ServiceException {
253        List<DatanodeIDProto> dnprotos = request.getNewTaragetsList();
254        DatanodeID[] dns = new DatanodeID[dnprotos.size()];
255        for (int i = 0; i < dnprotos.size(); i++) {
256          dns[i] = PBHelper.convert(dnprotos.get(i));
257        }
258        final List<String> sidprotos = request.getNewTargetStoragesList();
259        final String[] storageIDs = sidprotos.toArray(new String[sidprotos.size()]);
260        try {
261          impl.commitBlockSynchronization(PBHelper.convert(request.getBlock()),
262              request.getNewGenStamp(), request.getNewLength(),
263              request.getCloseFile(), request.getDeleteBlock(), dns, storageIDs);
264        } catch (IOException e) {
265          throw new ServiceException(e);
266        }
267        return COMMIT_BLOCK_SYNCHRONIZATION_RESPONSE_PROTO;
268      }
269    }