From 0d00ad8fee1822affad597730bf8ef0b922e3c9b Mon Sep 17 00:00:00 2001 From: pabloFuente Date: Sat, 26 Sep 2020 17:13:37 +0200 Subject: [PATCH] openvidu-server: fix close session with recording in starting status --- .../recording/service/RecordingManager.java | 33 ++++++++++++++----- 1 file changed, 25 insertions(+), 8 deletions(-) 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 2a281104..a63533c4 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 @@ -280,12 +280,10 @@ public class RecordingManager { this.cdr.recordRecordingStatusChanged(recording, null, recording.getCreatedAt(), Status.started); - if (!((properties.outputMode().equals(OutputMode.COMPOSED) - || properties.outputMode().equals(OutputMode.COMPOSED_QUICK_START)) - && properties.hasVideo())) { + if (!(OutputMode.COMPOSED.equals(properties.outputMode()) && properties.hasVideo())) { // Directly send recording started notification for all cases except for - // COMPOSED/COMPOSED_QUICK_START recordings with video (will be sent on first - // RECORDER subscriber) + // COMPOSED recordings with video (will be sent on first RECORDER subscriber) + // Both INDIVIDUAL and COMPOSED_QUICK_START should notify immediately this.sessionHandler.sendRecordingStartedNotification(session, recording); } if (session.getActivePublishers() == 0) { @@ -320,7 +318,19 @@ public class RecordingManager { recording = this.sessionsRecordings.get(session.getSessionId()); } - recording = ((RecordingService) singleStreamRecordingService).sealRecordingMetadataFileAsStopped(recording); + if (recording == null) { + recording = this.sessionsRecordingsStarting.get(session.getSessionId()); + if (recording == null) { + log.error("Cannot stop recording. Session {} is not being recorded", recordingId, + session.getSessionId()); + return null; + } else { + // Recording is still starting + log.warn("Recording {} is still in \"starting\" status", recording.getId()); + } + } + + ((RecordingService) singleStreamRecordingService).sealRecordingMetadataFileAsStopped(recording); final long timestamp = System.currentTimeMillis(); this.cdr.recordRecordingStatusChanged(recording, reason, timestamp, Status.stopped); @@ -412,8 +422,15 @@ public class RecordingManager { public void stopOneIndividualStreamRecording(KurentoSession session, String streamId, long kmsDisconnectionTime) { Recording recording = this.sessionsRecordings.get(session.getSessionId()); if (recording == null) { - log.error("Cannot stop recording of existing stream {}. Session {} is not being recorded", streamId, - session.getSessionId()); + recording = this.sessionsRecordingsStarting.get(session.getSessionId()); + if (recording == null) { + log.error("Cannot stop recording of existing stream {}. Session {} is not being recorded", streamId, + session.getSessionId()); + return; + } else { + // Recording is still starting + log.warn("Recording {} is still in \"starting\" status", recording.getId()); + } } if (OutputMode.INDIVIDUAL.equals(recording.getOutputMode())) { // Stop specific RecorderEndpoint for this stream