You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: UPDATING.md
+29-2Lines changed: 29 additions & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -52,6 +52,33 @@ One caveat on turning soft delete back off: objects archived while it was on are
52
52
**resurrected** into normal listings, since the rows were never removed — an
53
53
emergency stop rather than a clean rollback.
54
54
55
+
### Version history is on by default
56
+
57
+
`VERSION_HISTORY` and `ENABLE_VERSIONING_CAPTURE` now both ship **on**. Every
58
+
save of a chart, dashboard, or dataset writes version rows, and the version
59
+
history panel appears on Explore and Dashboard pages. The two flip together
60
+
deliberately: a panel with capture off renders an empty "No history yet" that
61
+
misrepresents the entity as unchanged.
62
+
63
+
**What operators should expect:**
64
+
65
+
-**Storage growth.** Capture writes shadow rows per save, so the metadata
66
+
database grows with edit volume. The `version_history.prune_old_versions`
67
+
beat task removes rows whose transaction is older than
68
+
`SUPERSET_VERSION_HISTORY_RETENTION_DAYS` (default 30). A deployment that
69
+
replaces `CELERY_CONFIG` rather than inheriting it must carry both the
70
+
`superset.tasks.version_history_retention` import and the beat entry; a
71
+
startup warning names whichever is absent.
72
+
-**`PUT` responses change shape.** Entity updates now return populated
73
+
`old_version_uuid` / `new_version_uuid` fields and an `ETag` header, which
74
+
were null or absent while capture was off.
75
+
76
+
`ENABLE_VERSIONING_CAPTURE` is **retained permanently** as an operational
77
+
kill-switch — not removed with the rollout toggles. Setting it to a falsy value
78
+
stops capture within a restart, without a revert-and-redeploy. Unlike the
79
+
soft-delete toggle, turning it off is a clean stop: existing version rows remain
80
+
readable and no entity state is altered.
81
+
55
82
### Scheduled report execution now enforces one application deadline
56
83
57
84
Scheduled report (not alert) executions are now governed by a single
@@ -481,7 +508,7 @@ Entity version history (the `version_transaction` / `*_version` shadow tables th
481
508
|---|---|---|
482
509
|`SUPERSET_VERSION_HISTORY_RETENTION_DAYS`|`30`| Version rows whose owning `version_transaction.issued_at` is older than this many days are pruned. Each entity's live row (`end_transaction_id IS NULL`) is always preserved, as are the live rows of its children and associations; closed historical rows (including the baseline) age out. Set to `0` or a negative value to disable pruning. |
483
510
484
-
The task ships in the default `CeleryConfig` (both the `superset.tasks.version_history_retention` import and the beat entry). A deployment that overrides `CELERY_CONFIG` without the beat entry logs a startup warning. When the override explicitly defines `imports`, a missing retention module is also reported; an absent `imports` setting is not diagnosed because Celery may register tasks through `include`, autodiscovery, or worker startup imports. Retention only prunes whatever history exists — capture itself is gated separately by `ENABLE_VERSIONING_CAPTURE` (ships off).
511
+
The task ships in the default `CeleryConfig` (both the `superset.tasks.version_history_retention` import and the beat entry). A deployment that overrides `CELERY_CONFIG` without the beat entry logs a startup warning. When the override explicitly defines `imports`, a missing retention module is also reported; an absent `imports` setting is not diagnosed because Celery may register tasks through `include`, autodiscovery, or worker startup imports. Retention only prunes whatever history exists — capture itself is gated separately by `ENABLE_VERSIONING_CAPTURE`, which now ships on.
485
512
486
513
### Deletion retention (soft-deleted entities are eventually purged)
487
514
@@ -491,7 +518,7 @@ Purging is **live by default** (`SOFT_DELETE_PURGE_DRY_RUN=False`), so the reten
491
518
492
519
Deployments that replace the default `CELERY_CONFIG` must ensure workers register `superset.tasks.deletion_retention` and schedule the `deletion_retention.purge_soft_deleted` task themselves. The shipped Docker development config uses `imports` and includes both entries. While `SOFT_DELETE` is statically enabled, a missing beat entry logs a startup warning; when the override explicitly defines `imports`, a missing purge module is also reported.
493
520
494
-
Operators can immediately erase a specific entity for compliance (GDPR) via `superset deletion-retention force-purge --uuid <uuid>`; this applies legacy hard-delete semantics — a live chart referencing a force-purged dataset is left without a datasource until re-pointed (the chart is not modified), and it purges the named entity even when it was never soft-deleted. Every purge writes an immutable, content-free audit record to the new `purge_audit_log` table that survives the entity it names: the **scheduled** purge fails closed (an entity whose audit row cannot be written is skipped and retried next run), while **force-purge** proceeds even if the audit write fails — the operator is present and deletion outranks audit for a compliance erasure.
521
+
Operators can immediately erase a specific entity for compliance (GDPR) via `superset deletion-retention force-purge --uuid <uuid>`; this applies legacy hard-delete semantics — a live chart referencing a force-purged dataset is left without a datasource until re-pointed (the chart is not modified), and it purges the named entity even when it was never soft-deleted. Every scheduled evaluation writes a provisional, content-free record to the new `purge_audit_log` table before the cascade starts. Meaningful retained outcomes survive the entity they name. Consecutive scheduled evaluations with the same blocked outcome suppress only the redundant current provisional record; completed outcomes, outcome transitions, and every force-purge attempt remain independent and immutable. The **scheduled** purge fails closed when its provisional record cannot be written, while **force-purge** proceeds even if the audit write fails — the operator is present and deletion outranks audit for a compliance erasure. Operators can monitor `deletion_retention.blocked_audit_suppressed` and `deletion_retention.blocked_audit_dedupe_fallback` to verify suppression and fail-safe fallback behavior without changing the existing blocked-workload gauge.
495
522
496
523
### Recently Archived view and permanent delete (purge) endpoints
SimpleCache (in-memory), MinIO/S3, or the local filesystem.
19
+
[Custom cache backends](https://flask-caching.readthedocs.io/en/latest/#custom-cache-backends) are also supported.
21
20
22
21
Caching can be configured by providing dictionaries in
23
22
`superset_config.py` that comply with [the Flask-Caching config specifications](https://flask-caching.readthedocs.io/en/latest/#configuring-flask-caching).
@@ -47,6 +46,7 @@ In order to use dedicated cache stores, additional python libraries must be inst
47
46
- For Redis: we recommend the [redis](https://pypi.python.org/pypi/redis) Python package
48
47
- Memcached: we recommend using [pylibmc](https://pypi.org/project/pylibmc/) client library as
49
48
`python-memcached` does not handle storing binary data correctly.
49
+
- MinIO (S3): we recommend using the [minio-flask-cache](https://github.com/greggailly/minio-flask-cache) package
Copy file name to clipboardExpand all lines: docs/static/feature-flags.json
+2-2Lines changed: 2 additions & 2 deletions
Original file line number
Diff line number
Diff line change
@@ -107,9 +107,9 @@
107
107
},
108
108
{
109
109
"name": "VERSION_HISTORY",
110
-
"default": false,
110
+
"default": true,
111
111
"lifecycle": "development",
112
-
"description": "Enables the version history panel on Explore and Dashboard pages. History only accrues while ``ENABLE_VERSIONING_CAPTURE`` is also on; with capture off the panel renders but stays empty."
112
+
"description": "Enables the version history panel on Explore and Dashboard pages. History only accrues while ``ENABLE_VERSIONING_CAPTURE`` is also on; with capture off the panel renders but stays empty, so the two ship with matching defaults and should be changed together."
Copy file name to clipboardExpand all lines: pyproject.toml
+9-9Lines changed: 9 additions & 9 deletions
Original file line number
Diff line number
Diff line change
@@ -68,19 +68,19 @@ dependencies = [
68
68
# not just a connection-pool quirk. Needs dedicated investigation, not a
69
69
# driver-compat-prep bump; revisit alongside the actual SQLAlchemy 2.0
70
70
# core bump (discussion #40273, step 6).
71
-
"flask-sqlalchemy>=2.5.1, <3.0",
71
+
"flask-sqlalchemy>=2.5.1, <4.0",
72
72
"flask-wtf>=1.3.0, <2.0",
73
73
"geopy",
74
74
"greenlet<=3.5.4, >=3.5.4",
75
75
"gunicorn>=26.0.0, <27; sys_platform != 'win32'",
76
76
"hashids>=1.3.1, <2",
77
77
# holidays>=0.45 required for security fix
78
-
"holidays>=0.99, <1",
78
+
"holidays>=0.101, <1",
79
79
"humanize",
80
80
"isodate",
81
81
"jsonpath-ng>=1.8.0, <2",
82
82
"Mako>=1.2.2",
83
-
"markdown>=3.10.2",
83
+
"markdown>=3.10.3",
84
84
# marshmallow 4 compatibility: see superset/marshmallow_compatibility.py for a
85
85
# Flask-AppBuilder workaround. Tracking issue:
86
86
# https://github.com/apache/superset/issues/33162
@@ -108,10 +108,10 @@ dependencies = [
108
108
"pyarrow>=24.0.0, <26", # before upgrading pyarrow, check that all db dependencies support this, see e.g. https://github.com/apache/superset/pull/34693
109
109
"pyyaml>=6.0.3, <7.0.0",
110
110
"PyJWT>=2.4.0, <3.0",
111
-
"redis>=5.0.0, <9.0",
111
+
"redis>=8.1.0, <9.0",
112
112
"rison>=2.0.1, <3.0",
113
113
"selenium>=4.46.0, <5.0",
114
-
"shillelagh[gsheetsapi]>=1.4.4, <2.0",
114
+
"shillelagh[gsheetsapi]>=1.4.5, <2.0",
115
115
"sshtunnel>=0.4.0, <0.5",
116
116
"simplejson>=4.1.1",
117
117
"slack_sdk>=3.43.0, <4",
@@ -131,7 +131,7 @@ dependencies = [
131
131
132
132
[project.optional-dependencies]
133
133
134
-
athena = ["pyathena[pandas]>=3.35.2, <4"]
134
+
athena = ["pyathena[pandas]>=3.35.4, <4"]
135
135
# No SQLAlchemy 2.0 support anywhere in this dialect's ecosystem today: our
136
136
# own preset-io/sqlalchemy-aurora-data-api fork is dead since 2021, and the
137
137
# more active community fork (cloud-utils/sqlalchemy-aurora-data-api) has an
@@ -143,7 +143,7 @@ bigquery = [
143
143
# 1.17.1 is likely the final release: googleapis/python-bigquery-sqlalchemy
144
144
# was archived 2026-05-16. Both 1.17.0 and 1.17.1 support SQLAlchemy 1.4/2.0.
145
145
"sqlalchemy-bigquery>=1.17.1",
146
-
"google-cloud-bigquery>=3.42.2",
146
+
"google-cloud-bigquery>=3.42.3",
147
147
]
148
148
clickhouse = ["clickhouse-connect>=1.6.0, <2.0"]
149
149
cockroachdb = ["cockroachdb>=0.3.5, <0.4"]
@@ -204,7 +204,7 @@ fastmcp = [
204
204
firebird = ["sqlalchemy-firebird>=0.8.0, <2.0.0"]
205
205
firebolt = ["firebolt-sqlalchemy>=1.1.2, <2"]
206
206
gevent = ["gevent>=26.7.0"]
207
-
gsheets = ["shillelagh[gsheetsapi]>=1.4.4, <2"]
207
+
gsheets = ["shillelagh[gsheetsapi]>=1.4.5, <2"]
208
208
hana = ["hdbcli==2.29.25", "sqlalchemy_hana==3.0.3"]
0 commit comments