dgtlmoon/changedetection.io · critical · OSError

Disk full: Cannot save {label}

Error message

Disk full: Cannot save {label}

What it means

An OSError raised by save_json_atomic in the file-based datastore when writing the temp JSON file fails with errno 28 (ENOSPC, no space left on device). The label identifies which file (settings or a watch entity) failed to save; the temp file is cleaned up before raising.

Source

Thrown at changedetectionio/store/file_saving_datastore.py:157

#                f"dir_fsync={dir_fsync_ms:.1f}ms, using_orjson={HAS_ORJSON}"
#            )

    except OSError as e:
        # Cleanup temp file
        if not fd_closed:
            try:
                os.close(fd)
            except:
                pass
        if os.path.exists(temp_path):
            try:
                os.unlink(temp_path)
            except:
                pass

        # Provide helpful error messages
        if e.errno == 28:  # ENOSPC
            raise OSError(f"Disk full: Cannot save {label}") from e
        elif e.errno == 122:  # EDQUOT
            raise OSError(f"Disk quota exceeded: Cannot save {label}") from e
        else:
            raise OSError(f"I/O error saving {label}: {e}") from e

    except Exception as e:
        # Cleanup temp file
        if not fd_closed:
            try:
                os.close(fd)
            except:
                pass
        if os.path.exists(temp_path):
            try:
                os.unlink(temp_path)
            except:
                pass
        raise e

View on GitHub (pinned to 5d9c7c6da7)

Solutions

  1. Free disk space: remove old snapshots (docker volume prune / trim watch history), delete unused watches, clear logs
  2. Grow the volume or move the datastore path to a larger disk
  3. Enable the setting to limit snapshot/history retention so growth is bounded
  4. After freeing space, verify saves succeed by triggering a check and confirming no error re-appears
Defensive patterns

Strategy: try-catch

Validate before calling

import shutil
if shutil.disk_usage(datastore_path).free < 100 * 1024 * 1024:
    alert('datastore volume nearly full')

Try / catch

try:
    datastore.save_entity_atomic(uuid, data)
except OSError as e:
    if 'Disk full' in str(e):
        alert_ops('ENOSPC on datastore volume'); cleanup_old_snapshots()

Prevention

When it happens

Trigger: Any settings or watch save (_save_settings, save_entity_atomic) hitting a full disk/partition while writing/flushing the temp file — the flush/fsync inside the atomic-write helper raises ENOSPC and is translated to this friendly message.

Common situations: Long-running containers accumulating snapshot history and JSON until the volume fills; small Docker volumes or tmpfs; CI boxes with tight disk quotas; huge numbers of watches inflating url-watches.json.

Related errors


AI-assisted analysis of dgtlmoon/changedetection.io@5d9c7c6da7 (2026-08-27). Data as JSON: /api/errors/94ec20bc45258e16. Report an issue: GitHub.