From 0d078377120da9ea886bd95b19c8a618dc4d7ab5 Mon Sep 17 00:00:00 2001 From: He Xiaoqiao Date: Fri, 25 Jun 2021 01:07:59 +0800 Subject: [PATCH] HDFS-16044. Fix getListing call getLocatedBlocks even source is a directory. Contributed by ludun. --- .../hadoop/hdfs/protocol/HdfsFileStatus.java | 2 +- .../hdfs/protocol/TestHdfsFileStatus.java | 49 +++++++++++++++++++ 2 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 hadoop-hdfs-project/hadoop-hdfs-client/src/test/java/org/apache/hadoop/hdfs/protocol/TestHdfsFileStatus.java diff --git a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/protocol/HdfsFileStatus.java b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/protocol/HdfsFileStatus.java index 264e3f4050f..3b12622484d 100644 --- a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/protocol/HdfsFileStatus.java +++ b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/protocol/HdfsFileStatus.java @@ -274,7 +274,7 @@ public interface HdfsFileStatus * @return An {@link HdfsFileStatus} instance from these parameters. */ public HdfsFileStatus build() { - if (null == locations && !isdir && null == symlink) { + if (null == locations && isdir && null == symlink) { return new HdfsNamedFileStatus(length, isdir, replication, blocksize, mtime, atime, permission, flags, owner, group, symlink, path, fileId, childrenNum, feInfo, storagePolicy, ecPolicy); diff --git a/hadoop-hdfs-project/hadoop-hdfs-client/src/test/java/org/apache/hadoop/hdfs/protocol/TestHdfsFileStatus.java b/hadoop-hdfs-project/hadoop-hdfs-client/src/test/java/org/apache/hadoop/hdfs/protocol/TestHdfsFileStatus.java new file mode 100644 index 00000000000..67f26f0e7f1 --- /dev/null +++ b/hadoop-hdfs-project/hadoop-hdfs-client/src/test/java/org/apache/hadoop/hdfs/protocol/TestHdfsFileStatus.java @@ -0,0 +1,49 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.hadoop.hdfs.protocol; + +import org.junit.Test; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +/** + * Test {@link HdfsFileStatus}. + */ +public class TestHdfsFileStatus { + private boolean createFileStatus(boolean isdir) { + HdfsFileStatus status = new HdfsFileStatus.Builder() + .isdir(isdir) + .build(); + + return status instanceof HdfsLocatedFileStatus; + } + + @Test + public void testHdfsFileStatusBuild() { + // listing directory + assertFalse("Status of directory should not be " + + "HdfsLocatedFileStatus", + createFileStatus(true)); + + // listing file when locations is null + assertTrue("Status of file should be HdfsLocatedFileStatus", + createFileStatus(false)); + } +} +