From 5f0ad8c069cee5299bb3ef27074f38ab16c3c2cb Mon Sep 17 00:00:00 2001 From: OneSizeFitsQuorum Date: Thu, 4 Dec 2025 22:41:41 +0800 Subject: [PATCH 1/2] fix Signed-off-by: OneSizeFitsQuorum --- .../wal/allocation/AbstractNodeAllocationStrategy.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/wal/allocation/AbstractNodeAllocationStrategy.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/wal/allocation/AbstractNodeAllocationStrategy.java index 119f262ea660..ade9fad13562 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/wal/allocation/AbstractNodeAllocationStrategy.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/wal/allocation/AbstractNodeAllocationStrategy.java @@ -57,6 +57,10 @@ protected AbstractNodeAllocationStrategy() { protected IWALNode createWALNode(String identifier) { try { + if (folderManager == null) { + folderManager = new FolderManager( + Arrays.asList(commonConfig.getWalDirs()), DirectoryStrategyType.SEQUENCE_STRATEGY); + } return folderManager.getNextWithRetry( folder -> new WALNode(identifier, folder + File.separator + identifier)); } catch (DiskSpaceInsufficientException e) { From cd69d063e4592c7cdb93f2cb1ebf5d0816ee9cf8 Mon Sep 17 00:00:00 2001 From: OneSizeFitsQuorum Date: Thu, 4 Dec 2025 23:04:10 +0800 Subject: [PATCH 2/2] finish Signed-off-by: OneSizeFitsQuorum --- .../AbstractNodeAllocationStrategy.java | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/wal/allocation/AbstractNodeAllocationStrategy.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/wal/allocation/AbstractNodeAllocationStrategy.java index ade9fad13562..68d4e39876a1 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/wal/allocation/AbstractNodeAllocationStrategy.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/wal/allocation/AbstractNodeAllocationStrategy.java @@ -34,6 +34,7 @@ import java.io.File; import java.io.IOException; import java.util.Arrays; +import java.util.concurrent.atomic.AtomicReference; public abstract class AbstractNodeAllocationStrategy implements NodeAllocationStrategy { private static final Logger logger = @@ -41,13 +42,13 @@ public abstract class AbstractNodeAllocationStrategy implements NodeAllocationSt private static final CommonConfig commonConfig = CommonDescriptor.getInstance().getConfig(); // manage wal folders - protected FolderManager folderManager; + protected AtomicReference folderManager = new AtomicReference<>(); protected AbstractNodeAllocationStrategy() { try { - folderManager = + folderManager.set( new FolderManager( - Arrays.asList(commonConfig.getWalDirs()), DirectoryStrategyType.SEQUENCE_STRATEGY); + Arrays.asList(commonConfig.getWalDirs()), DirectoryStrategyType.SEQUENCE_STRATEGY)); } catch (DiskSpaceInsufficientException e) { logger.error( "Fail to create wal node allocation strategy because all disks of wal folders are full.", @@ -57,12 +58,16 @@ protected AbstractNodeAllocationStrategy() { protected IWALNode createWALNode(String identifier) { try { - if (folderManager == null) { - folderManager = new FolderManager( - Arrays.asList(commonConfig.getWalDirs()), DirectoryStrategyType.SEQUENCE_STRATEGY); + // already in lock, so no need to synchronized + if (folderManager.get() == null) { + folderManager.set( + new FolderManager( + Arrays.asList(commonConfig.getWalDirs()), DirectoryStrategyType.SEQUENCE_STRATEGY)); } - return folderManager.getNextWithRetry( - folder -> new WALNode(identifier, folder + File.separator + identifier)); + return folderManager + .get() + .getNextWithRetry( + folder -> new WALNode(identifier, folder + File.separator + identifier)); } catch (DiskSpaceInsufficientException e) { logger.error("Fail to create wal node because all disks of wal folders are full.", e); return WALFakeNode.getFailureInstance(e);