Implement master promotion feature
All checks were successful
Deploy / deploy (push) Successful in 33s
All checks were successful
Deploy / deploy (push) Successful in 33s
Allows promoting any replica to master with zero document re-downloads.
The sync_map rebuild uses existing DB data only — pure in-memory join.
Changes:
- app/sync/promote.py: preflight() checks (doc count, sync lock, ack
warnings) and promote() transaction (pause scheduler, rebuild all
sync_maps, create old-master replica, swap settings, resume scheduler)
- app/api/master.py: GET /api/master/promote/{id}/preflight (dry run)
and POST /api/master/promote/{id} (execute)
- app/models.py: add promoted_from_master bool field to Replica
- app/database.py: idempotent ALTER TABLE migration for new column
- app/main.py: register master router
- app/templates/replica_detail.html: "Promote to Master" button +
dialog with pre-flight summary, 3-card stats, ack checkboxes, spinner
- app/ui/routes.py: flash query param on dashboard route
- app/templates/dashboard.html: blue info banner for post-promotion flash
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -86,7 +86,7 @@ async def doc_counts_fragment(request: Request, session: Session = Depends(get_s
|
||||
|
||||
|
||||
@router.get("/", response_class=HTMLResponse)
|
||||
def dashboard(request: Request, session: Session = Depends(get_session)):
|
||||
def dashboard(request: Request, session: Session = Depends(get_session), flash: Optional[str] = None):
|
||||
replicas = session.exec(select(Replica)).all()
|
||||
now = datetime.now(timezone.utc)
|
||||
progress = get_progress()
|
||||
@@ -133,6 +133,7 @@ def dashboard(request: Request, session: Session = Depends(get_session)):
|
||||
"replica_rows": replica_rows,
|
||||
"last_run": last_run,
|
||||
"progress": progress,
|
||||
"flash": flash,
|
||||
},
|
||||
)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user