From dc96146d7c1a3c212e0ad0f507afefab35c5ecb4 Mon Sep 17 00:00:00 2001 From: Caideyipi <87789683+Caideyipi@users.noreply.github.com> Date: Tue, 22 Oct 2024 14:03:26 +0800 Subject: [PATCH] Fixed the cache invalidation logic when delete time series --- .../iotdb/db/it/schema/IoTDBDeleteTimeSeriesIT.java | 13 +++++++++++++ .../fetcher/cache/TableDeviceSchemaCache.java | 7 +++++-- .../fetcher/cache/TreeDeviceSchemaCacheManager.java | 9 ++++++++- 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/integration-test/src/test/java/org/apache/iotdb/db/it/schema/IoTDBDeleteTimeSeriesIT.java b/integration-test/src/test/java/org/apache/iotdb/db/it/schema/IoTDBDeleteTimeSeriesIT.java index 25bc288d51d9..4d7a07dcebb8 100644 --- a/integration-test/src/test/java/org/apache/iotdb/db/it/schema/IoTDBDeleteTimeSeriesIT.java +++ b/integration-test/src/test/java/org/apache/iotdb/db/it/schema/IoTDBDeleteTimeSeriesIT.java @@ -240,6 +240,19 @@ public void deleteTimeSeriesAndAutoDeleteDeviceTest() throws Exception { } } + @Test + public void deleteTimeSeriesAndInvalidationTest() throws Exception { + try (final Connection connection = EnvFactory.getEnv().getConnection(); + final Statement statement = connection.createStatement()) { + statement.execute("insert into root.sg.d1 (c1, c2) values (1, 1)"); + statement.execute("delete timeSeries root.sg.d1.**"); + try (final ResultSet resultSet = statement.executeQuery("select c1, c2 from root.sg.d1")) { + Assert.assertEquals(1, resultSet.getMetaData().getColumnCount()); + Assert.assertFalse(resultSet.next()); + } + } + } + @Test public void deleteTimeSeriesCrossSchemaRegionTest() throws Exception { String[] retArray1 = new String[] {"4,4,4,4"}; diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/cache/TableDeviceSchemaCache.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/cache/TableDeviceSchemaCache.java index a044fadd8a1a..0992c980c9cd 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/cache/TableDeviceSchemaCache.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/cache/TableDeviceSchemaCache.java @@ -435,7 +435,8 @@ void invalidateLastCache(final PartialPath devicePath, final String measurement) } // WARNING: This is not guaranteed to affect table model's cache - void invalidateCache(final PartialPath devicePath) { + void invalidateCache( + final @Nonnull PartialPath devicePath, final boolean isMultiLevelWildcardMeasurement) { if (!devicePath.hasWildcard()) { final IDeviceID deviceID = devicePath.getIDeviceID(); dualKeyCache.invalidate(new TableId(null, deviceID.getTableName()), deviceID); @@ -458,7 +459,9 @@ void invalidateCache(final PartialPath devicePath) { }, cachedDeviceID -> { try { - return new PartialPath(cachedDeviceID).matchFullPath(devicePath); + return isMultiLevelWildcardMeasurement + ? devicePath.matchPrefixPath(new PartialPath(cachedDeviceID)) + : devicePath.matchFullPath(new PartialPath(cachedDeviceID)); } catch (final IllegalPathException e) { logger.warn( "Illegal deviceID {} found in cache when invalidating by path {}, invalidate it anyway", diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/cache/TreeDeviceSchemaCacheManager.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/cache/TreeDeviceSchemaCacheManager.java index 46fbca6c53fa..4e77466d81fe 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/cache/TreeDeviceSchemaCacheManager.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/cache/TreeDeviceSchemaCacheManager.java @@ -22,6 +22,7 @@ import org.apache.iotdb.commons.conf.CommonDescriptor; import org.apache.iotdb.commons.path.MeasurementPath; import org.apache.iotdb.commons.path.PartialPath; +import org.apache.iotdb.commons.path.PathPatternUtil; import org.apache.iotdb.commons.schema.view.LogicalViewSchema; import org.apache.iotdb.db.exception.metadata.view.InsertNonWritableViewException; import org.apache.iotdb.db.queryengine.common.schematree.ClusterSchemaTree; @@ -433,7 +434,13 @@ public void updateLastCache( public void invalidate(final List partialPathList) { // Currently invalidate by device partialPathList.forEach( - measurementPath -> tableDeviceSchemaCache.invalidateCache(measurementPath.getDevicePath())); + measurementPath -> { + final boolean isMultiLevelWildcardMeasurement = + PathPatternUtil.isMultiLevelMatchWildcard(measurementPath.getMeasurement()); + tableDeviceSchemaCache.invalidateCache( + isMultiLevelWildcardMeasurement ? measurementPath : measurementPath.getDevicePath(), + isMultiLevelWildcardMeasurement); + }); } public void cleanUp() {