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 bbae3ba30c6..d7328fecd2d 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 @@ -882,7 +882,8 @@ public class RouterRpcServer extends AbstractService 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); @@ -903,7 +904,8 @@ public class RouterRpcServer extends AbstractService 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); @@ -980,7 +982,8 @@ public class RouterRpcServer extends AbstractService 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); @@ -2081,14 +2084,29 @@ public class RouterRpcServer extends AbstractService /** * 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 = @@ -2109,7 +2127,7 @@ public class RouterRpcServer extends AbstractService } // 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 f54a56e74c0..3183df4749e 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 class TestRouterQuota { // 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