Skip to content

[BUG] swag-ondemand.py infinite loop on Docker daemon restart causes massive log spam and disk exhaustion #1158

Description

@amoifon

Is there an existing issue for this?

  • I have searched the existing issues

Name of mod

swag-ondemand

Name of base container

swag

Current Behavior

When the Docker daemon is upgraded (e.g., via unattended-upgrades), the service restart takes long enough for the /var/run/docker.sock to be removed and recreated. During this window, swag-ondemand.py enters an unthrottled infinite loop, flooding ondemand.log with 502 Bad Gateway / 503 Service Unavailable errors (hundreds per second). This quickly consumes all host disk space, leading to OSError: [Errno 28] No space left on device and triggering a cascading failure of all other containers on the host.

I've verified the code: the issue is located in the run(self) method of ContainerThread class, where the except block executes a logging.exception(e) without any time.sleep(), causing a tight loop that creates hundreds of log entries per second upon connection failure.

Expected Behavior

The script should handle the temporary Docker daemon unavailability gracefully. It should implement a backoff or a delay in the except block of the main loop to prevent log flooding and resource exhaustion during daemon maintenance.

Steps To Reproduce

The issue is specifically reproducible during an automated Docker package upgrade. It is difficult to reproduce with a simple systemctl restart docker as the socket is often replaced fast enough to avoid triggering the sustained 502/503 loop.

  1. Ensure swag-ondemand is running.
  2. Trigger an apt upgrade docker-ce (which performs a full package replacement/restart).
  3. Observe ondemand.log growing at high speed due to the lack of a delay in the exception handler.

Environment

- OS: Ubuntu 24.04.3
- How docker service was installed: Docker's apt repository

CPU architecture

x86-64

Docker creation

services:
  nginx:
    image: lscr.io/linuxserver/nginx:latest
    container_name: redacted
    networks:
      - swag
    environment:
      PUID: ${PUID}
      PGID: ${PGID}
      TZ: ${TIMEZONE}
    volumes:
      - ./config:/config
      - /media/library/archive/redacted:/config/www
    restart: unless-stopped
    labels:
      - swag=enable
      - swag_url=sub.${DOMAIN_NAME}
      - swag_port=80
      - swag_auth=authelia
      - swag_ondemand=enable
      - swag_server_custom_directive=include /config/nginx/ondemand.conf;
      - swag_ondemand_urls=https://sub.
networks:
  swag:
    external: true

Container logs

.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    Status
    Issues

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions