From 6c4eaff02fe41f5fa4dcbbce117277394bc4ef15 Mon Sep 17 00:00:00 2001 From: Pablo Carranza Velez Date: Wed, 11 Apr 2018 15:58:17 -0700 Subject: [PATCH] On startup, only attach to logs for running containers, and remove any containers marked as dead Closes #611 Change-Type: patch Signed-off-by: Pablo Carranza Velez --- src/application-manager.coffee | 7 +++++++ src/compose/service-manager.coffee | 14 ++++++++++++-- src/compose/service.coffee | 2 ++ src/lib/log-types.coffee | 7 +++++++ 4 files changed, 28 insertions(+), 2 deletions(-) diff --git a/src/application-manager.coffee b/src/application-manager.coffee index 04b920a0..5742cff8 100644 --- a/src/application-manager.coffee +++ b/src/application-manager.coffee @@ -266,6 +266,9 @@ module.exports = class ApplicationManager extends EventEmitter delete @_containerStarted[step.current.containerId] if step.options?.removeImage @images.removeByDockerId(step.current.image) + remove: (step) => + # Only called for dead containers, so no need to take locks or anything + @services.remove(step.current) updateMetadata: (step, { force = false, skipLock = false } = {}) => skipLock or= checkTruthy(step.current.labels['io.resin.legacy-container']) @_lockingIfNecessary step.current.appId, { force, skipLock: skipLock or step.options?.skipLock }, => @@ -678,6 +681,10 @@ module.exports = class ApplicationManager extends EventEmitter # There is already a kill step in progress for this service, so we wait return { action: 'noop' } + if current?.status == 'Dead' + # Dead containers have to be removed + return serviceAction('remove', current.serviceId, current) + needsDownload = !_.some availableImages, (image) => image.dockerImageId == target?.image or @images.isSameImage(image, { name: target.imageName }) diff --git a/src/compose/service-manager.coffee b/src/compose/service-manager.coffee index 910b791e..e450fd39 100644 --- a/src/compose/service-manager.coffee +++ b/src/compose/service-manager.coffee @@ -78,6 +78,15 @@ module.exports = class ServiceManager extends EventEmitter kill: (service, { removeContainer = true, wait = false } = {}) => @_killContainer(service.containerId, service, { removeContainer, wait }) + remove: (service) => + @logger.logSystemEvent(logTypes.removeDeadService, { service }) + @get(service) + .then (existingService) => + @docker.getContainer(existingService.containerId).remove(v: true) + .catchReturn(NotFoundError, null) + .tapCatch (err) => + @logger.logSystemEvent(logTypes.removeDeadServiceError, { service, error: err }) + getAllByAppId: (appId) => @getAll("io.resin.app-id=#{appId}") @@ -278,5 +287,6 @@ module.exports = class ServiceManager extends EventEmitter attachToRunning: => @getAll() .map (service) => - @logger.logSystemEvent(logTypes.startServiceNoop, { service }) - @logger.attach(@docker, service.containerId, service) + if service.status == 'Running' + @logger.logSystemEvent(logTypes.startServiceNoop, { service }) + @logger.attach(@docker, service.containerId, service) diff --git a/src/compose/service.coffee b/src/compose/service.coffee index 070254b8..22783e0e 100644 --- a/src/compose/service.coffee +++ b/src/compose/service.coffee @@ -429,6 +429,8 @@ module.exports = class Service status = 'Running' else if container.State.Status == 'created' status = 'Installed' + else if container.State.Status == 'dead' + status = 'Dead' else status = 'Stopped' diff --git a/src/lib/log-types.coffee b/src/lib/log-types.coffee index f1c872cf..06f182fb 100644 --- a/src/lib/log-types.coffee +++ b/src/lib/log-types.coffee @@ -15,6 +15,13 @@ module.exports = eventName: 'Service stop error' humanName: 'Failed to kill service' + removeDeadService: + eventName: 'Remove dead container' + humanName: 'Removing dead container' + removeDeadServiceError: + eventName: 'Remove dead container error' + humanName: 'Error removing dead container' + downloadImage: eventName: 'Docker image download' humanName: 'Downloading image'