Skip to content

Commit c800679

Browse files
committed
Next
1 parent 1ba5ef9 commit c800679

File tree

4 files changed

+53
-25
lines changed

4 files changed

+53
-25
lines changed

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/DataNodeInternalRPCServiceImpl.java

+36-20
Original file line numberDiff line numberDiff line change
@@ -566,23 +566,32 @@ public TSStatus invalidateLastCache(final String database) {
566566

567567
@Override
568568
public TSStatus invalidateSchemaCache(final TInvalidateCacheReq req) {
569-
DataNodeSchemaLockManager.getInstance().takeWriteLock(SchemaLockType.VALIDATE_VS_DELETION);
569+
DataNodeSchemaLockManager.getInstance()
570+
.takeWriteLock(SchemaLockType.VALIDATE_VS_DELETION_TABLE);
570571
try {
571-
TreeDeviceSchemaCacheManager.getInstance().takeWriteLock();
572+
DataNodeSchemaLockManager.getInstance()
573+
.takeWriteLock(SchemaLockType.VALIDATE_VS_DELETION_TREE);
572574
try {
573-
final String database = req.getFullPath();
574-
// req.getFullPath() is a database path
575-
ClusterTemplateManager.getInstance().invalid(database);
576-
// clear table related cache
577-
DataNodeTableCache.getInstance().invalid(database);
578-
tableDeviceSchemaCache.invalidate(database);
579-
LOGGER.info("Schema cache of {} has been invalidated", req.getFullPath());
580-
return new TSStatus(TSStatusCode.SUCCESS_STATUS.getStatusCode());
575+
TreeDeviceSchemaCacheManager.getInstance().takeWriteLock();
576+
try {
577+
final String database = req.getFullPath();
578+
// req.getFullPath() is a database path
579+
ClusterTemplateManager.getInstance().invalid(database);
580+
// clear table related cache
581+
DataNodeTableCache.getInstance().invalid(database);
582+
tableDeviceSchemaCache.invalidate(database);
583+
LOGGER.info("Schema cache of {} has been invalidated", req.getFullPath());
584+
return new TSStatus(TSStatusCode.SUCCESS_STATUS.getStatusCode());
585+
} finally {
586+
TreeDeviceSchemaCacheManager.getInstance().releaseWriteLock();
587+
}
581588
} finally {
582-
TreeDeviceSchemaCacheManager.getInstance().releaseWriteLock();
589+
DataNodeSchemaLockManager.getInstance()
590+
.releaseWriteLock(SchemaLockType.VALIDATE_VS_DELETION_TREE);
583591
}
584592
} finally {
585-
DataNodeSchemaLockManager.getInstance().releaseWriteLock(SchemaLockType.VALIDATE_VS_DELETION);
593+
DataNodeSchemaLockManager.getInstance()
594+
.releaseWriteLock(SchemaLockType.VALIDATE_VS_DELETION_TABLE);
586595
}
587596
}
588597

@@ -649,7 +658,7 @@ public TSStatus rollbackSchemaBlackList(TRollbackSchemaBlackListReq req) {
649658
@Override
650659
public TSStatus invalidateMatchedSchemaCache(final TInvalidateMatchedSchemaCacheReq req) {
651660
final TreeDeviceSchemaCacheManager cache = TreeDeviceSchemaCacheManager.getInstance();
652-
DataNodeSchemaLockManager.getInstance().takeWriteLock(SchemaLockType.VALIDATE_VS_DELETION);
661+
DataNodeSchemaLockManager.getInstance().takeWriteLock(SchemaLockType.VALIDATE_VS_DELETION_TREE);
653662
try {
654663
cache.takeWriteLock();
655664
try {
@@ -658,7 +667,8 @@ public TSStatus invalidateMatchedSchemaCache(final TInvalidateMatchedSchemaCache
658667
cache.releaseWriteLock();
659668
}
660669
} finally {
661-
DataNodeSchemaLockManager.getInstance().releaseWriteLock(SchemaLockType.VALIDATE_VS_DELETION);
670+
DataNodeSchemaLockManager.getInstance()
671+
.releaseWriteLock(SchemaLockType.VALIDATE_VS_DELETION_TREE);
662672
}
663673
return RpcUtils.SUCCESS_STATUS;
664674
}
@@ -1570,13 +1580,15 @@ public TSStatus updateTable(final TUpdateTableReq req) {
15701580

15711581
@Override
15721582
public TSStatus invalidateTableCache(final TInvalidateTableCacheReq req) {
1573-
DataNodeSchemaLockManager.getInstance().takeWriteLock(SchemaLockType.VALIDATE_VS_DELETION);
1583+
DataNodeSchemaLockManager.getInstance()
1584+
.takeWriteLock(SchemaLockType.VALIDATE_VS_DELETION_TABLE);
15741585
try {
15751586
TableDeviceSchemaCache.getInstance()
15761587
.invalidate(PathUtils.unQualifyDatabaseName(req.getDatabase()), req.getTableName());
15771588
return StatusUtils.OK;
15781589
} finally {
1579-
DataNodeSchemaLockManager.getInstance().releaseWriteLock(SchemaLockType.VALIDATE_VS_DELETION);
1590+
DataNodeSchemaLockManager.getInstance()
1591+
.releaseWriteLock(SchemaLockType.VALIDATE_VS_DELETION_TABLE);
15801592
}
15811593
}
15821594

@@ -1652,7 +1664,8 @@ public TSStatus rollbackTableDeviceBlackList(final TTableDeviceDeletionWithPatte
16521664

16531665
@Override
16541666
public TSStatus invalidateMatchedTableDeviceCache(final TTableDeviceInvalidateCacheReq req) {
1655-
DataNodeSchemaLockManager.getInstance().takeWriteLock(SchemaLockType.VALIDATE_VS_DELETION);
1667+
DataNodeSchemaLockManager.getInstance()
1668+
.takeWriteLock(SchemaLockType.VALIDATE_VS_DELETION_TABLE);
16561669
try {
16571670
TableDeviceSchemaCache.getInstance()
16581671
.invalidate(
@@ -1662,7 +1675,8 @@ public TSStatus invalidateMatchedTableDeviceCache(final TTableDeviceInvalidateCa
16621675
req.getDatabase(), req.getTableName(), req.getPatternInfo()));
16631676
return StatusUtils.OK;
16641677
} finally {
1665-
DataNodeSchemaLockManager.getInstance().releaseWriteLock(SchemaLockType.VALIDATE_VS_DELETION);
1678+
DataNodeSchemaLockManager.getInstance()
1679+
.releaseWriteLock(SchemaLockType.VALIDATE_VS_DELETION_TABLE);
16661680
}
16671681
}
16681682

@@ -1701,7 +1715,8 @@ public TSStatus deleteTableDeviceInBlackList(final TTableDeviceDeletionWithPatte
17011715

17021716
@Override
17031717
public TSStatus invalidateColumnCache(final TInvalidateColumnCacheReq req) {
1704-
DataNodeSchemaLockManager.getInstance().takeWriteLock(SchemaLockType.VALIDATE_VS_DELETION);
1718+
DataNodeSchemaLockManager.getInstance()
1719+
.takeWriteLock(SchemaLockType.VALIDATE_VS_DELETION_TABLE);
17051720
try {
17061721
TableDeviceSchemaCache.getInstance()
17071722
.invalidate(
@@ -1711,7 +1726,8 @@ public TSStatus invalidateColumnCache(final TInvalidateColumnCacheReq req) {
17111726
req.isIsAttributeColumn());
17121727
return StatusUtils.OK;
17131728
} finally {
1714-
DataNodeSchemaLockManager.getInstance().releaseWriteLock(SchemaLockType.VALIDATE_VS_DELETION);
1729+
DataNodeSchemaLockManager.getInstance()
1730+
.releaseWriteLock(SchemaLockType.VALIDATE_VS_DELETION_TABLE);
17151731
}
17161732
}
17171733

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/lock/SchemaLockType.java

+13-1
Original file line numberDiff line numberDiff line change
@@ -47,5 +47,17 @@ public enum SchemaLockType {
4747
* <li>Release write lock after finishing invalidating schema cache.
4848
* </ol>
4949
*/
50-
VALIDATE_VS_DELETION,
50+
VALIDATE_VS_DELETION_TREE,
51+
52+
/**
53+
* This lock is used for guarantee no data without schema after table related deletion.
54+
*
55+
* <ol>
56+
* <li>Take read lock before validating schema during inserting data or loading TsFile.
57+
* <li>Release read lock after finishing inserting data or loading TsFile.
58+
* <li>Take write lock before invalidating table device cache during table related deletion.
59+
* <li>Release write lock after finishing invalidating table device cache.
60+
* </ol>
61+
*/
62+
VALIDATE_VS_DELETION_TABLE,
5163
}

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/schema/ClusterSchemaFetcher.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ public void fetchAndComputeSchemaWithAutoCreate(
193193
// The schema cache R/W and fetch operation must be locked together thus the cache clean
194194
// operation executed by delete timeseries will be effective.
195195
DataNodeSchemaLockManager.getInstance()
196-
.takeReadLock(context, SchemaLockType.VALIDATE_VS_DELETION);
196+
.takeReadLock(context, SchemaLockType.VALIDATE_VS_DELETION_TREE);
197197
try {
198198
schemaCache.takeReadLock();
199199
try {
@@ -237,7 +237,7 @@ public void fetchAndComputeSchemaWithAutoCreate(
237237
// The schema cache R/W and fetch operation must be locked together thus the cache clean
238238
// operation executed by delete timeSeries will be effective.
239239
DataNodeSchemaLockManager.getInstance()
240-
.takeReadLock(context, SchemaLockType.VALIDATE_VS_DELETION);
240+
.takeReadLock(context, SchemaLockType.VALIDATE_VS_DELETION_TREE);
241241
try {
242242
schemaCache.takeReadLock();
243243
try {
@@ -285,7 +285,7 @@ public ISchemaTree fetchSchemaListWithAutoCreate(
285285
// The schema cache R/W and fetch operation must be locked together thus the cache clean
286286
// operation executed by delete timeSeries will be effective.
287287
DataNodeSchemaLockManager.getInstance()
288-
.takeReadLock(context, SchemaLockType.VALIDATE_VS_DELETION);
288+
.takeReadLock(context, SchemaLockType.VALIDATE_VS_DELETION_TREE);
289289
try {
290290
schemaCache.takeReadLock();
291291
try {

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/TableHeaderSchemaValidator.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ public Optional<TableSchema> validateTableHeaderSchema(
101101
// The schema cache R/W and fetch operation must be locked together thus the cache clean
102102
// operation executed by delete timeSeries will be effective.
103103
DataNodeSchemaLockManager.getInstance()
104-
.takeReadLock(context, SchemaLockType.VALIDATE_VS_DELETION);
104+
.takeReadLock(context, SchemaLockType.VALIDATE_VS_DELETION_TABLE);
105105

106106
try {
107107
final List<ColumnSchema> inputColumnList = tableSchema.getColumns();

0 commit comments

Comments
 (0)