diff --git a/openvidu-server/src/main/java/io/openvidu/server/cdr/CallDetailRecord.java b/openvidu-server/src/main/java/io/openvidu/server/cdr/CallDetailRecord.java index c94fe5cc..4a391118 100644 --- a/openvidu-server/src/main/java/io/openvidu/server/cdr/CallDetailRecord.java +++ b/openvidu-server/src/main/java/io/openvidu/server/cdr/CallDetailRecord.java @@ -76,8 +76,8 @@ import io.openvidu.server.webhook.CDRLoggerWebhook; * - size: number * - status: string * - webrtcConnectionDestroyed.reason: "unsubscribe", "unpublish", "disconnect", "networkDisconnect", "mediaServerDisconnect", "openviduServerStopped" - * - participantLeft.reason: "unsubscribe", "unpublish", "disconnect", "networkDisconnect", "openviduServerStopped" - * - sessionDestroyed.reason: "lastParticipantLeft", "openviduServerStopped" + * - participantLeft.reason: "unsubscribe", "unpublish", "disconnect", "networkDisconnect", "mediaServerDisconnect", "openviduServerStopped" + * - sessionDestroyed.reason: "lastParticipantLeft", "mediaServerDisconnect", "openviduServerStopped" * - recordingStopped.reason: "recordingStoppedByServer", "lastParticipantLeft", "sessionClosedByServer", "automaticStop", "mediaServerDisconnect", "openviduServerStopped" * * [OPTIONAL_PROPERTIES]: @@ -210,8 +210,11 @@ public class CallDetailRecord { RecordingManager.finalReason(reason), timestamp); this.log(recordingStoppedEvent); - // Summary: update ended recording - sessionManager.getAccumulatedRecordings(recording.getSessionId()).add(recordingStoppedEvent); + // FIXME: Summary: update ended recording if recordSessionDestroyed has not been + // already called + if (sessionManager.getAccumulatedRecordings(recording.getSessionId()) != null) { + sessionManager.getAccumulatedRecordings(recording.getSessionId()).add(recordingStoppedEvent); + } } public void recordRecordingStatusChanged(Recording recording, EndReason finalReason, long timestamp, 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 476ab259..0d3051aa 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 @@ -20,6 +20,7 @@ package io.openvidu.server.kurento.core; import java.util.Arrays; import java.util.Collections; import java.util.HashSet; +import java.util.NoSuchElementException; import java.util.Set; import org.kurento.client.GenericMediaElement; @@ -90,7 +91,13 @@ public class KurentoSessionManager extends SessionManager { openviduConfig, recordingManager); } - Kms lessLoadedKms = this.kmsManager.getLessLoadedKms(); + Kms lessLoadedKms = null; + try { + lessLoadedKms = this.kmsManager.getLessLoadedKms(); + } catch (NoSuchElementException e) { + throw new OpenViduException(Code.ROOM_CANNOT_BE_CREATED_ERROR_CODE, + "There is no available media server where to initialize session '" + sessionId + "'"); + } log.info("KMS less loaded is {} with a load of {}", lessLoadedKms.getUri(), lessLoadedKms.getLoad()); kSession = createSession(sessionNotActive, lessLoadedKms); } @@ -301,9 +308,10 @@ public class KurentoSessionManager extends SessionManager { // Abort automatic recording stop (user published before timeout) log.info("Participant {} published before timeout finished. Aborting automatic recording stop", participant.getParticipantPublicId()); - boolean stopAborted = recordingManager.abortAutomaticRecordingStopThread(kSession); + boolean stopAborted = recordingManager.abortAutomaticRecordingStopThread(kSession, + EndReason.automaticStop); if (stopAborted) { - log.info("Automatic recording stopped succesfully aborted"); + log.info("Automatic recording stopped successfully aborted"); } else { log.info("Automatic recording stopped couldn't be aborted. Recording of session {} has stopped", kSession.getSessionId()); diff --git a/openvidu-server/src/main/java/io/openvidu/server/kurento/kms/FixedOneKmsManager.java b/openvidu-server/src/main/java/io/openvidu/server/kurento/kms/FixedOneKmsManager.java index 647901c5..f2b58843 100644 --- a/openvidu-server/src/main/java/io/openvidu/server/kurento/kms/FixedOneKmsManager.java +++ b/openvidu-server/src/main/java/io/openvidu/server/kurento/kms/FixedOneKmsManager.java @@ -17,21 +17,22 @@ package io.openvidu.server.kurento.kms; +import java.util.List; + import org.kurento.client.KurentoClient; import org.kurento.commons.exception.KurentoException; public class FixedOneKmsManager extends KmsManager { @Override - protected void initializeKurentoClients() { - final String kmsUri = this.openviduConfig.getKmsUris().get(0); + public void initializeKurentoClients(List kmsUris) throws Exception { + final String kmsUri = kmsUris.get(0); KurentoClient kClient = null; try { kClient = KurentoClient.create(kmsUri, this.generateKurentoConnectionListener(kmsUri)); } catch (KurentoException e) { log.error("KMS in {} is not reachable by OpenVidu Server", kmsUri); - log.error("Shutting down OpenVidu Server"); - System.exit(1); + throw new Exception(); } Kms kms = new Kms(kmsUri, kClient, loadManager); kms.setKurentoClientConnected(true); 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 0348fca7..67d6162c 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 @@ -22,6 +22,7 @@ import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.NoSuchElementException; import java.util.concurrent.ConcurrentHashMap; import javax.annotation.PostConstruct; @@ -89,24 +90,19 @@ public abstract class KmsManager { this.kmss.put(kms.getUri(), kms); } - public synchronized void removeKms(Kms kms) { - this.kmss.remove(kms.getUri()); + public synchronized void removeKms(String kmsUri) { + this.kmss.remove(kmsUri); } - public synchronized Kms getLessLoadedKms() { + public synchronized Kms getLessLoadedKms() throws NoSuchElementException { return Collections.min(getKmsLoads()).kms; } - public synchronized Kms getNextLessLoadedKms() { - List sortedLoads = getKmssSortedByLoad(); - if (sortedLoads.size() > 1) { - return sortedLoads.get(1).kms; - } else { - return sortedLoads.get(0).kms; - } + public Kms getKms(String kmsUri) { + return this.kmss.get(kmsUri); } - public synchronized Collection getKmss() { + public Collection getKmss() { return this.kmss.values(); } @@ -179,11 +175,17 @@ public abstract class KmsManager { }; } - protected abstract void initializeKurentoClients(); + public abstract void initializeKurentoClients(List kmsUris) throws Exception; @PostConstruct - protected void postConstruct() { - this.initializeKurentoClients(); + private void postConstruct() { + try { + this.initializeKurentoClients(this.openviduConfig.getKmsUris()); + } catch (Exception e) { + // Some KMS wasn't reachable + log.error("Shutting down OpenVidu Server"); + System.exit(1); + } } } diff --git a/openvidu-server/src/main/java/io/openvidu/server/recording/service/RecordingManager.java b/openvidu-server/src/main/java/io/openvidu/server/recording/service/RecordingManager.java index ed3282eb..15968dec 100644 --- a/openvidu-server/src/main/java/io/openvidu/server/recording/service/RecordingManager.java +++ b/openvidu-server/src/main/java/io/openvidu/server/recording/service/RecordingManager.java @@ -226,7 +226,7 @@ public class RecordingManager { recording = this.singleStreamRecordingService.stopRecording(session, recording, reason); break; } - this.abortAutomaticRecordingStopThread(session); + this.abortAutomaticRecordingStopThread(session, reason); return recording; } @@ -248,7 +248,7 @@ public class RecordingManager { kmsDisconnectionTime); break; } - this.abortAutomaticRecordingStopThread(session); + this.abortAutomaticRecordingStopThread(session, reason); return recording; } @@ -433,7 +433,7 @@ public class RecordingManager { this.automaticRecordingStopThreads.putIfAbsent(session.getSessionId(), future); } - public boolean abortAutomaticRecordingStopThread(Session session) { + public boolean abortAutomaticRecordingStopThread(Session session, EndReason reason) { ScheduledFuture future = this.automaticRecordingStopThreads.remove(session.getSessionId()); if (future != null) { boolean cancelled = future.cancel(false); @@ -445,7 +445,7 @@ public class RecordingManager { log.info( "Ongoing recording of session {} was explicetly stopped within timeout for automatic recording stop. Closing session", session.getSessionId()); - sessionManager.closeSessionAndEmptyCollections(session, EndReason.automaticStop); + sessionManager.closeSessionAndEmptyCollections(session, reason); sessionManager.showTokens(); } return cancelled;