From e376b6cf223defe1bced0faf63ac9cb337a4fd0b Mon Sep 17 00:00:00 2001 From: LYD031106 <2565506388@qq.com> Date: Fri, 24 Oct 2025 22:19:09 +0800 Subject: [PATCH 1/8] fix(server): ensure graph clear API does not clear meta table --- .../org/apache/hugegraph/backend/store/mysql/MysqlStore.java | 1 + 1 file changed, 1 insertion(+) diff --git a/hugegraph-server/hugegraph-mysql/src/main/java/org/apache/hugegraph/backend/store/mysql/MysqlStore.java b/hugegraph-server/hugegraph-mysql/src/main/java/org/apache/hugegraph/backend/store/mysql/MysqlStore.java index c5d983feff..c291160e10 100644 --- a/hugegraph-server/hugegraph-mysql/src/main/java/org/apache/hugegraph/backend/store/mysql/MysqlStore.java +++ b/hugegraph-server/hugegraph-mysql/src/main/java/org/apache/hugegraph/backend/store/mysql/MysqlStore.java @@ -223,6 +223,7 @@ public void truncate() { this.checkOpened(); this.truncateTables(); + this.init(); LOG.debug("Store truncated: {}", this.store); } From 45d95fe38fb533a29421e59931307330074d98c2 Mon Sep 17 00:00:00 2001 From: LYD031106 <2565506388@qq.com> Date: Sun, 16 Nov 2025 16:53:24 +0800 Subject: [PATCH 2/8] test(server): add MySQL integration tests for server module --- .../unit/mysql/BaseMysqlUnitTest.java | 63 +++++++++++++++++++ .../hugegraph/unit/mysql/MysqlTest.java | 57 +++++++++++++++++ 2 files changed, 120 insertions(+) create mode 100644 hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/mysql/BaseMysqlUnitTest.java create mode 100644 hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/mysql/MysqlTest.java diff --git a/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/mysql/BaseMysqlUnitTest.java b/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/mysql/BaseMysqlUnitTest.java new file mode 100644 index 0000000000..7f5b859fc4 --- /dev/null +++ b/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/mysql/BaseMysqlUnitTest.java @@ -0,0 +1,63 @@ +/* + * + * * 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.hugegraph.unit.mysql; + +import org.apache.hugegraph.backend.store.BackendStore; +import org.apache.hugegraph.backend.store.hbase.HbaseStoreProvider; +import org.apache.hugegraph.backend.store.mysql.MysqlStoreProvider; +import org.apache.hugegraph.config.HugeConfig; +import org.apache.hugegraph.unit.BaseUnitTest; +import org.apache.hugegraph.unit.FakeObjects; +import org.junit.After; +import org.junit.Before; + +public class BaseMysqlUnitTest extends BaseUnitTest { + protected BackendStore store; + + protected HugeConfig config; + protected MysqlStoreProvider provider; + + @Before + public void setup() { + this.config = FakeObjects.newConfig(); + + this.provider = new MysqlStoreProvider(); + + this.store = this.provider.loadSystemStore(config); + } + + @After + public void down(){ + if (this.store != null) { + try { + this.store.close(); + } catch (Exception e) { + // pass + } + } + if (this.provider != null) { + try { + this.provider.close(); + } catch (Exception e) { + // pass + } + } + } +} diff --git a/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/mysql/MysqlTest.java b/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/mysql/MysqlTest.java new file mode 100644 index 0000000000..6e5e3e5c24 --- /dev/null +++ b/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/mysql/MysqlTest.java @@ -0,0 +1,57 @@ +/* + * + * * 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.hugegraph.unit.mysql; + +import org.apache.hugegraph.testutil.Assert; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +public class MysqlTest extends BaseMysqlUnitTest{ + private static final String GRAPH_NAME = "test_graph"; + + @Before + public void setUp(){ + this.provider.open(GRAPH_NAME); + this.provider.init(); + } + + @After + public void teardown(){ + if (this.store != null) { + this.store.close(); + } + if (this.provider != null) { + this.provider.close(); + } + } + + @Test + public void testMysqlMetaVersion(){ + // init store + this.store.init(); + String beforeVersion = this.store.storedVersion(); + this.store.truncate(); + String afterInitVersion = this.store.storedVersion(); + Assert.assertNotNull(beforeVersion); + Assert.assertNotNull(afterInitVersion); + Assert.assertEquals(beforeVersion, afterInitVersion); + } +} From 22b240770e9afde7611732ffa6bce120b068c464 Mon Sep 17 00:00:00 2001 From: LYD031106 <2565506388@qq.com> Date: Thu, 20 Nov 2025 01:06:27 +0800 Subject: [PATCH 3/8] fix(server): ensure graph clear API does not clear system table --- .../backend/store/mysql/MysqlStore.java | 4 ++- .../apache/hugegraph/unit/UnitTestSuite.java | 4 +++ .../unit/mysql/BaseMysqlUnitTest.java | 28 ++++++++++--------- .../hugegraph/unit/mysql/MysqlTest.java | 25 ++++------------- 4 files changed, 28 insertions(+), 33 deletions(-) diff --git a/hugegraph-server/hugegraph-mysql/src/main/java/org/apache/hugegraph/backend/store/mysql/MysqlStore.java b/hugegraph-server/hugegraph-mysql/src/main/java/org/apache/hugegraph/backend/store/mysql/MysqlStore.java index c291160e10..5a4626eec7 100644 --- a/hugegraph-server/hugegraph-mysql/src/main/java/org/apache/hugegraph/backend/store/mysql/MysqlStore.java +++ b/hugegraph-server/hugegraph-mysql/src/main/java/org/apache/hugegraph/backend/store/mysql/MysqlStore.java @@ -54,7 +54,6 @@ public abstract class MysqlStore extends AbstractBackendStore { private final BackendStoreProvider provider; private final Map tables; - private MysqlSessions sessions; public MysqlStore(final BackendStoreProvider provider, @@ -338,6 +337,9 @@ protected void clearTables() { protected void truncateTables() { Session session = this.sessions.session(); for (MysqlTable table : this.tables()) { + if (table instanceof MysqlTables.Meta || table instanceof MysqlTables.Counters){ + continue; + } table.truncate(session); } } diff --git a/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/UnitTestSuite.java b/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/UnitTestSuite.java index 03d3479494..786866b5c4 100644 --- a/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/UnitTestSuite.java +++ b/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/UnitTestSuite.java @@ -46,6 +46,8 @@ import org.apache.hugegraph.unit.id.IdTest; import org.apache.hugegraph.unit.id.IdUtilTest; import org.apache.hugegraph.unit.id.SplicingIdGeneratorTest; +import org.apache.hugegraph.unit.mysql.BaseMysqlUnitTest; +import org.apache.hugegraph.unit.mysql.MysqlTest; import org.apache.hugegraph.unit.mysql.MysqlUtilTest; import org.apache.hugegraph.unit.mysql.WhereBuilderTest; import org.apache.hugegraph.unit.rocksdb.RocksDBCountersTest; @@ -130,6 +132,8 @@ /* mysql */ MysqlUtilTest.class, WhereBuilderTest.class, + BaseMysqlUnitTest.class, + MysqlTest.class, /* rocksdb */ RocksDBSessionsTest.class, diff --git a/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/mysql/BaseMysqlUnitTest.java b/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/mysql/BaseMysqlUnitTest.java index 7f5b859fc4..91c96ca8df 100644 --- a/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/mysql/BaseMysqlUnitTest.java +++ b/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/mysql/BaseMysqlUnitTest.java @@ -19,39 +19,41 @@ package org.apache.hugegraph.unit.mysql; +import org.apache.commons.configuration2.Configuration; import org.apache.hugegraph.backend.store.BackendStore; import org.apache.hugegraph.backend.store.hbase.HbaseStoreProvider; import org.apache.hugegraph.backend.store.mysql.MysqlStoreProvider; import org.apache.hugegraph.config.HugeConfig; +import org.apache.hugegraph.testutil.Utils; import org.apache.hugegraph.unit.BaseUnitTest; import org.apache.hugegraph.unit.FakeObjects; import org.junit.After; import org.junit.Before; public class BaseMysqlUnitTest extends BaseUnitTest { - protected BackendStore store; + + private static final String GRAPH_NAME = "test_graph"; protected HugeConfig config; protected MysqlStoreProvider provider; - @Before public void setup() { - this.config = FakeObjects.newConfig(); - + try { + Configuration conf = Utils.getConf(); + this.config = new HugeConfig(conf); + } catch (Exception e) { + this.config = FakeObjects.newConfig(); + } this.provider = new MysqlStoreProvider(); - - this.store = this.provider.loadSystemStore(config); + this.provider.open(GRAPH_NAME); + this.provider.loadSystemStore(config).open(config); + this.provider.loadGraphStore(config).open(config); + this.provider.loadSchemaStore(config).open(config); + this.provider.init(); } @After public void down(){ - if (this.store != null) { - try { - this.store.close(); - } catch (Exception e) { - // pass - } - } if (this.provider != null) { try { this.provider.close(); diff --git a/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/mysql/MysqlTest.java b/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/mysql/MysqlTest.java index 6e5e3e5c24..5644ed6520 100644 --- a/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/mysql/MysqlTest.java +++ b/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/mysql/MysqlTest.java @@ -19,37 +19,24 @@ package org.apache.hugegraph.unit.mysql; +import org.apache.hugegraph.backend.store.BackendStore; import org.apache.hugegraph.testutil.Assert; import org.junit.After; import org.junit.Before; import org.junit.Test; public class MysqlTest extends BaseMysqlUnitTest{ - private static final String GRAPH_NAME = "test_graph"; - @Before public void setUp(){ - this.provider.open(GRAPH_NAME); - this.provider.init(); - } - - @After - public void teardown(){ - if (this.store != null) { - this.store.close(); - } - if (this.provider != null) { - this.provider.close(); - } + super.setup(); } @Test public void testMysqlMetaVersion(){ - // init store - this.store.init(); - String beforeVersion = this.store.storedVersion(); - this.store.truncate(); - String afterInitVersion = this.store.storedVersion(); + BackendStore systemStore = this.provider.loadSystemStore(config); + String beforeVersion = systemStore.storedVersion(); + this.provider.truncate(); + String afterInitVersion = systemStore.storedVersion(); Assert.assertNotNull(beforeVersion); Assert.assertNotNull(afterInitVersion); Assert.assertEquals(beforeVersion, afterInitVersion); From d7f35f1828bf5fac4743ebdda71cc6b22c32337f Mon Sep 17 00:00:00 2001 From: LYD031106 <2565506388@qq.com> Date: Thu, 20 Nov 2025 23:58:11 +0800 Subject: [PATCH 4/8] fix(server): Remove invalid references --- .../org/apache/hugegraph/unit/mysql/BaseMysqlUnitTest.java | 3 --- .../main/java/org/apache/hugegraph/unit/mysql/MysqlTest.java | 1 - 2 files changed, 4 deletions(-) diff --git a/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/mysql/BaseMysqlUnitTest.java b/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/mysql/BaseMysqlUnitTest.java index 91c96ca8df..1f79dd5a30 100644 --- a/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/mysql/BaseMysqlUnitTest.java +++ b/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/mysql/BaseMysqlUnitTest.java @@ -20,15 +20,12 @@ package org.apache.hugegraph.unit.mysql; import org.apache.commons.configuration2.Configuration; -import org.apache.hugegraph.backend.store.BackendStore; -import org.apache.hugegraph.backend.store.hbase.HbaseStoreProvider; import org.apache.hugegraph.backend.store.mysql.MysqlStoreProvider; import org.apache.hugegraph.config.HugeConfig; import org.apache.hugegraph.testutil.Utils; import org.apache.hugegraph.unit.BaseUnitTest; import org.apache.hugegraph.unit.FakeObjects; import org.junit.After; -import org.junit.Before; public class BaseMysqlUnitTest extends BaseUnitTest { diff --git a/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/mysql/MysqlTest.java b/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/mysql/MysqlTest.java index 5644ed6520..9f5ca8301b 100644 --- a/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/mysql/MysqlTest.java +++ b/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/mysql/MysqlTest.java @@ -21,7 +21,6 @@ import org.apache.hugegraph.backend.store.BackendStore; import org.apache.hugegraph.testutil.Assert; -import org.junit.After; import org.junit.Before; import org.junit.Test; From 4ad56cb2718d1a691b4fd2d8e70677df6e8cfddd Mon Sep 17 00:00:00 2001 From: LYD031106 <2565506388@qq.com> Date: Sun, 30 Nov 2025 21:10:14 +0800 Subject: [PATCH 5/8] fix(server): ensure graph clear API does not clear meta table --- .../backend/store/mysql/MysqlStore.java | 5 -- .../unit/mysql/BaseMysqlUnitTest.java | 17 ++-- .../hugegraph/unit/mysql/MysqlTest.java | 79 +++++++++++++++++-- 3 files changed, 81 insertions(+), 20 deletions(-) diff --git a/hugegraph-server/hugegraph-mysql/src/main/java/org/apache/hugegraph/backend/store/mysql/MysqlStore.java b/hugegraph-server/hugegraph-mysql/src/main/java/org/apache/hugegraph/backend/store/mysql/MysqlStore.java index 5a4626eec7..3db70390ad 100644 --- a/hugegraph-server/hugegraph-mysql/src/main/java/org/apache/hugegraph/backend/store/mysql/MysqlStore.java +++ b/hugegraph-server/hugegraph-mysql/src/main/java/org/apache/hugegraph/backend/store/mysql/MysqlStore.java @@ -222,7 +222,6 @@ public void truncate() { this.checkOpened(); this.truncateTables(); - this.init(); LOG.debug("Store truncated: {}", this.store); } @@ -337,9 +336,6 @@ protected void clearTables() { protected void truncateTables() { Session session = this.sessions.session(); for (MysqlTable table : this.tables()) { - if (table instanceof MysqlTables.Meta || table instanceof MysqlTables.Counters){ - continue; - } table.truncate(session); } } @@ -509,7 +505,6 @@ public String storedVersion() { @Override protected Collection tables() { List tables = new ArrayList<>(super.tables()); - tables.add(this.meta); return tables; } } diff --git a/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/mysql/BaseMysqlUnitTest.java b/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/mysql/BaseMysqlUnitTest.java index 1f79dd5a30..6d0b5488ad 100644 --- a/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/mysql/BaseMysqlUnitTest.java +++ b/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/mysql/BaseMysqlUnitTest.java @@ -20,11 +20,11 @@ package org.apache.hugegraph.unit.mysql; import org.apache.commons.configuration2.Configuration; +import org.apache.hugegraph.backend.store.mysql.MysqlSessions; import org.apache.hugegraph.backend.store.mysql.MysqlStoreProvider; import org.apache.hugegraph.config.HugeConfig; import org.apache.hugegraph.testutil.Utils; import org.apache.hugegraph.unit.BaseUnitTest; -import org.apache.hugegraph.unit.FakeObjects; import org.junit.After; public class BaseMysqlUnitTest extends BaseUnitTest { @@ -33,20 +33,19 @@ public class BaseMysqlUnitTest extends BaseUnitTest { protected HugeConfig config; protected MysqlStoreProvider provider; + protected MysqlSessions sessions; - public void setup() { - try { - Configuration conf = Utils.getConf(); - this.config = new HugeConfig(conf); - } catch (Exception e) { - this.config = FakeObjects.newConfig(); - } + public void setup() throws Exception { + Configuration conf = Utils.getConf(); + this.config = new HugeConfig(conf); this.provider = new MysqlStoreProvider(); this.provider.open(GRAPH_NAME); this.provider.loadSystemStore(config).open(config); this.provider.loadGraphStore(config).open(config); this.provider.loadSchemaStore(config).open(config); this.provider.init(); + this.sessions = new MysqlSessions(config, GRAPH_NAME, this.provider.loadGraphStore(config).store()); + this.sessions.open(); } @After @@ -55,7 +54,7 @@ public void down(){ try { this.provider.close(); } catch (Exception e) { - // pass + LOG.warn("Mysql provider close failed",e); } } } diff --git a/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/mysql/MysqlTest.java b/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/mysql/MysqlTest.java index 9f5ca8301b..039914bd9b 100644 --- a/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/mysql/MysqlTest.java +++ b/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/mysql/MysqlTest.java @@ -20,24 +20,91 @@ package org.apache.hugegraph.unit.mysql; import org.apache.hugegraph.backend.store.BackendStore; +import org.apache.hugegraph.backend.store.mysql.MysqlSessions; +import org.apache.hugegraph.backend.store.mysql.ResultSetWrapper; import org.apache.hugegraph.testutil.Assert; import org.junit.Before; import org.junit.Test; +import java.sql.PreparedStatement; +import java.sql.SQLException; public class MysqlTest extends BaseMysqlUnitTest{ @Before - public void setUp(){ + public void setUp() throws Exception { super.setup(); } @Test - public void testMysqlMetaVersion(){ + public void testMysqlMetaVersion() throws SQLException { BackendStore systemStore = this.provider.loadSystemStore(config); + + // Record system version before truncation String beforeVersion = systemStore.storedVersion(); + + // Get sessions for direct table operations + MysqlSessions.Session session = this.sessions.session(); + session.open(); + + // Get the actual table names from the store + String vertexTable = "g_v"; + String edgeOutTable = "g_oe"; + String edgeInTable = "g_ie"; + + // Insert test vertex data directly using simple SQL + String insertVertex = String.format( + "INSERT INTO %s (ID, LABEL, PROPERTIES, EXPIRED_TIME) VALUES ('test_vertex', 1, '{\"name\":\"test_vertex\"}', 0)", + vertexTable + ); + session.execute(insertVertex); + + // Insert test edge data directly using simple SQL + String insertEdgeOut = String.format( + "INSERT INTO %s (OWNER_VERTEX, DIRECTION, LABEL, SUB_LABEL, SORT_VALUES, OTHER_VERTEX, PROPERTIES, EXPIRED_TIME) VALUES ('test_vertex', 0, 1, 0, '', 'target_vertex', '{\"weight\":1.0}', 0)", + edgeOutTable + ); + session.execute(insertEdgeOut); + + String insertEdgeIn = String.format( + "INSERT INTO %s (OWNER_VERTEX, DIRECTION, LABEL, SUB_LABEL, SORT_VALUES, OTHER_VERTEX, PROPERTIES, EXPIRED_TIME) VALUES ('target_vertex', 1, 1, 0, '', 'test_vertex', '{\"weight\":1.0}', 0)", + edgeInTable + ); + session.execute(insertEdgeIn); + + // Verify data exists by querying + String selectVertex = String.format("SELECT * FROM %s WHERE ID = 'test_vertex'", vertexTable); + ResultSetWrapper vResult = session.select(selectVertex); + Assert.assertTrue("vertex data should exist", vResult.next()); + vResult.close(); + + String selectEdgeOut = String.format("SELECT * FROM %s WHERE OWNER_VERTEX = 'test_vertex' AND DIRECTION = 0", edgeOutTable); + ResultSetWrapper oeResult = session.select(selectEdgeOut); + Assert.assertTrue("out edge data should exist", oeResult.next()); + oeResult.close(); + + String selectEdgeIn = String.format("SELECT * FROM %s WHERE OWNER_VERTEX = 'target_vertex' AND DIRECTION = 1", edgeInTable); + ResultSetWrapper ieResult = session.select(selectEdgeIn); + Assert.assertTrue("in edge data should exist", ieResult.next()); + ieResult.close(); + + // Execute truncate operation, clears all graph data but preserves system tables this.provider.truncate(); - String afterInitVersion = systemStore.storedVersion(); - Assert.assertNotNull(beforeVersion); - Assert.assertNotNull(afterInitVersion); - Assert.assertEquals(beforeVersion, afterInitVersion); + + // Verify system version remains unchanged after truncation + String afterVersion = systemStore.storedVersion(); + Assert.assertNotNull("System metadata version should exist", afterVersion); + Assert.assertEquals("System metadata version should remain unchanged after truncation", beforeVersion, afterVersion); + + // Verify data has been cleared + vResult = session.select(selectVertex); + Assert.assertFalse("vertex data should not exist", vResult.next()); + vResult.close(); + + oeResult = session.select(selectEdgeOut); + Assert.assertFalse("out edge data should not exist", oeResult.next()); + oeResult.close(); + + ieResult = session.select(selectEdgeIn); + Assert.assertFalse("in edge data should not exist", ieResult.next()); + ieResult.close(); } } From 40e0314ff4ad9780413ac5f2ce5281d363966a48 Mon Sep 17 00:00:00 2001 From: LYD031106 <2565506388@qq.com> Date: Sat, 6 Dec 2025 20:46:28 +0800 Subject: [PATCH 6/8] fix(server): ensure graph clear API does not clear meta table --- .../backend/store/mysql/MysqlStore.java | 12 ++- .../unit/mysql/BaseMysqlUnitTest.java | 37 +++++---- .../hugegraph/unit/mysql/MysqlTest.java | 81 ++++++++++--------- 3 files changed, 76 insertions(+), 54 deletions(-) diff --git a/hugegraph-server/hugegraph-mysql/src/main/java/org/apache/hugegraph/backend/store/mysql/MysqlStore.java b/hugegraph-server/hugegraph-mysql/src/main/java/org/apache/hugegraph/backend/store/mysql/MysqlStore.java index 3db70390ad..ea74c8a99e 100644 --- a/hugegraph-server/hugegraph-mysql/src/main/java/org/apache/hugegraph/backend/store/mysql/MysqlStore.java +++ b/hugegraph-server/hugegraph-mysql/src/main/java/org/apache/hugegraph/backend/store/mysql/MysqlStore.java @@ -24,6 +24,7 @@ import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; import org.apache.hugegraph.backend.BackendException; import org.apache.hugegraph.backend.id.Id; @@ -335,7 +336,7 @@ protected void clearTables() { protected void truncateTables() { Session session = this.sessions.session(); - for (MysqlTable table : this.tables()) { + for (MysqlTable table : this.getTruncatedTables()) { table.truncate(session); } } @@ -344,6 +345,14 @@ protected Collection tables() { return this.tables.values(); } + protected Collection getTruncatedTables() { + // Exclude meta table to preserve system metadata during graph clear + return this.tables.entrySet().stream() + .filter(e -> !(HugeType.META == e.getKey())) + .map(Map.Entry::getValue) + .collect(Collectors.toList()); + } + @Override protected final MysqlTable table(HugeType type) { assert type != null; @@ -505,6 +514,7 @@ public String storedVersion() { @Override protected Collection tables() { List tables = new ArrayList<>(super.tables()); + tables.add(this.meta); return tables; } } diff --git a/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/mysql/BaseMysqlUnitTest.java b/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/mysql/BaseMysqlUnitTest.java index 6d0b5488ad..7de1e2d909 100644 --- a/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/mysql/BaseMysqlUnitTest.java +++ b/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/mysql/BaseMysqlUnitTest.java @@ -1,20 +1,18 @@ /* + * 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 * - * * 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. + * 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.hugegraph.unit.mysql; @@ -49,12 +47,19 @@ public void setup() throws Exception { } @After - public void down(){ + public void down() { if (this.provider != null) { try { this.provider.close(); } catch (Exception e) { - LOG.warn("Mysql provider close failed",e); + LOG.warn("Mysql provider close failed ", e); + } + } + if (this.sessions != null) { + try { + this.sessions.close(); + } catch (Exception e) { + LOG.warn("Mysql sessions close failed ", e); } } } diff --git a/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/mysql/MysqlTest.java b/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/mysql/MysqlTest.java index 039914bd9b..f8f4d45d4a 100644 --- a/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/mysql/MysqlTest.java +++ b/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/mysql/MysqlTest.java @@ -25,10 +25,11 @@ import org.apache.hugegraph.testutil.Assert; import org.junit.Before; import org.junit.Test; -import java.sql.PreparedStatement; + import java.sql.SQLException; -public class MysqlTest extends BaseMysqlUnitTest{ +public class MysqlTest extends BaseMysqlUnitTest { + @Before public void setUp() throws Exception { super.setup(); @@ -44,47 +45,54 @@ public void testMysqlMetaVersion() throws SQLException { // Get sessions for direct table operations MysqlSessions.Session session = this.sessions.session(); session.open(); - + // Get the actual table names from the store String vertexTable = "g_v"; String edgeOutTable = "g_oe"; String edgeInTable = "g_ie"; - + // Insert test vertex data directly using simple SQL String insertVertex = String.format( - "INSERT INTO %s (ID, LABEL, PROPERTIES, EXPIRED_TIME) VALUES ('test_vertex', 1, '{\"name\":\"test_vertex\"}', 0)", - vertexTable + "INSERT INTO %s (ID, LABEL, PROPERTIES, EXPIRED_TIME) VALUES ('test_vertex', 1, " + + "'{\"name\":\"test_vertex\"}', 0)", + vertexTable ); session.execute(insertVertex); - + // Insert test edge data directly using simple SQL String insertEdgeOut = String.format( - "INSERT INTO %s (OWNER_VERTEX, DIRECTION, LABEL, SUB_LABEL, SORT_VALUES, OTHER_VERTEX, PROPERTIES, EXPIRED_TIME) VALUES ('test_vertex', 0, 1, 0, '', 'target_vertex', '{\"weight\":1.0}', 0)", - edgeOutTable + "INSERT INTO %s (OWNER_VERTEX, DIRECTION, LABEL, SUB_LABEL, SORT_VALUES, " + + "OTHER_VERTEX, PROPERTIES, EXPIRED_TIME) VALUES ('test_vertex', 0, 1, 0, '', " + + "'target_vertex', '{\"weight\":1.0}', 0)", + edgeOutTable ); session.execute(insertEdgeOut); - + String insertEdgeIn = String.format( - "INSERT INTO %s (OWNER_VERTEX, DIRECTION, LABEL, SUB_LABEL, SORT_VALUES, OTHER_VERTEX, PROPERTIES, EXPIRED_TIME) VALUES ('target_vertex', 1, 1, 0, '', 'test_vertex', '{\"weight\":1.0}', 0)", - edgeInTable + "INSERT INTO %s (OWNER_VERTEX, DIRECTION, LABEL, SUB_LABEL, SORT_VALUES, " + + "OTHER_VERTEX, PROPERTIES, EXPIRED_TIME) VALUES ('target_vertex', 1, 1, 0, '', " + + "'test_vertex', '{\"weight\":1.0}', 0)", + edgeInTable ); session.execute(insertEdgeIn); // Verify data exists by querying String selectVertex = String.format("SELECT * FROM %s WHERE ID = 'test_vertex'", vertexTable); - ResultSetWrapper vResult = session.select(selectVertex); - Assert.assertTrue("vertex data should exist", vResult.next()); - vResult.close(); - - String selectEdgeOut = String.format("SELECT * FROM %s WHERE OWNER_VERTEX = 'test_vertex' AND DIRECTION = 0", edgeOutTable); - ResultSetWrapper oeResult = session.select(selectEdgeOut); - Assert.assertTrue("out edge data should exist", oeResult.next()); - oeResult.close(); - - String selectEdgeIn = String.format("SELECT * FROM %s WHERE OWNER_VERTEX = 'target_vertex' AND DIRECTION = 1", edgeInTable); - ResultSetWrapper ieResult = session.select(selectEdgeIn); - Assert.assertTrue("in edge data should exist", ieResult.next()); - ieResult.close(); + String selectEdgeOut = String.format( + "SELECT * FROM %s WHERE OWNER_VERTEX = 'test_vertex' AND DIRECTION = 0", + edgeOutTable); + String selectEdgeIn = String.format( + "SELECT * FROM %s WHERE OWNER_VERTEX = 'target_vertex' AND DIRECTION = 1", + edgeInTable); + try ( + ResultSetWrapper vResult = session.select(selectVertex); + ResultSetWrapper oeResult = session.select(selectEdgeOut); + ResultSetWrapper ieResult = session.select(selectEdgeIn); + ) { + Assert.assertTrue("vertex data should exist", vResult.next()); + Assert.assertTrue("out edge data should exist", oeResult.next()); + Assert.assertTrue("in edge data should exist", ieResult.next()); + } // Execute truncate operation, clears all graph data but preserves system tables this.provider.truncate(); @@ -92,19 +100,18 @@ public void testMysqlMetaVersion() throws SQLException { // Verify system version remains unchanged after truncation String afterVersion = systemStore.storedVersion(); Assert.assertNotNull("System metadata version should exist", afterVersion); - Assert.assertEquals("System metadata version should remain unchanged after truncation", beforeVersion, afterVersion); + Assert.assertEquals("System metadata version should remain unchanged after truncation", + beforeVersion, afterVersion); // Verify data has been cleared - vResult = session.select(selectVertex); - Assert.assertFalse("vertex data should not exist", vResult.next()); - vResult.close(); - - oeResult = session.select(selectEdgeOut); - Assert.assertFalse("out edge data should not exist", oeResult.next()); - oeResult.close(); - - ieResult = session.select(selectEdgeIn); - Assert.assertFalse("in edge data should not exist", ieResult.next()); - ieResult.close(); + try ( + ResultSetWrapper vResult = session.select(selectVertex); + ResultSetWrapper oeResult = session.select(selectEdgeOut); + ResultSetWrapper ieResult = session.select(selectEdgeIn); + ) { + Assert.assertFalse("vertex data should not exist", vResult.next()); + Assert.assertFalse("out edge data should not exist", oeResult.next()); + Assert.assertFalse("in edge data should not exist", ieResult.next()); + } } } From ea75f053444e500f348a51e7ba6b0f35e2c128ea Mon Sep 17 00:00:00 2001 From: LYD031106 <2565506388@qq.com> Date: Sat, 6 Dec 2025 20:47:01 +0800 Subject: [PATCH 7/8] fix(server): ensure graph clear API does not clear meta table --- .../hugegraph/unit/mysql/MysqlTest.java | 26 +++++++++---------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/mysql/MysqlTest.java b/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/mysql/MysqlTest.java index f8f4d45d4a..84194821ed 100644 --- a/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/mysql/MysqlTest.java +++ b/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/mysql/MysqlTest.java @@ -1,20 +1,18 @@ /* + * 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 * - * * 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. + * 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.hugegraph.unit.mysql; From e14eb0fdc21f64a14bc857b605661c5c63fba2fe Mon Sep 17 00:00:00 2001 From: LYD031106 <2565506388@qq.com> Date: Sun, 18 Jan 2026 01:33:52 +0800 Subject: [PATCH 8/8] =?UTF-8?q?feat:=20CI/CD=E6=B5=81=E7=A8=8B=E8=B0=83?= =?UTF-8?q?=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/org/apache/hugegraph/unit/UnitTestSuite.java | 1 - .../org/apache/hugegraph/unit/mysql/BaseMysqlUnitTest.java | 5 +++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/UnitTestSuite.java b/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/UnitTestSuite.java index 786866b5c4..cdcceaedb8 100644 --- a/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/UnitTestSuite.java +++ b/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/UnitTestSuite.java @@ -132,7 +132,6 @@ /* mysql */ MysqlUtilTest.class, WhereBuilderTest.class, - BaseMysqlUnitTest.class, MysqlTest.class, /* rocksdb */ diff --git a/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/mysql/BaseMysqlUnitTest.java b/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/mysql/BaseMysqlUnitTest.java index 7de1e2d909..03d77ae2ec 100644 --- a/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/mysql/BaseMysqlUnitTest.java +++ b/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/mysql/BaseMysqlUnitTest.java @@ -24,6 +24,7 @@ import org.apache.hugegraph.testutil.Utils; import org.apache.hugegraph.unit.BaseUnitTest; import org.junit.After; +import org.junit.Assume; public class BaseMysqlUnitTest extends BaseUnitTest { @@ -35,6 +36,10 @@ public class BaseMysqlUnitTest extends BaseUnitTest { public void setup() throws Exception { Configuration conf = Utils.getConf(); + String backend = conf.getString("backend", "memory"); + // Only run mysql related tests when backend is mysql + Assume.assumeTrue("Skip MySQL tests when backend is not mysql", + "mysql".equalsIgnoreCase(backend)); this.config = new HugeConfig(conf); this.provider = new MysqlStoreProvider(); this.provider.open(GRAPH_NAME);