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;