From 0a1d33f8bce227801440927d03c54d2c963f10cf Mon Sep 17 00:00:00 2001 From: Mykyta Leonov Date: Thu, 6 Jul 2023 01:00:56 +0300 Subject: [PATCH] Fix race condition causing unexpected idle disconnections This issue may appear when 'send[data]' methods are triggered from different threads. As a result threads race appears between cancelIdleTimeoutExecutor and scheduling new idle task. Example of race: 1. Thread 1 cancels task 2. Thread 2 waits until thread 1 will finish 3. Thread 1 finishes 4. Thread 2 tries to cancel already cancelled task and leaves synchronized block 5. Thread 1 schedules new idle task 6. Thread 2 schedules another idle task, the first is overwritten and never cancelled. As a result disconnection is triggered precisely after set idle timeout passes. Signed-off-by: Mykyta Leonov --- core/src/main/java/org/glassfish/tyrus/core/TyrusSession.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/core/src/main/java/org/glassfish/tyrus/core/TyrusSession.java b/core/src/main/java/org/glassfish/tyrus/core/TyrusSession.java index a7e2df5e..20161f0c 100755 --- a/core/src/main/java/org/glassfish/tyrus/core/TyrusSession.java +++ b/core/src/main/java/org/glassfish/tyrus/core/TyrusSession.java @@ -482,9 +482,8 @@ public void setHeartbeatInterval(long heartbeatInterval) { } void restartIdleTimeoutExecutor() { - cancelIdleTimeoutExecutor(); - synchronized (idleTimeoutLock) { + cancelIdleTimeoutExecutor(); idleTimeoutFuture = service.schedule(new IdleTimeoutCommand(), this.getMaxIdleTimeout(), TimeUnit.MILLISECONDS); }