fastpluggy-db-purge
Centralized database retention management and purge plugin for FastPluggy.
Features
- Auto-discover all database tables with row counts and sizes
- Per-table retention policies via admin UI
- Plugin-declared purge targets via
fp_purge_targetshook — declaring a table upserts a disabled rule an admin enables to validate (see below) - Manual and scheduled purge with batched deletes
- Full audit trail of purge operations
Installation
pip install fastpluggy-db-purge
Configuration
| Setting | Default | Description |
|---|---|---|
default_retention_days |
30 | Global fallback retention |
default_timestamp_column |
updated_at |
Global fallback timestamp column |
batch_size |
5000 | Rows per DELETE batch |
auto_purge_enabled |
False | Enable scheduled purge |
auto_purge_cron |
0 4 * * * |
Cron schedule (daily 4am UTC) |
Declaring purge targets from another plugin
A plugin can declare its own tables as purgeable from its on_load_complete():
from fastpluggy_plugin.db_purge.hooks import register_purge_target
register_purge_target("task_reports", "end_time", default_retention_days=30)
This does two things:
- Registers the table + declared defaults in the in-memory registry, so it shows on the DB Purge dashboard (marked declared by plugin).
- Upserts a persistent rule in
fp_purge_rules, created disabled. An admin must enable it in the web UI before anything is deleted — a validation gate, so declaring a table can never silently purge its data.
If the plugin later changes what it declares (timestamp column or retention),
the rule is refreshed and re-disabled for the admin to re-validate.
Provenance is tracked by a declared_hash column: plugin-managed rows carry the
hash; admin-created rows have declared_hash = NULL and are never touched by the
hook.
To exclude a config/system table from purge entirely:
from fastpluggy_plugin.db_purge.hooks import register_purge_excluded
register_purge_excluded("my_plugin_config")
Observability
Audit Trail
All purge runs (manual, scheduled, and dry-run) are logged to fp_purge_logs:
-- Recent purges
SELECT table_name, rows_deleted, duration_ms, status, executed_at, executed_by
FROM fp_purge_logs
ORDER BY executed_at DESC LIMIT 20;
-- Failed purges
SELECT table_name, error_message, executed_at
FROM fp_purge_logs
WHERE status = 'error'
ORDER BY executed_at DESC;
-- Stalled purges (running > 1 hour)
SELECT table_name, executed_at, executed_by
FROM fp_purge_logs
WHERE status = 'running' AND executed_at < NOW() - INTERVAL '1 hour';
Metrics
No Prometheus metrics are exposed yet. Use the audit trail table for monitoring.
Logging
Purge lifecycle events are logged at INFO level:
[db_purge] Declared purge target (disabled, awaiting admin): task_reports
Purge task_reports: deleted 5000 rows (total: 5000)
db_purge_all: task_reports — deleted 25000 rows (success)
Errors are logged at ERROR with full tracebacks.
Failure Modes
DB statement timeout during purge
Symptom: Purge fails with statement_timeout error
Cause: Large table (>1TB) with slow DELETE or COUNT(*)
Recovery:
- COUNT(*) is skipped automatically above 1GB (since v1.0.1)
- Reduce
batch_sizesetting to smaller chunks (default 5000) - Increase DB
statement_timeoutif appropriate for your workload
Hard crash mid-purge (OOM, kill -9)
Symptom: fp_purge_logs row stuck in status='running' forever
Impact: Partial rows deleted; exact count visible in rows_deleted field (updated per batch commit)
Recovery:
- Check
rows_deletedto see progress - Manually update the row to
status='error'or delete it - Re-run the purge (safe to retry — it's an idempotent
DELETE WHERE ts < cutoff)
Known issue: #3 tracks automatic stale-running reaper
Scheduled purge keeps running after toggle OFF
Symptom: Auto-purge disabled in UI but cron still executes
Impact: P1 data loss if retention policy was changed before disabling
Recovery: Manually disable the task in the tasks_worker scheduled tasks table
Known issue: #4 tracks the fix
Purging table from uninstalled plugin
Risk: Enabled purge rule for a table whose owning plugin was uninstalled
Prevention: No automatic guard — admin must disable purge rules before uninstalling plugins
Recovery: If data was incorrectly purged, restore from DB backup
Upgrade Notes
v1.0.0 → v1.0.1+
Schema migration: declared_hash column added automatically on first load (idempotent ALTER TABLE ADD COLUMN)
Rollback: If downgrading to <1.0.0, drop the column:
ALTER TABLE fp_purge_rules DROP COLUMN declared_hash;
v0.x → v1.0.0
Breaking: Plugin-declared rules now re-disable on declaration change. Previously-enabled rules may need re-validation after upgrade.
Metadata
Release files for fastpluggy-db-purge 1.0.4
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| fastpluggy_db_purge-1.0.4.tar.gz | 36.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| fastpluggy_db_purge-1.0.4-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 65.5 kB
Release files / fastpluggy_db_purge-1.0.4.tar.gz
| Download URL | fastpluggy_db_purge-1.0.4.tar.gz |
|---|---|
| Size | 36.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
9750c490cd7ff1bcf9eca7832fbb9b18fced61b3781cd62bde4732be1557ca6c
|
|
BLAKE2b-256 checksum How to use checksums |
965375573c07725767b427b6adbee81136759c916b0d4b328c91a982310900ca
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.13
|
Release files / fastpluggy_db_purge-1.0.4-py3-none-any.whl
| Download URL | fastpluggy_db_purge-1.0.4-py3-none-any.whl |
|---|---|
| Size | 28.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
d10b1efe26524563c3c63a1bb70e776cb7d375274996e62b447debba7fc54e42
|
|
BLAKE2b-256 checksum How to use checksums |
0fa5e5165bfcaa897066e5abaab5f911819d24abec21094722d1a2b1950eb479
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.13
|