You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openmeetings.apache.org by se...@apache.org on 2020/04/29 21:28:20 UTC
[openmeetings] 01/01: OPENMEETINGS-2315 Only StreamProcessor to
hold reference of KStream
This is an automated email from the ASF dual-hosted git repository.
sebawagner pushed a commit to branch feature/OPENMEETINGS-2315-refactor-kstream-to-streamprocessor
in repository https://gitbox.apache.org/repos/asf/openmeetings.git
commit a51b4fcd16fd7885d4e1754c7cee8af40e1a0c4a
Author: Sebastian Wagner <se...@apache.org>
AuthorDate: Thu Apr 30 09:27:44 2020 +1200
OPENMEETINGS-2315 Only StreamProcessor to hold reference of KStream
---
.../org/apache/openmeetings/core/remote/KRoom.java | 75 +++++++++-------------
.../apache/openmeetings/core/remote/KStream.java | 2 +-
.../openmeetings/core/remote/KurentoHandler.java | 6 +-
.../openmeetings/core/remote/StreamProcessor.java | 22 +++++--
.../core/remote/TestStreamProcessor.java | 1 +
.../web/admin/connection/ConnectionsPanel.java | 8 ---
6 files changed, 52 insertions(+), 62 deletions(-)
diff --git a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KRoom.java b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KRoom.java
index 47abfdd..fc414dc 100644
--- a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KRoom.java
+++ b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KRoom.java
@@ -27,9 +27,7 @@ import static org.apache.openmeetings.core.remote.KurentoHandler.newKurentoMsg;
import java.util.Collection;
import java.util.Date;
-import java.util.Map;
import java.util.Optional;
-import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicBoolean;
import org.apache.openmeetings.core.util.WebSocketHelper;
@@ -53,10 +51,16 @@ import org.slf4j.LoggerFactory;
import com.github.openjson.JSONObject;
+/**
+ * Bean object dynamically created representing a conference room on the MediaServer
+ *
+ */
public class KRoom {
private static final Logger log = LoggerFactory.getLogger(KRoom.class);
-
- private final Map<String, KStream> streams = new ConcurrentHashMap<>();
+ /**
+ * Not injected by annotation but by constructor.
+ */
+ private final StreamProcessor streamProcessor;
private final MediaPipeline pipeline;
private final Long roomId;
private final Room.Type type;
@@ -67,7 +71,8 @@ public class KRoom {
private JSONObject recordingUser = new JSONObject();
private JSONObject sharingUser = new JSONObject();
- public KRoom(Room r, MediaPipeline pipeline, RecordingChunkDao chunkDao) {
+ public KRoom(StreamProcessor streamProcessor, Room r, MediaPipeline pipeline, RecordingChunkDao chunkDao) {
+ this.streamProcessor = streamProcessor;
this.roomId = r.getId();
this.type = r.getType();
this.pipeline = pipeline;
@@ -98,16 +103,16 @@ public class KRoom {
public KStream join(final StreamDesc sd) {
log.info("ROOM {}: join client {}, stream: {}", roomId, sd.getClient(), sd.getUid());
final KStream stream = new KStream(sd, this);
- streams.put(stream.getUid(), stream);
+ streamProcessor.addStream(stream);
return stream;
}
public Collection<KStream> getParticipants() {
- return streams.values();
+ return streamProcessor.getStreamsByRoom(this.getRoomId());
}
public void onStopBroadcast(KStream stream, final StreamProcessor processor) {
- streams.remove(stream.getUid());
+ streamProcessor.release(stream);
stream.release(processor);
WebSocketHelper.sendAll(newKurentoMsg()
.put("id", "broadcastStopped")
@@ -118,21 +123,6 @@ public class KRoom {
//FIXME TODO permission can be removed, some listener might be required
}
- public void leave(final StreamProcessor processor, final Client c) {
- for (Map.Entry<String, KStream> e : streams.entrySet()) {
- e.getValue().remove(c);
- }
- for (StreamDesc sd : c.getStreams()) {
- if (StreamType.SCREEN == sd.getType()) {
-
- }
- KStream stream = streams.remove(sd.getUid());
- if (stream != null) {
- stream.release(processor);
- }
- }
- }
-
public boolean isRecording() {
return recordingStarted.get();
}
@@ -141,7 +131,7 @@ public class KRoom {
return new JSONObject(recordingUser.toString());
}
- public void startRecording(StreamProcessor processor, Client c) {
+ public void startRecording(Client c) {
if (recordingStarted.compareAndSet(false, true)) {
log.debug("##REC:: recording in room {} is starting ::", roomId);
Room r = c.getRoom();
@@ -173,16 +163,16 @@ public class KRoom {
Optional<StreamDesc> osd = c.getScreenStream();
if (osd.isPresent()) {
osd.get().addActivity(Activity.RECORD);
- processor.getClientManager().update(c);
+ streamProcessor.getClientManager().update(c);
rec.setWidth(osd.get().getWidth());
rec.setHeight(osd.get().getHeight());
}
- rec = processor.getRecordingDao().update(rec);
+ rec = streamProcessor.getRecordingDao().update(rec);
// Receive recordingId
recordingId = rec.getId();
- for (final KStream stream : streams.values()) {
- stream.startRecord(processor);
- }
+ streamProcessor.getStreamsByRoom(this.getRoomId()).forEach(
+ stream -> stream.startRecord(streamProcessor)
+ );
// Send notification to all users that the recording has been started
WebSocketHelper.sendRoom(new RoomMessage(roomId, u, RoomMessage.Type.RECORDING_TOGGLED));
@@ -190,19 +180,19 @@ public class KRoom {
}
}
- public void stopRecording(final StreamProcessor processor, Client c) {
+ public void stopRecording(Client c) {
if (recordingStarted.compareAndSet(true, false)) {
log.debug("##REC:: recording in room {} is stopping {} ::", roomId, recordingId);
- for (final KStream stream : streams.values()) {
- stream.stopRecord();
- }
- Recording rec = processor.getRecordingDao().get(recordingId);
+ streamProcessor.getStreamsByRoom(this.getRoomId()).forEach(
+ stream -> stream.stopRecord()
+ );
+ Recording rec = streamProcessor.getRecordingDao().get(recordingId);
rec.setRecordEnd(new Date());
- rec = processor.getRecordingDao().update(rec);
+ rec = streamProcessor.getRecordingDao().update(rec);
recordingUser = new JSONObject();
recordingId = null;
- processor.startConvertion(rec);
+ streamProcessor.startConvertion(rec);
User u;
if (c == null) {
u = new User();
@@ -211,8 +201,8 @@ public class KRoom {
Optional<StreamDesc> osd = c.getScreenStream();
if (osd.isPresent()) {
osd.get().removeActivity(Activity.RECORD);
- processor.getClientManager().update(c);
- processor.getHandler().sendShareUpdated(osd.get());
+ streamProcessor.getClientManager().update(c);
+ streamProcessor.getHandler().sendShareUpdated(osd.get());
}
}
// Send notification to all users that the recording has been started
@@ -270,11 +260,10 @@ public class KRoom {
}
}
- public void close(final StreamProcessor processor) {
- for (final KStream stream : streams.values()) {
- stream.release(processor);
- }
- streams.clear();
+ public void close() {
+ streamProcessor.getStreamsByRoom(this.getRoomId()).forEach(
+ stream -> stream.release(streamProcessor)
+ );
pipeline.release(new Continuation<Void>() {
@Override
public void onSuccess(Void result) throws Exception {
diff --git a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KStream.java b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KStream.java
index 397d25f..e7cb42b 100644
--- a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KStream.java
+++ b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KStream.java
@@ -144,7 +144,7 @@ public class KStream extends AbstractStream {
}
});
outgoingMedia.addMediaFlowInStateChangeListener(evt -> log.warn("Media FlowIn :: {}", evt));
- processor.addStream(this);
+ // processor.addStream(this);
addListener(processor, sd.getSid(), sd.getUid(), sdpOffer);
if (room.isRecording()) {
startRecord(processor);
diff --git a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KurentoHandler.java b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KurentoHandler.java
index ade553e..e7d60405 100644
--- a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KurentoHandler.java
+++ b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KurentoHandler.java
@@ -142,7 +142,7 @@ public class KurentoHandler {
kuid = randomUUID().toString(); // will be changed to prevent double events
client.destroy();
for (Entry<Long, KRoom> e : rooms.entrySet()) {
- e.getValue().close(streamProcessor);
+ e.getValue().close();
}
testProcessor.destroy();
streamProcessor.destroy();
@@ -238,7 +238,7 @@ public class KurentoHandler {
pipe.addTag(t, TAG_KUID, kuid);
pipe.addTag(t, TAG_ROOM, String.valueOf(roomId));
t.commit();
- room = new KRoom(r, pipe, chunkDao);
+ room = new KRoom(streamProcessor, r, pipe, chunkDao);
rooms.put(roomId, room);
}
log.debug("Room {} found!", roomId);
@@ -426,7 +426,7 @@ public class KurentoHandler {
return;
} else if (r != null) {
rooms.remove(r.getRoomId());
- r.close(streamProcessor);
+ r.close();
}
}
log.warn("Invalid MediaPipeline {} detected, will be dropped, tags: {}", pipe.getId(), tags);
diff --git a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/StreamProcessor.java b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/StreamProcessor.java
index 32cda74..779928a 100644
--- a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/StreamProcessor.java
+++ b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/StreamProcessor.java
@@ -25,6 +25,7 @@ import static org.apache.openmeetings.core.remote.KurentoHandler.activityAllowed
import static org.apache.openmeetings.core.remote.KurentoHandler.newKurentoMsg;
import static org.apache.openmeetings.core.remote.KurentoHandler.sendError;
+import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
@@ -65,6 +66,9 @@ import com.github.openjson.JSONObject;
@Component
public class StreamProcessor implements IStreamProcessor {
private static final Logger log = LoggerFactory.getLogger(StreamProcessor.class);
+ /**
+ * Holds a reference to the current streams available on the server instance
+ */
private final Map<String, KStream> streamByUid = new ConcurrentHashMap<>();
@Autowired
@@ -305,7 +309,7 @@ public class StreamProcessor implements IStreamProcessor {
room.stopSharing();
if (Room.Type.INTERVIEW != room.getType() && room.isRecording()) {
log.info("No more screen streams in the non-interview room, stopping recording");
- room.stopRecording(this, null);
+ room.stopRecording(null);
}
}
}
@@ -315,7 +319,7 @@ public class StreamProcessor implements IStreamProcessor {
.collect(Collectors.toList());
if (streams.isEmpty()) {
log.info("No more streams in the room, stopping recording");
- room.stopRecording(this, null);
+ room.stopRecording(null);
}
}
}
@@ -447,14 +451,14 @@ public class StreamProcessor implements IStreamProcessor {
if (!kHandler.isConnected() || !hasRightsToRecord(c)) {
return;
}
- kHandler.getRoom(c.getRoomId()).startRecording(this, c);
+ kHandler.getRoom(c.getRoomId()).startRecording(c);
}
public void stopRecording(Client c) {
if (!kHandler.isConnected() || !hasRightsToRecord(c)) {
return;
}
- kHandler.getRoom(c.getRoomId()).stopRecording(this, c);
+ kHandler.getRoom(c.getRoomId()).stopRecording(c);
// In case this user wasn't shareing his screen we also need to close that one
c.getScreenStream().ifPresent(sd -> {
@@ -494,13 +498,11 @@ public class StreamProcessor implements IStreamProcessor {
}
}
if (c.getRoomId() != null) {
- KRoom room = kHandler.getRoom(c.getRoomId());
- room.leave(this, c);
checkStreams(c.getRoomId());
}
}
- void addStream(KStream stream) {
+ public void addStream(KStream stream) {
streamByUid.put(stream.getUid(), stream);
}
@@ -508,6 +510,12 @@ public class StreamProcessor implements IStreamProcessor {
return streamByUid.values();
}
+ public Collection<KStream> getStreamsByRoom(Long roomId) {
+ return streamByUid.values().stream()
+ .filter(stream -> stream.getRoom() != null && stream.getRoom().getRoomId().equals(roomId))
+ .collect(Collectors.toCollection(ArrayList::new));
+ }
+
Client getBySid(String sid) {
return cm.getBySid(sid);
}
diff --git a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/TestStreamProcessor.java b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/TestStreamProcessor.java
index e3a171d..764e458 100644
--- a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/TestStreamProcessor.java
+++ b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/TestStreamProcessor.java
@@ -126,4 +126,5 @@ public class TestStreamProcessor implements IStreamProcessor {
}
streamByUid.clear();
}
+
}
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/connection/ConnectionsPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/connection/ConnectionsPanel.java
index 84cc14c..270f809 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/connection/ConnectionsPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/connection/ConnectionsPanel.java
@@ -90,14 +90,6 @@ public class ConnectionsPanel extends AdminBasePanel {
l.addAll(streams);
log.info("Retrieve all Streams, StreamProcessor has {} of streams", streams.size());
- List<KStreamDto> missing = kHandler.getRooms()
- .stream()
- .flatMap(room -> room.getParticipants().stream())
- .filter(stream -> !streamProcessor.hasStream(stream.getUid()))
- .map(kStream -> new KStreamDto("KRoom", kStream))
- .collect(Collectors.toList());
- l.addAll(missing);
- log.warn("Following streams were in KRoom but not in StreamProcessor: {}", missing);
return l;
}