Skip to content

Commit

Permalink
HDFS-17746. [ARR] The behavior of throwing exception in getListing sh…
Browse files Browse the repository at this point in the history
…ould be consistent with sync mode.
  • Loading branch information
hfutatzhanghb committed Mar 7, 2025
1 parent 7ab88fe commit 7305cdc
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 21 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -526,25 +526,24 @@ public DirectoryListing getListing(
@Override
protected List<RemoteResult<RemoteLocation, DirectoryListing>> getListingInt(
String src, byte[] startAfter, boolean needLocation) throws IOException {
List<RemoteLocation> locations =
rpcServer.getLocationsForPath(src, false, false);
// Locate the dir and fetch the listing.
if (locations.isEmpty()) {
asyncComplete(new ArrayList<>());
return asyncReturn(List.class);
}
asyncTry(() -> {
try {
List<RemoteLocation> locations =
rpcServer.getLocationsForPath(src, false, false);
// Locate the dir and fetch the listing.
if (locations.isEmpty()) {
asyncComplete(new ArrayList<>());
return asyncReturn(List.class);
}
RemoteMethod method = new RemoteMethod("getListing",
new Class<?>[] {String.class, startAfter.getClass(), boolean.class},
new RemoteParam(), startAfter, needLocation);
rpcClient.invokeConcurrent(locations, method, false, -1,
DirectoryListing.class);
});
asyncCatch((CatchFunction<List, RouterResolveException>) (o, e) -> {
} catch (NoLocationException | RouterResolveException e) {
LOG.debug("Cannot get locations for {}, {}.", src, e.getMessage());
LOG.info("Cannot get locations for {}, {}.", src, e.getMessage());
return new ArrayList<>();
}, RouterResolveException.class);
asyncComplete(new ArrayList<>());
}

return asyncReturn(List.class);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.hdfs.protocol.ClientProtocol;
import org.apache.hadoop.hdfs.server.federation.MiniRouterDFSCluster;
import org.apache.hadoop.hdfs.server.federation.RouterConfigBuilder;
import org.apache.hadoop.hdfs.server.federation.StateStoreDFSCluster;
Expand All @@ -35,14 +34,15 @@
import org.apache.hadoop.hdfs.server.federation.store.protocol.GetMountTableEntriesResponse;
import org.apache.hadoop.hdfs.server.federation.store.protocol.RemoveMountTableEntryRequest;
import org.apache.hadoop.hdfs.server.federation.store.records.MountTable;
import org.apache.hadoop.util.Time;
import org.apache.hadoop.test.LambdaTestUtils;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Collections;

Expand All @@ -56,8 +56,6 @@ public class TestRouterAsyncMountTable {
public static final Logger LOG = LoggerFactory.getLogger(TestRouterAsyncMountTable.class);

private static StateStoreDFSCluster cluster;
private static MiniRouterDFSCluster.NamenodeContext nnContext0;
private static MiniRouterDFSCluster.NamenodeContext nnContext1;
private static MiniRouterDFSCluster.RouterContext routerContext;
private static MountTableResolver mountTable;
private static FileSystem routerFs;
Expand All @@ -78,9 +76,6 @@ public static void globalSetUp() throws Exception {
cluster.startRouters();
cluster.waitClusterUp();

// Get the end points.
nnContext0 = cluster.getNamenode("ns0", null);
nnContext1 = cluster.getNamenode("ns1", null);
routerContext = cluster.getRandomRouter();
routerFs = routerContext.getFileSystem();
Router router = routerContext.getRouter();
Expand Down Expand Up @@ -134,7 +129,6 @@ private boolean addMountTable(final MountTable entry) throws IOException {

@Test
public void testGetEnclosingRoot() throws Exception {

// Add a read only entry.
MountTable readOnlyEntry = MountTable.newInstance(
"/readonly", Collections.singletonMap("ns0", "/testdir"));
Expand All @@ -155,4 +149,13 @@ public void testGetEnclosingRoot() throws Exception {
// Path does not need to exist.
assertEquals(routerFs.getEnclosingRoot(new Path("/regular/pathDNE")), new Path("/regular"));
}

@Test
public void testListNonExistPath() throws Exception {
mountTable.setDefaultNSEnable(false);
LambdaTestUtils.intercept(FileNotFoundException.class,
"File /base does not exist.",
"Expect FileNotFoundException.",
() -> routerFs.listStatus(new Path("/base")));
}
}

0 comments on commit 7305cdc

Please sign in to comment.