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

wangyang pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/dolphinscheduler.git


The following commit(s) were added to refs/heads/dev by this push:
     new 27d0563fe4 Bind processId to constructor CodeGenerator (#15848)
27d0563fe4 is described below

commit 27d0563fe4c020a771448830309429592c66ba9c
Author: Wenjun Ruan <wen...@apache.org>
AuthorDate: Tue Apr 16 10:58:43 2024 +0800

    Bind processId to constructor CodeGenerator (#15848)
---
 .../dolphinscheduler/api/python/PythonGateway.java |  6 +-
 .../api/service/impl/ClusterServiceImpl.java       |  2 +-
 .../api/service/impl/EnvironmentServiceImpl.java   |  2 +-
 .../api/service/impl/ExecutorServiceImpl.java      |  2 +-
 .../api/service/impl/K8SNamespaceServiceImpl.java  |  2 +-
 .../service/impl/ProcessDefinitionServiceImpl.java | 16 ++--
 .../service/impl/ProjectParameterServiceImpl.java  |  2 +-
 .../service/impl/ProjectPreferenceServiceImpl.java |  2 +-
 .../api/service/impl/ProjectServiceImpl.java       |  2 +-
 .../service/impl/TaskDefinitionServiceImpl.java    |  6 +-
 .../api/service/impl/EnvironmentServiceTest.java   |  6 +-
 .../common/utils/CodeGenerateUtils.java            | 93 ++++++++++++----------
 .../common/utils/CodeGenerateUtilsTest.java        | 53 ++++++++++--
 .../service/process/ProcessServiceImpl.java        |  2 +-
 .../tools/datasource/dao/ProcessDefinitionDao.java |  2 +-
 .../tools/datasource/dao/ProjectDao.java           |  2 +-
 .../v200/V200DolphinSchedulerUpgrader.java         |  2 +-
 .../tools/demo/ProcessDefinitionDemo.java          | 16 ++--
 18 files changed, 130 insertions(+), 88 deletions(-)

diff --git 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/python/PythonGateway.java
 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/python/PythonGateway.java
index 1e4e1f5aa0..762ba576b0 100644
--- 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/python/PythonGateway.java
+++ 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/python/PythonGateway.java
@@ -184,7 +184,7 @@ public class PythonGateway {
         Map<String, Long> result = new HashMap<>();
         // project do not exists, mean task not exists too, so we should 
directly return init value
         if (project == null) {
-            result.put("code", CodeGenerateUtils.getInstance().genCode());
+            result.put("code", CodeGenerateUtils.genCode());
             result.put("version", 0L);
             return result;
         }
@@ -194,7 +194,7 @@ public class PythonGateway {
         // In the case project exists, but current workflow still not created, 
we should also return the init
         // version of it
         if (processDefinition == null) {
-            result.put("code", CodeGenerateUtils.getInstance().genCode());
+            result.put("code", CodeGenerateUtils.genCode());
             result.put("version", 0L);
             return result;
         }
@@ -202,7 +202,7 @@ public class PythonGateway {
         TaskDefinition taskDefinition =
                 taskDefinitionMapper.queryByName(project.getCode(), 
processDefinition.getCode(), taskName);
         if (taskDefinition == null) {
-            result.put("code", CodeGenerateUtils.getInstance().genCode());
+            result.put("code", CodeGenerateUtils.genCode());
             result.put("version", 0L);
         } else {
             result.put("code", taskDefinition.getCode());
diff --git 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ClusterServiceImpl.java
 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ClusterServiceImpl.java
index a5ceb92abc..bf4e3ac4d6 100644
--- 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ClusterServiceImpl.java
+++ 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ClusterServiceImpl.java
@@ -96,7 +96,7 @@ public class ClusterServiceImpl extends BaseServiceImpl 
implements ClusterServic
         cluster.setOperator(loginUser.getId());
         cluster.setCreateTime(new Date());
         cluster.setUpdateTime(new Date());
-        cluster.setCode(CodeGenerateUtils.getInstance().genCode());
+        cluster.setCode(CodeGenerateUtils.genCode());
 
         if (clusterMapper.insert(cluster) > 0) {
             return cluster.getCode();
diff --git 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/EnvironmentServiceImpl.java
 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/EnvironmentServiceImpl.java
index ade9aea483..2eb8f84810 100644
--- 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/EnvironmentServiceImpl.java
+++ 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/EnvironmentServiceImpl.java
@@ -123,7 +123,7 @@ public class EnvironmentServiceImpl extends BaseServiceImpl 
implements Environme
         env.setUpdateTime(new Date());
         long code = 0L;
         try {
-            code = CodeGenerateUtils.getInstance().genCode();
+            code = CodeGenerateUtils.genCode();
             env.setCode(code);
         } catch (CodeGenerateException e) {
             log.error("Generate environment code error.", e);
diff --git 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ExecutorServiceImpl.java
 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ExecutorServiceImpl.java
index 7ab6102ff8..5b576ce95a 100644
--- 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ExecutorServiceImpl.java
+++ 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ExecutorServiceImpl.java
@@ -258,7 +258,7 @@ public class ExecutorServiceImpl extends BaseServiceImpl 
implements ExecutorServ
         checkScheduleTimeNumExceed(commandType, cronTime);
         checkMasterExists();
 
-        long triggerCode = CodeGenerateUtils.getInstance().genCode();
+        long triggerCode = CodeGenerateUtils.genCode();
 
         /**
          * create command
diff --git 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/K8SNamespaceServiceImpl.java
 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/K8SNamespaceServiceImpl.java
index 54894a5ca7..7543616f31 100644
--- 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/K8SNamespaceServiceImpl.java
+++ 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/K8SNamespaceServiceImpl.java
@@ -141,7 +141,7 @@ public class K8SNamespaceServiceImpl extends 
BaseServiceImpl implements K8sNames
 
         long code = 0L;
         try {
-            code = CodeGenerateUtils.getInstance().genCode();
+            code = CodeGenerateUtils.genCode();
             cluster.setCode(code);
         } catch (CodeGenerateUtils.CodeGenerateException e) {
             log.error("Generate cluster code error.", e);
diff --git 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProcessDefinitionServiceImpl.java
 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProcessDefinitionServiceImpl.java
index ed6b2d27bb..2bf84a0bcc 100644
--- 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProcessDefinitionServiceImpl.java
+++ 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProcessDefinitionServiceImpl.java
@@ -299,7 +299,7 @@ public class ProcessDefinitionServiceImpl extends 
BaseServiceImpl implements Pro
         List<TaskDefinitionLog> taskDefinitionLogs = 
generateTaskDefinitionList(taskDefinitionJson);
         List<ProcessTaskRelationLog> taskRelationList = 
generateTaskRelationList(taskRelationJson, taskDefinitionLogs);
 
-        long processDefinitionCode = CodeGenerateUtils.getInstance().genCode();
+        long processDefinitionCode = CodeGenerateUtils.genCode();
         ProcessDefinition processDefinition =
                 new ProcessDefinition(projectCode, name, 
processDefinitionCode, description,
                         globalParams, locations, timeout, loginUser.getId());
@@ -360,7 +360,7 @@ public class ProcessDefinitionServiceImpl extends 
BaseServiceImpl implements Pro
 
         long processDefinitionCode;
         try {
-            processDefinitionCode = CodeGenerateUtils.getInstance().genCode();
+            processDefinitionCode = CodeGenerateUtils.genCode();
         } catch (CodeGenerateException e) {
             throw new ServiceException(Status.INTERNAL_SERVER_ERROR_ARGS);
         }
@@ -1233,7 +1233,7 @@ public class ProcessDefinitionServiceImpl extends 
BaseServiceImpl implements Pro
             // build process definition
             processDefinition = new ProcessDefinition(projectCode,
                     processDefinitionName,
-                    CodeGenerateUtils.getInstance().genCode(),
+                    CodeGenerateUtils.genCode(),
                     "",
                     "[]", null,
                     0, loginUser.getId());
@@ -1388,7 +1388,7 @@ public class ProcessDefinitionServiceImpl extends 
BaseServiceImpl implements Pro
         sqlParameters.setSqlType(SqlType.NON_QUERY.ordinal());
         sqlParameters.setLocalParams(Collections.emptyList());
         taskDefinition.setTaskParams(JSONUtils.toJsonString(sqlParameters));
-        taskDefinition.setCode(CodeGenerateUtils.getInstance().genCode());
+        taskDefinition.setCode(CodeGenerateUtils.genCode());
         taskDefinition.setTaskType(TASK_TYPE_SQL);
         taskDefinition.setFailRetryTimes(0);
         taskDefinition.setFailRetryInterval(0);
@@ -1433,7 +1433,7 @@ public class ProcessDefinitionServiceImpl extends 
BaseServiceImpl implements Pro
         processDefinition.setProjectCode(projectCode);
         processDefinition.setUserId(loginUser.getId());
         try {
-            
processDefinition.setCode(CodeGenerateUtils.getInstance().genCode());
+            processDefinition.setCode(CodeGenerateUtils.genCode());
         } catch (CodeGenerateException e) {
             log.error(
                     "Save process definition error because generate process 
definition code error, projectCode:{}.",
@@ -1456,7 +1456,7 @@ public class ProcessDefinitionServiceImpl extends 
BaseServiceImpl implements Pro
             taskDefinitionLog.setOperator(loginUser.getId());
             taskDefinitionLog.setOperateTime(now);
             try {
-                long code = CodeGenerateUtils.getInstance().genCode();
+                long code = CodeGenerateUtils.genCode();
                 taskCodeMap.put(taskDefinitionLog.getCode(), code);
                 taskDefinitionLog.setCode(code);
             } catch (CodeGenerateException e) {
@@ -2074,7 +2074,7 @@ public class ProcessDefinitionServiceImpl extends 
BaseServiceImpl implements Pro
                 Map<Long, Long> taskCodeMap = new HashMap<>();
                 for (TaskDefinitionLog taskDefinitionLog : taskDefinitionLogs) 
{
                     try {
-                        long taskCode = 
CodeGenerateUtils.getInstance().genCode();
+                        long taskCode = CodeGenerateUtils.genCode();
                         taskCodeMap.put(taskDefinitionLog.getCode(), taskCode);
                         taskDefinitionLog.setCode(taskCode);
                     } catch (CodeGenerateException e) {
@@ -2097,7 +2097,7 @@ public class ProcessDefinitionServiceImpl extends 
BaseServiceImpl implements Pro
                 }
                 final long oldProcessDefinitionCode = 
processDefinition.getCode();
                 try {
-                    
processDefinition.setCode(CodeGenerateUtils.getInstance().genCode());
+                    processDefinition.setCode(CodeGenerateUtils.genCode());
                 } catch (CodeGenerateException e) {
                     log.error("Generate process definition code error, 
projectCode:{}.", targetProjectCode, e);
                     putMsg(result, Status.INTERNAL_SERVER_ERROR_ARGS);
diff --git 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProjectParameterServiceImpl.java
 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProjectParameterServiceImpl.java
index e30375e809..e0011096e4 100644
--- 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProjectParameterServiceImpl.java
+++ 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProjectParameterServiceImpl.java
@@ -97,7 +97,7 @@ public class ProjectParameterServiceImpl extends 
BaseServiceImpl implements Proj
                     .builder()
                     .paramName(projectParameterName)
                     .paramValue(projectParameterValue)
-                    .code(CodeGenerateUtils.getInstance().genCode())
+                    .code(CodeGenerateUtils.genCode())
                     .projectCode(projectCode)
                     .userId(loginUser.getId())
                     .createTime(now)
diff --git 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProjectPreferenceServiceImpl.java
 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProjectPreferenceServiceImpl.java
index dcbd3b7456..6274d290d5 100644
--- 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProjectPreferenceServiceImpl.java
+++ 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProjectPreferenceServiceImpl.java
@@ -76,7 +76,7 @@ public class ProjectPreferenceServiceImpl extends 
BaseServiceImpl
             projectPreference.setProjectCode(projectCode);
             projectPreference.setPreferences(preferences);
             projectPreference.setUserId(loginUser.getId());
-            
projectPreference.setCode(CodeGenerateUtils.getInstance().genCode());
+            projectPreference.setCode(CodeGenerateUtils.genCode());
             projectPreference.setState(1);
             projectPreference.setCreateTime(now);
             projectPreference.setUpdateTime(now);
diff --git 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProjectServiceImpl.java
 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProjectServiceImpl.java
index 1a00584a26..b5c329c4fd 100644
--- 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProjectServiceImpl.java
+++ 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProjectServiceImpl.java
@@ -126,7 +126,7 @@ public class ProjectServiceImpl extends BaseServiceImpl 
implements ProjectServic
             project = Project
                     .builder()
                     .name(name)
-                    .code(CodeGenerateUtils.getInstance().genCode())
+                    .code(CodeGenerateUtils.genCode())
                     .description(desc)
                     .userId(loginUser.getId())
                     .userName(loginUser.getUserName())
diff --git 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/TaskDefinitionServiceImpl.java
 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/TaskDefinitionServiceImpl.java
index 4a0c3f8b68..8b01df1319 100644
--- 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/TaskDefinitionServiceImpl.java
+++ 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/TaskDefinitionServiceImpl.java
@@ -265,7 +265,7 @@ public class TaskDefinitionServiceImpl extends 
BaseServiceImpl implements TaskDe
 
         long taskDefinitionCode;
         try {
-            taskDefinitionCode = CodeGenerateUtils.getInstance().genCode();
+            taskDefinitionCode = CodeGenerateUtils.genCode();
         } catch (CodeGenerateException e) {
             throw new ServiceException(Status.INTERNAL_SERVER_ERROR_ARGS);
         }
@@ -338,7 +338,7 @@ public class TaskDefinitionServiceImpl extends 
BaseServiceImpl implements TaskDe
         }
         long taskCode = taskDefinition.getCode();
         if (taskCode == 0) {
-            taskDefinition.setCode(CodeGenerateUtils.getInstance().genCode());
+            taskDefinition.setCode(CodeGenerateUtils.genCode());
         }
         List<ProcessTaskRelationLog> processTaskRelationLogList =
                 
processTaskRelationMapper.queryByProcessCode(processDefinitionCode)
@@ -1264,7 +1264,7 @@ public class TaskDefinitionServiceImpl extends 
BaseServiceImpl implements TaskDe
         List<Long> taskCodes = new ArrayList<>();
         try {
             for (int i = 0; i < genNum; i++) {
-                taskCodes.add(CodeGenerateUtils.getInstance().genCode());
+                taskCodes.add(CodeGenerateUtils.genCode());
             }
         } catch (CodeGenerateException e) {
             log.error("Generate task definition code error.", e);
diff --git 
a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/impl/EnvironmentServiceTest.java
 
b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/impl/EnvironmentServiceTest.java
index b226295e0e..b8161af13d 100644
--- 
a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/impl/EnvironmentServiceTest.java
+++ 
b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/impl/EnvironmentServiceTest.java
@@ -96,9 +96,6 @@ public class EnvironmentServiceTest {
     @Mock
     private ResourcePermissionCheckService resourcePermissionCheckService;
 
-    @Mock
-    private CodeGenerateUtils codeGenerateUtils;
-
     public static final String testUserName = "environmentServerTest";
 
     public static final String environmentName = "Env1";
@@ -141,8 +138,7 @@ public class EnvironmentServiceTest {
                 () -> environmentService.createEnvironment(adminUser, 
"testName", "test", "test", workerGroups));
 
         try (MockedStatic<CodeGenerateUtils> ignored = 
Mockito.mockStatic(CodeGenerateUtils.class)) {
-            
when(CodeGenerateUtils.getInstance()).thenReturn(codeGenerateUtils);
-            
when(codeGenerateUtils.genCode()).thenThrow(CodeGenerateUtils.CodeGenerateException.class);
+            
when(CodeGenerateUtils.genCode()).thenThrow(CodeGenerateUtils.CodeGenerateException.class);
 
             assertThrowsServiceException(Status.INTERNAL_SERVER_ERROR_ARGS,
                     () -> environmentService.createEnvironment(adminUser, 
"testName", "test", "test", workerGroups));
diff --git 
a/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/utils/CodeGenerateUtils.java
 
b/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/utils/CodeGenerateUtils.java
index f35523b59d..3e75264808 100644
--- 
a/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/utils/CodeGenerateUtils.java
+++ 
b/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/utils/CodeGenerateUtils.java
@@ -1,4 +1,6 @@
-/** Copyright 2010-2012 Twitter, Inc.*/
+/**
+ * Copyright 2010-2012 Twitter, Inc.
+ */
 
 package org.apache.dolphinscheduler.common.utils;
 
@@ -6,66 +8,71 @@ import java.net.InetAddress;
 import java.net.UnknownHostException;
 import java.util.Objects;
 
+import lombok.extern.slf4j.Slf4j;
+
 /**
- *  Rewriting based on Twitter snowflake algorithm
+ * Rewriting based on Twitter snowflake algorithm
  */
+@Slf4j
 public class CodeGenerateUtils {
 
-    // start timestamp
-    private static final long START_TIMESTAMP = 1609430400000L; // 2021-01-01 
00:00:00
-    // Each machine generates 32 in the same millisecond
-    private static final long LOW_DIGIT_BIT = 5L;
-    private static final long MIDDLE_BIT = 2L;
-    private static final long MAX_LOW_DIGIT = ~(-1L << LOW_DIGIT_BIT);
-    // The displacement to the left
-    private static final long MIDDLE_LEFT = LOW_DIGIT_BIT;
-    private static final long HIGH_DIGIT_LEFT = LOW_DIGIT_BIT + MIDDLE_BIT;
-    private final long machineHash;
-    private long lowDigit = 0L;
-    private long recordMillisecond = -1L;
-
-    private static final long SYSTEM_TIMESTAMP = System.currentTimeMillis();
-    private static final long SYSTEM_NANOTIME = System.nanoTime();
+    private static final CodeGenerator codeGenerator;
 
-    private CodeGenerateUtils() throws CodeGenerateException {
+    static {
         try {
-            this.machineHash =
-                    
Math.abs(Objects.hash(InetAddress.getLocalHost().getHostName())) % (2 << 
(MIDDLE_BIT - 1));
+            codeGenerator = new 
CodeGenerator(InetAddress.getLocalHost().getHostName() + "-" + 
OSUtils.getProcessID());
         } catch (UnknownHostException e) {
             throw new CodeGenerateException(e.getMessage());
         }
     }
 
-    private static CodeGenerateUtils instance = null;
-
-    public static synchronized CodeGenerateUtils getInstance() throws 
CodeGenerateException {
-        if (instance == null) {
-            instance = new CodeGenerateUtils();
-        }
-        return instance;
+    public static long genCode() throws CodeGenerateException {
+        return codeGenerator.genCode();
     }
 
-    public synchronized long genCode() throws CodeGenerateException {
-        long nowtMillisecond = systemMillisecond();
-        if (nowtMillisecond < recordMillisecond) {
-            throw new CodeGenerateException("New code exception because time 
is set back.");
+    public static class CodeGenerator {
+
+        // start timestamp
+        private static final long START_TIMESTAMP = 1609430400000L; // 
2021-01-01 00:00:00
+        // Each machine generates 32 in the same millisecond
+        private static final long LOW_DIGIT_BIT = 5L;
+        private static final long MACHINE_BIT = 5L;
+        private static final long MAX_LOW_DIGIT = ~(-1L << LOW_DIGIT_BIT);
+        // The displacement to the left
+        private static final long HIGH_DIGIT_LEFT = LOW_DIGIT_BIT + 
MACHINE_BIT;
+        public final long machineHash;
+        private long lowDigit = 0L;
+        private long recordMillisecond = -1L;
+
+        private static final long SYSTEM_TIMESTAMP = 
System.currentTimeMillis();
+        private static final long SYSTEM_NANOTIME = System.nanoTime();
+
+        public CodeGenerator(String appName) {
+            this.machineHash = Math.abs(Objects.hash(appName)) % (1 << 
MACHINE_BIT);
         }
-        if (nowtMillisecond == recordMillisecond) {
-            lowDigit = (lowDigit + 1) & MAX_LOW_DIGIT;
-            if (lowDigit == 0L) {
-                while (nowtMillisecond <= recordMillisecond) {
-                    nowtMillisecond = systemMillisecond();
+
+        public synchronized long genCode() throws CodeGenerateException {
+            long nowtMillisecond = systemMillisecond();
+            if (nowtMillisecond < recordMillisecond) {
+                throw new CodeGenerateException("New code exception because 
time is set back.");
+            }
+            if (nowtMillisecond == recordMillisecond) {
+                lowDigit = (lowDigit + 1) & MAX_LOW_DIGIT;
+                if (lowDigit == 0L) {
+                    while (nowtMillisecond <= recordMillisecond) {
+                        nowtMillisecond = systemMillisecond();
+                    }
                 }
+            } else {
+                lowDigit = 0L;
             }
-        } else {
-            lowDigit = 0L;
+            recordMillisecond = nowtMillisecond;
+            return (nowtMillisecond - START_TIMESTAMP) << HIGH_DIGIT_LEFT | 
machineHash << LOW_DIGIT_BIT | lowDigit;
         }
-        recordMillisecond = nowtMillisecond;
-        return (nowtMillisecond - START_TIMESTAMP) << HIGH_DIGIT_LEFT | 
machineHash << MIDDLE_LEFT | lowDigit;
-    }
 
-    private long systemMillisecond() {
-        return SYSTEM_TIMESTAMP + (System.nanoTime() - SYSTEM_NANOTIME) / 
1000000;
+        private long systemMillisecond() {
+            return SYSTEM_TIMESTAMP + (System.nanoTime() - SYSTEM_NANOTIME) / 
1000000;
+        }
     }
 
     public static class CodeGenerateException extends RuntimeException {
diff --git 
a/dolphinscheduler-common/src/test/java/org/apache/dolphinscheduler/common/utils/CodeGenerateUtilsTest.java
 
b/dolphinscheduler-common/src/test/java/org/apache/dolphinscheduler/common/utils/CodeGenerateUtilsTest.java
index 3871646c95..8cd8ab8e6d 100644
--- 
a/dolphinscheduler-common/src/test/java/org/apache/dolphinscheduler/common/utils/CodeGenerateUtilsTest.java
+++ 
b/dolphinscheduler-common/src/test/java/org/apache/dolphinscheduler/common/utils/CodeGenerateUtilsTest.java
@@ -17,20 +17,59 @@
 
 package org.apache.dolphinscheduler.common.utils;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.util.ArrayList;
 import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.CountDownLatch;
 
-import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
-public class CodeGenerateUtilsTest {
+class CodeGenerateUtilsTest {
 
     @Test
-    public void testNoGenerateDuplicateCode() throws 
CodeGenerateUtils.CodeGenerateException {
-        HashSet<Long> existsCode = new HashSet<>();
-        for (int i = 0; i < 100; i++) {
-            Long currentCode = CodeGenerateUtils.getInstance().genCode();
-            Assertions.assertFalse(existsCode.contains(currentCode));
+    void testNoGenerateDuplicateCode() {
+        int codeNum = 10000000;
+        List<Long> existsCode = new ArrayList<>();
+        for (int i = 0; i < codeNum; i++) {
+            Long currentCode = CodeGenerateUtils.genCode();
             existsCode.add(currentCode);
         }
+        Set<Long> existsCodeSet = new HashSet<>(existsCode);
+        // Disallow duplicate code
+        assertEquals(existsCode.size(), existsCodeSet.size());
+    }
+
+    @Test
+    void testNoGenerateDuplicateCodeWithDifferentAppName() throws 
UnknownHostException, InterruptedException {
+        int threadNum = 10;
+        int codeNum = 1000000;
+
+        final String hostName = InetAddress.getLocalHost().getHostName();
+        Map<String, List<Long>> machineCodes = new ConcurrentHashMap<>();
+        CountDownLatch countDownLatch = new CountDownLatch(threadNum);
+
+        for (int i = 0; i < threadNum; i++) {
+            final int c = i;
+            new Thread(() -> {
+                List<Long> codes = new ArrayList<>(codeNum);
+                CodeGenerateUtils.CodeGenerator codeGenerator = new 
CodeGenerateUtils.CodeGenerator(hostName + "-" + c);
+                for (int j = 0; j < codeNum; j++) {
+                    codes.add(codeGenerator.genCode());
+                }
+                machineCodes.put(Thread.currentThread().getName(), codes);
+                countDownLatch.countDown();
+            }).start();
+        }
+        countDownLatch.await();
+        Set<Long> totalCodes = new HashSet<>();
+        machineCodes.values().forEach(totalCodes::addAll);
+        assertEquals(codeNum * threadNum, totalCodes.size());
     }
 }
diff --git 
a/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/process/ProcessServiceImpl.java
 
b/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/process/ProcessServiceImpl.java
index 40191f6aa3..028ab7651f 100644
--- 
a/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/process/ProcessServiceImpl.java
+++ 
b/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/process/ProcessServiceImpl.java
@@ -1679,7 +1679,7 @@ public class ProcessServiceImpl implements ProcessService 
{
             taskDefinitionLog.setOperateTime(now);
             taskDefinitionLog.setOperator(operator.getId());
             if (taskDefinitionLog.getCode() == 0) {
-                
taskDefinitionLog.setCode(CodeGenerateUtils.getInstance().genCode());
+                taskDefinitionLog.setCode(CodeGenerateUtils.genCode());
             }
             if (taskDefinitionLog.getVersion() == 0) {
                 // init first version
diff --git 
a/dolphinscheduler-tools/src/main/java/org/apache/dolphinscheduler/tools/datasource/dao/ProcessDefinitionDao.java
 
b/dolphinscheduler-tools/src/main/java/org/apache/dolphinscheduler/tools/datasource/dao/ProcessDefinitionDao.java
index 338a9d591d..877f1c9482 100644
--- 
a/dolphinscheduler-tools/src/main/java/org/apache/dolphinscheduler/tools/datasource/dao/ProcessDefinitionDao.java
+++ 
b/dolphinscheduler-tools/src/main/java/org/apache/dolphinscheduler/tools/datasource/dao/ProcessDefinitionDao.java
@@ -100,7 +100,7 @@ public class ProcessDefinitionDao {
                 processDefinition.setId(rs.getInt(1));
                 long code = rs.getLong(2);
                 if (code == 0L) {
-                    code = CodeGenerateUtils.getInstance().genCode();
+                    code = CodeGenerateUtils.genCode();
                 }
                 processDefinition.setCode(code);
                 processDefinition.setVersion(Constants.VERSION_FIRST);
diff --git 
a/dolphinscheduler-tools/src/main/java/org/apache/dolphinscheduler/tools/datasource/dao/ProjectDao.java
 
b/dolphinscheduler-tools/src/main/java/org/apache/dolphinscheduler/tools/datasource/dao/ProjectDao.java
index 65466fe99a..685732337a 100644
--- 
a/dolphinscheduler-tools/src/main/java/org/apache/dolphinscheduler/tools/datasource/dao/ProjectDao.java
+++ 
b/dolphinscheduler-tools/src/main/java/org/apache/dolphinscheduler/tools/datasource/dao/ProjectDao.java
@@ -47,7 +47,7 @@ public class ProjectDao {
                 Integer id = rs.getInt(1);
                 long code = rs.getLong(2);
                 if (code == 0L) {
-                    code = CodeGenerateUtils.getInstance().genCode();
+                    code = CodeGenerateUtils.genCode();
                 }
                 projectMap.put(id, code);
             }
diff --git 
a/dolphinscheduler-tools/src/main/java/org/apache/dolphinscheduler/tools/datasource/upgrader/v200/V200DolphinSchedulerUpgrader.java
 
b/dolphinscheduler-tools/src/main/java/org/apache/dolphinscheduler/tools/datasource/upgrader/v200/V200DolphinSchedulerUpgrader.java
index 35a9be75dc..fd430c2b06 100644
--- 
a/dolphinscheduler-tools/src/main/java/org/apache/dolphinscheduler/tools/datasource/upgrader/v200/V200DolphinSchedulerUpgrader.java
+++ 
b/dolphinscheduler-tools/src/main/java/org/apache/dolphinscheduler/tools/datasource/upgrader/v200/V200DolphinSchedulerUpgrader.java
@@ -206,7 +206,7 @@ public class V200DolphinSchedulerUpgrader implements 
DolphinSchedulerUpgrader {
                 taskDefinitionLog.setName(name);
                 taskDefinitionLog
                         .setWorkerGroup(task.get("workerGroup") == null ? 
"default" : task.get("workerGroup").asText());
-                long taskCode = CodeGenerateUtils.getInstance().genCode();
+                long taskCode = CodeGenerateUtils.genCode();
                 taskDefinitionLog.setCode(taskCode);
                 taskDefinitionLog.setVersion(Constants.VERSION_FIRST);
                 
taskDefinitionLog.setProjectCode(processDefinition.getProjectCode());
diff --git 
a/dolphinscheduler-tools/src/main/java/org/apache/dolphinscheduler/tools/demo/ProcessDefinitionDemo.java
 
b/dolphinscheduler-tools/src/main/java/org/apache/dolphinscheduler/tools/demo/ProcessDefinitionDemo.java
index fb1cfab637..023928575f 100644
--- 
a/dolphinscheduler-tools/src/main/java/org/apache/dolphinscheduler/tools/demo/ProcessDefinitionDemo.java
+++ 
b/dolphinscheduler-tools/src/main/java/org/apache/dolphinscheduler/tools/demo/ProcessDefinitionDemo.java
@@ -85,7 +85,7 @@ public class ProcessDefinitionDemo {
             project = Project
                     .builder()
                     .name("demo")
-                    .code(CodeGenerateUtils.getInstance().genCode())
+                    .code(CodeGenerateUtils.genCode())
                     .description("")
                     .userId(loginUser.getId())
                     .userName(loginUser.getUserName())
@@ -167,7 +167,7 @@ public class ProcessDefinitionDemo {
         List<Long> taskCodes = new ArrayList<>();
         try {
             for (int i = 0; i < 1; i++) {
-                taskCodes.add(CodeGenerateUtils.getInstance().genCode());
+                taskCodes.add(CodeGenerateUtils.genCode());
             }
         } catch (CodeGenerateUtils.CodeGenerateException e) {
             log.error("task code get error, ", e);
@@ -242,7 +242,7 @@ public class ProcessDefinitionDemo {
         List<Long> taskCodes = new ArrayList<>();
         try {
             for (int i = 0; i < 2; i++) {
-                taskCodes.add(CodeGenerateUtils.getInstance().genCode());
+                taskCodes.add(CodeGenerateUtils.genCode());
             }
         } catch (CodeGenerateUtils.CodeGenerateException e) {
             log.error("task code get error, ", e);
@@ -334,7 +334,7 @@ public class ProcessDefinitionDemo {
         List<Long> taskCodes = new ArrayList<>();
         try {
             for (int i = 0; i < 2; i++) {
-                taskCodes.add(CodeGenerateUtils.getInstance().genCode());
+                taskCodes.add(CodeGenerateUtils.genCode());
             }
         } catch (CodeGenerateUtils.CodeGenerateException e) {
             log.error("task code get error, ", e);
@@ -420,7 +420,7 @@ public class ProcessDefinitionDemo {
         List<Long> taskCodes = new ArrayList<>();
         try {
             for (int i = 0; i < 4; i++) {
-                taskCodes.add(CodeGenerateUtils.getInstance().genCode());
+                taskCodes.add(CodeGenerateUtils.genCode());
             }
         } catch (CodeGenerateUtils.CodeGenerateException e) {
             log.error("task code get error, ", e);
@@ -537,7 +537,7 @@ public class ProcessDefinitionDemo {
         List<Long> taskCodes = new ArrayList<>();
         try {
             for (int i = 0; i < 4; i++) {
-                taskCodes.add(CodeGenerateUtils.getInstance().genCode());
+                taskCodes.add(CodeGenerateUtils.genCode());
             }
         } catch (CodeGenerateUtils.CodeGenerateException e) {
             log.error("task code get error, ", e);
@@ -656,7 +656,7 @@ public class ProcessDefinitionDemo {
         List<Long> taskCodes = new ArrayList<>();
         try {
             for (int i = 0; i < 3; i++) {
-                taskCodes.add(CodeGenerateUtils.getInstance().genCode());
+                taskCodes.add(CodeGenerateUtils.genCode());
             }
         } catch (CodeGenerateUtils.CodeGenerateException e) {
             log.error("task code get error, ", e);
@@ -755,7 +755,7 @@ public class ProcessDefinitionDemo {
         List<Long> taskCodes = new ArrayList<>();
         try {
             for (int i = 0; i < 1; i++) {
-                taskCodes.add(CodeGenerateUtils.getInstance().genCode());
+                taskCodes.add(CodeGenerateUtils.genCode());
             }
         } catch (CodeGenerateUtils.CodeGenerateException e) {
             log.error("task code get error, ", e);


Reply via email to