From 847b13202cb909d18ca3304c27ebe17ce2312b8e Mon Sep 17 00:00:00 2001 From: Janis Date: Mon, 4 May 2026 22:45:45 +0200 Subject: [PATCH] fix(redis): prevent concurrent Redis heartbeat refreshes using AtomicBoolean --- .../chess/service/InstanceHeartbeatService.scala | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/modules/core/src/main/scala/de/nowchess/chess/service/InstanceHeartbeatService.scala b/modules/core/src/main/scala/de/nowchess/chess/service/InstanceHeartbeatService.scala index 3ed5a04..941fe3a 100644 --- a/modules/core/src/main/scala/de/nowchess/chess/service/InstanceHeartbeatService.scala +++ b/modules/core/src/main/scala/de/nowchess/chess/service/InstanceHeartbeatService.scala @@ -11,6 +11,7 @@ import io.quarkus.redis.datasource.RedisDataSource import io.quarkus.redis.datasource.ReactiveRedisDataSource import scala.compiletime.uninitialized import java.util.concurrent.{Executors, TimeUnit} +import java.util.concurrent.atomic.AtomicBoolean import java.net.InetAddress import com.fasterxml.jackson.databind.ObjectMapper import org.jboss.logging.Logger @@ -55,6 +56,7 @@ class InstanceHeartbeatService: private var serviceActive = false private var shuttingDown = false // scalafix:on DisableSyntax.var + private val redisHeartbeatPending = new AtomicBoolean(false) def onStart(@Observes event: StartupEvent): Unit = if coordinatorEnabled then @@ -171,6 +173,7 @@ class InstanceHeartbeatService: } private def refreshRedisHeartbeat(): Unit = + if !redisHeartbeatPending.compareAndSet(false, true) then return try val key = s"$redisPrefix:instances:$instanceId" @@ -191,11 +194,14 @@ class InstanceHeartbeatService: .setex(key, 5L, json) .subscribe() .`with`( - _ => (), - (ex: Throwable) => log.warnf(ex, "Failed to refresh Redis heartbeat"), + _ => redisHeartbeatPending.set(false), + (ex: Throwable) => + redisHeartbeatPending.set(false) + log.warnf(ex, "Failed to refresh Redis heartbeat"), ) catch case ex: Exception => + redisHeartbeatPending.set(false) log.warnf(ex, "Failed to serialize Redis heartbeat metadata") private def getHostname: String =