From 480d6490f5a836bc8fa8f8dbf89b2740f6c9d77e Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Thu, 23 Apr 2015 13:09:02 +0200 Subject: [PATCH 1/3] Clean up Docker client class. --- lib/docker_client.rb | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/lib/docker_client.rb b/lib/docker_client.rb index 98918179..8d43fc5f 100644 --- a/lib/docker_client.rb +++ b/lib/docker_client.rb @@ -177,16 +177,9 @@ class DockerClient def send_command(command, container, &block) Timeout.timeout(@execution_environment.permitted_execution_time.to_i) do output = container.exec(['bash', '-c', command]) - #do |stream, chunk| - # block.call(stream, chunk) if block_given? #this may issue - # if stream == :stderr - ## stderr.push(chunk) - # else - # stdout.push(chunk) - # end - #end + Rails.logger.info "output from container.exec" Rails.logger.info output - {status: output[2], stderr: output[1].join, stdout: output[0].join} + {status: output[2] == 0 ? :ok : :failed, stdout: output[0].join, stderr: output[1].join} end rescue Timeout::Error timeout_occured = true @@ -202,7 +195,7 @@ class DockerClient container = self.class.create_container(@execution_environment) DockerContainerPool.add_to_all_containers(container, @execution_environment) end - {status: :timeout, stderr: '', stdout: ''} + {status: :timeout} ensure Rails.logger.info('send_command ensuring for' + container.to_s) RECYCLE_CONTAINERS ? return_container(container) : self.class.destroy_container(container) From 64114815c7ff8f1db2c8a95e4614352497656732 Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Thu, 23 Apr 2015 13:13:17 +0200 Subject: [PATCH 2/3] Clean up writing server sent events. --- app/controllers/submissions_controller.rb | 24 ++++++----------------- 1 file changed, 6 insertions(+), 18 deletions(-) diff --git a/app/controllers/submissions_controller.rb b/app/controllers/submissions_controller.rb index fb14ff07..cfd5391e 100644 --- a/app/controllers/submissions_controller.rb +++ b/app/controllers/submissions_controller.rb @@ -70,25 +70,13 @@ class SubmissionsController < ApplicationController def run with_server_sent_events do |server_sent_event| - container_info_sent = false - stderr = '' output = @docker_client.execute_run_command(@submission, params[:filename]) - if output - server_sent_event.write({stdout: output[:stdout]}, event: 'output') - server_sent_event.write({stderr: output[:stderr]}, event: 'output') - output[:status] = :ok if output[:status] == 0 - server_sent_event.write({status: output[:status]}, event: 'status') - end - #server_sent_event.write({stdout: output[:output][2], event: 'status') - # do |stream, chunk| - # unless container_info_sent - # server_sent_event.write({id: @docker_client.container.try(:id), port_bindings: @docker_client.container.try(:port_bindings)}, event: 'info') - # container_info_sent = true - # end - # server_sent_event.write({stream => chunk}, event: 'output') - # stderr += chunk if stream == :stderr - # end - # server_sent_event.write(output, event: 'status') + + server_sent_event.write({stdout: output[:stdout]}, event: 'output') if output[:stdout] + server_sent_event.write({stderr: output[:stderr]}, event: 'output') if output[:stderr] + + server_sent_event.write({status: output[:status]}, event: 'status') + if stderr.present? if hint = Whistleblower.new(execution_environment: @submission.execution_environment).generate_hint(stderr) server_sent_event.write(hint, event: 'hint') From 9063b18012d3acf67b6729fcf4883c6d389881d5 Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Thu, 23 Apr 2015 13:15:31 +0200 Subject: [PATCH 3/3] Fix hints to work again. --- app/controllers/submissions_controller.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controllers/submissions_controller.rb b/app/controllers/submissions_controller.rb index cfd5391e..74ef224a 100644 --- a/app/controllers/submissions_controller.rb +++ b/app/controllers/submissions_controller.rb @@ -77,8 +77,8 @@ class SubmissionsController < ApplicationController server_sent_event.write({status: output[:status]}, event: 'status') - if stderr.present? - if hint = Whistleblower.new(execution_environment: @submission.execution_environment).generate_hint(stderr) + unless output[:stderr].nil? + if hint = Whistleblower.new(execution_environment: @submission.execution_environment).generate_hint(output[:stderr]) server_sent_event.write(hint, event: 'hint') else store_error(stderr)