diff --git a/openvidu-server/src/main/java/io/openvidu/server/kurento/core/KurentoSessionManager.java b/openvidu-server/src/main/java/io/openvidu/server/kurento/core/KurentoSessionManager.java index 6e1c3bd1..5d9cdb5f 100644 --- a/openvidu-server/src/main/java/io/openvidu/server/kurento/core/KurentoSessionManager.java +++ b/openvidu-server/src/main/java/io/openvidu/server/kurento/core/KurentoSessionManager.java @@ -82,6 +82,7 @@ public class KurentoSessionManager extends SessionManager { @Override public synchronized void joinRoom(Participant participant, String sessionId, Integer transactionId) { Set existingParticipants = null; + boolean lockAcquired = false; try { KurentoSession kSession = (KurentoSession) sessions.get(sessionId); @@ -99,6 +100,9 @@ public class KurentoSessionManager extends SessionManager { openviduConfig, recordingManager); } + lockAcquired = true; + KmsManager.selectAndRemoveKmsLock.lock(); + Kms lessLoadedKms = null; try { lessLoadedKms = this.kmsManager.getLessLoadedAndRunningKms(); @@ -126,6 +130,10 @@ public class KurentoSessionManager extends SessionManager { log.warn("PARTICIPANT {}: Error joining/creating session {}", participant.getParticipantPublicId(), sessionId, e); sessionEventsHandler.onParticipantJoined(participant, sessionId, null, transactionId, e); + } finally { + if (lockAcquired) { + KmsManager.selectAndRemoveKmsLock.unlock(); + } } if (existingParticipants != null) { sessionEventsHandler.onParticipantJoined(participant, sessionId, existingParticipants, transactionId, null); 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 237a6478..31400352 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 @@ -24,6 +24,8 @@ import java.util.List; import java.util.Map; import java.util.NoSuchElementException; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; import java.util.stream.Collectors; import javax.annotation.PostConstruct; @@ -41,6 +43,8 @@ import io.openvidu.server.utils.MediaNodeStatusManager; public abstract class KmsManager { + public static final Lock selectAndRemoveKmsLock = new ReentrantLock(true); + public class KmsLoad implements Comparable { private Kms kms;