dgtlmoon/changedetection.io · critical · OSError

Disk quota exceeded: Cannot save {label}

Error message

Disk quota exceeded: Cannot save {label}

What it means

An OSError raised by save_json_atomic when the write fails with errno 122 (EDQUOT) — the filesystem or NFS/quota subsystem reports the user's disk quota was exceeded. Functionally identical to the disk-full path but caused by a quota limit rather than physical space.

Source

Thrown at changedetectionio/store/file_saving_datastore.py:159

    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. Check your quota: quota -s or df -h <datastore-path>; raise the quota if possible
  2. Delete old snapshots/watch history inside the datastore directory to get back under quota
  3. Move the datastore to a non-quota volume and restart
  4. Set snapshot retention limits to prevent recurrence
Defensive patterns

Strategy: try-catch

Validate before calling

# NFS/quota environments: check quota before heavy saves
import subprocess
subprocess.run(['quota', '-s'], check=False)  # inspect in ops tooling

Try / catch

try:
    datastore.save_entity_atomic(uuid, data)
except OSError as e:
    if 'Quota exceeded' in str(e):
        alert_ops('datastore quota exceeded'); prune_history()

Prevention

When it happens

Trigger: Saving settings or a watch entity on a quota-enabled filesystem (NFS with rpc.rquotad, shared hosting, per-user quota on ext4/xfs) and the block limit is hit during the atomic temp-file write.

Common situations: Shared-hosting or NAS-backed installs where the user's quota is smaller than the physical disk; team environments where several processes share one quota; monitoring-heavy accounts whose snapshots silently consume the quota.

Related errors


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