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 }