Optimize TsTable with Copy-on-Write pattern for thread-safe concurrent access (#17069) * Optimize TsTable with Copy-on-Write pattern for thread-safe concurrent access - Change columnSchemaMap, tagColumnIndexMap, and idColumnIndexMap from final to volatile - Implement Copy-on-Write in executeWrite method: 1. Create local copies of maps before modification 2. Execute write operations on local copies 3. Atomically update class fields after write completes - Add WriteOperation functional interface to pass map copies to write operations - Add executeWriteWithTransform for efficient single-pass transformation during copy - Optimize renameColumnSchema to preserve column order with single-pass copy - This ensures readers see either complete old data or complete new data, avoiding ConcurrentModificationException * fix * fix * fix * Revert "fix" This reverts commit 2155558217aabe2a0dd7dc09e85c569597d38b9f. * Revert "fix" This reverts commit 7e798b1ba71365cc7ad8a76c5e83122ead6a3744. * Revert "fix" This reverts commit 9b221b192be5ecf73fb4bd23ec2a7d3009888bfd. * Revert "Optimize TsTable with Copy-on-Write pattern for thread-safe concurrent access" This reverts commit 3eeaf83f3dc3c32ee944daf3f7ff9b456e88b29e. * fix
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/table/DataNodeTableCache.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/table/DataNodeTableCache.java index 9beab9b..64fa5f3 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/table/DataNodeTableCache.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/table/DataNodeTableCache.java
@@ -288,13 +288,17 @@ try { if (databaseTableMap.containsKey(database) && databaseTableMap.get(database).containsKey(tableName)) { - databaseTableMap.get(database).get(tableName).removeColumnSchema(columnName); + final TsTable copyTable = new TsTable(databaseTableMap.get(database).get(tableName)); + copyTable.removeColumnSchema(columnName); + databaseTableMap.get(database).put(tableName, copyTable); } if (preUpdateTableMap.containsKey(database) && preUpdateTableMap.get(database).containsKey(tableName)) { final Pair<TsTable, Long> tableVersionPair = preUpdateTableMap.get(database).get(tableName); if (Objects.nonNull(tableVersionPair.getLeft())) { - tableVersionPair.getLeft().removeColumnSchema(columnName); + final TsTable copyTable = new TsTable(tableVersionPair.getLeft()); + copyTable.removeColumnSchema(columnName); + tableVersionPair.setLeft(copyTable); } tableVersionPair.setRight(tableVersionPair.getRight() + 1); }