From 7a3f2f8270a37dcefd754cc4fc342e4a04db0800 Mon Sep 17 00:00:00 2001 From: Caideyipi <87789683+Caideyipi@users.noreply.github.com> Date: Thu, 3 Sep 2026 18:27:12 +0800 Subject: [PATCH] Pipe: Load TsFile classes from parent class loader --- .../plugin/service/PipePluginClassLoader.java | 8 ++++- .../service/PipePluginClassLoaderTest.java | 35 +++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/agent/plugin/service/PipePluginClassLoader.java b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/agent/plugin/service/PipePluginClassLoader.java index 745d93566fc40..fb11975c22657 100644 --- a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/agent/plugin/service/PipePluginClassLoader.java +++ b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/agent/plugin/service/PipePluginClassLoader.java @@ -36,7 +36,13 @@ public class PipePluginClassLoader extends URLClassLoader { private static final String[] PARENT_FIRST_CLASS_PREFIXES = { - "java.", "javax.", "jdk.", "sun.", "org.slf4j.", "org.apache.iotdb.pipe.api." + "java.", + "javax.", + "jdk.", + "sun.", + "org.slf4j.", + "org.apache.iotdb.pipe.api.", + "org.apache.tsfile." }; private final String libRoot; diff --git a/iotdb-core/node-commons/src/test/java/org/apache/iotdb/commons/pipe/agent/plugin/service/PipePluginClassLoaderTest.java b/iotdb-core/node-commons/src/test/java/org/apache/iotdb/commons/pipe/agent/plugin/service/PipePluginClassLoaderTest.java index 39126656fc1ab..bff221bd2ccc0 100644 --- a/iotdb-core/node-commons/src/test/java/org/apache/iotdb/commons/pipe/agent/plugin/service/PipePluginClassLoaderTest.java +++ b/iotdb-core/node-commons/src/test/java/org/apache/iotdb/commons/pipe/agent/plugin/service/PipePluginClassLoaderTest.java @@ -45,6 +45,41 @@ public class PipePluginClassLoaderTest { + @Test + public void testTsFileClassesShouldBeLoadedFromParent() throws Exception { + final Path tempDir = Files.createTempDirectory("pipe-plugin-tsfile-classloader-test"); + try { + final Path childSources = Files.createDirectory(tempDir.resolve("child-sources")); + final Path childClasses = Files.createDirectory(tempDir.resolve("child-classes")); + final String tabletClassName = "org.apache.tsfile.write.record.Tablet"; + final String childTabletSource = + "package org.apache.tsfile.write.record;" + + "public class Tablet {" + + " public String source() {" + + " return \"child\";" + + " }" + + "}"; + final Map childSourceMap = new LinkedHashMap<>(); + childSourceMap.put(tabletClassName, childTabletSource); + compile(childSources, childClasses, childSourceMap); + + final Path childJar = tempDir.resolve("child.jar"); + createJar( + childJar, childClasses, Arrays.asList("org/apache/tsfile/write/record/Tablet.class")); + + final ClassLoader parentClassLoader = PipePluginClassLoaderTest.class.getClassLoader(); + final Class parentTabletClass = Class.forName(tabletClassName, true, parentClassLoader); + try (final PipePluginClassLoader pluginClassLoader = + new PipePluginClassLoader(childJar.toString(), parentClassLoader)) { + final Class pluginTabletClass = Class.forName(tabletClassName, true, pluginClassLoader); + Assert.assertSame(parentTabletClass, pluginTabletClass); + Assert.assertNotSame(pluginClassLoader, pluginTabletClass.getClassLoader()); + } + } finally { + deleteRecursively(tempDir); + } + } + @Test public void testPluginClassesShouldOverrideParentClasses() throws Exception { final Path tempDir = Files.createTempDirectory("pipe-plugin-classloader-test");