From 051d5d989420747b0145b83392538f8b4e2d1d74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E4=B8=87=E4=B9=89?= Date: Wed, 19 Aug 2026 16:23:47 +0800 Subject: [PATCH] [server] Fix race condition in table/partition deletion ordering Swap the submission order so that metadata deletion (ZK) is submitted to the ioExecutor before remote directory cleanup. Since the ioExecutor is a single-threaded pool, slow remote filesystem operations can block the faster metadata deletion, causing flaky test timeouts in CoordinatorEventProcessorTest.testCreateAndDropTable. This closes #1026. --- .../org/apache/fluss/server/coordinator/TableManager.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fluss-server/src/main/java/org/apache/fluss/server/coordinator/TableManager.java b/fluss-server/src/main/java/org/apache/fluss/server/coordinator/TableManager.java index 2381447bcb8..c085cc42b06 100644 --- a/fluss-server/src/main/java/org/apache/fluss/server/coordinator/TableManager.java +++ b/fluss-server/src/main/java/org/apache/fluss/server/coordinator/TableManager.java @@ -272,8 +272,8 @@ private void resumePartitionDeletions() { private void completeDeleteTable(long tableId) { Set replicas = coordinatorContext.getAllReplicasForTable(tableId); replicaStateMachine.handleStateChanges(replicas, ReplicaState.NonExistentReplica); - asyncDeleteRemoteDirectory(tableId); asyncDeleteTableMetadata(tableId); + asyncDeleteRemoteDirectory(tableId); coordinatorContext.removeTable(tableId); // Release the manager's in-flight tracking so the next batch can be submitted. lifecycleThrottler.onTableDropCompleted(tableId); @@ -284,8 +284,8 @@ private void completeDeletePartition(TablePartition tablePartition) { coordinatorContext.getAllReplicasForPartition( tablePartition.getTableId(), tablePartition.getPartitionId()); replicaStateMachine.handleStateChanges(replicas, ReplicaState.NonExistentReplica); - asyncDeleteRemoteDirectory(tablePartition); asyncDeletePartitionMetadata(tablePartition.getPartitionId()); + asyncDeleteRemoteDirectory(tablePartition); coordinatorContext.removePartition(tablePartition); lifecycleThrottler.onPartitionDropCompleted(tablePartition); }