From 6b64f1f8ba4230c6d57ee415d4dff68db0ffbe8c Mon Sep 17 00:00:00 2001 From: Qiong Zhou Date: Wed, 20 May 2026 21:06:57 +0800 Subject: [PATCH 1/2] Fix issue #18274 After database out of service for longer than session timeout time, client heartbeat will never be updated --- .../jdbc/mapper/JdbcRegistryClientHeartbeatMapper.java | 7 +++++++ .../jdbc/repository/JdbcRegistryClientRepository.java | 6 ++++++ .../plugin/registry/jdbc/server/JdbcRegistryServer.java | 2 +- 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/dolphinscheduler-registry/dolphinscheduler-registry-plugins/dolphinscheduler-registry-jdbc/src/main/java/org/apache/dolphinscheduler/plugin/registry/jdbc/mapper/JdbcRegistryClientHeartbeatMapper.java b/dolphinscheduler-registry/dolphinscheduler-registry-plugins/dolphinscheduler-registry-jdbc/src/main/java/org/apache/dolphinscheduler/plugin/registry/jdbc/mapper/JdbcRegistryClientHeartbeatMapper.java index 2b8499bb4812..be15b0253e59 100644 --- a/dolphinscheduler-registry/dolphinscheduler-registry-plugins/dolphinscheduler-registry-jdbc/src/main/java/org/apache/dolphinscheduler/plugin/registry/jdbc/mapper/JdbcRegistryClientHeartbeatMapper.java +++ b/dolphinscheduler-registry/dolphinscheduler-registry-plugins/dolphinscheduler-registry-jdbc/src/main/java/org/apache/dolphinscheduler/plugin/registry/jdbc/mapper/JdbcRegistryClientHeartbeatMapper.java @@ -19,6 +19,7 @@ import org.apache.dolphinscheduler.plugin.registry.jdbc.model.DO.JdbcRegistryClientHeartbeat; +import org.apache.ibatis.annotations.Insert; import org.apache.ibatis.annotations.Select; import java.util.List; @@ -30,4 +31,10 @@ public interface JdbcRegistryClientHeartbeatMapper extends BaseMapper selectAll(); + @Insert("INSERT INTO t_ds_jdbc_registry_client_heartbeat(id, client_name, last_heartbeat_time, connection_config, create_time) " + + + "VALUES(#{id}, #{clientName}, #{lastHeartbeatTime}, #{connectionConfig}, NOW()) " + + "ON DUPLICATE KEY UPDATE " + + "last_heartbeat_time = #{lastHeartbeatTime}") + void upsert(JdbcRegistryClientHeartbeat clientHeartbeat); } diff --git a/dolphinscheduler-registry/dolphinscheduler-registry-plugins/dolphinscheduler-registry-jdbc/src/main/java/org/apache/dolphinscheduler/plugin/registry/jdbc/repository/JdbcRegistryClientRepository.java b/dolphinscheduler-registry/dolphinscheduler-registry-plugins/dolphinscheduler-registry-jdbc/src/main/java/org/apache/dolphinscheduler/plugin/registry/jdbc/repository/JdbcRegistryClientRepository.java index 1791f3c942aa..12c0fb924d14 100644 --- a/dolphinscheduler-registry/dolphinscheduler-registry-plugins/dolphinscheduler-registry-jdbc/src/main/java/org/apache/dolphinscheduler/plugin/registry/jdbc/repository/JdbcRegistryClientRepository.java +++ b/dolphinscheduler-registry/dolphinscheduler-registry-plugins/dolphinscheduler-registry-jdbc/src/main/java/org/apache/dolphinscheduler/plugin/registry/jdbc/repository/JdbcRegistryClientRepository.java @@ -58,6 +58,12 @@ public boolean updateById(JdbcRegistryClientHeartbeatDTO jdbcRegistryClientHeart return jdbcRegistryClientHeartbeatMapper.updateById(jdbcRegistryClientHeartbeat) == 1; } + public void upsert(JdbcRegistryClientHeartbeatDTO clientHeartbeatDTO) { + JdbcRegistryClientHeartbeat clientHeartbeat = + JdbcRegistryClientHeartbeatDTO.toJdbcRegistryClientHeartbeat(clientHeartbeatDTO); + jdbcRegistryClientHeartbeatMapper.upsert(clientHeartbeat); + } + public void insert(JdbcRegistryClientHeartbeatDTO jdbcRegistryClient) { checkNotNull(jdbcRegistryClient.getId()); JdbcRegistryClientHeartbeat jdbcRegistryClientHeartbeat = diff --git a/dolphinscheduler-registry/dolphinscheduler-registry-plugins/dolphinscheduler-registry-jdbc/src/main/java/org/apache/dolphinscheduler/plugin/registry/jdbc/server/JdbcRegistryServer.java b/dolphinscheduler-registry/dolphinscheduler-registry-plugins/dolphinscheduler-registry-jdbc/src/main/java/org/apache/dolphinscheduler/plugin/registry/jdbc/server/JdbcRegistryServer.java index 3e8b11c81351..6b19d2b66a68 100644 --- a/dolphinscheduler-registry/dolphinscheduler-registry-plugins/dolphinscheduler-registry-jdbc/src/main/java/org/apache/dolphinscheduler/plugin/registry/jdbc/server/JdbcRegistryServer.java +++ b/dolphinscheduler-registry/dolphinscheduler-registry-plugins/dolphinscheduler-registry-jdbc/src/main/java/org/apache/dolphinscheduler/plugin/registry/jdbc/server/JdbcRegistryServer.java @@ -340,7 +340,7 @@ private void refreshClientsHeartbeat() { } JdbcRegistryClientHeartbeatDTO clone = jdbcRegistryClientHeartbeatDTO.clone(); clone.setLastHeartbeatTime(now); - jdbcRegistryClientRepository.updateById(jdbcRegistryClientHeartbeatDTO); + jdbcRegistryClientRepository.upsert(jdbcRegistryClientHeartbeatDTO); jdbcRegistryClientHeartbeatDTO.setLastHeartbeatTime(clone.getLastHeartbeatTime()); } if (jdbcRegistryServerState == JdbcRegistryServerState.SUSPENDED) { From e14254bcd43ae898535d59583a4a5031b790a085 Mon Sep 17 00:00:00 2001 From: Qiong Zhou Date: Thu, 21 May 2026 11:30:29 +0800 Subject: [PATCH 2/2] Fix issue #18274 After database out of service for longer than session timeout time, client heartbeat will never be updated --- .../jdbc/mapper/JdbcRegistryClientHeartbeatMapper.java | 8 -------- .../jdbc/repository/JdbcRegistryClientRepository.java | 5 ++++- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/dolphinscheduler-registry/dolphinscheduler-registry-plugins/dolphinscheduler-registry-jdbc/src/main/java/org/apache/dolphinscheduler/plugin/registry/jdbc/mapper/JdbcRegistryClientHeartbeatMapper.java b/dolphinscheduler-registry/dolphinscheduler-registry-plugins/dolphinscheduler-registry-jdbc/src/main/java/org/apache/dolphinscheduler/plugin/registry/jdbc/mapper/JdbcRegistryClientHeartbeatMapper.java index be15b0253e59..d1878cfb583f 100644 --- a/dolphinscheduler-registry/dolphinscheduler-registry-plugins/dolphinscheduler-registry-jdbc/src/main/java/org/apache/dolphinscheduler/plugin/registry/jdbc/mapper/JdbcRegistryClientHeartbeatMapper.java +++ b/dolphinscheduler-registry/dolphinscheduler-registry-plugins/dolphinscheduler-registry-jdbc/src/main/java/org/apache/dolphinscheduler/plugin/registry/jdbc/mapper/JdbcRegistryClientHeartbeatMapper.java @@ -19,7 +19,6 @@ import org.apache.dolphinscheduler.plugin.registry.jdbc.model.DO.JdbcRegistryClientHeartbeat; -import org.apache.ibatis.annotations.Insert; import org.apache.ibatis.annotations.Select; import java.util.List; @@ -30,11 +29,4 @@ public interface JdbcRegistryClientHeartbeatMapper extends BaseMapper selectAll(); - - @Insert("INSERT INTO t_ds_jdbc_registry_client_heartbeat(id, client_name, last_heartbeat_time, connection_config, create_time) " - + - "VALUES(#{id}, #{clientName}, #{lastHeartbeatTime}, #{connectionConfig}, NOW()) " + - "ON DUPLICATE KEY UPDATE " + - "last_heartbeat_time = #{lastHeartbeatTime}") - void upsert(JdbcRegistryClientHeartbeat clientHeartbeat); } diff --git a/dolphinscheduler-registry/dolphinscheduler-registry-plugins/dolphinscheduler-registry-jdbc/src/main/java/org/apache/dolphinscheduler/plugin/registry/jdbc/repository/JdbcRegistryClientRepository.java b/dolphinscheduler-registry/dolphinscheduler-registry-plugins/dolphinscheduler-registry-jdbc/src/main/java/org/apache/dolphinscheduler/plugin/registry/jdbc/repository/JdbcRegistryClientRepository.java index 12c0fb924d14..47bed6a95d1e 100644 --- a/dolphinscheduler-registry/dolphinscheduler-registry-plugins/dolphinscheduler-registry-jdbc/src/main/java/org/apache/dolphinscheduler/plugin/registry/jdbc/repository/JdbcRegistryClientRepository.java +++ b/dolphinscheduler-registry/dolphinscheduler-registry-plugins/dolphinscheduler-registry-jdbc/src/main/java/org/apache/dolphinscheduler/plugin/registry/jdbc/repository/JdbcRegistryClientRepository.java @@ -61,7 +61,10 @@ public boolean updateById(JdbcRegistryClientHeartbeatDTO jdbcRegistryClientHeart public void upsert(JdbcRegistryClientHeartbeatDTO clientHeartbeatDTO) { JdbcRegistryClientHeartbeat clientHeartbeat = JdbcRegistryClientHeartbeatDTO.toJdbcRegistryClientHeartbeat(clientHeartbeatDTO); - jdbcRegistryClientHeartbeatMapper.upsert(clientHeartbeat); + int row = jdbcRegistryClientHeartbeatMapper.updateById(clientHeartbeat); + if (row == 0) { + jdbcRegistryClientHeartbeatMapper.insert(clientHeartbeat); + } } public void insert(JdbcRegistryClientHeartbeatDTO jdbcRegistryClient) {