From 3a61ce0f8636e8a36083e9bb263064f114db15b0 Mon Sep 17 00:00:00 2001 From: pabloFuente Date: Sat, 26 Sep 2020 01:12:25 +0200 Subject: [PATCH] openvidu-server: fix recording started client event --- .../server/core/SessionEventsHandler.java | 30 +++++++------------ .../recording/service/RecordingManager.java | 10 +++++-- 2 files changed, 18 insertions(+), 22 deletions(-) diff --git a/openvidu-server/src/main/java/io/openvidu/server/core/SessionEventsHandler.java b/openvidu-server/src/main/java/io/openvidu/server/core/SessionEventsHandler.java index 982d96f5..bee845f2 100644 --- a/openvidu-server/src/main/java/io/openvidu/server/core/SessionEventsHandler.java +++ b/openvidu-server/src/main/java/io/openvidu/server/core/SessionEventsHandler.java @@ -22,7 +22,6 @@ import java.util.Map; import java.util.Optional; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.locks.ReentrantLock; import java.util.stream.Collectors; import org.kurento.client.GenericMediaEvent; @@ -62,9 +61,7 @@ public class SessionEventsHandler { @Autowired protected OpenviduConfig openviduConfig; - Map recordingsStarted = new ConcurrentHashMap<>(); - - ReentrantLock lock = new ReentrantLock(); + private Map recordingsToSendClientEvents = new ConcurrentHashMap<>(); public void onSessionCreated(Session session) { CDR.recordSessionCreated(session); @@ -290,16 +287,10 @@ public class SessionEventsHandler { rpcNotificationService.sendResponse(participant.getParticipantPrivateId(), transactionId, result); if (ProtocolElements.RECORDER_PARTICIPANT_PUBLICID.equals(participant.getParticipantPublicId())) { - lock.lock(); - try { - Recording recording = this.recordingsStarted.remove(session.getSessionId()); - if (recording != null) { - // RECORDER participant is now receiving video from the first publisher - this.sendRecordingStartedNotification(session, recording); - } - } finally { - lock.unlock(); - } + recordingsToSendClientEvents.computeIfPresent(session.getSessionId(), (key, value) -> { + sendRecordingStartedNotification(session, value); + return null; + }); } } @@ -311,8 +302,9 @@ public class SessionEventsHandler { rpcNotificationService.sendResponse(participant.getParticipantPrivateId(), transactionId, new JsonObject()); } - public void onNetworkQualityChanged(Participant participant, JsonObject params ) { - rpcNotificationService.sendNotification(participant.getParticipantPrivateId(), ProtocolElements.NETWORKQUALITYCHANGED_METHOD, params); + public void onNetworkQualityChanged(Participant participant, JsonObject params) { + rpcNotificationService.sendNotification(participant.getParticipantPrivateId(), + ProtocolElements.NETWORKQUALITYCHANGED_METHOD, params); } public void onSendMessage(Participant participant, JsonObject message, Set participants, @@ -460,7 +452,7 @@ public class SessionEventsHandler { public void sendRecordingStoppedNotification(Session session, Recording recording, EndReason reason) { // Be sure to clean this map (this should return null) - this.recordingsStarted.remove(session.getSessionId()); + recordingsToSendClientEvents.remove(session.getSessionId()); // Filter participants by roles according to "OPENVIDU_RECORDING_NOTIFICATION" Set existingParticipants; @@ -570,8 +562,8 @@ public class SessionEventsHandler { this.rpcNotificationService.closeRpcSession(participantPrivateId); } - public void setRecordingStarted(String sessionId, Recording recording) { - this.recordingsStarted.put(sessionId, recording); + public void storeRecordingToSendClientEvent(Recording recording) { + recordingsToSendClientEvents.put(recording.getSessionId(), recording); } private Set filterParticipantsByRole(OpenViduRole[] roles, Set participants) { 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 f4666ddf..2a281104 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,9 +280,12 @@ public class RecordingManager { this.cdr.recordRecordingStatusChanged(recording, null, recording.getCreatedAt(), Status.started); - if (!(OutputMode.COMPOSED.equals(properties.outputMode()) && properties.hasVideo())) { + if (!((properties.outputMode().equals(OutputMode.COMPOSED) + || properties.outputMode().equals(OutputMode.COMPOSED_QUICK_START)) + && properties.hasVideo())) { // Directly send recording started notification for all cases except for - // COMPOSED recordings with video (will be sent on first RECORDER subscriber) + // COMPOSED/COMPOSED_QUICK_START recordings with video (will be sent on first + // RECORDER subscriber) this.sessionHandler.sendRecordingStartedNotification(session, recording); } if (session.getActivePublishers() == 0) { @@ -835,6 +838,8 @@ public class RecordingManager { || (sessionsRecordingsStarting.putIfAbsent(recording.getSessionId(), recording) != null)) { log.error("Concurrent session recording initialization. Aborting this thread"); throw new RuntimeException("Concurrent initialization of recording " + recording.getId()); + } else { + this.sessionHandler.storeRecordingToSendClientEvent(recording); } } @@ -843,7 +848,6 @@ public class RecordingManager { * collection */ private void recordingFromStartingToStarted(Recording recording) { - this.sessionHandler.setRecordingStarted(recording.getSessionId(), recording); this.sessionsRecordings.put(recording.getSessionId(), recording); this.startingRecordings.remove(recording.getId()); this.sessionsRecordingsStarting.remove(recording.getSessionId());