diff --git a/hadoop-hdfs-project/hadoop-hdfs-rbf/src/main/java/org/apache/hadoop/hdfs/server/federation/router/RouterRpcServer.java b/hadoop-hdfs-project/hadoop-hdfs-rbf/src/main/java/org/apache/hadoop/hdfs/server/federation/router/RouterRpcServer.java index 11592894b4..e6d2f5e5dd 100644 --- a/hadoop-hdfs-project/hadoop-hdfs-rbf/src/main/java/org/apache/hadoop/hdfs/server/federation/router/RouterRpcServer.java +++ b/hadoop-hdfs-project/hadoop-hdfs-rbf/src/main/java/org/apache/hadoop/hdfs/server/federation/router/RouterRpcServer.java @@ -900,7 +900,8 @@ public boolean rename(final String src, final String dst) throws IOException { checkOperation(OperationCategory.WRITE); - final List srcLocations = getLocationsForPath(src, true); + final List srcLocations = + getLocationsForPath(src, true, false); // srcLocations may be trimmed by getRenameDestinations() final List locs = new LinkedList<>(srcLocations); RemoteParam dstParam = getRenameDestinations(locs, dst); @@ -921,7 +922,8 @@ public void rename2(final String src, final String dst, final Options.Rename... options) throws IOException { checkOperation(OperationCategory.WRITE); - final List srcLocations = getLocationsForPath(src, true); + final List srcLocations = + getLocationsForPath(src, true, false); // srcLocations may be trimmed by getRenameDestinations() final List locs = new LinkedList<>(srcLocations); RemoteParam dstParam = getRenameDestinations(locs, dst); @@ -998,7 +1000,8 @@ public boolean truncate(String src, long newLength, String clientName) public boolean delete(String src, boolean recursive) throws IOException { checkOperation(OperationCategory.WRITE); - final List locations = getLocationsForPath(src, true); + final List locations = + getLocationsForPath(src, true, false); RemoteMethod method = new RemoteMethod("delete", new Class[] {String.class, boolean.class}, new RemoteParam(), recursive); @@ -2213,14 +2216,29 @@ private RemoteLocation getLocationForPath( /** * Get the possible locations of a path in the federated cluster. + * During the get operation, it will do the quota verification. * * @param path Path to check. * @param failIfLocked Fail the request if locked (top mount point). * @return Prioritized list of locations in the federated cluster. * @throws IOException If the location for this path cannot be determined. */ - protected List getLocationsForPath( - String path, boolean failIfLocked) throws IOException { + protected List getLocationsForPath(String path, + boolean failIfLocked) throws IOException { + return getLocationsForPath(path, failIfLocked, true); + } + + /** + * Get the possible locations of a path in the federated cluster. + * + * @param path Path to check. + * @param failIfLocked Fail the request if locked (top mount point). + * @param needQuotaVerify If need to do the quota verification. + * @return Prioritized list of locations in the federated cluster. + * @throws IOException If the location for this path cannot be determined. + */ + protected List getLocationsForPath(String path, + boolean failIfLocked, boolean needQuotaVerify) throws IOException { try { // Check the location for this path final PathLocation location = @@ -2241,7 +2259,7 @@ protected List getLocationsForPath( } // Check quota - if (this.router.isQuotaEnabled()) { + if (this.router.isQuotaEnabled() && needQuotaVerify) { RouterQuotaUsage quotaUsage = this.router.getQuotaManager() .getQuotaUsage(path); if (quotaUsage != null) { diff --git a/hadoop-hdfs-project/hadoop-hdfs-rbf/src/test/java/org/apache/hadoop/hdfs/server/federation/router/TestRouterQuota.java b/hadoop-hdfs-project/hadoop-hdfs-rbf/src/test/java/org/apache/hadoop/hdfs/server/federation/router/TestRouterQuota.java index 569e51da91..0e62200641 100644 --- a/hadoop-hdfs-project/hadoop-hdfs-rbf/src/test/java/org/apache/hadoop/hdfs/server/federation/router/TestRouterQuota.java +++ b/hadoop-hdfs-project/hadoop-hdfs-rbf/src/test/java/org/apache/hadoop/hdfs/server/federation/router/TestRouterQuota.java @@ -151,6 +151,10 @@ public Boolean get() { // mkdir in real FileSystem should be okay nnFs1.mkdirs(new Path("/testdir1/" + UUID.randomUUID())); nnFs2.mkdirs(new Path("/testdir2/" + UUID.randomUUID())); + + // delete/rename call should be still okay + routerFs.delete(new Path("/nsquota"), true); + routerFs.rename(new Path("/nsquota/subdir"), new Path("/nsquota/subdir")); } @Test