mirror of
https://github.com/apache/superset.git
synced 2026-07-10 00:35:39 +00:00
VersionDAO.restore_version previously called Continuum's Reverter once per relation in a split-revert loop with flush + expire between calls. That closed an autoflush race in the Reverter when multiple relations were reverted at once, but split one logical restore across multiple Continuum transactions — and once the change-records listener was wired up, the listener's tx-dedup guard skipped the second pass, silently dropping child-addition records from version_changes. A restore that re-added a calculated column would render as an empty "Baseline" entry in the dropdown. Replaces the split-revert with a single ``target_version.revert(relations=relations)`` call wrapped in a new ``single_flush_scope(db.session)`` context manager (``superset/versioning/utils.py``). The context manager suppresses autoflush inside the block and issues one trailing flush on clean exit; on exception, the trailing flush is skipped so the session's normal rollback path handles cleanup. Same autoflush window closed, one Continuum transaction instead of N, the change-records listener sees the complete shadow state in one after_flush pass. The wrapper carries the full autoflush-race / cascade-add rationale in its docstring so the restore_version call site can be a short 6-line block referencing it. Integration coverage: ``test_restore_emits_full_child_diff_in_one_transaction``.