From b9d28d11cdf8f8474dc4b482754cb45f4eeb2aa9 Mon Sep 17 00:00:00 2001 From: pabloFuente Date: Fri, 25 Sep 2020 16:45:03 +0200 Subject: [PATCH] openvidu-server: composed quickstart recording stop bug fix --- .../ComposedQuickStartRecordingService.java | 4 +- .../service/ComposedRecordingService.java | 2 +- .../openvidu/server/utils/DockerManager.java | 46 ++++++++++++------- 3 files changed, 33 insertions(+), 19 deletions(-) diff --git a/openvidu-server/src/main/java/io/openvidu/server/recording/service/ComposedQuickStartRecordingService.java b/openvidu-server/src/main/java/io/openvidu/server/recording/service/ComposedQuickStartRecordingService.java index f1262adb..5ab5588e 100644 --- a/openvidu-server/src/main/java/io/openvidu/server/recording/service/ComposedQuickStartRecordingService.java +++ b/openvidu-server/src/main/java/io/openvidu/server/recording/service/ComposedQuickStartRecordingService.java @@ -78,7 +78,7 @@ public class ComposedQuickStartRecordingService extends ComposedRecordingService recordExecCommand += "export " + envs.get(i) + " "; } recordExecCommand += "&& ./composed_quick_start.sh --start-recording > /var/log/ffmpeg.log 2>&1 &"; - dockerManager.runCommandInContainer(containerId, recordExecCommand, 0); + dockerManager.runCommandInContainer(containerId, recordExecCommand); } catch (Exception e) { this.cleanRecordingMaps(recording); throw this.failStartRecording(session, recording, @@ -116,7 +116,7 @@ public class ComposedQuickStartRecordingService extends ComposedRecordingService } try { - dockerManager.runCommandInContainer(containerId, "./composed_quick_start.sh --stop-recording", 10); + dockerManager.runCommandInContainerSync(containerId, "./composed_quick_start.sh --stop-recording", 10); } catch (InterruptedException e1) { cleanRecordingMaps(recording); log.error("Error stopping recording for session id: {}", session.getSessionId()); 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 19020abe..e91ef8b9 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 @@ -396,7 +396,7 @@ public class ComposedRecordingService extends RecordingService { protected void stopAndRemoveRecordingContainer(Recording recording, String containerId, int secondsOfWait) { // Gracefully stop ffmpeg process try { - dockerManager.runCommandInContainer(containerId, "echo 'q' > stop", 0); + dockerManager.runCommandInContainer(containerId, "echo 'q' > stop"); } catch (InterruptedException e1) { e1.printStackTrace(); } diff --git a/openvidu-server/src/main/java/io/openvidu/server/utils/DockerManager.java b/openvidu-server/src/main/java/io/openvidu/server/utils/DockerManager.java index bb4a87d0..c616729b 100644 --- a/openvidu-server/src/main/java/io/openvidu/server/utils/DockerManager.java +++ b/openvidu-server/src/main/java/io/openvidu/server/utils/DockerManager.java @@ -26,23 +26,29 @@ import java.util.concurrent.TimeUnit; import javax.ws.rs.ProcessingException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import com.github.dockerjava.api.DockerClient; -import com.github.dockerjava.api.async.ResultCallback; -import com.github.dockerjava.api.command.*; +import com.github.dockerjava.api.command.CreateContainerCmd; +import com.github.dockerjava.api.command.CreateContainerResponse; +import com.github.dockerjava.api.command.ExecCreateCmdResponse; +import com.github.dockerjava.api.command.InspectContainerResponse; +import com.github.dockerjava.api.command.InspectImageResponse; import com.github.dockerjava.api.exception.ConflictException; import com.github.dockerjava.api.exception.DockerClientException; import com.github.dockerjava.api.exception.InternalServerErrorException; import com.github.dockerjava.api.exception.NotFoundException; -import com.github.dockerjava.api.model.*; +import com.github.dockerjava.api.model.Bind; +import com.github.dockerjava.api.model.Container; +import com.github.dockerjava.api.model.HostConfig; +import com.github.dockerjava.api.model.Volume; import com.github.dockerjava.core.DefaultDockerClientConfig; import com.github.dockerjava.core.DockerClientBuilder; import com.github.dockerjava.core.DockerClientConfig; import com.github.dockerjava.core.command.ExecStartResultCallback; import com.github.dockerjava.core.command.PullImageResultCallback; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import io.openvidu.client.OpenViduException; import io.openvidu.client.OpenViduException.Code; import io.openvidu.server.recording.service.WaitForContainerStoppedCallback; @@ -63,7 +69,7 @@ public class DockerManager { // Pull image this.dockerClient.pullImageCmd(image).exec(new PullImageResultCallback()).awaitCompletion(secondsOfWait, TimeUnit.SECONDS); - + } catch (NotFoundException | InternalServerErrorException e) { if (dockerImageExistsLocally(image)) { log.info("Docker image '{}' exists locally", image); @@ -102,9 +108,8 @@ public class DockerManager { } public String runContainer(String container, String containerName, String user, List volumes, - List binds, String networkMode, List envs, List command, Long shmSize, boolean privileged, - Map labels) - throws Exception { + List binds, String networkMode, List envs, List command, Long shmSize, + boolean privileged, Map labels) throws Exception { CreateContainerCmd cmd = dockerClient.createContainerCmd(container).withEnv(envs); if (containerName != null) { @@ -167,21 +172,30 @@ public class DockerManager { } } - public String runCommandInContainer(String containerId, String command, int secondsOfWait) + public void runCommandInContainer(String containerId, String command) throws InterruptedException { + ExecCreateCmdResponse execCreateCmdResponse = dockerClient.execCreateCmd(containerId).withAttachStdout(true) + .withAttachStderr(true).withCmd("bash", "-c", command).exec(); + dockerClient.execStartCmd(execCreateCmdResponse.getId()).exec(new ExecStartResultCallback() { + }); + } + + public void runCommandInContainerSync(String containerId, String command, int secondsOfWait) throws InterruptedException { ExecCreateCmdResponse execCreateCmdResponse = dockerClient.execCreateCmd(containerId).withAttachStdout(true) .withAttachStderr(true).withCmd("bash", "-c", command).exec(); CountDownLatch latch = new CountDownLatch(1); - final String[] stringResponse = new String[1]; dockerClient.execStartCmd(execCreateCmdResponse.getId()).exec(new ExecStartResultCallback() { @Override - public void onNext(Frame item) { - stringResponse[0] = new String(item.getPayload()); + public void onComplete() { latch.countDown(); } }); - latch.await(secondsOfWait, TimeUnit.SECONDS); - return stringResponse[0]; + try { + latch.await(secondsOfWait, TimeUnit.SECONDS); + } catch (InterruptedException e) { + throw new InterruptedException("Container " + containerId + " did not return from executing command \"" + + command + "\" in " + secondsOfWait + " seconds"); + } } public void waitForContainerStopped(String containerId, int secondsOfWait) throws Exception {