This is an automated email from the ASF dual-hosted git repository.

zhoujinsong pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/amoro.git


The following commit(s) were added to refs/heads/master by this push:
     new 675c222c3 [AMORO-4257][AMS] Fix duplicate process ID caused by 
multiple SnowflakeIdGenerator instances (#4258)
675c222c3 is described below

commit 675c222c3c3e208a1603415b1696704cc9de4621
Author: felixhzhu <[email protected]>
AuthorDate: Wed Jun 24 11:03:38 2026 +0800

    [AMORO-4257][AMS] Fix duplicate process ID caused by multiple 
SnowflakeIdGenerator instances (#4258)
    
    Consolidate multiple independent SnowflakeIdGenerator instances into a 
single global singleton (SnowflakeIdGenerator.INSTANCE) to prevent ID 
collisions when two instances generate IDs in the same 10ms time window with 
the same machineId=0.
    
    fix #4257
    
    Co-authored-by: felixhzhu <[email protected]>
---
 .../main/java/org/apache/amoro/server/process/TableProcessMeta.java   | 4 ++--
 .../src/main/java/org/apache/amoro/server/utils/IcebergTableUtil.java | 3 +--
 .../main/java/org/apache/amoro/server/utils/SnowflakeIdGenerator.java | 3 +++
 3 files changed, 6 insertions(+), 4 deletions(-)

diff --git 
a/amoro-ams/src/main/java/org/apache/amoro/server/process/TableProcessMeta.java 
b/amoro-ams/src/main/java/org/apache/amoro/server/process/TableProcessMeta.java
index 06912e5a8..afafc5888 100644
--- 
a/amoro-ams/src/main/java/org/apache/amoro/server/process/TableProcessMeta.java
+++ 
b/amoro-ams/src/main/java/org/apache/amoro/server/process/TableProcessMeta.java
@@ -27,7 +27,7 @@ import java.util.HashMap;
 import java.util.Map;
 
 public class TableProcessMeta {
-  private static final SnowflakeIdGenerator idGenerator = new 
SnowflakeIdGenerator();
+
   private long processId;
   private long tableId;
   private volatile String externalProcessIdentifier;
@@ -193,7 +193,7 @@ public class TableProcessMeta {
 
   public static TableProcessMeta createProcessMeta(TableProcess process) {
     TableProcessMeta tableProcessMeta = new TableProcessMeta();
-    tableProcessMeta.setProcessId(idGenerator.generateId());
+    tableProcessMeta.setProcessId(SnowflakeIdGenerator.INSTANCE.generateId());
     tableProcessMeta.setTableId(process.getTableIdentifier().getId());
     tableProcessMeta.setExternalProcessIdentifier("");
     tableProcessMeta.setStatus(ProcessStatus.PENDING);
diff --git 
a/amoro-ams/src/main/java/org/apache/amoro/server/utils/IcebergTableUtil.java 
b/amoro-ams/src/main/java/org/apache/amoro/server/utils/IcebergTableUtil.java
index 0b96dddd8..28edb65e9 100644
--- 
a/amoro-ams/src/main/java/org/apache/amoro/server/utils/IcebergTableUtil.java
+++ 
b/amoro-ams/src/main/java/org/apache/amoro/server/utils/IcebergTableUtil.java
@@ -78,7 +78,6 @@ import java.util.stream.Collectors;
 public class IcebergTableUtil {
 
   private static final Logger LOG = 
LoggerFactory.getLogger(IcebergTableUtil.class);
-  private static final SnowflakeIdGenerator snowflakeIdGenerator = new 
SnowflakeIdGenerator();
 
   public static long getSnapshotId(Table table, boolean refresh) {
     Snapshot currentSnapshot = getSnapshot(table, refresh);
@@ -284,7 +283,7 @@ public class IcebergTableUtil {
                             table, entry.getKey(), entry.getValue()))
                 .reduce(Expressions::or)
                 .orElse(Expressions.alwaysTrue());
-    long processId = snowflakeIdGenerator.generateId();
+    long processId = SnowflakeIdGenerator.INSTANCE.generateId();
     ServerTableIdentifier identifier = tableRuntime.getTableIdentifier();
     OptimizingConfig config = tableRuntime.getOptimizingConfig();
     long lastMinor = tableRuntime.getLastMinorOptimizingTime();
diff --git 
a/amoro-ams/src/main/java/org/apache/amoro/server/utils/SnowflakeIdGenerator.java
 
b/amoro-ams/src/main/java/org/apache/amoro/server/utils/SnowflakeIdGenerator.java
index 96b7285cb..1014ebc17 100644
--- 
a/amoro-ams/src/main/java/org/apache/amoro/server/utils/SnowflakeIdGenerator.java
+++ 
b/amoro-ams/src/main/java/org/apache/amoro/server/utils/SnowflakeIdGenerator.java
@@ -20,6 +20,9 @@ package org.apache.amoro.server.utils;
 
 /** SnowflakeId generator */
 public class SnowflakeIdGenerator {
+  /** Global singleton instance for process ID generation. */
+  public static final SnowflakeIdGenerator INSTANCE = new 
SnowflakeIdGenerator();
+
   // Base timestamp (e.g., the start time of the service)
   private static final long EPOCH_SECONDS = 0L;
 

Reply via email to