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 eView on GitHub (pinned to 5d9c7c6da7)
Solutions
- Free disk space: remove old snapshots (docker volume prune / trim watch history), delete unused watches, clear logs
- Grow the volume or move the datastore path to a larger disk
- Enable the setting to limit snapshot/history retention so growth is bounded
- 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
- Monitor free space on the datastore volume with alerts at ~10% remaining
- Enable snapshot/history retention limits so growth is bounded
- Keep the datastore on a dedicated volume so logs can't fill it first
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
- Disk quota exceeded: Cannot save {label}
- Migration failed: Could not create changedetection.json. url
- I/O error saving {label}: {e}
- Migration failed: Could not save watch {uuid}. url-watches.j
- Migration failed: {len(missing)} watch files missing: {missi
AI-assisted analysis of dgtlmoon/changedetection.io@5d9c7c6da7 (2026-08-27).
Data as JSON: /api/errors/94ec20bc45258e16.
Report an issue: GitHub.