openvidu-server: parameterized shmSize on POST /api/recordings/start

pull/508/head
pabloFuente 2020-06-17 19:05:23 +02:00
parent a4fcf90745
commit 37c05cb82a
4 changed files with 40 additions and 5 deletions

View File

@ -32,6 +32,7 @@ public class RecordingProperties {
private String resolution; private String resolution;
private boolean hasAudio; private boolean hasAudio;
private boolean hasVideo; private boolean hasVideo;
private long shmSize; // For COMPOSED recording
/** /**
* Builder for {@link io.openvidu.java.client.RecordingProperties} * Builder for {@link io.openvidu.java.client.RecordingProperties}
@ -45,6 +46,7 @@ public class RecordingProperties {
private String resolution; private String resolution;
private boolean hasAudio = true; private boolean hasAudio = true;
private boolean hasVideo = true; private boolean hasVideo = true;
private long shmSize = 536870912L;
/** /**
* Builder for {@link io.openvidu.java.client.RecordingProperties} * Builder for {@link io.openvidu.java.client.RecordingProperties}
@ -58,7 +60,7 @@ public class RecordingProperties {
} }
} }
return new RecordingProperties(this.name, this.outputMode, this.recordingLayout, this.customLayout, return new RecordingProperties(this.name, this.outputMode, this.recordingLayout, this.customLayout,
this.resolution, this.hasAudio, this.hasVideo); this.resolution, this.hasAudio, this.hasVideo, this.shmSize);
} }
/** /**
@ -145,10 +147,20 @@ public class RecordingProperties {
return this; return this;
} }
/**
* If COMPOSED recording, call this method to specify the amount of shared
* memory reserved for the recording process in bytes. Minimum 134217728 (128
* MB). Property ignored if INDIVIDUAL recording
*/
public RecordingProperties.Builder shmSize(long shmSize) {
this.shmSize = shmSize;
return this;
}
} }
protected RecordingProperties(String name, Recording.OutputMode outputMode, RecordingLayout layout, protected RecordingProperties(String name, Recording.OutputMode outputMode, RecordingLayout layout,
String customLayout, String resolution, boolean hasAudio, boolean hasVideo) { String customLayout, String resolution, boolean hasAudio, boolean hasVideo, long shmSize) {
this.name = name; this.name = name;
this.outputMode = outputMode; this.outputMode = outputMode;
this.recordingLayout = layout; this.recordingLayout = layout;
@ -156,6 +168,7 @@ public class RecordingProperties {
this.resolution = resolution; this.resolution = resolution;
this.hasAudio = hasAudio; this.hasAudio = hasAudio;
this.hasVideo = hasVideo; this.hasVideo = hasVideo;
this.shmSize = shmSize;
} }
/** /**
@ -242,4 +255,16 @@ public class RecordingProperties {
return this.hasVideo; return this.hasVideo;
} }
/**
* If COMPOSED recording, the amount of shared memory reserved for the recording
* process in bytes. Minimum 134217728 (128MB). Property ignored if INDIVIDUAL
* recording<br>
* <br>
*
* Default to 536870912 (512 MB)
*/
public long shmSize() {
return this.shmSize;
}
} }

View File

@ -175,7 +175,7 @@ public class ComposedRecordingService extends RecordingService {
List<Bind> binds = new ArrayList<>(); List<Bind> binds = new ArrayList<>();
binds.add(bind1); binds.add(bind1);
containerId = dockerManager.runContainer(container, containerName, null, volumes, binds, "host", envs, null, containerId = dockerManager.runContainer(container, containerName, null, volumes, binds, "host", envs, null,
536870912L, false, null); properties.shmSize(), false, null);
containers.put(containerId, containerName); containers.put(containerId, containerName);
} catch (Exception e) { } catch (Exception e) {
this.cleanRecordingMaps(recording); this.cleanRecordingMaps(recording);

View File

@ -149,6 +149,7 @@ public abstract class RecordingService {
if (RecordingLayout.CUSTOM.equals(properties.recordingLayout())) { if (RecordingLayout.CUSTOM.equals(properties.recordingLayout())) {
builder.customLayout(properties.customLayout()); builder.customLayout(properties.customLayout());
} }
builder.shmSize(properties.shmSize());
} }
properties = builder.build(); properties = builder.build();
} }

View File

@ -460,6 +460,7 @@ public class SessionRestController {
Boolean hasVideo; Boolean hasVideo;
String recordingLayoutString; String recordingLayoutString;
String customLayout; String customLayout;
Long shmSize;
try { try {
sessionId = (String) params.get("session"); sessionId = (String) params.get("session");
name = (String) params.get("name"); name = (String) params.get("name");
@ -469,7 +470,8 @@ public class SessionRestController {
hasVideo = (Boolean) params.get("hasVideo"); hasVideo = (Boolean) params.get("hasVideo");
recordingLayoutString = (String) params.get("recordingLayout"); recordingLayoutString = (String) params.get("recordingLayout");
customLayout = (String) params.get("customLayout"); customLayout = (String) params.get("customLayout");
} catch (ClassCastException e) { shmSize = new Long(params.get("shmSize").toString());
} catch (ClassCastException | NumberFormatException e) {
return this.generateErrorResponse("Type error in some parameter", "/api/recordings/start", return this.generateErrorResponse("Type error in some parameter", "/api/recordings/start",
HttpStatus.BAD_REQUEST); HttpStatus.BAD_REQUEST);
} }
@ -480,7 +482,7 @@ public class SessionRestController {
HttpStatus.BAD_REQUEST); HttpStatus.BAD_REQUEST);
} }
io.openvidu.java.client.Recording.OutputMode finalOutputMode = null; io.openvidu.java.client.Recording.OutputMode finalOutputMode = OutputMode.COMPOSED;
RecordingLayout recordingLayout = null; RecordingLayout recordingLayout = null;
if (outputModeString != null && !outputModeString.isEmpty()) { if (outputModeString != null && !outputModeString.isEmpty()) {
try { try {
@ -551,6 +553,13 @@ public class SessionRestController {
builder.customLayout( builder.customLayout(
customLayout == null ? session.getSessionProperties().defaultCustomLayout() : customLayout); customLayout == null ? session.getSessionProperties().defaultCustomLayout() : customLayout);
} }
if (shmSize != null) {
if (shmSize < 134217728L) {
return this.generateErrorResponse("Wrong \"shmSize\" parameter. Must be 134217728 (128 MB) minimum",
"/api/recordings/start", HttpStatus.UNPROCESSABLE_ENTITY);
}
builder.shmSize(shmSize);
}
} }
builder.name(name).hasAudio(hasAudio != null ? hasAudio : true).hasVideo(hasVideo != null ? hasVideo : true); builder.name(name).hasAudio(hasAudio != null ? hasAudio : true).hasVideo(hasVideo != null ? hasVideo : true);