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 */
018package org.apache.hadoop.hdfs.protocolPB;
019
020import java.io.IOException;
021
022import org.apache.hadoop.hdfs.protocol.DatanodeInfo;
023import org.apache.hadoop.hdfs.protocol.proto.HdfsServerProtos.VersionRequestProto;
024import org.apache.hadoop.hdfs.protocol.proto.HdfsServerProtos.VersionResponseProto;
025import org.apache.hadoop.hdfs.protocol.proto.NamenodeProtocolProtos.EndCheckpointRequestProto;
026import org.apache.hadoop.hdfs.protocol.proto.NamenodeProtocolProtos.EndCheckpointResponseProto;
027import org.apache.hadoop.hdfs.protocol.proto.NamenodeProtocolProtos.ErrorReportRequestProto;
028import org.apache.hadoop.hdfs.protocol.proto.NamenodeProtocolProtos.ErrorReportResponseProto;
029import org.apache.hadoop.hdfs.protocol.proto.NamenodeProtocolProtos.GetBlockKeysRequestProto;
030import org.apache.hadoop.hdfs.protocol.proto.NamenodeProtocolProtos.GetBlockKeysResponseProto;
031import org.apache.hadoop.hdfs.protocol.proto.NamenodeProtocolProtos.GetBlocksRequestProto;
032import org.apache.hadoop.hdfs.protocol.proto.NamenodeProtocolProtos.GetBlocksResponseProto;
033import org.apache.hadoop.hdfs.protocol.proto.NamenodeProtocolProtos.GetEditLogManifestRequestProto;
034import org.apache.hadoop.hdfs.protocol.proto.NamenodeProtocolProtos.GetEditLogManifestResponseProto;
035import org.apache.hadoop.hdfs.protocol.proto.NamenodeProtocolProtos.GetMostRecentCheckpointTxIdRequestProto;
036import org.apache.hadoop.hdfs.protocol.proto.NamenodeProtocolProtos.GetMostRecentCheckpointTxIdResponseProto;
037import org.apache.hadoop.hdfs.protocol.proto.NamenodeProtocolProtos.GetTransactionIdRequestProto;
038import org.apache.hadoop.hdfs.protocol.proto.NamenodeProtocolProtos.GetTransactionIdResponseProto;
039import org.apache.hadoop.hdfs.protocol.proto.NamenodeProtocolProtos.IsUpgradeFinalizedRequestProto;
040import org.apache.hadoop.hdfs.protocol.proto.NamenodeProtocolProtos.IsUpgradeFinalizedResponseProto;
041import org.apache.hadoop.hdfs.protocol.proto.NamenodeProtocolProtos.RegisterRequestProto;
042import org.apache.hadoop.hdfs.protocol.proto.NamenodeProtocolProtos.RegisterResponseProto;
043import org.apache.hadoop.hdfs.protocol.proto.NamenodeProtocolProtos.RollEditLogRequestProto;
044import org.apache.hadoop.hdfs.protocol.proto.NamenodeProtocolProtos.RollEditLogResponseProto;
045import org.apache.hadoop.hdfs.protocol.proto.NamenodeProtocolProtos.StartCheckpointRequestProto;
046import org.apache.hadoop.hdfs.protocol.proto.NamenodeProtocolProtos.StartCheckpointResponseProto;
047import org.apache.hadoop.hdfs.security.token.block.ExportedBlockKeys;
048import org.apache.hadoop.hdfs.server.namenode.CheckpointSignature;
049import org.apache.hadoop.hdfs.server.protocol.BlocksWithLocations;
050import org.apache.hadoop.hdfs.server.protocol.NamenodeCommand;
051import org.apache.hadoop.hdfs.server.protocol.NamenodeProtocol;
052import org.apache.hadoop.hdfs.server.protocol.NamenodeRegistration;
053import org.apache.hadoop.hdfs.server.protocol.NamespaceInfo;
054import org.apache.hadoop.hdfs.server.protocol.RemoteEditLogManifest;
055
056import com.google.protobuf.RpcController;
057import com.google.protobuf.ServiceException;
058
059/**
060 * Implementation for protobuf service that forwards requests
061 * received on {@link NamenodeProtocolPB} to the
062 * {@link NamenodeProtocol} server implementation.
063 */
064public class NamenodeProtocolServerSideTranslatorPB implements
065    NamenodeProtocolPB {
066  private final NamenodeProtocol impl;
067
068  private final static ErrorReportResponseProto VOID_ERROR_REPORT_RESPONSE = 
069  ErrorReportResponseProto.newBuilder().build();
070
071  private final static EndCheckpointResponseProto VOID_END_CHECKPOINT_RESPONSE =
072  EndCheckpointResponseProto.newBuilder().build();
073
074  public NamenodeProtocolServerSideTranslatorPB(NamenodeProtocol impl) {
075    this.impl = impl;
076  }
077
078  @Override
079  public GetBlocksResponseProto getBlocks(RpcController unused,
080      GetBlocksRequestProto request) throws ServiceException {
081    DatanodeInfo dnInfo = new DatanodeInfo(PBHelperClient.convert(request
082        .getDatanode()));
083    BlocksWithLocations blocks;
084    try {
085      blocks = impl.getBlocks(dnInfo, request.getSize());
086    } catch (IOException e) {
087      throw new ServiceException(e);
088    }
089    return GetBlocksResponseProto.newBuilder()
090        .setBlocks(PBHelper.convert(blocks)).build();
091  }
092
093  @Override
094  public GetBlockKeysResponseProto getBlockKeys(RpcController unused,
095      GetBlockKeysRequestProto request) throws ServiceException {
096    ExportedBlockKeys keys;
097    try {
098      keys = impl.getBlockKeys();
099    } catch (IOException e) {
100      throw new ServiceException(e);
101    }
102    GetBlockKeysResponseProto.Builder builder = 
103        GetBlockKeysResponseProto.newBuilder();
104    if (keys != null) {
105      builder.setKeys(PBHelper.convert(keys));
106    }
107    return builder.build();
108  }
109
110  @Override
111  public GetTransactionIdResponseProto getTransactionId(RpcController unused,
112      GetTransactionIdRequestProto request) throws ServiceException {
113    long txid;
114    try {
115      txid = impl.getTransactionID();
116    } catch (IOException e) {
117      throw new ServiceException(e);
118    }
119    return GetTransactionIdResponseProto.newBuilder().setTxId(txid).build();
120  }
121  
122  @Override
123  public GetMostRecentCheckpointTxIdResponseProto getMostRecentCheckpointTxId(
124      RpcController unused, GetMostRecentCheckpointTxIdRequestProto request)
125      throws ServiceException {
126    long txid;
127    try {
128      txid = impl.getMostRecentCheckpointTxId();
129    } catch (IOException e) {
130      throw new ServiceException(e);
131    }
132    return GetMostRecentCheckpointTxIdResponseProto.newBuilder().setTxId(txid).build();
133  }
134
135
136  @Override
137  public RollEditLogResponseProto rollEditLog(RpcController unused,
138      RollEditLogRequestProto request) throws ServiceException {
139    CheckpointSignature signature;
140    try {
141      signature = impl.rollEditLog();
142    } catch (IOException e) {
143      throw new ServiceException(e);
144    }
145    return RollEditLogResponseProto.newBuilder()
146        .setSignature(PBHelper.convert(signature)).build();
147  }
148
149  @Override
150  public ErrorReportResponseProto errorReport(RpcController unused,
151      ErrorReportRequestProto request) throws ServiceException {
152    try {
153      impl.errorReport(PBHelper.convert(request.getRegistration()),
154          request.getErrorCode(), request.getMsg());
155    } catch (IOException e) {
156      throw new ServiceException(e);
157    }
158    return VOID_ERROR_REPORT_RESPONSE;
159  }
160
161  @Override
162  public RegisterResponseProto registerSubordinateNamenode(
163      RpcController unused, RegisterRequestProto request)
164      throws ServiceException {
165    NamenodeRegistration reg;
166    try {
167      reg = impl.registerSubordinateNamenode(
168          PBHelper.convert(request.getRegistration()));
169    } catch (IOException e) {
170      throw new ServiceException(e);
171    }
172    return RegisterResponseProto.newBuilder()
173        .setRegistration(PBHelper.convert(reg)).build();
174  }
175
176  @Override
177  public StartCheckpointResponseProto startCheckpoint(RpcController unused,
178      StartCheckpointRequestProto request) throws ServiceException {
179    NamenodeCommand cmd;
180    try {
181      cmd = impl.startCheckpoint(PBHelper.convert(request.getRegistration()));
182    } catch (IOException e) {
183      throw new ServiceException(e);
184    }
185    return StartCheckpointResponseProto.newBuilder()
186        .setCommand(PBHelper.convert(cmd)).build();
187  }
188
189  @Override
190  public EndCheckpointResponseProto endCheckpoint(RpcController unused,
191      EndCheckpointRequestProto request) throws ServiceException {
192    try {
193      impl.endCheckpoint(PBHelper.convert(request.getRegistration()),
194          PBHelper.convert(request.getSignature()));
195    } catch (IOException e) {
196      throw new ServiceException(e);
197    }
198    return VOID_END_CHECKPOINT_RESPONSE;
199  }
200
201  @Override
202  public GetEditLogManifestResponseProto getEditLogManifest(
203      RpcController unused, GetEditLogManifestRequestProto request)
204      throws ServiceException {
205    RemoteEditLogManifest manifest;
206    try {
207      manifest = impl.getEditLogManifest(request.getSinceTxId());
208    } catch (IOException e) {
209      throw new ServiceException(e);
210    }
211    return GetEditLogManifestResponseProto.newBuilder()
212        .setManifest(PBHelper.convert(manifest)).build();
213  }
214
215  @Override
216  public VersionResponseProto versionRequest(RpcController controller,
217      VersionRequestProto request) throws ServiceException {
218    NamespaceInfo info;
219    try {
220      info = impl.versionRequest();
221    } catch (IOException e) {
222      throw new ServiceException(e);
223    }
224    return VersionResponseProto.newBuilder()
225        .setInfo(PBHelper.convert(info)).build();
226  }
227
228  @Override
229  public IsUpgradeFinalizedResponseProto isUpgradeFinalized(
230      RpcController controller, IsUpgradeFinalizedRequestProto request)
231      throws ServiceException {
232    boolean isUpgradeFinalized;
233    try {
234      isUpgradeFinalized = impl.isUpgradeFinalized();
235    } catch (IOException e) {
236      throw new ServiceException(e);
237    }
238    return IsUpgradeFinalizedResponseProto.newBuilder()
239        .setIsUpgradeFinalized(isUpgradeFinalized).build();
240  }
241}