This is an automated email from the ASF dual-hosted git repository. lzljs3620320 pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/paimon.git
The following commit(s) were added to refs/heads/master by this push: new 2d825d5e4e [VFS] Fix PVFS trash behavior for Hadoop TrashPolicy (#5975) 2d825d5e4e is described below commit 2d825d5e4eafd2e34b5a7300503a1ae79a60dac0 Author: timmyyao <1939694...@qq.com> AuthorDate: Tue Jul 29 21:12:28 2025 +0800 [VFS] Fix PVFS trash behavior for Hadoop TrashPolicy (#5975) --- .../paimon/vfs/hadoop/PaimonVirtualFileSystem.java | 11 ++++++++++- .../paimon/vfs/hadoop/VirtualFileSystemTest.java | 19 +++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/paimon-vfs/paimon-vfs-hadoop/src/main/java/org/apache/paimon/vfs/hadoop/PaimonVirtualFileSystem.java b/paimon-vfs/paimon-vfs-hadoop/src/main/java/org/apache/paimon/vfs/hadoop/PaimonVirtualFileSystem.java index e18d3f5f59..5cac693539 100644 --- a/paimon-vfs/paimon-vfs-hadoop/src/main/java/org/apache/paimon/vfs/hadoop/PaimonVirtualFileSystem.java +++ b/paimon-vfs/paimon-vfs-hadoop/src/main/java/org/apache/paimon/vfs/hadoop/PaimonVirtualFileSystem.java @@ -393,7 +393,16 @@ public class PaimonVirtualFileSystem extends FileSystem { @Override public boolean mkdirs(Path f, FsPermission permission) throws IOException { - VFSIdentifier vfsIdentifier = vfsOperations.getVFSIdentifier(getVirtualPath(f)); + String virtualPath = getVirtualPath(f); + // Hadoop TrashPolicy will mkdir /user/<root>/.Trash, and we should reject this operation + // and return false, which indicates trash is not supported for TrashPolicy + for (String component : virtualPath.split("/")) { + if (component.equals(".Trash")) { + LOG.info("PVFS do not support trash directory {}", f); + return false; + } + } + VFSIdentifier vfsIdentifier = vfsOperations.getVFSIdentifier(virtualPath); if (vfsIdentifier instanceof VFSCatalogIdentifier) { throw new IOException("Cannot mkdirs for virtual path " + f + " which is a catalog"); } else if (vfsIdentifier instanceof VFSDatabaseIdentifier) { diff --git a/paimon-vfs/paimon-vfs-hadoop/src/test/java/org/apache/paimon/vfs/hadoop/VirtualFileSystemTest.java b/paimon-vfs/paimon-vfs-hadoop/src/test/java/org/apache/paimon/vfs/hadoop/VirtualFileSystemTest.java index 0154589c11..d6e50d1fb0 100644 --- a/paimon-vfs/paimon-vfs-hadoop/src/test/java/org/apache/paimon/vfs/hadoop/VirtualFileSystemTest.java +++ b/paimon-vfs/paimon-vfs-hadoop/src/test/java/org/apache/paimon/vfs/hadoop/VirtualFileSystemTest.java @@ -34,11 +34,13 @@ import org.apache.paimon.table.Table; import org.apache.paimon.table.object.ObjectTable; import org.apache.paimon.types.DataTypes; +import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FSDataInputStream; import org.apache.hadoop.fs.FSDataOutputStream; import org.apache.hadoop.fs.FileStatus; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; +import org.apache.hadoop.fs.TrashPolicy; import org.junit.Assert; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; @@ -468,4 +470,21 @@ public abstract class VirtualFileSystemTest { Assert.assertEquals( new Path(vfsPath, "schema").toString(), fileStatuses[0].getPath().toString()); } + + @Test + public void testTrash() throws Exception { + String databaseName = "test_db"; + String tableName = "object_table"; + createObjectTable(databaseName, tableName); + + Path vfsPath = new Path(vfsRoot, databaseName + "/" + tableName + "/test_dir/file.txt"); + FSDataOutputStream out = vfs.create(vfsPath); + out.write("hello".getBytes()); + out.close(); + + // Trash vfsPath, return false and trash action not executed + TrashPolicy trashPolicy = TrashPolicy.getInstance(new Configuration(), vfs); + Assert.assertFalse(trashPolicy.moveToTrash(vfsPath)); + Assert.assertTrue(vfs.exists(vfsPath)); + } }