From d0483f903317e34eef786baa3a3f1cd06fafbb90 Mon Sep 17 00:00:00 2001 From: pabloFuente Date: Tue, 13 Oct 2020 19:03:49 +0200 Subject: [PATCH] openvidu-server: close UpdatableTimerTasks on @PreDestroy --- .../io/openvidu/server/core/SessionManager.java | 17 +++++++++++++---- .../openvidu/server/kurento/kms/KmsManager.java | 16 ++++++++++------ .../server/utils/UpdatableTimerTask.java | 2 +- 3 files changed, 24 insertions(+), 11 deletions(-) diff --git a/openvidu-server/src/main/java/io/openvidu/server/core/SessionManager.java b/openvidu-server/src/main/java/io/openvidu/server/core/SessionManager.java index b4475461..75e75e44 100644 --- a/openvidu-server/src/main/java/io/openvidu/server/core/SessionManager.java +++ b/openvidu-server/src/main/java/io/openvidu/server/core/SessionManager.java @@ -87,6 +87,8 @@ public abstract class SessionManager { public FormatChecker formatChecker = new FormatChecker(); + private UpdatableTimerTask sessionGarbageCollectorTimer; + final protected ConcurrentMap sessions = new ConcurrentHashMap<>(); final protected ConcurrentMap sessionsNotActive = new ConcurrentHashMap<>(); protected ConcurrentMap> sessionidParticipantpublicidParticipant = new ConcurrentHashMap<>(); @@ -165,8 +167,9 @@ public abstract class SessionManager { public abstract String getParticipantPrivateIdFromStreamId(String sessionId, String streamId) throws OpenViduException; - - public abstract void onVideoData(Participant participant, Integer transactionId, Integer height, Integer width, Boolean videoActive, Boolean audioActive); + + public abstract void onVideoData(Participant participant, Integer transactionId, Integer height, Integer width, + Boolean videoActive, Boolean audioActive); /** * Returns a Session given its id @@ -422,6 +425,9 @@ public abstract class SessionManager { log.warn("Error closing session '{}': {}", sessionId, e.getMessage()); } } + if (this.sessionGarbageCollectorTimer != null) { + this.sessionGarbageCollectorTimer.cancelTimer(); + } } @PostConstruct @@ -431,7 +437,8 @@ public abstract class SessionManager { "Garbage collector for non active sessions is disabled (property 'OPENVIDU_SESSIONS_GARBAGE_INTERVAL' is 0)"); return; } - new UpdatableTimerTask(() -> { + + this.sessionGarbageCollectorTimer = new UpdatableTimerTask(() -> { // Remove all non active sessions created more than the specified time log.info("Running non active sessions garbage collector..."); @@ -477,7 +484,9 @@ public abstract class SessionManager { log.warn("Possible ghost session {}", sessionActive.getSessionId()); } } - }, () -> new Long(openviduConfig.getSessionGarbageInterval() * 1000)).updateTimer(); + }, () -> new Long(openviduConfig.getSessionGarbageInterval() * 1000)); + + this.sessionGarbageCollectorTimer.updateTimer(); log.info( "Garbage collector for non active sessions initialized. Running every {} seconds and cleaning up non active Sessions more than {} seconds old", diff --git a/openvidu-server/src/main/java/io/openvidu/server/kurento/kms/KmsManager.java b/openvidu-server/src/main/java/io/openvidu/server/kurento/kms/KmsManager.java index a77c718f..c63c3ebf 100644 --- a/openvidu-server/src/main/java/io/openvidu/server/kurento/kms/KmsManager.java +++ b/openvidu-server/src/main/java/io/openvidu/server/kurento/kms/KmsManager.java @@ -57,6 +57,8 @@ public abstract class KmsManager { private Map kmsReconnectionLocks = new ConcurrentHashMap<>(); + private UpdatableTimerTask kurentoReconnectTimer; + public class KmsLoad implements Comparable { private Kms kms; @@ -231,10 +233,9 @@ public abstract class KmsManager { // TODO: this is a fix for the lack of reconnected event kmsReconnectionLocks.putIfAbsent(kms.getId(), new ReentrantLock()); - final UpdatableTimerTask[] TIMER = new UpdatableTimerTask[1]; final AtomicInteger ITERATION = new AtomicInteger(0); - TIMER[0] = new UpdatableTimerTask(() -> { + kurentoReconnectTimer = new UpdatableTimerTask(() -> { boolean lockAcquired = false; try { if (kmsReconnectionLocks.get(kms.getId()).tryLock(5, TimeUnit.SECONDS)) { @@ -245,7 +246,7 @@ public abstract class KmsManager { log.info( "Timer of KMS with uri {} and KurentoClient [{}] cancelled (reconnected event received during interval wait)", kms.getUri(), kms.getKurentoClient().toString()); - TIMER[0].cancelTimer(); + kurentoReconnectTimer.cancelTimer(); return; } @@ -253,14 +254,14 @@ public abstract class KmsManager { log.info( "Timer of KMS with uri {} and KurentoClient [{}] has been closed. Cancelling Timer", kms.getUri(), kms.getKurentoClient().toString()); - TIMER[0].cancelTimer(); + kurentoReconnectTimer.cancelTimer(); return; } kms.getKurentoClient().getServerManager().getInfo(); log.info("According to Timer KMS with uri {} and KurentoClient [{}] is now reconnected", kms.getUri(), kms.getKurentoClient().toString()); - TIMER[0].cancelTimer(); + kurentoReconnectTimer.cancelTimer(); kms.setKurentoClientConnected(true); kms.setTimeOfKurentoClientConnection(System.currentTimeMillis()); @@ -296,7 +297,7 @@ public abstract class KmsManager { } }, () -> new Long(dynamicReconnectLoopSeconds(ITERATION.getAndIncrement()) * 1000)); - TIMER[0].updateTimer(); + kurentoReconnectTimer.updateTimer(); } @Override @@ -365,6 +366,9 @@ public abstract class KmsManager { this.kmss.values().forEach(kms -> { kms.getKurentoClient().destroy(); }); + if (kurentoReconnectTimer != null) { + kurentoReconnectTimer.cancelTimer(); + } } public static String generateKmsId() { diff --git a/openvidu-server/src/main/java/io/openvidu/server/utils/UpdatableTimerTask.java b/openvidu-server/src/main/java/io/openvidu/server/utils/UpdatableTimerTask.java index d94122e5..6a59836b 100644 --- a/openvidu-server/src/main/java/io/openvidu/server/utils/UpdatableTimerTask.java +++ b/openvidu-server/src/main/java/io/openvidu/server/utils/UpdatableTimerTask.java @@ -67,7 +67,7 @@ public class UpdatableTimerTask extends TimerTask { try { task.run(); } catch (Exception e) { - log.error("Exception running UpdatableTimerTask: {}", e.getMessage()); + log.error("Exception running UpdatableTimerTask: {} - {}", e.getMessage(), e.getStackTrace()); } updateTimer(); }