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 515718be..d7e39e94 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 @@ -65,18 +65,18 @@ public class FixedOneKmsManager extends KmsManager { } @Override - public void incrementActiveRecordings(String mediaNodeId) { + public void incrementActiveRecordings(String mediaNodeId, String recordingId, String sessionId) { try { - this.getKmss().iterator().next().incrementActiveRecordings(); + this.getKmss().iterator().next().incrementActiveRecordings(recordingId, sessionId); } catch (NoSuchElementException e) { log.error("There is no KMS available when incrementing active recordings"); } } @Override - public void decrementActiveRecordings(String mediaNodeId) { + public void decrementActiveRecordings(String mediaNodeId, String recordingId) { try { - this.getKmss().iterator().next().decrementActiveRecordings(); + this.getKmss().iterator().next().decrementActiveRecordings(recordingId); } catch (NoSuchElementException e) { log.error("There is no KMS available when decrementing active recordings"); } diff --git a/openvidu-server/src/main/java/io/openvidu/server/kurento/kms/Kms.java b/openvidu-server/src/main/java/io/openvidu/server/kurento/kms/Kms.java index 0957c3cc..94a260a1 100644 --- a/openvidu-server/src/main/java/io/openvidu/server/kurento/kms/Kms.java +++ b/openvidu-server/src/main/java/io/openvidu/server/kurento/kms/Kms.java @@ -21,9 +21,10 @@ import java.net.MalformedURLException; import java.net.URL; import java.util.Collection; import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicBoolean; -import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; import org.kurento.client.KurentoClient; @@ -65,7 +66,7 @@ public class Kms { private AtomicLong timeOfKurentoClientDisconnection = new AtomicLong(0); private Map kurentoSessions = new ConcurrentHashMap<>(); - private AtomicInteger activeRecordings = new AtomicInteger(0); + private Map activeRecordings = new ConcurrentHashMap<>(); public Kms(KmsProperties props, LoadManager loadManager, QuarantineKiller quarantineKiller) { this.id = props.getId(); @@ -148,16 +149,16 @@ public class Kms { this.kurentoSessions.remove(sessionId); } - public synchronized int getActiveRecordings() { - return this.activeRecordings.get(); + public synchronized Set> getActiveRecordings() { + return this.activeRecordings.entrySet(); } - public synchronized int incrementActiveRecordings() { - return this.activeRecordings.incrementAndGet(); + public synchronized void incrementActiveRecordings(String recordingId, String sessionId) { + this.activeRecordings.put(recordingId, sessionId); } - public synchronized void decrementActiveRecordings() { - this.activeRecordings.updateAndGet(i -> i > 0 ? i - 1 : i); + public synchronized void decrementActiveRecordings(String recordingId) { + this.activeRecordings.remove(recordingId); this.quarantineKiller.dropMediaNode(this.id); } @@ -176,7 +177,7 @@ public class Kms { return json; } - public JsonObject toJsonExtended(boolean withSessions, boolean withExtraInfo) { + public JsonObject toJsonExtended(boolean withSessions, boolean withActiveRecordings, boolean withExtraInfo) { JsonObject json = this.toJson(); @@ -188,6 +189,14 @@ public class Kms { json.add("sessions", sessions); } + if (withActiveRecordings) { + JsonArray activeRecordingsJson = new JsonArray(); + for (String recordingId : this.activeRecordings.keySet()) { + activeRecordingsJson.add(recordingId); + } + json.add("activeRecordings", activeRecordingsJson); + } + if (withExtraInfo) { if (json.get("connected").getAsBoolean()) { 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 bdee263b..93439d99 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 @@ -89,8 +89,8 @@ public abstract class KmsManager { return json; } - public JsonObject toJsonExtended(boolean withSessions, boolean withExtraInfo) { - JsonObject json = this.kms.toJsonExtended(withSessions, withExtraInfo); + public JsonObject toJsonExtended(boolean withSessions, boolean withActiveRecordings, boolean withExtraInfo) { + JsonObject json = this.kms.toJsonExtended(withSessions, withActiveRecordings, withExtraInfo); json.addProperty("load", this.load); return json; } @@ -356,9 +356,9 @@ public abstract class KmsManager { public abstract boolean isMediaNodeAvailableForRecording(String mediaNodeId); - public abstract void incrementActiveRecordings(String mediaNodeId); + public abstract void incrementActiveRecordings(String mediaNodeId, String recordingId, String sessionId); - public abstract void decrementActiveRecordings(String mediaNodeId); + public abstract void decrementActiveRecordings(String mediaNodeId, String recordingId); @PostConstruct protected abstract void postConstructInitKurentoClients(); diff --git a/openvidu-server/src/main/java/io/openvidu/server/recording/service/ComposedRecordingService.java b/openvidu-server/src/main/java/io/openvidu/server/recording/service/ComposedRecordingService.java index c5c931a0..4c705869 100644 --- a/openvidu-server/src/main/java/io/openvidu/server/recording/service/ComposedRecordingService.java +++ b/openvidu-server/src/main/java/io/openvidu/server/recording/service/ComposedRecordingService.java @@ -80,12 +80,8 @@ public class ComposedRecordingService extends RecordingService { } @Override - public Recording startRecording(Session session, RecordingProperties properties) throws OpenViduException { - - PropertiesRecordingId updatePropertiesAndRecordingId = this.setFinalRecordingNameAndGetFreeRecordingId(session, - properties); - properties = updatePropertiesAndRecordingId.properties; - String recordingId = updatePropertiesAndRecordingId.recordingId; + public Recording startRecording(Session session, String recordingId, RecordingProperties properties) + throws OpenViduException { // Instantiate and store recording object Recording recording = new Recording(session.getSessionId(), recordingId, properties); @@ -290,7 +286,8 @@ public class ComposedRecordingService extends RecordingService { cleanRecordingMaps(recordingAux); // Decrement active recordings - kmsManager.decrementActiveRecordings(recordingAux.getRecordingProperties().mediaNode()); + kmsManager.decrementActiveRecordings(recordingAux.getRecordingProperties().mediaNode(), + recordingId); if (i == timeout) { log.error("Container did not launched in {} seconds", timeout / 2); @@ -366,7 +363,8 @@ public class ComposedRecordingService extends RecordingService { // Decrement active recordings once it is downloaded. This method will also drop // the Media Node if no more sessions or recordings and status is // waiting-idle-to-terminate - kmsManager.decrementActiveRecordings(finalRecordingArray[0].getRecordingProperties().mediaNode()); + kmsManager.decrementActiveRecordings(finalRecordingArray[0].getRecordingProperties().mediaNode(), + finalRecordingArray[0].getId()); // Upload if necessary this.uploadRecording(finalRecordingArray[0], reason); @@ -595,7 +593,7 @@ public class ComposedRecordingService extends RecordingService { // Decrement active recordings once it is downloaded. This method will also drop // the Media Node if no more sessions or recordings and status is // waiting-idle-to-terminate - kmsManager.decrementActiveRecordings(recording.getRecordingProperties().mediaNode()); + kmsManager.decrementActiveRecordings(recording.getRecordingProperties().mediaNode(), recording.getId()); // Upload if necessary this.uploadRecording(recording, reason); 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 baebae33..11c87ca7 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 @@ -72,6 +72,7 @@ import io.openvidu.server.kurento.kms.KmsManager; import io.openvidu.server.recording.Recording; import io.openvidu.server.recording.RecordingDownloader; import io.openvidu.server.recording.RecordingUploader; +import io.openvidu.server.recording.service.RecordingService.PropertiesRecordingId; import io.openvidu.server.utils.CustomFileManager; import io.openvidu.server.utils.DockerManager; import io.openvidu.server.utils.JsonUtils; @@ -261,11 +262,18 @@ public class RecordingManager { } public Recording startRecording(Session session, RecordingProperties properties) throws OpenViduException { + + String recordingId = null; + try { + PropertiesRecordingId updatePropertiesAndRecordingId = ((RecordingService) this.composedRecordingService) + .setFinalRecordingNameAndGetFreeRecordingId(session, properties); + properties = updatePropertiesAndRecordingId.properties; + recordingId = updatePropertiesAndRecordingId.recordingId; // INCREMENT ACTIVE RECORDINGS OF MEDIA NODE HERE. IF MEDIA NODE IS NOT // AVAILABLE FOR STARTING NEW RECORDINGS THIS METHOD THROWS AN EXCEPTION - kmsManager.incrementActiveRecordings(properties.mediaNode()); + kmsManager.incrementActiveRecordings(properties.mediaNode(), recordingId, session.getSessionId()); try { if (session.recordingLock.tryLock(15, TimeUnit.SECONDS)) { @@ -277,13 +285,16 @@ public class RecordingManager { Recording recording = null; switch (properties.outputMode()) { case COMPOSED: - recording = this.composedRecordingService.startRecording(session, properties); + recording = this.composedRecordingService.startRecording(session, recordingId, + properties); break; case COMPOSED_QUICK_START: - recording = this.composedQuickStartRecordingService.startRecording(session, properties); + recording = this.composedQuickStartRecordingService.startRecording(session, recordingId, + properties); break; case INDIVIDUAL: - recording = this.singleStreamRecordingService.startRecording(session, properties); + recording = this.singleStreamRecordingService.startRecording(session, recordingId, + properties); break; } this.recordingFromStartingToStarted(recording); @@ -323,7 +334,7 @@ public class RecordingManager { } } catch (Exception e) { // DECREMENT ACTIVE RECORDINGS OF MEDIA NODE AND TRY REMOVE MEDIA NODE HERE - kmsManager.decrementActiveRecordings(properties.mediaNode()); + kmsManager.decrementActiveRecordings(properties.mediaNode(), recordingId); throw e; } } diff --git a/openvidu-server/src/main/java/io/openvidu/server/recording/service/RecordingService.java b/openvidu-server/src/main/java/io/openvidu/server/recording/service/RecordingService.java index d705e7a5..4076532c 100644 --- a/openvidu-server/src/main/java/io/openvidu/server/recording/service/RecordingService.java +++ b/openvidu-server/src/main/java/io/openvidu/server/recording/service/RecordingService.java @@ -71,7 +71,8 @@ public abstract class RecordingService { this.cdr = cdr; } - public abstract Recording startRecording(Session session, RecordingProperties properties) throws OpenViduException; + public abstract Recording startRecording(Session session, String recordingId, RecordingProperties properties) + throws OpenViduException; public abstract Recording stopRecording(Session session, Recording recording, EndReason reason); diff --git a/openvidu-server/src/main/java/io/openvidu/server/recording/service/SingleStreamRecordingService.java b/openvidu-server/src/main/java/io/openvidu/server/recording/service/SingleStreamRecordingService.java index 42b3b33b..8e751214 100644 --- a/openvidu-server/src/main/java/io/openvidu/server/recording/service/SingleStreamRecordingService.java +++ b/openvidu-server/src/main/java/io/openvidu/server/recording/service/SingleStreamRecordingService.java @@ -85,12 +85,8 @@ public class SingleStreamRecordingService extends RecordingService { } @Override - public Recording startRecording(Session session, RecordingProperties properties) throws OpenViduException { - - PropertiesRecordingId updatePropertiesAndRecordingId = this.setFinalRecordingNameAndGetFreeRecordingId(session, - properties); - properties = updatePropertiesAndRecordingId.properties; - String recordingId = updatePropertiesAndRecordingId.recordingId; + public Recording startRecording(Session session, String recordingId, RecordingProperties properties) + throws OpenViduException { log.info("Starting individual ({}) recording {} of session {}", properties.hasVideo() ? (properties.hasAudio() ? "video+audio" : "video-only") : "audioOnly", @@ -187,7 +183,7 @@ public class SingleStreamRecordingService extends RecordingService { // Decrement active recordings once it is downloaded. This method will also drop // the Media Node if no more sessions or recordings and status is // waiting-idle-to-terminate - kmsManager.decrementActiveRecordings(session.getMediaNodeId()); + kmsManager.decrementActiveRecordings(session.getMediaNodeId(), finalRecordingArray[0].getId()); // Upload if necessary this.uploadRecording(finalRecordingArray[0], reason);