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