diff --git a/lib/docker_client.rb b/lib/docker_client.rb index 8bb6ce4f..ba9677d1 100644 --- a/lib/docker_client.rb +++ b/lib/docker_client.rb @@ -188,7 +188,17 @@ class DockerClient {status: :ok, stderr: stderr.join, stdout: stdout.join} end rescue Timeout::Error - container.restart if RECYCLE_CONTAINERS + #container.restart if RECYCLE_CONTAINERS + DockerContainerPool.remove_from_all_containers(container, @execution_environment) + + # destroy container + destroy_container(container) + + if(RECYCLE_CONTAINERS) + # create new container and add it to @all_containers. will be added to @containers on return_container + container = create_container(execution_environment) + DockerContainerPool.add_to_all_containers(container, execution_environment) + end {status: :timeout} ensure RECYCLE_CONTAINERS ? return_container(container) : self.class.destroy_container(container) diff --git a/lib/docker_container_pool.rb b/lib/docker_container_pool.rb index 7cc5fb51..fc3aee99 100644 --- a/lib/docker_container_pool.rb +++ b/lib/docker_container_pool.rb @@ -19,6 +19,20 @@ class DockerContainerPool @config ||= CodeOcean::Config.new(:docker).read(erb: true)[:pool] end + def self.remove_from_all_containers(container, execution_environment) + @all_containers[execution_environment.id]-=[container] + if(@containers[execution_environment.id].include?(container)) + @containers[execution_environment.id]-=[container] + end + end + + def self.add_to_all_containers(container, execution_environment) + @all_containers[execution_environment.id]+=[container] + if(!@containers[execution_environment.id].include?(container)) + @containers[execution_environment.id]+=[container] + end + end + def self.create_container(execution_environment) container = DockerClient.create_container(execution_environment) container.status = 'available' @@ -37,14 +51,14 @@ class DockerContainerPool if(!container.nil?) if ((Time.now - container.start_time).to_i.abs > TIME_TILL_RESTART) # remove container from @all_containers - @all_containers[execution_environment.id]-=[container] + remove_from_all_containers(container, execution_environment) # destroy container DockerClient.destroy_container(container) # create new container and add it to @all_containers. will be added to @containers on return_container - container = create_container(@execution_environment) - @all_containers[execution_environment.id]+=[container] + container = create_container(execution_environment) + add_to_all_containers(container, execution_environment) end #container.status = 'used' end