1 /**
2  * Licensed to the Apache Software Foundation (ASF) under one
3  * or more contributor license agreements.  See the NOTICE file
4  * distributed with this work for additional information
5  * regarding copyright ownership.  The ASF licenses this file
6  * to you under the Apache License, Version 2.0 (the
7  * "License"); you may not use this file except in compliance
8  * with the License.  You may obtain a copy of the License at
9  *
10  *     http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  */
18 package org.apache.hadoop.hdfs.protocolPB;
19 
20 import java.io.Closeable;
21 import java.io.FileNotFoundException;
22 import java.io.IOException;
23 import java.util.Arrays;
24 import java.util.EnumSet;
25 import java.util.List;
26 
27 import com.google.common.collect.Lists;
28 
29 import org.apache.hadoop.classification.InterfaceAudience;
30 import org.apache.hadoop.classification.InterfaceStability;
31 import org.apache.hadoop.crypto.CryptoProtocolVersion;
32 import org.apache.hadoop.fs.BatchedRemoteIterator.BatchedEntries;
33 import org.apache.hadoop.fs.CacheFlag;
34 import org.apache.hadoop.fs.ContentSummary;
35 import org.apache.hadoop.fs.CreateFlag;
36 import org.apache.hadoop.fs.FileAlreadyExistsException;
37 import org.apache.hadoop.fs.FsServerDefaults;
38 import org.apache.hadoop.fs.Options.Rename;
39 import org.apache.hadoop.fs.ParentNotDirectoryException;
40 import org.apache.hadoop.fs.StorageType;
41 import org.apache.hadoop.fs.UnresolvedLinkException;
42 import org.apache.hadoop.fs.XAttr;
43 import org.apache.hadoop.fs.XAttrSetFlag;
44 import org.apache.hadoop.fs.permission.AclEntry;
45 import org.apache.hadoop.fs.permission.AclStatus;
46 import org.apache.hadoop.fs.permission.FsAction;
47 import org.apache.hadoop.fs.permission.FsPermission;
48 import org.apache.hadoop.hdfs.inotify.EventBatchList;
49 import org.apache.hadoop.hdfs.protocol.AlreadyBeingCreatedException;
50 import org.apache.hadoop.hdfs.protocol.BlockStoragePolicy;
51 import org.apache.hadoop.hdfs.protocol.CacheDirectiveEntry;
52 import org.apache.hadoop.hdfs.protocol.CacheDirectiveInfo;
53 import org.apache.hadoop.hdfs.protocol.CachePoolEntry;
54 import org.apache.hadoop.hdfs.protocol.CachePoolInfo;
55 import org.apache.hadoop.hdfs.protocol.ClientProtocol;
56 import org.apache.hadoop.hdfs.protocol.CorruptFileBlocks;
57 import org.apache.hadoop.hdfs.protocol.DSQuotaExceededException;
58 import org.apache.hadoop.hdfs.protocol.DatanodeID;
59 import org.apache.hadoop.hdfs.protocol.DatanodeInfo;
60 import org.apache.hadoop.hdfs.protocol.DirectoryListing;
61 import org.apache.hadoop.hdfs.protocol.EncryptionZone;
62 import org.apache.hadoop.hdfs.protocol.ExtendedBlock;
63 import org.apache.hadoop.hdfs.protocol.HdfsConstants.DatanodeReportType;
64 import org.apache.hadoop.hdfs.protocol.HdfsConstants.RollingUpgradeAction;
65 import org.apache.hadoop.hdfs.protocol.HdfsConstants.SafeModeAction;
66 import org.apache.hadoop.hdfs.protocol.HdfsFileStatus;
67 import org.apache.hadoop.hdfs.protocol.LastBlockWithStatus;
68 import org.apache.hadoop.hdfs.protocol.LocatedBlock;
69 import org.apache.hadoop.hdfs.protocol.LocatedBlocks;
70 import org.apache.hadoop.hdfs.protocol.NSQuotaExceededException;
71 import org.apache.hadoop.hdfs.protocol.RollingUpgradeInfo;
72 import org.apache.hadoop.hdfs.protocol.SnapshotDiffReport;
73 import org.apache.hadoop.hdfs.protocol.SnapshottableDirectoryStatus;
74 import org.apache.hadoop.hdfs.protocol.proto.AclProtos.GetAclStatusRequestProto;
75 import org.apache.hadoop.hdfs.protocol.proto.AclProtos.ModifyAclEntriesRequestProto;
76 import org.apache.hadoop.hdfs.protocol.proto.AclProtos.RemoveAclEntriesRequestProto;
77 import org.apache.hadoop.hdfs.protocol.proto.AclProtos.RemoveAclRequestProto;
78 import org.apache.hadoop.hdfs.protocol.proto.AclProtos.RemoveDefaultAclRequestProto;
79 import org.apache.hadoop.hdfs.protocol.proto.AclProtos.SetAclRequestProto;
80 import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.AbandonBlockRequestProto;
81 import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.AddBlockRequestProto;
82 import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.AddCacheDirectiveRequestProto;
83 import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.AddCachePoolRequestProto;
84 import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.AllowSnapshotRequestProto;
85 import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.AppendRequestProto;
86 import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.AppendResponseProto;
87 import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.CachePoolEntryProto;
88 import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.CheckAccessRequestProto;
89 import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.CompleteRequestProto;
90 import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.ConcatRequestProto;
91 import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.CreateRequestProto;
92 import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.CreateResponseProto;
93 import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.CreateSnapshotRequestProto;
94 import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.CreateSymlinkRequestProto;
95 import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.DeleteRequestProto;
96 import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.DeleteSnapshotRequestProto;
97 import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.DisallowSnapshotRequestProto;
98 import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.FinalizeUpgradeRequestProto;
99 import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.FsyncRequestProto;
100 import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.GetAdditionalDatanodeRequestProto;
101 import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.GetBlockLocationsRequestProto;
102 import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.GetBlockLocationsResponseProto;
103 import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.GetContentSummaryRequestProto;
104 import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.GetCurrentEditLogTxidRequestProto;
105 import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.GetDataEncryptionKeyRequestProto;
106 import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.GetDataEncryptionKeyResponseProto;
107 import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.GetDatanodeReportRequestProto;
108 import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.GetDatanodeStorageReportRequestProto;
109 import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.GetEditsFromTxidRequestProto;
110 import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.GetFileInfoRequestProto;
111 import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.GetFileInfoResponseProto;
112 import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.GetFileLinkInfoRequestProto;
113 import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.GetFileLinkInfoResponseProto;
114 import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.GetFsStatusRequestProto;
115 import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.GetLinkTargetRequestProto;
116 import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.GetLinkTargetResponseProto;
117 import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.GetListingRequestProto;
118 import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.GetListingResponseProto;
119 import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.GetPreferredBlockSizeRequestProto;
120 import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.GetServerDefaultsRequestProto;
121 import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.GetSnapshotDiffReportRequestProto;
122 import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.GetSnapshotDiffReportResponseProto;
123 import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.GetSnapshottableDirListingRequestProto;
124 import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.GetSnapshottableDirListingResponseProto;
125 import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.GetStoragePoliciesRequestProto;
126 import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.GetStoragePoliciesResponseProto;
127 import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.IsFileClosedRequestProto;
128 import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.ListCacheDirectivesRequestProto;
129 import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.ListCacheDirectivesResponseProto;
130 import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.ListCachePoolsRequestProto;
131 import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.ListCachePoolsResponseProto;
132 import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.ListCorruptFileBlocksRequestProto;
133 import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.MetaSaveRequestProto;
134 import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.MkdirsRequestProto;
135 import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.ModifyCacheDirectiveRequestProto;
136 import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.ModifyCachePoolRequestProto;
137 import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.RecoverLeaseRequestProto;
138 import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.RefreshNodesRequestProto;
139 import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.RemoveCacheDirectiveRequestProto;
140 import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.RemoveCachePoolRequestProto;
141 import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.Rename2RequestProto;
142 import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.RenameRequestProto;
143 import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.RenameSnapshotRequestProto;
144 import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.RenewLeaseRequestProto;
145 import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.ReportBadBlocksRequestProto;
146 import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.RestoreFailedStorageRequestProto;
147 import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.RollEditsRequestProto;
148 import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.RollEditsResponseProto;
149 import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.RollingUpgradeRequestProto;
150 import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.RollingUpgradeResponseProto;
151 import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.SaveNamespaceRequestProto;
152 import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.SetBalancerBandwidthRequestProto;
153 import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.SetOwnerRequestProto;
154 import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.SetPermissionRequestProto;
155 import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.SetQuotaRequestProto;
156 import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.SetReplicationRequestProto;
157 import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.SetSafeModeRequestProto;
158 import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.SetTimesRequestProto;
159 import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.TruncateRequestProto;
160 import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.UpdateBlockForPipelineRequestProto;
161 import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.UpdatePipelineRequestProto;
162 import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.SetStoragePolicyRequestProto;
163 import org.apache.hadoop.hdfs.protocol.proto.EncryptionZonesProtos;
164 import org.apache.hadoop.hdfs.protocol.proto.EncryptionZonesProtos.CreateEncryptionZoneRequestProto;
165 import org.apache.hadoop.hdfs.protocol.proto.EncryptionZonesProtos.GetEZForPathRequestProto;
166 import org.apache.hadoop.hdfs.protocol.proto.EncryptionZonesProtos.ListEncryptionZonesRequestProto;
167 import org.apache.hadoop.hdfs.protocol.proto.XAttrProtos.GetXAttrsRequestProto;
168 import org.apache.hadoop.hdfs.protocol.proto.XAttrProtos.ListXAttrsRequestProto;
169 import org.apache.hadoop.hdfs.protocol.proto.XAttrProtos.RemoveXAttrRequestProto;
170 import org.apache.hadoop.hdfs.protocol.proto.XAttrProtos.SetXAttrRequestProto;
171 import org.apache.hadoop.hdfs.security.token.block.DataEncryptionKey;
172 import org.apache.hadoop.hdfs.security.token.delegation.DelegationTokenIdentifier;
173 import org.apache.hadoop.hdfs.server.namenode.NotReplicatedYetException;
174 import org.apache.hadoop.hdfs.server.namenode.SafeModeException;
175 import org.apache.hadoop.hdfs.server.protocol.DatanodeStorageReport;
176 import org.apache.hadoop.io.EnumSetWritable;
177 import org.apache.hadoop.io.Text;
178 import org.apache.hadoop.ipc.ProtobufHelper;
179 import org.apache.hadoop.ipc.ProtocolMetaInterface;
180 import org.apache.hadoop.ipc.ProtocolTranslator;
181 import org.apache.hadoop.ipc.RPC;
182 import org.apache.hadoop.ipc.RpcClientUtil;
183 import org.apache.hadoop.security.AccessControlException;
184 import org.apache.hadoop.security.proto.SecurityProtos.CancelDelegationTokenRequestProto;
185 import org.apache.hadoop.security.proto.SecurityProtos.GetDelegationTokenRequestProto;
186 import org.apache.hadoop.security.proto.SecurityProtos.GetDelegationTokenResponseProto;
187 import org.apache.hadoop.security.proto.SecurityProtos.RenewDelegationTokenRequestProto;
188 import org.apache.hadoop.security.token.Token;
189 
190 import com.google.protobuf.ByteString;
191 import com.google.protobuf.ServiceException;
192 
193 import static org.apache.hadoop.fs.BatchedRemoteIterator.BatchedListEntries;
194 import static org.apache.hadoop.hdfs.protocol.proto.EncryptionZonesProtos
195     .EncryptionZoneProto;
196 
197 /**
198  * This class forwards NN's ClientProtocol calls as RPC calls to the NN server
199  * while translating from the parameter types used in ClientProtocol to the
200  * new PB types.
201  */
202 @InterfaceAudience.Private
203 @InterfaceStability.Stable
204 public class ClientNamenodeProtocolTranslatorPB implements
205     ProtocolMetaInterface, ClientProtocol, Closeable, ProtocolTranslator {
206   final private ClientNamenodeProtocolPB rpcProxy;
207 
208   static final GetServerDefaultsRequestProto VOID_GET_SERVER_DEFAULT_REQUEST =
209   GetServerDefaultsRequestProto.newBuilder().build();
210 
211   private final static GetFsStatusRequestProto VOID_GET_FSSTATUS_REQUEST =
212   GetFsStatusRequestProto.newBuilder().build();
213 
214   private final static SaveNamespaceRequestProto VOID_SAVE_NAMESPACE_REQUEST =
215   SaveNamespaceRequestProto.newBuilder().build();
216 
217   private final static RollEditsRequestProto VOID_ROLLEDITS_REQUEST =
218   RollEditsRequestProto.getDefaultInstance();
219 
220   private final static RefreshNodesRequestProto VOID_REFRESH_NODES_REQUEST =
221   RefreshNodesRequestProto.newBuilder().build();
222 
223   private final static FinalizeUpgradeRequestProto
224   VOID_FINALIZE_UPGRADE_REQUEST =
225       FinalizeUpgradeRequestProto.newBuilder().build();
226 
227   private final static GetDataEncryptionKeyRequestProto
228   VOID_GET_DATA_ENCRYPTIONKEY_REQUEST =
229       GetDataEncryptionKeyRequestProto.newBuilder().build();
230 
231   private final static GetStoragePoliciesRequestProto
232   VOID_GET_STORAGE_POLICIES_REQUEST =
233       GetStoragePoliciesRequestProto.newBuilder().build();
234 
ClientNamenodeProtocolTranslatorPB(ClientNamenodeProtocolPB proxy)235   public ClientNamenodeProtocolTranslatorPB(ClientNamenodeProtocolPB proxy) {
236     rpcProxy = proxy;
237   }
238 
239   @Override
close()240   public void close() {
241     RPC.stopProxy(rpcProxy);
242   }
243 
244   @Override
getBlockLocations(String src, long offset, long length)245   public LocatedBlocks getBlockLocations(String src, long offset, long length)
246       throws AccessControlException, FileNotFoundException,
247       UnresolvedLinkException, IOException {
248     GetBlockLocationsRequestProto req = GetBlockLocationsRequestProto
249         .newBuilder()
250         .setSrc(src)
251         .setOffset(offset)
252         .setLength(length)
253         .build();
254     try {
255       GetBlockLocationsResponseProto resp = rpcProxy.getBlockLocations(null,
256           req);
257       return resp.hasLocations() ?
258         PBHelper.convert(resp.getLocations()) : null;
259     } catch (ServiceException e) {
260       throw ProtobufHelper.getRemoteException(e);
261     }
262   }
263 
264   @Override
getServerDefaults()265   public FsServerDefaults getServerDefaults() throws IOException {
266     GetServerDefaultsRequestProto req = VOID_GET_SERVER_DEFAULT_REQUEST;
267     try {
268       return PBHelper
269           .convert(rpcProxy.getServerDefaults(null, req).getServerDefaults());
270     } catch (ServiceException e) {
271       throw ProtobufHelper.getRemoteException(e);
272     }
273   }
274 
275   @Override
create(String src, FsPermission masked, String clientName, EnumSetWritable<CreateFlag> flag, boolean createParent, short replication, long blockSize, CryptoProtocolVersion[] supportedVersions)276   public HdfsFileStatus create(String src, FsPermission masked,
277       String clientName, EnumSetWritable<CreateFlag> flag,
278       boolean createParent, short replication, long blockSize,
279       CryptoProtocolVersion[] supportedVersions)
280       throws AccessControlException, AlreadyBeingCreatedException,
281       DSQuotaExceededException, FileAlreadyExistsException,
282       FileNotFoundException, NSQuotaExceededException,
283       ParentNotDirectoryException, SafeModeException, UnresolvedLinkException,
284       IOException {
285     CreateRequestProto.Builder builder = CreateRequestProto.newBuilder()
286         .setSrc(src)
287         .setMasked(PBHelper.convert(masked))
288         .setClientName(clientName)
289         .setCreateFlag(PBHelper.convertCreateFlag(flag))
290         .setCreateParent(createParent)
291         .setReplication(replication)
292         .setBlockSize(blockSize);
293     builder.addAllCryptoProtocolVersion(PBHelper.convert(supportedVersions));
294     CreateRequestProto req = builder.build();
295     try {
296       CreateResponseProto res = rpcProxy.create(null, req);
297       return res.hasFs() ? PBHelper.convert(res.getFs()) : null;
298     } catch (ServiceException e) {
299       throw ProtobufHelper.getRemoteException(e);
300     }
301 
302   }
303 
304   @Override
truncate(String src, long newLength, String clientName)305   public boolean truncate(String src, long newLength, String clientName)
306       throws IOException, UnresolvedLinkException {
307     TruncateRequestProto req = TruncateRequestProto.newBuilder()
308         .setSrc(src)
309         .setNewLength(newLength)
310         .setClientName(clientName)
311         .build();
312     try {
313       return rpcProxy.truncate(null, req).getResult();
314     } catch (ServiceException e) {
315       throw ProtobufHelper.getRemoteException(e);
316     }
317   }
318 
319   @Override
append(String src, String clientName, EnumSetWritable<CreateFlag> flag)320   public LastBlockWithStatus append(String src, String clientName,
321       EnumSetWritable<CreateFlag> flag) throws AccessControlException,
322       DSQuotaExceededException, FileNotFoundException, SafeModeException,
323       UnresolvedLinkException, IOException {
324     AppendRequestProto req = AppendRequestProto.newBuilder().setSrc(src)
325         .setClientName(clientName).setFlag(PBHelper.convertCreateFlag(flag))
326         .build();
327     try {
328       AppendResponseProto res = rpcProxy.append(null, req);
329       LocatedBlock lastBlock = res.hasBlock() ? PBHelper
330           .convert(res.getBlock()) : null;
331       HdfsFileStatus stat = (res.hasStat()) ? PBHelper.convert(res.getStat())
332           : null;
333       return new LastBlockWithStatus(lastBlock, stat);
334     } catch (ServiceException e) {
335       throw ProtobufHelper.getRemoteException(e);
336     }
337   }
338 
339   @Override
setReplication(String src, short replication)340   public boolean setReplication(String src, short replication)
341       throws AccessControlException, DSQuotaExceededException,
342       FileNotFoundException, SafeModeException, UnresolvedLinkException,
343       IOException {
344     SetReplicationRequestProto req = SetReplicationRequestProto.newBuilder()
345         .setSrc(src)
346         .setReplication(replication)
347         .build();
348     try {
349       return rpcProxy.setReplication(null, req).getResult();
350     } catch (ServiceException e) {
351       throw ProtobufHelper.getRemoteException(e);
352     }
353   }
354 
355   @Override
setPermission(String src, FsPermission permission)356   public void setPermission(String src, FsPermission permission)
357       throws AccessControlException, FileNotFoundException, SafeModeException,
358       UnresolvedLinkException, IOException {
359     SetPermissionRequestProto req = SetPermissionRequestProto.newBuilder()
360         .setSrc(src)
361         .setPermission(PBHelper.convert(permission))
362         .build();
363     try {
364       rpcProxy.setPermission(null, req);
365     } catch (ServiceException e) {
366       throw ProtobufHelper.getRemoteException(e);
367     }
368   }
369 
370   @Override
setOwner(String src, String username, String groupname)371   public void setOwner(String src, String username, String groupname)
372       throws AccessControlException, FileNotFoundException, SafeModeException,
373       UnresolvedLinkException, IOException {
374     SetOwnerRequestProto.Builder req = SetOwnerRequestProto.newBuilder()
375         .setSrc(src);
376     if (username != null)
377         req.setUsername(username);
378     if (groupname != null)
379         req.setGroupname(groupname);
380     try {
381       rpcProxy.setOwner(null, req.build());
382     } catch (ServiceException e) {
383       throw ProtobufHelper.getRemoteException(e);
384     }
385   }
386 
387   @Override
abandonBlock(ExtendedBlock b, long fileId, String src, String holder)388   public void abandonBlock(ExtendedBlock b, long fileId, String src,
389       String holder) throws AccessControlException, FileNotFoundException,
390         UnresolvedLinkException, IOException {
391     AbandonBlockRequestProto req = AbandonBlockRequestProto.newBuilder()
392         .setB(PBHelper.convert(b)).setSrc(src).setHolder(holder)
393             .setFileId(fileId).build();
394     try {
395       rpcProxy.abandonBlock(null, req);
396     } catch (ServiceException e) {
397       throw ProtobufHelper.getRemoteException(e);
398     }
399   }
400 
401   @Override
addBlock(String src, String clientName, ExtendedBlock previous, DatanodeInfo[] excludeNodes, long fileId, String[] favoredNodes)402   public LocatedBlock addBlock(String src, String clientName,
403       ExtendedBlock previous, DatanodeInfo[] excludeNodes, long fileId,
404       String[] favoredNodes)
405       throws AccessControlException, FileNotFoundException,
406       NotReplicatedYetException, SafeModeException, UnresolvedLinkException,
407       IOException {
408     AddBlockRequestProto.Builder req = AddBlockRequestProto.newBuilder()
409         .setSrc(src).setClientName(clientName).setFileId(fileId);
410     if (previous != null)
411       req.setPrevious(PBHelper.convert(previous));
412     if (excludeNodes != null)
413       req.addAllExcludeNodes(PBHelper.convert(excludeNodes));
414     if (favoredNodes != null) {
415       req.addAllFavoredNodes(Arrays.asList(favoredNodes));
416     }
417     try {
418       return PBHelper.convert(rpcProxy.addBlock(null, req.build()).getBlock());
419     } catch (ServiceException e) {
420       throw ProtobufHelper.getRemoteException(e);
421     }
422   }
423 
424   @Override
getAdditionalDatanode(String src, long fileId, ExtendedBlock blk, DatanodeInfo[] existings, String[] existingStorageIDs, DatanodeInfo[] excludes, int numAdditionalNodes, String clientName)425   public LocatedBlock getAdditionalDatanode(String src, long fileId,
426       ExtendedBlock blk, DatanodeInfo[] existings, String[] existingStorageIDs,
427       DatanodeInfo[] excludes,
428       int numAdditionalNodes, String clientName) throws AccessControlException,
429       FileNotFoundException, SafeModeException, UnresolvedLinkException,
430       IOException {
431     GetAdditionalDatanodeRequestProto req = GetAdditionalDatanodeRequestProto
432         .newBuilder()
433         .setSrc(src)
434         .setFileId(fileId)
435         .setBlk(PBHelper.convert(blk))
436         .addAllExistings(PBHelper.convert(existings))
437         .addAllExistingStorageUuids(Arrays.asList(existingStorageIDs))
438         .addAllExcludes(PBHelper.convert(excludes))
439         .setNumAdditionalNodes(numAdditionalNodes)
440         .setClientName(clientName)
441         .build();
442     try {
443       return PBHelper.convert(rpcProxy.getAdditionalDatanode(null, req)
444           .getBlock());
445     } catch (ServiceException e) {
446       throw ProtobufHelper.getRemoteException(e);
447     }
448   }
449 
450   @Override
complete(String src, String clientName, ExtendedBlock last, long fileId)451   public boolean complete(String src, String clientName,
452                           ExtendedBlock last, long fileId)
453       throws AccessControlException, FileNotFoundException, SafeModeException,
454       UnresolvedLinkException, IOException {
455     CompleteRequestProto.Builder req = CompleteRequestProto.newBuilder()
456         .setSrc(src)
457         .setClientName(clientName)
458         .setFileId(fileId);
459     if (last != null)
460       req.setLast(PBHelper.convert(last));
461     try {
462       return rpcProxy.complete(null, req.build()).getResult();
463     } catch (ServiceException e) {
464       throw ProtobufHelper.getRemoteException(e);
465     }
466   }
467 
468   @Override
reportBadBlocks(LocatedBlock[] blocks)469   public void reportBadBlocks(LocatedBlock[] blocks) throws IOException {
470     ReportBadBlocksRequestProto req = ReportBadBlocksRequestProto.newBuilder()
471         .addAllBlocks(Arrays.asList(PBHelper.convertLocatedBlock(blocks)))
472         .build();
473     try {
474       rpcProxy.reportBadBlocks(null, req);
475     } catch (ServiceException e) {
476       throw ProtobufHelper.getRemoteException(e);
477     }
478   }
479 
480   @Override
rename(String src, String dst)481   public boolean rename(String src, String dst) throws UnresolvedLinkException,
482       IOException {
483     RenameRequestProto req = RenameRequestProto.newBuilder()
484         .setSrc(src)
485         .setDst(dst).build();
486     try {
487       return rpcProxy.rename(null, req).getResult();
488     } catch (ServiceException e) {
489       throw ProtobufHelper.getRemoteException(e);
490     }
491   }
492 
493 
494   @Override
rename2(String src, String dst, Rename... options)495   public void rename2(String src, String dst, Rename... options)
496       throws AccessControlException, DSQuotaExceededException,
497       FileAlreadyExistsException, FileNotFoundException,
498       NSQuotaExceededException, ParentNotDirectoryException, SafeModeException,
499       UnresolvedLinkException, IOException {
500     boolean overwrite = false;
501     if (options != null) {
502       for (Rename option : options) {
503         if (option == Rename.OVERWRITE) {
504           overwrite = true;
505         }
506       }
507     }
508     Rename2RequestProto req = Rename2RequestProto.newBuilder().
509         setSrc(src).
510         setDst(dst).setOverwriteDest(overwrite).
511         build();
512     try {
513       rpcProxy.rename2(null, req);
514     } catch (ServiceException e) {
515       throw ProtobufHelper.getRemoteException(e);
516     }
517 
518   }
519 
520   @Override
concat(String trg, String[] srcs)521   public void concat(String trg, String[] srcs) throws IOException,
522       UnresolvedLinkException {
523     ConcatRequestProto req = ConcatRequestProto.newBuilder().
524         setTrg(trg).
525         addAllSrcs(Arrays.asList(srcs)).build();
526     try {
527       rpcProxy.concat(null, req);
528     } catch (ServiceException e) {
529       throw ProtobufHelper.getRemoteException(e);
530     }
531   }
532 
533 
534   @Override
delete(String src, boolean recursive)535   public boolean delete(String src, boolean recursive)
536       throws AccessControlException, FileNotFoundException, SafeModeException,
537       UnresolvedLinkException, IOException {
538     DeleteRequestProto req = DeleteRequestProto.newBuilder().setSrc(src).setRecursive(recursive).build();
539     try {
540       return rpcProxy.delete(null, req).getResult();
541     } catch (ServiceException e) {
542       throw ProtobufHelper.getRemoteException(e);
543     }
544   }
545 
546   @Override
mkdirs(String src, FsPermission masked, boolean createParent)547   public boolean mkdirs(String src, FsPermission masked, boolean createParent)
548       throws AccessControlException, FileAlreadyExistsException,
549       FileNotFoundException, NSQuotaExceededException,
550       ParentNotDirectoryException, SafeModeException, UnresolvedLinkException,
551       IOException {
552     MkdirsRequestProto req = MkdirsRequestProto.newBuilder()
553         .setSrc(src)
554         .setMasked(PBHelper.convert(masked))
555         .setCreateParent(createParent).build();
556 
557     try {
558       return rpcProxy.mkdirs(null, req).getResult();
559     } catch (ServiceException e) {
560       throw ProtobufHelper.getRemoteException(e);
561     }
562   }
563 
564   @Override
getListing(String src, byte[] startAfter, boolean needLocation)565   public DirectoryListing getListing(String src, byte[] startAfter,
566       boolean needLocation) throws AccessControlException,
567       FileNotFoundException, UnresolvedLinkException, IOException {
568     GetListingRequestProto req = GetListingRequestProto.newBuilder()
569         .setSrc(src)
570         .setStartAfter(ByteString.copyFrom(startAfter))
571         .setNeedLocation(needLocation).build();
572     try {
573       GetListingResponseProto result = rpcProxy.getListing(null, req);
574 
575       if (result.hasDirList()) {
576         return PBHelper.convert(result.getDirList());
577       }
578       return null;
579     } catch (ServiceException e) {
580       throw ProtobufHelper.getRemoteException(e);
581     }
582   }
583 
584   @Override
renewLease(String clientName)585   public void renewLease(String clientName) throws AccessControlException,
586       IOException {
587     RenewLeaseRequestProto req = RenewLeaseRequestProto.newBuilder()
588         .setClientName(clientName).build();
589     try {
590       rpcProxy.renewLease(null, req);
591     } catch (ServiceException e) {
592       throw ProtobufHelper.getRemoteException(e);
593     }
594   }
595 
596   @Override
recoverLease(String src, String clientName)597   public boolean recoverLease(String src, String clientName)
598       throws IOException {
599     RecoverLeaseRequestProto req = RecoverLeaseRequestProto.newBuilder()
600         .setSrc(src)
601         .setClientName(clientName).build();
602     try {
603       return rpcProxy.recoverLease(null, req).getResult();
604     } catch (ServiceException e) {
605       throw ProtobufHelper.getRemoteException(e);
606     }
607   }
608 
609   @Override
getStats()610   public long[] getStats() throws IOException {
611     try {
612       return PBHelper.convert(rpcProxy.getFsStats(null,
613           VOID_GET_FSSTATUS_REQUEST));
614     } catch (ServiceException e) {
615       throw ProtobufHelper.getRemoteException(e);
616     }
617   }
618 
619   @Override
getDatanodeReport(DatanodeReportType type)620   public DatanodeInfo[] getDatanodeReport(DatanodeReportType type)
621       throws IOException {
622     GetDatanodeReportRequestProto req = GetDatanodeReportRequestProto
623         .newBuilder()
624         .setType(PBHelper.convert(type)).build();
625     try {
626       return PBHelper.convert(
627           rpcProxy.getDatanodeReport(null, req).getDiList());
628     } catch (ServiceException e) {
629       throw ProtobufHelper.getRemoteException(e);
630     }
631   }
632 
633   @Override
getDatanodeStorageReport(DatanodeReportType type)634   public DatanodeStorageReport[] getDatanodeStorageReport(DatanodeReportType type)
635       throws IOException {
636     final GetDatanodeStorageReportRequestProto req
637         = GetDatanodeStorageReportRequestProto.newBuilder()
638             .setType(PBHelper.convert(type)).build();
639     try {
640       return PBHelper.convertDatanodeStorageReports(
641           rpcProxy.getDatanodeStorageReport(null, req).getDatanodeStorageReportsList());
642     } catch (ServiceException e) {
643       throw ProtobufHelper.getRemoteException(e);
644     }
645   }
646 
647   @Override
getPreferredBlockSize(String filename)648   public long getPreferredBlockSize(String filename) throws IOException,
649       UnresolvedLinkException {
650     GetPreferredBlockSizeRequestProto req = GetPreferredBlockSizeRequestProto
651         .newBuilder()
652         .setFilename(filename)
653         .build();
654     try {
655       return rpcProxy.getPreferredBlockSize(null, req).getBsize();
656     } catch (ServiceException e) {
657       throw ProtobufHelper.getRemoteException(e);
658     }
659   }
660 
661   @Override
setSafeMode(SafeModeAction action, boolean isChecked)662   public boolean setSafeMode(SafeModeAction action, boolean isChecked) throws IOException {
663     SetSafeModeRequestProto req = SetSafeModeRequestProto.newBuilder()
664         .setAction(PBHelper.convert(action)).setChecked(isChecked).build();
665     try {
666       return rpcProxy.setSafeMode(null, req).getResult();
667     } catch (ServiceException e) {
668       throw ProtobufHelper.getRemoteException(e);
669     }
670   }
671 
672   @Override
saveNamespace()673   public void saveNamespace() throws AccessControlException, IOException {
674     try {
675       rpcProxy.saveNamespace(null, VOID_SAVE_NAMESPACE_REQUEST);
676     } catch (ServiceException e) {
677       throw ProtobufHelper.getRemoteException(e);
678     }
679   }
680 
681   @Override
rollEdits()682   public long rollEdits() throws AccessControlException, IOException {
683     try {
684       RollEditsResponseProto resp = rpcProxy.rollEdits(null,
685           VOID_ROLLEDITS_REQUEST);
686       return resp.getNewSegmentTxId();
687     } catch (ServiceException se) {
688       throw ProtobufHelper.getRemoteException(se);
689     }
690   }
691 
692   @Override
restoreFailedStorage(String arg)693   public boolean restoreFailedStorage(String arg)
694       throws AccessControlException, IOException{
695     RestoreFailedStorageRequestProto req = RestoreFailedStorageRequestProto
696         .newBuilder()
697         .setArg(arg).build();
698     try {
699       return rpcProxy.restoreFailedStorage(null, req).getResult();
700     } catch (ServiceException e) {
701       throw ProtobufHelper.getRemoteException(e);
702     }
703   }
704 
705   @Override
refreshNodes()706   public void refreshNodes() throws IOException {
707     try {
708       rpcProxy.refreshNodes(null, VOID_REFRESH_NODES_REQUEST);
709     } catch (ServiceException e) {
710       throw ProtobufHelper.getRemoteException(e);
711     }
712   }
713 
714   @Override
finalizeUpgrade()715   public void finalizeUpgrade() throws IOException {
716     try {
717       rpcProxy.finalizeUpgrade(null, VOID_FINALIZE_UPGRADE_REQUEST);
718     } catch (ServiceException e) {
719       throw ProtobufHelper.getRemoteException(e);
720     }
721   }
722 
723   @Override
rollingUpgrade(RollingUpgradeAction action)724   public RollingUpgradeInfo rollingUpgrade(RollingUpgradeAction action) throws IOException {
725     final RollingUpgradeRequestProto r = RollingUpgradeRequestProto.newBuilder()
726         .setAction(PBHelper.convert(action)).build();
727     try {
728       final RollingUpgradeResponseProto proto = rpcProxy.rollingUpgrade(null, r);
729       if (proto.hasRollingUpgradeInfo()) {
730         return PBHelper.convert(proto.getRollingUpgradeInfo());
731       }
732       return null;
733     } catch (ServiceException e) {
734       throw ProtobufHelper.getRemoteException(e);
735     }
736   }
737 
738   @Override
listCorruptFileBlocks(String path, String cookie)739   public CorruptFileBlocks listCorruptFileBlocks(String path, String cookie)
740       throws IOException {
741     ListCorruptFileBlocksRequestProto.Builder req =
742         ListCorruptFileBlocksRequestProto.newBuilder().setPath(path);
743     if (cookie != null)
744       req.setCookie(cookie);
745     try {
746       return PBHelper.convert(
747           rpcProxy.listCorruptFileBlocks(null, req.build()).getCorrupt());
748     } catch (ServiceException e) {
749       throw ProtobufHelper.getRemoteException(e);
750     }
751   }
752 
753   @Override
metaSave(String filename)754   public void metaSave(String filename) throws IOException {
755     MetaSaveRequestProto req = MetaSaveRequestProto.newBuilder()
756         .setFilename(filename).build();
757     try {
758       rpcProxy.metaSave(null, req);
759     } catch (ServiceException e) {
760       throw ProtobufHelper.getRemoteException(e);
761     }
762 
763   }
764 
765   @Override
getFileInfo(String src)766   public HdfsFileStatus getFileInfo(String src) throws AccessControlException,
767       FileNotFoundException, UnresolvedLinkException, IOException {
768     GetFileInfoRequestProto req = GetFileInfoRequestProto.newBuilder()
769         .setSrc(src).build();
770     try {
771       GetFileInfoResponseProto res = rpcProxy.getFileInfo(null, req);
772       return res.hasFs() ? PBHelper.convert(res.getFs()) : null;
773     } catch (ServiceException e) {
774       throw ProtobufHelper.getRemoteException(e);
775     }
776   }
777 
778   @Override
getFileLinkInfo(String src)779   public HdfsFileStatus getFileLinkInfo(String src)
780       throws AccessControlException, UnresolvedLinkException, IOException {
781     GetFileLinkInfoRequestProto req = GetFileLinkInfoRequestProto.newBuilder()
782         .setSrc(src).build();
783     try {
784       GetFileLinkInfoResponseProto result = rpcProxy.getFileLinkInfo(null, req);
785       return result.hasFs() ?
786           PBHelper.convert(rpcProxy.getFileLinkInfo(null, req).getFs()) : null;
787     } catch (ServiceException e) {
788       throw ProtobufHelper.getRemoteException(e);
789     }
790   }
791 
792   @Override
getContentSummary(String path)793   public ContentSummary getContentSummary(String path)
794       throws AccessControlException, FileNotFoundException,
795       UnresolvedLinkException, IOException {
796     GetContentSummaryRequestProto req = GetContentSummaryRequestProto
797         .newBuilder()
798         .setPath(path)
799         .build();
800     try {
801       return PBHelper.convert(rpcProxy.getContentSummary(null, req)
802           .getSummary());
803     } catch (ServiceException e) {
804       throw ProtobufHelper.getRemoteException(e);
805     }
806   }
807 
808   @Override
setQuota(String path, long namespaceQuota, long storagespaceQuota, StorageType type)809   public void setQuota(String path, long namespaceQuota, long storagespaceQuota,
810                        StorageType type)
811       throws AccessControlException, FileNotFoundException,
812       UnresolvedLinkException, IOException {
813     final SetQuotaRequestProto.Builder builder
814         = SetQuotaRequestProto.newBuilder()
815         .setPath(path)
816         .setNamespaceQuota(namespaceQuota)
817         .setStoragespaceQuota(storagespaceQuota);
818     if (type != null) {
819       builder.setStorageType(PBHelper.convertStorageType(type));
820     }
821     final SetQuotaRequestProto req = builder.build();
822     try {
823       rpcProxy.setQuota(null, req);
824     } catch (ServiceException e) {
825       throw ProtobufHelper.getRemoteException(e);
826     }
827   }
828 
829   @Override
fsync(String src, long fileId, String client, long lastBlockLength)830   public void fsync(String src, long fileId, String client,
831                     long lastBlockLength)
832       throws AccessControlException, FileNotFoundException,
833       UnresolvedLinkException, IOException {
834     FsyncRequestProto req = FsyncRequestProto.newBuilder().setSrc(src)
835         .setClient(client).setLastBlockLength(lastBlockLength)
836             .setFileId(fileId).build();
837     try {
838       rpcProxy.fsync(null, req);
839     } catch (ServiceException e) {
840       throw ProtobufHelper.getRemoteException(e);
841     }
842   }
843 
844   @Override
setTimes(String src, long mtime, long atime)845   public void setTimes(String src, long mtime, long atime)
846       throws AccessControlException, FileNotFoundException,
847       UnresolvedLinkException, IOException {
848     SetTimesRequestProto req = SetTimesRequestProto.newBuilder()
849         .setSrc(src)
850         .setMtime(mtime)
851         .setAtime(atime)
852         .build();
853     try {
854       rpcProxy.setTimes(null, req);
855     } catch (ServiceException e) {
856       throw ProtobufHelper.getRemoteException(e);
857     }
858   }
859 
860   @Override
createSymlink(String target, String link, FsPermission dirPerm, boolean createParent)861   public void createSymlink(String target, String link, FsPermission dirPerm,
862       boolean createParent) throws AccessControlException,
863       FileAlreadyExistsException, FileNotFoundException,
864       ParentNotDirectoryException, SafeModeException, UnresolvedLinkException,
865       IOException {
866     CreateSymlinkRequestProto req = CreateSymlinkRequestProto.newBuilder()
867         .setTarget(target)
868         .setLink(link)
869         .setDirPerm(PBHelper.convert(dirPerm))
870         .setCreateParent(createParent)
871         .build();
872     try {
873       rpcProxy.createSymlink(null, req);
874     } catch (ServiceException e) {
875       throw ProtobufHelper.getRemoteException(e);
876     }
877   }
878 
879   @Override
getLinkTarget(String path)880   public String getLinkTarget(String path) throws AccessControlException,
881       FileNotFoundException, IOException {
882     GetLinkTargetRequestProto req = GetLinkTargetRequestProto.newBuilder()
883         .setPath(path).build();
884     try {
885       GetLinkTargetResponseProto rsp = rpcProxy.getLinkTarget(null, req);
886       return rsp.hasTargetPath() ? rsp.getTargetPath() : null;
887     } catch (ServiceException e) {
888       throw ProtobufHelper.getRemoteException(e);
889     }
890   }
891 
892   @Override
updateBlockForPipeline(ExtendedBlock block, String clientName)893   public LocatedBlock updateBlockForPipeline(ExtendedBlock block,
894       String clientName) throws IOException {
895     UpdateBlockForPipelineRequestProto req = UpdateBlockForPipelineRequestProto
896         .newBuilder()
897         .setBlock(PBHelper.convert(block))
898         .setClientName(clientName)
899         .build();
900     try {
901       return PBHelper.convert(
902           rpcProxy.updateBlockForPipeline(null, req).getBlock());
903     } catch (ServiceException e) {
904       throw ProtobufHelper.getRemoteException(e);
905     }
906   }
907 
908   @Override
updatePipeline(String clientName, ExtendedBlock oldBlock, ExtendedBlock newBlock, DatanodeID[] newNodes, String[] storageIDs)909   public void updatePipeline(String clientName, ExtendedBlock oldBlock,
910       ExtendedBlock newBlock, DatanodeID[] newNodes, String[] storageIDs) throws IOException {
911     UpdatePipelineRequestProto req = UpdatePipelineRequestProto.newBuilder()
912         .setClientName(clientName)
913         .setOldBlock(PBHelper.convert(oldBlock))
914         .setNewBlock(PBHelper.convert(newBlock))
915         .addAllNewNodes(Arrays.asList(PBHelper.convert(newNodes)))
916         .addAllStorageIDs(storageIDs == null ? null : Arrays.asList(storageIDs))
917         .build();
918     try {
919       rpcProxy.updatePipeline(null, req);
920     } catch (ServiceException e) {
921       throw ProtobufHelper.getRemoteException(e);
922     }
923   }
924 
925   @Override
getDelegationToken(Text renewer)926   public Token<DelegationTokenIdentifier> getDelegationToken(Text renewer)
927       throws IOException {
928     GetDelegationTokenRequestProto req = GetDelegationTokenRequestProto
929         .newBuilder()
930         .setRenewer(renewer.toString())
931         .build();
932     try {
933       GetDelegationTokenResponseProto resp = rpcProxy.getDelegationToken(null, req);
934       return resp.hasToken() ? PBHelper.convertDelegationToken(resp.getToken())
935           : null;
936     } catch (ServiceException e) {
937       throw ProtobufHelper.getRemoteException(e);
938     }
939   }
940 
941   @Override
renewDelegationToken(Token<DelegationTokenIdentifier> token)942   public long renewDelegationToken(Token<DelegationTokenIdentifier> token)
943       throws IOException {
944     RenewDelegationTokenRequestProto req = RenewDelegationTokenRequestProto.newBuilder().
945         setToken(PBHelper.convert(token)).
946         build();
947     try {
948       return rpcProxy.renewDelegationToken(null, req).getNewExpiryTime();
949     } catch (ServiceException e) {
950       throw ProtobufHelper.getRemoteException(e);
951     }
952   }
953 
954   @Override
cancelDelegationToken(Token<DelegationTokenIdentifier> token)955   public void cancelDelegationToken(Token<DelegationTokenIdentifier> token)
956       throws IOException {
957     CancelDelegationTokenRequestProto req = CancelDelegationTokenRequestProto
958         .newBuilder()
959         .setToken(PBHelper.convert(token))
960         .build();
961     try {
962       rpcProxy.cancelDelegationToken(null, req);
963     } catch (ServiceException e) {
964       throw ProtobufHelper.getRemoteException(e);
965     }
966   }
967 
968   @Override
setBalancerBandwidth(long bandwidth)969   public void setBalancerBandwidth(long bandwidth) throws IOException {
970     SetBalancerBandwidthRequestProto req = SetBalancerBandwidthRequestProto.newBuilder()
971         .setBandwidth(bandwidth)
972         .build();
973     try {
974       rpcProxy.setBalancerBandwidth(null, req);
975     } catch (ServiceException e) {
976       throw ProtobufHelper.getRemoteException(e);
977     }
978   }
979 
980   @Override
isMethodSupported(String methodName)981   public boolean isMethodSupported(String methodName) throws IOException {
982     return RpcClientUtil.isMethodSupported(rpcProxy,
983         ClientNamenodeProtocolPB.class, RPC.RpcKind.RPC_PROTOCOL_BUFFER,
984         RPC.getProtocolVersion(ClientNamenodeProtocolPB.class), methodName);
985   }
986 
987   @Override
getDataEncryptionKey()988   public DataEncryptionKey getDataEncryptionKey() throws IOException {
989     try {
990       GetDataEncryptionKeyResponseProto rsp = rpcProxy.getDataEncryptionKey(
991           null, VOID_GET_DATA_ENCRYPTIONKEY_REQUEST);
992      return rsp.hasDataEncryptionKey() ?
993           PBHelper.convert(rsp.getDataEncryptionKey()) : null;
994     } catch (ServiceException e) {
995       throw ProtobufHelper.getRemoteException(e);
996     }
997   }
998 
999 
1000   @Override
isFileClosed(String src)1001   public boolean isFileClosed(String src) throws AccessControlException,
1002       FileNotFoundException, UnresolvedLinkException, IOException {
1003     IsFileClosedRequestProto req = IsFileClosedRequestProto.newBuilder()
1004         .setSrc(src).build();
1005     try {
1006       return rpcProxy.isFileClosed(null, req).getResult();
1007     } catch (ServiceException e) {
1008       throw ProtobufHelper.getRemoteException(e);
1009     }
1010   }
1011 
1012   @Override
getUnderlyingProxyObject()1013   public Object getUnderlyingProxyObject() {
1014     return rpcProxy;
1015   }
1016 
1017   @Override
createSnapshot(String snapshotRoot, String snapshotName)1018   public String createSnapshot(String snapshotRoot, String snapshotName)
1019       throws IOException {
1020     final CreateSnapshotRequestProto.Builder builder
1021         = CreateSnapshotRequestProto.newBuilder().setSnapshotRoot(snapshotRoot);
1022     if (snapshotName != null) {
1023       builder.setSnapshotName(snapshotName);
1024     }
1025     final CreateSnapshotRequestProto req = builder.build();
1026     try {
1027       return rpcProxy.createSnapshot(null, req).getSnapshotPath();
1028     } catch (ServiceException e) {
1029       throw ProtobufHelper.getRemoteException(e);
1030     }
1031   }
1032 
1033   @Override
deleteSnapshot(String snapshotRoot, String snapshotName)1034   public void deleteSnapshot(String snapshotRoot, String snapshotName)
1035       throws IOException {
1036     DeleteSnapshotRequestProto req = DeleteSnapshotRequestProto.newBuilder()
1037         .setSnapshotRoot(snapshotRoot).setSnapshotName(snapshotName).build();
1038     try {
1039       rpcProxy.deleteSnapshot(null, req);
1040     } catch (ServiceException e) {
1041       throw ProtobufHelper.getRemoteException(e);
1042     }
1043   }
1044 
1045   @Override
allowSnapshot(String snapshotRoot)1046   public void allowSnapshot(String snapshotRoot) throws IOException {
1047     AllowSnapshotRequestProto req = AllowSnapshotRequestProto.newBuilder()
1048         .setSnapshotRoot(snapshotRoot).build();
1049     try {
1050       rpcProxy.allowSnapshot(null, req);
1051     } catch (ServiceException e) {
1052       throw ProtobufHelper.getRemoteException(e);
1053     }
1054   }
1055 
1056   @Override
disallowSnapshot(String snapshotRoot)1057   public void disallowSnapshot(String snapshotRoot) throws IOException {
1058     DisallowSnapshotRequestProto req = DisallowSnapshotRequestProto
1059         .newBuilder().setSnapshotRoot(snapshotRoot).build();
1060     try {
1061       rpcProxy.disallowSnapshot(null, req);
1062     } catch (ServiceException e) {
1063       throw ProtobufHelper.getRemoteException(e);
1064     }
1065   }
1066 
1067   @Override
renameSnapshot(String snapshotRoot, String snapshotOldName, String snapshotNewName)1068   public void renameSnapshot(String snapshotRoot, String snapshotOldName,
1069       String snapshotNewName) throws IOException {
1070     RenameSnapshotRequestProto req = RenameSnapshotRequestProto.newBuilder()
1071         .setSnapshotRoot(snapshotRoot).setSnapshotOldName(snapshotOldName)
1072         .setSnapshotNewName(snapshotNewName).build();
1073     try {
1074       rpcProxy.renameSnapshot(null, req);
1075     } catch (ServiceException e) {
1076       throw ProtobufHelper.getRemoteException(e);
1077     }
1078   }
1079 
1080   @Override
getSnapshottableDirListing()1081   public SnapshottableDirectoryStatus[] getSnapshottableDirListing()
1082       throws IOException {
1083     GetSnapshottableDirListingRequestProto req =
1084         GetSnapshottableDirListingRequestProto.newBuilder().build();
1085     try {
1086       GetSnapshottableDirListingResponseProto result = rpcProxy
1087           .getSnapshottableDirListing(null, req);
1088 
1089       if (result.hasSnapshottableDirList()) {
1090         return PBHelper.convert(result.getSnapshottableDirList());
1091       }
1092       return null;
1093     } catch (ServiceException e) {
1094       throw ProtobufHelper.getRemoteException(e);
1095     }
1096   }
1097 
1098   @Override
getSnapshotDiffReport(String snapshotRoot, String fromSnapshot, String toSnapshot)1099   public SnapshotDiffReport getSnapshotDiffReport(String snapshotRoot,
1100       String fromSnapshot, String toSnapshot) throws IOException {
1101     GetSnapshotDiffReportRequestProto req = GetSnapshotDiffReportRequestProto
1102         .newBuilder().setSnapshotRoot(snapshotRoot)
1103         .setFromSnapshot(fromSnapshot).setToSnapshot(toSnapshot).build();
1104     try {
1105       GetSnapshotDiffReportResponseProto result =
1106           rpcProxy.getSnapshotDiffReport(null, req);
1107 
1108       return PBHelper.convert(result.getDiffReport());
1109     } catch (ServiceException e) {
1110       throw ProtobufHelper.getRemoteException(e);
1111     }
1112   }
1113 
1114   @Override
addCacheDirective(CacheDirectiveInfo directive, EnumSet<CacheFlag> flags)1115   public long addCacheDirective(CacheDirectiveInfo directive,
1116       EnumSet<CacheFlag> flags) throws IOException {
1117     try {
1118       AddCacheDirectiveRequestProto.Builder builder =
1119           AddCacheDirectiveRequestProto.newBuilder().
1120               setInfo(PBHelper.convert(directive));
1121       if (!flags.isEmpty()) {
1122         builder.setCacheFlags(PBHelper.convertCacheFlags(flags));
1123       }
1124       return rpcProxy.addCacheDirective(null, builder.build()).getId();
1125     } catch (ServiceException e) {
1126       throw ProtobufHelper.getRemoteException(e);
1127     }
1128   }
1129 
1130   @Override
modifyCacheDirective(CacheDirectiveInfo directive, EnumSet<CacheFlag> flags)1131   public void modifyCacheDirective(CacheDirectiveInfo directive,
1132       EnumSet<CacheFlag> flags) throws IOException {
1133     try {
1134       ModifyCacheDirectiveRequestProto.Builder builder =
1135           ModifyCacheDirectiveRequestProto.newBuilder().
1136               setInfo(PBHelper.convert(directive));
1137       if (!flags.isEmpty()) {
1138         builder.setCacheFlags(PBHelper.convertCacheFlags(flags));
1139       }
1140       rpcProxy.modifyCacheDirective(null, builder.build());
1141     } catch (ServiceException e) {
1142       throw ProtobufHelper.getRemoteException(e);
1143     }
1144   }
1145 
1146   @Override
removeCacheDirective(long id)1147   public void removeCacheDirective(long id)
1148       throws IOException {
1149     try {
1150       rpcProxy.removeCacheDirective(null,
1151           RemoveCacheDirectiveRequestProto.newBuilder().
1152               setId(id).build());
1153     } catch (ServiceException e) {
1154       throw ProtobufHelper.getRemoteException(e);
1155     }
1156   }
1157 
1158   private static class BatchedCacheEntries
1159       implements BatchedEntries<CacheDirectiveEntry> {
1160     private final ListCacheDirectivesResponseProto response;
1161 
BatchedCacheEntries( ListCacheDirectivesResponseProto response)1162     BatchedCacheEntries(
1163         ListCacheDirectivesResponseProto response) {
1164       this.response = response;
1165     }
1166 
1167     @Override
get(int i)1168     public CacheDirectiveEntry get(int i) {
1169       return PBHelper.convert(response.getElements(i));
1170     }
1171 
1172     @Override
size()1173     public int size() {
1174       return response.getElementsCount();
1175     }
1176 
1177     @Override
hasMore()1178     public boolean hasMore() {
1179       return response.getHasMore();
1180     }
1181   }
1182 
1183   @Override
1184   public BatchedEntries<CacheDirectiveEntry>
listCacheDirectives(long prevId, CacheDirectiveInfo filter)1185       listCacheDirectives(long prevId,
1186           CacheDirectiveInfo filter) throws IOException {
1187     if (filter == null) {
1188       filter = new CacheDirectiveInfo.Builder().build();
1189     }
1190     try {
1191       return new BatchedCacheEntries(
1192         rpcProxy.listCacheDirectives(null,
1193           ListCacheDirectivesRequestProto.newBuilder().
1194             setPrevId(prevId).
1195             setFilter(PBHelper.convert(filter)).
1196             build()));
1197     } catch (ServiceException e) {
1198       throw ProtobufHelper.getRemoteException(e);
1199     }
1200   }
1201 
1202   @Override
addCachePool(CachePoolInfo info)1203   public void addCachePool(CachePoolInfo info) throws IOException {
1204     AddCachePoolRequestProto.Builder builder =
1205         AddCachePoolRequestProto.newBuilder();
1206     builder.setInfo(PBHelper.convert(info));
1207     try {
1208       rpcProxy.addCachePool(null, builder.build());
1209     } catch (ServiceException e) {
1210       throw ProtobufHelper.getRemoteException(e);
1211     }
1212   }
1213 
1214   @Override
modifyCachePool(CachePoolInfo req)1215   public void modifyCachePool(CachePoolInfo req) throws IOException {
1216     ModifyCachePoolRequestProto.Builder builder =
1217         ModifyCachePoolRequestProto.newBuilder();
1218     builder.setInfo(PBHelper.convert(req));
1219     try {
1220       rpcProxy.modifyCachePool(null, builder.build());
1221     } catch (ServiceException e) {
1222       throw ProtobufHelper.getRemoteException(e);
1223     }
1224   }
1225 
1226   @Override
removeCachePool(String cachePoolName)1227   public void removeCachePool(String cachePoolName) throws IOException {
1228     try {
1229       rpcProxy.removeCachePool(null,
1230           RemoveCachePoolRequestProto.newBuilder().
1231             setPoolName(cachePoolName).build());
1232     } catch (ServiceException e) {
1233       throw ProtobufHelper.getRemoteException(e);
1234     }
1235   }
1236 
1237   private static class BatchedCachePoolEntries
1238     implements BatchedEntries<CachePoolEntry> {
1239       private final ListCachePoolsResponseProto proto;
1240 
BatchedCachePoolEntries(ListCachePoolsResponseProto proto)1241     public BatchedCachePoolEntries(ListCachePoolsResponseProto proto) {
1242       this.proto = proto;
1243     }
1244 
1245     @Override
get(int i)1246     public CachePoolEntry get(int i) {
1247       CachePoolEntryProto elem = proto.getEntries(i);
1248       return PBHelper.convert(elem);
1249     }
1250 
1251     @Override
size()1252     public int size() {
1253       return proto.getEntriesCount();
1254     }
1255 
1256     @Override
hasMore()1257     public boolean hasMore() {
1258       return proto.getHasMore();
1259     }
1260   }
1261 
1262   @Override
listCachePools(String prevKey)1263   public BatchedEntries<CachePoolEntry> listCachePools(String prevKey)
1264       throws IOException {
1265     try {
1266       return new BatchedCachePoolEntries(
1267         rpcProxy.listCachePools(null,
1268           ListCachePoolsRequestProto.newBuilder().
1269             setPrevPoolName(prevKey).build()));
1270     } catch (ServiceException e) {
1271       throw ProtobufHelper.getRemoteException(e);
1272     }
1273   }
1274 
1275   @Override
modifyAclEntries(String src, List<AclEntry> aclSpec)1276   public void modifyAclEntries(String src, List<AclEntry> aclSpec)
1277       throws IOException {
1278     ModifyAclEntriesRequestProto req = ModifyAclEntriesRequestProto
1279         .newBuilder().setSrc(src)
1280         .addAllAclSpec(PBHelper.convertAclEntryProto(aclSpec)).build();
1281     try {
1282       rpcProxy.modifyAclEntries(null, req);
1283     } catch (ServiceException e) {
1284       throw ProtobufHelper.getRemoteException(e);
1285     }
1286   }
1287 
1288   @Override
removeAclEntries(String src, List<AclEntry> aclSpec)1289   public void removeAclEntries(String src, List<AclEntry> aclSpec)
1290       throws IOException {
1291     RemoveAclEntriesRequestProto req = RemoveAclEntriesRequestProto
1292         .newBuilder().setSrc(src)
1293         .addAllAclSpec(PBHelper.convertAclEntryProto(aclSpec)).build();
1294     try {
1295       rpcProxy.removeAclEntries(null, req);
1296     } catch (ServiceException e) {
1297       throw ProtobufHelper.getRemoteException(e);
1298     }
1299   }
1300 
1301   @Override
removeDefaultAcl(String src)1302   public void removeDefaultAcl(String src) throws IOException {
1303     RemoveDefaultAclRequestProto req = RemoveDefaultAclRequestProto
1304         .newBuilder().setSrc(src).build();
1305     try {
1306       rpcProxy.removeDefaultAcl(null, req);
1307     } catch (ServiceException e) {
1308       throw ProtobufHelper.getRemoteException(e);
1309     }
1310   }
1311 
1312   @Override
removeAcl(String src)1313   public void removeAcl(String src) throws IOException {
1314     RemoveAclRequestProto req = RemoveAclRequestProto.newBuilder()
1315         .setSrc(src).build();
1316     try {
1317       rpcProxy.removeAcl(null, req);
1318     } catch (ServiceException e) {
1319       throw ProtobufHelper.getRemoteException(e);
1320     }
1321   }
1322 
1323   @Override
setAcl(String src, List<AclEntry> aclSpec)1324   public void setAcl(String src, List<AclEntry> aclSpec) throws IOException {
1325     SetAclRequestProto req = SetAclRequestProto.newBuilder()
1326         .setSrc(src)
1327         .addAllAclSpec(PBHelper.convertAclEntryProto(aclSpec))
1328         .build();
1329     try {
1330       rpcProxy.setAcl(null, req);
1331     } catch (ServiceException e) {
1332       throw ProtobufHelper.getRemoteException(e);
1333     }
1334   }
1335 
1336   @Override
getAclStatus(String src)1337   public AclStatus getAclStatus(String src) throws IOException {
1338     GetAclStatusRequestProto req = GetAclStatusRequestProto.newBuilder()
1339         .setSrc(src).build();
1340     try {
1341       return PBHelper.convert(rpcProxy.getAclStatus(null, req));
1342     } catch (ServiceException e) {
1343       throw ProtobufHelper.getRemoteException(e);
1344     }
1345   }
1346 
1347   @Override
createEncryptionZone(String src, String keyName)1348   public void createEncryptionZone(String src, String keyName)
1349     throws IOException {
1350     final CreateEncryptionZoneRequestProto.Builder builder =
1351       CreateEncryptionZoneRequestProto.newBuilder();
1352     builder.setSrc(src);
1353     if (keyName != null && !keyName.isEmpty()) {
1354       builder.setKeyName(keyName);
1355     }
1356     CreateEncryptionZoneRequestProto req = builder.build();
1357     try {
1358       rpcProxy.createEncryptionZone(null, req);
1359     } catch (ServiceException e) {
1360       throw ProtobufHelper.getRemoteException(e);
1361     }
1362   }
1363 
1364   @Override
getEZForPath(String src)1365   public EncryptionZone getEZForPath(String src)
1366       throws IOException {
1367     final GetEZForPathRequestProto.Builder builder =
1368         GetEZForPathRequestProto.newBuilder();
1369     builder.setSrc(src);
1370     final GetEZForPathRequestProto req = builder.build();
1371     try {
1372       final EncryptionZonesProtos.GetEZForPathResponseProto response =
1373           rpcProxy.getEZForPath(null, req);
1374       if (response.hasZone()) {
1375         return PBHelper.convert(response.getZone());
1376       } else {
1377         return null;
1378       }
1379     } catch (ServiceException e) {
1380       throw ProtobufHelper.getRemoteException(e);
1381     }
1382   }
1383 
1384   @Override
listEncryptionZones(long id)1385   public BatchedEntries<EncryptionZone> listEncryptionZones(long id)
1386       throws IOException {
1387     final ListEncryptionZonesRequestProto req =
1388       ListEncryptionZonesRequestProto.newBuilder()
1389           .setId(id)
1390           .build();
1391     try {
1392       EncryptionZonesProtos.ListEncryptionZonesResponseProto response =
1393           rpcProxy.listEncryptionZones(null, req);
1394       List<EncryptionZone> elements =
1395           Lists.newArrayListWithCapacity(response.getZonesCount());
1396       for (EncryptionZoneProto p : response.getZonesList()) {
1397         elements.add(PBHelper.convert(p));
1398       }
1399       return new BatchedListEntries<EncryptionZone>(elements,
1400           response.getHasMore());
1401     } catch (ServiceException e) {
1402       throw ProtobufHelper.getRemoteException(e);
1403     }
1404   }
1405 
1406   @Override
setXAttr(String src, XAttr xAttr, EnumSet<XAttrSetFlag> flag)1407   public void setXAttr(String src, XAttr xAttr, EnumSet<XAttrSetFlag> flag)
1408       throws IOException {
1409     SetXAttrRequestProto req = SetXAttrRequestProto.newBuilder()
1410         .setSrc(src)
1411         .setXAttr(PBHelper.convertXAttrProto(xAttr))
1412         .setFlag(PBHelper.convert(flag))
1413         .build();
1414     try {
1415       rpcProxy.setXAttr(null, req);
1416     } catch (ServiceException e) {
1417       throw ProtobufHelper.getRemoteException(e);
1418     }
1419   }
1420 
1421   @Override
getXAttrs(String src, List<XAttr> xAttrs)1422   public List<XAttr> getXAttrs(String src, List<XAttr> xAttrs)
1423       throws IOException {
1424     GetXAttrsRequestProto.Builder builder = GetXAttrsRequestProto.newBuilder();
1425     builder.setSrc(src);
1426     if (xAttrs != null) {
1427       builder.addAllXAttrs(PBHelper.convertXAttrProto(xAttrs));
1428     }
1429     GetXAttrsRequestProto req = builder.build();
1430     try {
1431       return PBHelper.convert(rpcProxy.getXAttrs(null, req));
1432     } catch (ServiceException e) {
1433       throw ProtobufHelper.getRemoteException(e);
1434     }
1435   }
1436 
1437   @Override
listXAttrs(String src)1438   public List<XAttr> listXAttrs(String src)
1439       throws IOException {
1440     ListXAttrsRequestProto.Builder builder = ListXAttrsRequestProto.newBuilder();
1441     builder.setSrc(src);
1442     ListXAttrsRequestProto req = builder.build();
1443     try {
1444       return PBHelper.convert(rpcProxy.listXAttrs(null, req));
1445     } catch (ServiceException e) {
1446       throw ProtobufHelper.getRemoteException(e);
1447     }
1448   }
1449 
1450   @Override
removeXAttr(String src, XAttr xAttr)1451   public void removeXAttr(String src, XAttr xAttr) throws IOException {
1452     RemoveXAttrRequestProto req = RemoveXAttrRequestProto
1453         .newBuilder().setSrc(src)
1454         .setXAttr(PBHelper.convertXAttrProto(xAttr)).build();
1455     try {
1456       rpcProxy.removeXAttr(null, req);
1457     } catch (ServiceException e) {
1458       throw ProtobufHelper.getRemoteException(e);
1459     }
1460   }
1461 
1462   @Override
checkAccess(String path, FsAction mode)1463   public void checkAccess(String path, FsAction mode) throws IOException {
1464     CheckAccessRequestProto req = CheckAccessRequestProto.newBuilder()
1465         .setPath(path).setMode(PBHelper.convert(mode)).build();
1466     try {
1467       rpcProxy.checkAccess(null, req);
1468     } catch (ServiceException e) {
1469       throw ProtobufHelper.getRemoteException(e);
1470     }
1471   }
1472 
1473   @Override
setStoragePolicy(String src, String policyName)1474   public void setStoragePolicy(String src, String policyName)
1475       throws IOException {
1476     SetStoragePolicyRequestProto req = SetStoragePolicyRequestProto
1477         .newBuilder().setSrc(src).setPolicyName(policyName).build();
1478     try {
1479       rpcProxy.setStoragePolicy(null, req);
1480     } catch (ServiceException e) {
1481       throw ProtobufHelper.getRemoteException(e);
1482     }
1483   }
1484 
1485   @Override
getStoragePolicies()1486   public BlockStoragePolicy[] getStoragePolicies() throws IOException {
1487     try {
1488       GetStoragePoliciesResponseProto response = rpcProxy
1489           .getStoragePolicies(null, VOID_GET_STORAGE_POLICIES_REQUEST);
1490       return PBHelper.convertStoragePolicies(response.getPoliciesList());
1491     } catch (ServiceException e) {
1492       throw ProtobufHelper.getRemoteException(e);
1493     }
1494   }
1495 
getCurrentEditLogTxid()1496   public long getCurrentEditLogTxid() throws IOException {
1497     GetCurrentEditLogTxidRequestProto req = GetCurrentEditLogTxidRequestProto
1498         .getDefaultInstance();
1499     try {
1500       return rpcProxy.getCurrentEditLogTxid(null, req).getTxid();
1501     } catch (ServiceException e) {
1502       throw ProtobufHelper.getRemoteException(e);
1503     }
1504   }
1505 
1506   @Override
getEditsFromTxid(long txid)1507   public EventBatchList getEditsFromTxid(long txid) throws IOException {
1508     GetEditsFromTxidRequestProto req = GetEditsFromTxidRequestProto.newBuilder()
1509         .setTxid(txid).build();
1510     try {
1511       return PBHelper.convert(rpcProxy.getEditsFromTxid(null, req));
1512     } catch (ServiceException e) {
1513       throw ProtobufHelper.getRemoteException(e);
1514     }
1515   }
1516 }
1517