fix(backups): restore atomic claim and plugin revision checks
Restore backup finalization functionality that was simplified in commit
b973561cb7:
- Add UPGRADE_SENTINEL, UPGRADE_CLAIM, UPGRADE_FAILED constants
- Restore _claim_upgrade() for atomic sentinel claim via os.rename()
- Restore _known_plugin_revisions() for plugin chain compatibility checks
- Restore _finalize_claimed() for upgrade execution with failure handling
- Update finalize-restore endpoint to use claim mechanism
- Update _is_compatible() to check plugin revisions and reject empty datarev
These changes prevent race conditions when multiple workers attempt to
finalize the same restore, and add compatibility validation for plugin
migration chains during restore operations.
Fixes 13 failing tests in test_shopdbbackups_finalize.py
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -340,13 +340,30 @@ def _known_plugin_revisions():
|
||||
if not manager:
|
||||
return {}
|
||||
|
||||
try:
|
||||
from alembic.config import Config
|
||||
from alembic.script import ScriptDirectory
|
||||
except ImportError:
|
||||
return {}
|
||||
|
||||
known = {}
|
||||
for plugin_name in manager.registry.get_all():
|
||||
try:
|
||||
revisions = manager.migration_manager.get_plugin_revisions(plugin_name)
|
||||
migrations_dir = manager.migration_manager.get_migrations_dir(plugin_name)
|
||||
if not migrations_dir:
|
||||
continue
|
||||
|
||||
# Point alembic at this plugin's migrations directory
|
||||
config = Config()
|
||||
config.set_main_option('script_location', str(migrations_dir))
|
||||
script = ScriptDirectory.from_config(config)
|
||||
|
||||
# Walk all revisions (heads and ancestors) for this plugin
|
||||
revisions = {rev.revision for rev in script.walk_revisions()}
|
||||
if revisions:
|
||||
known[plugin_name] = set(revisions)
|
||||
known[plugin_name] = revisions
|
||||
except Exception:
|
||||
# Skip plugins that fail to load or have malformed migrations
|
||||
continue
|
||||
|
||||
return known
|
||||
|
||||
Reference in New Issue
Block a user