You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@amoro.apache.org by ji...@apache.org on 2026/06/24 03:03:43 UTC

(amoro) branch master updated: [AMORO-4257][AMS] Fix duplicate process ID caused by multiple SnowflakeIdGenerator instances (#4258)

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 <43...@users.noreply.github.com>
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 <fe...@tencent.com>
---
 .../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;