From fbb5e04ad76dbaeb8b7938d3f6e2eedea9a4cabf Mon Sep 17 00:00:00 2001 From: LYD031106 <2565506388@qq.com> Date: Sun, 16 Nov 2025 15:45:10 +0800 Subject: [PATCH 1/9] fix(server): ensure graph clear API does not clear meta table --- .../backend/store/hbase/HbaseStore.java | 2 + .../unit/hbase/BaseHbaseUnitTest.java | 63 +++++++++++++++++++ .../hugegraph/unit/hbase/HbaseUnitTest.java | 58 +++++++++++++++++ 3 files changed, 123 insertions(+) create mode 100644 hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/hbase/BaseHbaseUnitTest.java create mode 100644 hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/hbase/HbaseUnitTest.java diff --git a/hugegraph-server/hugegraph-hbase/src/main/java/org/apache/hugegraph/backend/store/hbase/HbaseStore.java b/hugegraph-server/hugegraph-hbase/src/main/java/org/apache/hugegraph/backend/store/hbase/HbaseStore.java index 1d75c00944..a17df5f41c 100644 --- a/hugegraph-server/hugegraph-hbase/src/main/java/org/apache/hugegraph/backend/store/hbase/HbaseStore.java +++ b/hugegraph-server/hugegraph-hbase/src/main/java/org/apache/hugegraph/backend/store/hbase/HbaseStore.java @@ -402,6 +402,8 @@ public void truncate() { "Failed to truncate table for '%s' store", e, this.store); } + this.init(); + LOG.debug("Store truncated: {}", this.store); } diff --git a/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/hbase/BaseHbaseUnitTest.java b/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/hbase/BaseHbaseUnitTest.java new file mode 100644 index 0000000000..c3fbcb8b13 --- /dev/null +++ b/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/hbase/BaseHbaseUnitTest.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.hbase; + +import org.apache.hugegraph.backend.store.BackendStore; +import org.apache.hugegraph.backend.store.hbase.HbaseStoreProvider; +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 BaseHbaseUnitTest extends BaseUnitTest{ + + protected BackendStore store; + + protected HugeConfig config; + protected HbaseStoreProvider provider; + + @Before + public void setup() { + this.config = FakeObjects.newConfig(); + + this.provider = new HbaseStoreProvider(); + + 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/hbase/HbaseUnitTest.java b/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/hbase/HbaseUnitTest.java new file mode 100644 index 0000000000..c4ed2e38b0 --- /dev/null +++ b/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/hbase/HbaseUnitTest.java @@ -0,0 +1,58 @@ +/* + * + * * 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.hbase; + +import org.apache.hugegraph.testutil.Assert; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +public class HbaseUnitTest extends BaseHbaseUnitTest { + + 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 testHbaseMetaVersion(){ + // 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 9c810fd18082a5d6184424b62f2a77f8026b48a5 Mon Sep 17 00:00:00 2001 From: LYD031106 <2565506388@qq.com> Date: Thu, 20 Nov 2025 23:56:27 +0800 Subject: [PATCH 2/9] fix(server): ensure graph clear API does not clear system table --- .../backend/store/hbase/HbaseStore.java | 13 ++++++--- .../unit/hbase/BaseHbaseUnitTest.java | 28 +++++++----------- .../hugegraph/unit/hbase/HbaseUnitTest.java | 29 +++++-------------- 3 files changed, 27 insertions(+), 43 deletions(-) diff --git a/hugegraph-server/hugegraph-hbase/src/main/java/org/apache/hugegraph/backend/store/hbase/HbaseStore.java b/hugegraph-server/hugegraph-hbase/src/main/java/org/apache/hugegraph/backend/store/hbase/HbaseStore.java index a17df5f41c..81bbf84db8 100644 --- a/hugegraph-server/hugegraph-hbase/src/main/java/org/apache/hugegraph/backend/store/hbase/HbaseStore.java +++ b/hugegraph-server/hugegraph-hbase/src/main/java/org/apache/hugegraph/backend/store/hbase/HbaseStore.java @@ -114,6 +114,14 @@ protected List tableNames() { .collect(Collectors.toList()); } + protected List truncatedTableNames() { + return this.tables.values().stream() + .filter(table -> !(table instanceof HbaseTables.Meta || + table instanceof HbaseTables.Counters)) + .map(BackendTable::table) + .collect(Collectors.toList()); + } + public String namespace() { return this.namespace; } @@ -371,7 +379,7 @@ public void truncate() { }; // Truncate tables - List tables = this.tableNames(); + List tables = this.truncatedTableNames(); Map> futures = new HashMap<>(tables.size()); try { @@ -401,9 +409,6 @@ public void truncate() { throw new BackendException( "Failed to truncate table for '%s' store", e, this.store); } - - this.init(); - LOG.debug("Store truncated: {}", this.store); } diff --git a/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/hbase/BaseHbaseUnitTest.java b/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/hbase/BaseHbaseUnitTest.java index c3fbcb8b13..f162ff68fe 100644 --- a/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/hbase/BaseHbaseUnitTest.java +++ b/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/hbase/BaseHbaseUnitTest.java @@ -19,44 +19,38 @@ package org.apache.hugegraph.unit.hbase; -import org.apache.hugegraph.backend.store.BackendStore; +import org.apache.commons.configuration2.Configuration; import org.apache.hugegraph.backend.store.hbase.HbaseStoreProvider; 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 BaseHbaseUnitTest extends BaseUnitTest{ - protected BackendStore store; + private static final String GRAPH_NAME = "test_graph"; protected HugeConfig config; protected HbaseStoreProvider provider; - @Before public void setup() { - this.config = FakeObjects.newConfig(); - + Configuration conf = Utils.getConf(); + this.config = new HugeConfig(conf); this.provider = new HbaseStoreProvider(); - - 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(); } catch (Exception e) { - // pass + LOG.warn("Failed to close provider",e); } } } diff --git a/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/hbase/HbaseUnitTest.java b/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/hbase/HbaseUnitTest.java index c4ed2e38b0..be594d8809 100644 --- a/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/hbase/HbaseUnitTest.java +++ b/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/hbase/HbaseUnitTest.java @@ -19,38 +19,23 @@ package org.apache.hugegraph.unit.hbase; +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 HbaseUnitTest extends BaseHbaseUnitTest { - - 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 testHbaseMetaVersion(){ - // init store - this.store.init(); - String beforeVersion = this.store.storedVersion(); - this.store.truncate(); - String afterInitVersion = this.store.storedVersion(); + public void testMysqlMetaVersion(){ + 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 004684e3321b1fcebb7d1c7f2b72d2cf3ccf4712 Mon Sep 17 00:00:00 2001 From: LYD031106 <2565506388@qq.com> Date: Sun, 30 Nov 2025 14:35:13 +0800 Subject: [PATCH 3/9] fix(server): Improve the test cases --- .../backend/store/hbase/HbaseStore.java | 8 +-- .../unit/hbase/BaseHbaseUnitTest.java | 8 ++- .../hugegraph/unit/hbase/HbaseUnitTest.java | 58 +++++++++++++++++-- 3 files changed, 63 insertions(+), 11 deletions(-) diff --git a/hugegraph-server/hugegraph-hbase/src/main/java/org/apache/hugegraph/backend/store/hbase/HbaseStore.java b/hugegraph-server/hugegraph-hbase/src/main/java/org/apache/hugegraph/backend/store/hbase/HbaseStore.java index 81bbf84db8..d8f7943fac 100644 --- a/hugegraph-server/hugegraph-hbase/src/main/java/org/apache/hugegraph/backend/store/hbase/HbaseStore.java +++ b/hugegraph-server/hugegraph-hbase/src/main/java/org/apache/hugegraph/backend/store/hbase/HbaseStore.java @@ -115,10 +115,9 @@ protected List tableNames() { } protected List truncatedTableNames() { - return this.tables.values().stream() - .filter(table -> !(table instanceof HbaseTables.Meta || - table instanceof HbaseTables.Counters)) - .map(BackendTable::table) + return this.tables.entrySet().stream() + .filter(e -> !(HugeType.META == e.getKey())) + .map(e -> e.getValue().table()) .collect(Collectors.toList()); } @@ -409,6 +408,7 @@ public void truncate() { throw new BackendException( "Failed to truncate table for '%s' store", e, this.store); } + LOG.debug("Store truncated: {}", this.store); } diff --git a/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/hbase/BaseHbaseUnitTest.java b/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/hbase/BaseHbaseUnitTest.java index f162ff68fe..1949474ca0 100644 --- a/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/hbase/BaseHbaseUnitTest.java +++ b/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/hbase/BaseHbaseUnitTest.java @@ -20,20 +20,24 @@ package org.apache.hugegraph.unit.hbase; import org.apache.commons.configuration2.Configuration; +import org.apache.hugegraph.backend.store.hbase.HbaseSessions; import org.apache.hugegraph.backend.store.hbase.HbaseStoreProvider; import org.apache.hugegraph.config.HugeConfig; import org.apache.hugegraph.testutil.Utils; import org.apache.hugegraph.unit.BaseUnitTest; import org.junit.After; +import java.io.IOException; + public class BaseHbaseUnitTest extends BaseUnitTest{ private static final String GRAPH_NAME = "test_graph"; protected HugeConfig config; protected HbaseStoreProvider provider; + protected HbaseSessions sessions; - public void setup() { + public void setup() throws IOException { Configuration conf = Utils.getConf(); this.config = new HugeConfig(conf); this.provider = new HbaseStoreProvider(); @@ -42,6 +46,8 @@ public void setup() { this.provider.loadGraphStore(config).open(config); this.provider.loadSchemaStore(config).open(config); this.provider.init(); + this.sessions = new HbaseSessions(config,GRAPH_NAME, this.provider.loadGraphStore(config).store()); + this.sessions.open(); } @After diff --git a/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/hbase/HbaseUnitTest.java b/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/hbase/HbaseUnitTest.java index be594d8809..c0fca11d8c 100644 --- a/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/hbase/HbaseUnitTest.java +++ b/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/hbase/HbaseUnitTest.java @@ -19,25 +19,71 @@ package org.apache.hugegraph.unit.hbase; +import org.apache.hadoop.hbase.client.Result; +import org.apache.hugegraph.backend.store.BackendEntry.BackendIterator; import org.apache.hugegraph.backend.store.BackendStore; import org.apache.hugegraph.testutil.Assert; +import org.apache.hugegraph.backend.store.hbase.HbaseSessions; +import org.apache.hugegraph.util.StringEncoding; import org.junit.Before; import org.junit.Test; +import java.io.IOException; + public class HbaseUnitTest extends BaseHbaseUnitTest { + @Before - public void setUp(){ + public void setUp() throws IOException { super.setup(); } @Test - public void testMysqlMetaVersion(){ + public void testHbaseMetaVersionAfterTruncate() { BackendStore systemStore = this.provider.loadSystemStore(config); + + // Record system version before truncation String beforeVersion = systemStore.storedVersion(); + + HbaseSessions.Session testsession = this.sessions.session(); + + // Insert test data + testsession.put("g_v", "f".getBytes(), "row_trunc_v".getBytes(), StringEncoding.encode("q"), StringEncoding.encode("v")); + testsession.put("g_oe", "f".getBytes(), "row_trunc_oe".getBytes(), StringEncoding.encode("q"), StringEncoding.encode("v")); + testsession.put("g_ie", "f".getBytes(), "row_trunc_ie".getBytes(), StringEncoding.encode("q"), StringEncoding.encode("v")); + testsession.commit(); + + // Verify data insertion success + BackendIterator vIterator = testsession.get("g_v", "f".getBytes(), "row_trunc_v".getBytes()); + BackendIterator oeIterator = testsession.get("g_oe", "f".getBytes(), "row_trunc_oe".getBytes()); + BackendIterator ieIterator = testsession.get("g_ie", "f".getBytes(), "row_trunc_ie".getBytes()); + + Assert.assertTrue("data should exist", vIterator.hasNext()); + Assert.assertTrue("data should exist", oeIterator.hasNext()); + Assert.assertTrue("data should exist", ieIterator.hasNext()); + + vIterator.close(); + oeIterator.close(); + ieIterator.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 + vIterator = testsession.get("g_v", "f".getBytes(), "row_trunc_v".getBytes()); + oeIterator = testsession.get("g_oe", "f".getBytes(), "row_trunc_oe".getBytes()); + ieIterator = testsession.get("g_ie", "f".getBytes(), "row_trunc_ie".getBytes()); + + Assert.assertFalse("data should not exist", vIterator.hasNext()); + Assert.assertFalse("data should not exist", oeIterator.hasNext()); + Assert.assertFalse("data should not exist", ieIterator.hasNext()); + + vIterator.close(); + oeIterator.close(); + ieIterator.close(); } } From 7676f54af0c9b8cccf3798ffdfa97bc96247886c Mon Sep 17 00:00:00 2001 From: LYD031106 <2565506388@qq.com> Date: Sat, 6 Dec 2025 20:10:39 +0800 Subject: [PATCH 4/9] fix(server): ensure graph clear API does not clear meta table --- .../backend/store/hbase/HbaseStore.java | 1 + .../unit/hbase/BaseHbaseUnitTest.java | 48 ++++++---- .../hugegraph/unit/hbase/HbaseUnitTest.java | 91 +++++++++---------- 3 files changed, 71 insertions(+), 69 deletions(-) diff --git a/hugegraph-server/hugegraph-hbase/src/main/java/org/apache/hugegraph/backend/store/hbase/HbaseStore.java b/hugegraph-server/hugegraph-hbase/src/main/java/org/apache/hugegraph/backend/store/hbase/HbaseStore.java index d8f7943fac..bc0f9f2b8b 100644 --- a/hugegraph-server/hugegraph-hbase/src/main/java/org/apache/hugegraph/backend/store/hbase/HbaseStore.java +++ b/hugegraph-server/hugegraph-hbase/src/main/java/org/apache/hugegraph/backend/store/hbase/HbaseStore.java @@ -115,6 +115,7 @@ protected List tableNames() { } protected List truncatedTableNames() { + // Exclude meta table to preserve system metadata during graph clear return this.tables.entrySet().stream() .filter(e -> !(HugeType.META == e.getKey())) .map(e -> e.getValue().table()) diff --git a/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/hbase/BaseHbaseUnitTest.java b/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/hbase/BaseHbaseUnitTest.java index 1949474ca0..c79ab79455 100644 --- a/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/hbase/BaseHbaseUnitTest.java +++ b/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/hbase/BaseHbaseUnitTest.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.hbase; @@ -26,10 +24,11 @@ import org.apache.hugegraph.testutil.Utils; import org.apache.hugegraph.unit.BaseUnitTest; import org.junit.After; +import org.junit.Before; import java.io.IOException; -public class BaseHbaseUnitTest extends BaseUnitTest{ +public class BaseHbaseUnitTest extends BaseUnitTest { private static final String GRAPH_NAME = "test_graph"; @@ -37,6 +36,7 @@ public class BaseHbaseUnitTest extends BaseUnitTest{ protected HbaseStoreProvider provider; protected HbaseSessions sessions; + @Before public void setup() throws IOException { Configuration conf = Utils.getConf(); this.config = new HugeConfig(conf); @@ -46,17 +46,25 @@ public void setup() throws IOException { this.provider.loadGraphStore(config).open(config); this.provider.loadSchemaStore(config).open(config); this.provider.init(); - this.sessions = new HbaseSessions(config,GRAPH_NAME, this.provider.loadGraphStore(config).store()); + this.sessions = + new HbaseSessions(config, GRAPH_NAME, this.provider.loadGraphStore(config).store()); this.sessions.open(); } @After - public void down(){ - if (this.provider != null) { + public void tearDown() { + if (this.sessions != null) { try { - this.provider.close(); + this.sessions.close(); } catch (Exception e) { - LOG.warn("Failed to close provider",e); + LOG.warn("Failed to close sessions ", e); + } + } + if (this.provider != null){ + try { + this.provider.close(); + }catch (Exception e){ + LOG.warn("Failed to close provider ",e); } } } diff --git a/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/hbase/HbaseUnitTest.java b/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/hbase/HbaseUnitTest.java index c0fca11d8c..96845b3e9d 100644 --- a/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/hbase/HbaseUnitTest.java +++ b/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/hbase/HbaseUnitTest.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.hbase; @@ -25,18 +23,12 @@ import org.apache.hugegraph.testutil.Assert; import org.apache.hugegraph.backend.store.hbase.HbaseSessions; import org.apache.hugegraph.util.StringEncoding; -import org.junit.Before; import org.junit.Test; -import java.io.IOException; +import java.nio.charset.StandardCharsets; public class HbaseUnitTest extends BaseHbaseUnitTest { - @Before - public void setUp() throws IOException { - super.setup(); - } - @Test public void testHbaseMetaVersionAfterTruncate() { BackendStore systemStore = this.provider.loadSystemStore(config); @@ -45,45 +37,46 @@ public void testHbaseMetaVersionAfterTruncate() { String beforeVersion = systemStore.storedVersion(); HbaseSessions.Session testsession = this.sessions.session(); - + // Insert test data - testsession.put("g_v", "f".getBytes(), "row_trunc_v".getBytes(), StringEncoding.encode("q"), StringEncoding.encode("v")); - testsession.put("g_oe", "f".getBytes(), "row_trunc_oe".getBytes(), StringEncoding.encode("q"), StringEncoding.encode("v")); - testsession.put("g_ie", "f".getBytes(), "row_trunc_ie".getBytes(), StringEncoding.encode("q"), StringEncoding.encode("v")); + testsession.put("g_v", "f".getBytes(StandardCharsets.UTF_8), + "row_trunc_v".getBytes(StandardCharsets.UTF_8), StringEncoding.encode("q"), + StringEncoding.encode("v")); + testsession.put("g_oe", "f".getBytes(StandardCharsets.UTF_8), + "row_trunc_oe".getBytes(StandardCharsets.UTF_8), + StringEncoding.encode("q"), StringEncoding.encode("v")); + testsession.put("g_ie", "f".getBytes(StandardCharsets.UTF_8), + "row_trunc_ie".getBytes(StandardCharsets.UTF_8), + StringEncoding.encode("q"), StringEncoding.encode("v")); testsession.commit(); // Verify data insertion success - BackendIterator vIterator = testsession.get("g_v", "f".getBytes(), "row_trunc_v".getBytes()); - BackendIterator oeIterator = testsession.get("g_oe", "f".getBytes(), "row_trunc_oe".getBytes()); - BackendIterator ieIterator = testsession.get("g_ie", "f".getBytes(), "row_trunc_ie".getBytes()); - - Assert.assertTrue("data should exist", vIterator.hasNext()); - Assert.assertTrue("data should exist", oeIterator.hasNext()); - Assert.assertTrue("data should exist", ieIterator.hasNext()); - - vIterator.close(); - oeIterator.close(); - ieIterator.close(); - + try ( + BackendIterator vIterator = testsession.get("g_v", "f".getBytes(StandardCharsets.UTF_8), "row_trunc_v".getBytes(StandardCharsets.UTF_8)); + BackendIterator oeIterator = testsession.get("g_oe", "f".getBytes(StandardCharsets.UTF_8), "row_trunc_oe".getBytes(StandardCharsets.UTF_8)); + BackendIterator ieIterator = testsession.get("g_ie", "f".getBytes(StandardCharsets.UTF_8), "row_trunc_ie".getBytes(StandardCharsets.UTF_8)); + ) { + Assert.assertTrue("data should exist", vIterator.hasNext()); + Assert.assertTrue("data should exist", oeIterator.hasNext()); + Assert.assertTrue("data should exist", ieIterator.hasNext()); + } // Execute truncate operation, clears all graph data but preserves system tables this.provider.truncate(); // Verify system version remains unchanged after truncation String afterVersion = systemStore.storedVersion(); - Assert.assertNotNull("System metadata version should exist",afterVersion); + 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 - vIterator = testsession.get("g_v", "f".getBytes(), "row_trunc_v".getBytes()); - oeIterator = testsession.get("g_oe", "f".getBytes(), "row_trunc_oe".getBytes()); - ieIterator = testsession.get("g_ie", "f".getBytes(), "row_trunc_ie".getBytes()); - - Assert.assertFalse("data should not exist", vIterator.hasNext()); - Assert.assertFalse("data should not exist", oeIterator.hasNext()); - Assert.assertFalse("data should not exist", ieIterator.hasNext()); - - vIterator.close(); - oeIterator.close(); - ieIterator.close(); + try ( + BackendIterator vIterator = testsession.get("g_v", "f".getBytes(StandardCharsets.UTF_8), "row_trunc_v".getBytes(StandardCharsets.UTF_8)); + BackendIterator oeIterator = testsession.get("g_oe", "f".getBytes(StandardCharsets.UTF_8), "row_trunc_oe".getBytes(StandardCharsets.UTF_8)); + BackendIterator ieIterator = testsession.get("g_ie", "f".getBytes(StandardCharsets.UTF_8), "row_trunc_ie".getBytes(StandardCharsets.UTF_8)); + ) { + Assert.assertFalse("data should not exist", vIterator.hasNext()); + Assert.assertFalse("data should not exist", oeIterator.hasNext()); + Assert.assertFalse("data should not exist", ieIterator.hasNext()); + } } } From 06a09eb0bfd87d22dc84396281d45da5b6ce31d2 Mon Sep 17 00:00:00 2001 From: LYD031106 <2565506388@qq.com> Date: Sat, 13 Dec 2025 01:31:25 +0800 Subject: [PATCH 5/9] fix(server): ensure graph clear API does not clear meta table --- .../backend/store/hbase/HbaseStore.java | 4 +-- .../unit/hbase/BaseHbaseUnitTest.java | 31 ++++++++++++------- .../hugegraph/unit/hbase/HbaseUnitTest.java | 21 ++++++++----- 3 files changed, 36 insertions(+), 20 deletions(-) diff --git a/hugegraph-server/hugegraph-hbase/src/main/java/org/apache/hugegraph/backend/store/hbase/HbaseStore.java b/hugegraph-server/hugegraph-hbase/src/main/java/org/apache/hugegraph/backend/store/hbase/HbaseStore.java index bc0f9f2b8b..7a9de48e26 100644 --- a/hugegraph-server/hugegraph-hbase/src/main/java/org/apache/hugegraph/backend/store/hbase/HbaseStore.java +++ b/hugegraph-server/hugegraph-hbase/src/main/java/org/apache/hugegraph/backend/store/hbase/HbaseStore.java @@ -114,7 +114,7 @@ protected List tableNames() { .collect(Collectors.toList()); } - protected List truncatedTableNames() { + protected List getTableNamesExcludingMeta() { // Exclude meta table to preserve system metadata during graph clear return this.tables.entrySet().stream() .filter(e -> !(HugeType.META == e.getKey())) @@ -379,7 +379,7 @@ public void truncate() { }; // Truncate tables - List tables = this.truncatedTableNames(); + List tables = this.getTableNamesExcludingMeta(); Map> futures = new HashMap<>(tables.size()); try { diff --git a/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/hbase/BaseHbaseUnitTest.java b/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/hbase/BaseHbaseUnitTest.java index c79ab79455..5ebd281cf9 100644 --- a/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/hbase/BaseHbaseUnitTest.java +++ b/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/hbase/BaseHbaseUnitTest.java @@ -41,14 +41,21 @@ public void setup() throws IOException { Configuration conf = Utils.getConf(); this.config = new HugeConfig(conf); this.provider = new HbaseStoreProvider(); - 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 HbaseSessions(config, GRAPH_NAME, this.provider.loadGraphStore(config).store()); - this.sessions.open(); + try { + this.provider.open(GRAPH_NAME); + this.provider.loadSystemStore(config).open(config); + this.provider.loadGraphStore(config).open(config); + this.provider.loadSchemaStore(config).open(config); + // ensure back is clear + this.provider.truncate(); + this.provider.init(); + this.sessions = new HbaseSessions(config, GRAPH_NAME, this.provider.loadGraphStore(config).store()); + this.sessions.open(); + } catch (Exception e) { + tearDown(); + LOG.warn("Failed to init Hbasetest ", e); + } + } @After @@ -60,11 +67,13 @@ public void tearDown() { LOG.warn("Failed to close sessions ", e); } } - if (this.provider != null){ + if (this.provider != null) { + // ensure back is clear + this.provider.truncate(); try { this.provider.close(); - }catch (Exception e){ - LOG.warn("Failed to close provider ",e); + } catch (Exception e) { + LOG.warn("Failed to close provider ", e); } } } diff --git a/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/hbase/HbaseUnitTest.java b/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/hbase/HbaseUnitTest.java index 96845b3e9d..c851016139 100644 --- a/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/hbase/HbaseUnitTest.java +++ b/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/hbase/HbaseUnitTest.java @@ -52,9 +52,12 @@ public void testHbaseMetaVersionAfterTruncate() { // Verify data insertion success try ( - BackendIterator vIterator = testsession.get("g_v", "f".getBytes(StandardCharsets.UTF_8), "row_trunc_v".getBytes(StandardCharsets.UTF_8)); - BackendIterator oeIterator = testsession.get("g_oe", "f".getBytes(StandardCharsets.UTF_8), "row_trunc_oe".getBytes(StandardCharsets.UTF_8)); - BackendIterator ieIterator = testsession.get("g_ie", "f".getBytes(StandardCharsets.UTF_8), "row_trunc_ie".getBytes(StandardCharsets.UTF_8)); + BackendIterator vIterator = testsession.get("g_v", "f".getBytes( + StandardCharsets.UTF_8), "row_trunc_v".getBytes(StandardCharsets.UTF_8)); + BackendIterator oeIterator = testsession.get("g_oe", "f".getBytes( + StandardCharsets.UTF_8), "row_trunc_oe".getBytes(StandardCharsets.UTF_8)); + BackendIterator ieIterator = testsession.get("g_ie", "f".getBytes( + StandardCharsets.UTF_8), "row_trunc_ie".getBytes(StandardCharsets.UTF_8)); ) { Assert.assertTrue("data should exist", vIterator.hasNext()); Assert.assertTrue("data should exist", oeIterator.hasNext()); @@ -66,13 +69,17 @@ public void testHbaseMetaVersionAfterTruncate() { // 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 try ( - BackendIterator vIterator = testsession.get("g_v", "f".getBytes(StandardCharsets.UTF_8), "row_trunc_v".getBytes(StandardCharsets.UTF_8)); - BackendIterator oeIterator = testsession.get("g_oe", "f".getBytes(StandardCharsets.UTF_8), "row_trunc_oe".getBytes(StandardCharsets.UTF_8)); - BackendIterator ieIterator = testsession.get("g_ie", "f".getBytes(StandardCharsets.UTF_8), "row_trunc_ie".getBytes(StandardCharsets.UTF_8)); + BackendIterator vIterator = testsession.get("g_v", "f".getBytes( + StandardCharsets.UTF_8), "row_trunc_v".getBytes(StandardCharsets.UTF_8)); + BackendIterator oeIterator = testsession.get("g_oe", "f".getBytes( + StandardCharsets.UTF_8), "row_trunc_oe".getBytes(StandardCharsets.UTF_8)); + BackendIterator ieIterator = testsession.get("g_ie", "f".getBytes( + StandardCharsets.UTF_8), "row_trunc_ie".getBytes(StandardCharsets.UTF_8)); ) { Assert.assertFalse("data should not exist", vIterator.hasNext()); Assert.assertFalse("data should not exist", oeIterator.hasNext()); From 2bba64478940fa734ba17fecd2a1818efedb38e0 Mon Sep 17 00:00:00 2001 From: LYD031106 <2565506388@qq.com> Date: Sat, 13 Dec 2025 02:14:02 +0800 Subject: [PATCH 6/9] fix(server): ensure graph clear API does not clear meta table --- .../main/java/org/apache/hugegraph/unit/UnitTestSuite.java | 4 ++++ 1 file changed, 4 insertions(+) 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 a0cb72aa6c..f62c7b2110 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 @@ -43,6 +43,7 @@ import org.apache.hugegraph.unit.core.SerialEnumTest; import org.apache.hugegraph.unit.core.SystemSchemaStoreTest; import org.apache.hugegraph.unit.core.TraversalUtilTest; +import org.apache.hugegraph.unit.hbase.HbaseUnitTest; import org.apache.hugegraph.unit.id.EdgeIdTest; import org.apache.hugegraph.unit.id.IdTest; import org.apache.hugegraph.unit.id.IdUtilTest; @@ -140,6 +141,9 @@ RocksDBSessionTest.class, RocksDBCountersTest.class, + /* hbase */ + HbaseUnitTest.class, + /* utils */ VersionTest.class, JsonUtilTest.class, From 77f20b713ac1af45334d3a9415a68d379ecef078 Mon Sep 17 00:00:00 2001 From: LYD031106 <2565506388@qq.com> Date: Wed, 14 Jan 2026 00:33:44 +0800 Subject: [PATCH 7/9] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8DCI/CD=E9=94=99?= =?UTF-8?q?=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/org/apache/hugegraph/core/CoreTestSuite.java | 5 ++++- .../main/java/org/apache/hugegraph/unit/UnitTestSuite.java | 2 -- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/core/CoreTestSuite.java b/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/core/CoreTestSuite.java index 2ff62b06ef..2797b3287c 100644 --- a/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/core/CoreTestSuite.java +++ b/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/core/CoreTestSuite.java @@ -24,6 +24,7 @@ import org.apache.hugegraph.meta.MetaManager; import org.apache.hugegraph.meta.PdMetaDriver; import org.apache.hugegraph.testutil.Utils; +import org.apache.hugegraph.unit.hbase.HbaseUnitTest; import org.apache.hugegraph.util.Log; import org.junit.AfterClass; import org.junit.Assert; @@ -47,7 +48,9 @@ TaskCoreTest.class, AuthTest.class, MultiGraphsTest.class, - RamTableTest.class + RamTableTest.class, + /* hbase */ + HbaseUnitTest.class, }) public class CoreTestSuite { 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 f62c7b2110..ec6d808a45 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 @@ -141,8 +141,6 @@ RocksDBSessionTest.class, RocksDBCountersTest.class, - /* hbase */ - HbaseUnitTest.class, /* utils */ VersionTest.class, From aa5a973589ae88be4a5676d34130fcc7149865b8 Mon Sep 17 00:00:00 2001 From: LYD031106 <2565506388@qq.com> Date: Sun, 18 Jan 2026 01:45:36 +0800 Subject: [PATCH 8/9] =?UTF-8?q?feat:=20=E4=BF=AE=E5=A4=8DCI/CD=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/apache/hugegraph/unit/hbase/BaseHbaseUnitTest.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/hbase/BaseHbaseUnitTest.java b/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/hbase/BaseHbaseUnitTest.java index 5ebd281cf9..1a56ea76c7 100644 --- a/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/hbase/BaseHbaseUnitTest.java +++ b/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/hbase/BaseHbaseUnitTest.java @@ -25,6 +25,7 @@ import org.apache.hugegraph.unit.BaseUnitTest; import org.junit.After; import org.junit.Before; +import org.junit.Assume; import java.io.IOException; @@ -39,6 +40,10 @@ public class BaseHbaseUnitTest extends BaseUnitTest { @Before public void setup() throws IOException { Configuration conf = Utils.getConf(); + String backend = conf.getString("backend", "memory"); + // Only run HBase related tests when backend is hbase + Assume.assumeTrue("Skip HBase tests when backend is not hbase", + "hbase".equalsIgnoreCase(backend)); this.config = new HugeConfig(conf); this.provider = new HbaseStoreProvider(); try { From cd658fbaca801012da87ea61a7b5e3a714a4493f Mon Sep 17 00:00:00 2001 From: LYD031106 <2565506388@qq.com> Date: Mon, 19 Jan 2026 01:23:56 +0800 Subject: [PATCH 9/9] fix: debug --- .../java/org/apache/hugegraph/unit/hbase/BaseHbaseUnitTest.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/hbase/BaseHbaseUnitTest.java b/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/hbase/BaseHbaseUnitTest.java index 1a56ea76c7..449af964c8 100644 --- a/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/hbase/BaseHbaseUnitTest.java +++ b/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/hbase/BaseHbaseUnitTest.java @@ -51,8 +51,6 @@ public void setup() throws IOException { this.provider.loadSystemStore(config).open(config); this.provider.loadGraphStore(config).open(config); this.provider.loadSchemaStore(config).open(config); - // ensure back is clear - this.provider.truncate(); this.provider.init(); this.sessions = new HbaseSessions(config, GRAPH_NAME, this.provider.loadGraphStore(config).store()); this.sessions.open();