From e448e403ba4c92b483f4fe2a308b3d3afd4d5635 Mon Sep 17 00:00:00 2001 From: Ralf Teusner Date: Tue, 21 Apr 2015 18:28:34 +0200 Subject: [PATCH] restart containers if they are running for more than 15 minutes (900 seconds) --- lib/docker_client.rb | 1 + lib/docker_container_mixin.rb | 4 ++++ lib/docker_container_pool.rb | 20 +++++++++++++++++++- 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/lib/docker_client.rb b/lib/docker_client.rb index 95b89e50..8bb6ce4f 100644 --- a/lib/docker_client.rb +++ b/lib/docker_client.rb @@ -53,6 +53,7 @@ class DockerClient local_workspace_path = generate_local_workspace_path FileUtils.mkdir(local_workspace_path) container.start(container_start_options(execution_environment, local_workspace_path)) + container.start_time = Time.now container rescue Docker::Error::NotFoundError => error destroy_container(container) diff --git a/lib/docker_container_mixin.rb b/lib/docker_container_mixin.rb index a8d3c8a4..fde9fe5b 100644 --- a/lib/docker_container_mixin.rb +++ b/lib/docker_container_mixin.rb @@ -1,4 +1,8 @@ module DockerContainerMixin + + attr_accessor :start_time + attr_accessor :status + def binds json['HostConfig']['Binds'] end diff --git a/lib/docker_container_pool.rb b/lib/docker_container_pool.rb index 8823d989..47a8bf5c 100644 --- a/lib/docker_container_pool.rb +++ b/lib/docker_container_pool.rb @@ -3,6 +3,8 @@ require 'concurrent/timer_task' require 'concurrent/utilities' class DockerContainerPool + TIME_TILL_RESTART = 900 + @containers = ThreadSafe::Hash[ExecutionEnvironment.all.map { |execution_environment| [execution_environment.id, ThreadSafe::Array.new] }] #as containers are not containing containers in use @all_containers = ThreadSafe::Hash[ExecutionEnvironment.all.map { |execution_environment| [execution_environment.id, ThreadSafe::Array.new] }] @@ -22,12 +24,28 @@ class DockerContainerPool end def self.return_container(container, execution_environment) + container.status = 'available' @containers[execution_environment.id].push(container) end def self.get_container(execution_environment) if config[:active] - @containers[execution_environment.id].try(:shift) || nil + container = @containers[execution_environment.id].try(:shift) || nil + + if((Time.now - container.start_time).to_i.abs > TIME_TILL_RESTART) + # remove container from @all_containers + @all_containers[execution_environment.id]-=[container] + + # 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] + end + container.status = 'used' + container + else create_container(execution_environment) end