fix: unblock the demo reset rollback after an interrupted restore #171
No reviewers
Labels
No labels
auto-merge
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
AcadeNice/corentin_wakdo!171
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "fix/demo-reset-rollback-escape"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Le piege
scripts/demo-reset.shrejoue un dump complet a l'etape[4/6]: DROP, puisCREATE, puis INSERT, table par table. Si elle meurt entre le DROP et l'INSERT de
schema_migrations(coupure, disque plein, base qui tombe), le schema reste amoitie change et la table de suivi a disparu.
Le retour arriere vers la sauvegarde de securite que l'outil venait de prendre a
l'etape
[3/6]repassait alors par la verification de compatibilite de l'etape[1/6], qui voyait la divergence et refusait en code 3. Le retour arriere etaitbloque exactement au moment ou il sert, et la documentation renvoyait vers le
dump nocturne du cron : tout ce qui s'est passe depuis la nuit etait perdu.
La sortie de secours
Une sauvegarde de securite est, par construction, l'image de CETTE base-la prise
quelques secondes plus tot. Chaque sauvegarde porte desormais un marqueur
rollback.tagecrit par l'outil, qui contient :des tables systeme du schema
mysql, projet compose et conteneurwakdo-db,condenses en sha256) — une restauration applicative ne la change pas, donc
elle survit telle quelle a une restauration interrompue ;
db.sql.gzpose a cote, qui lie le marqueur a cecontenu precis.
L'etape
[1/6]leve la comparaison de schema seulement si les quatre conditionstiennent ensemble :
meta.txtannoncekind=pre-reset, le marqueur est present,son empreinte de base correspond a la base visee maintenant, et son empreinte de
dump correspond au dump pose a cote.
La levee est aussi directionnelle : elle ne joue que quand la base a PERDU
des migrations que la sauvegarde possede, la signature d'une restauration
interrompue. Une migration appliquee DEPUIS (vrai deploiement entre-temps) reste
refusee avec le meme code de sortie, marqueur ou pas. Il n'y a pas d'option
--force: le garde-fou n'est pas desarme, seul le chemin sur par constructionest ouvert. Chaque levee est annoncee en clair et tracee dans
demo-backups/rollback-escape.log;--dry-runl'annonce sans rien ecrire.Les controles d'integrite du dump ajoutes par #167 tournent avant et
independamment : une sauvegarde marquee dont le
db.sql.gzest vide, tronque,non-gzip, ou sans
-- Dump completedreste refusee.Tests
tests/shell/demo-snapshot-lib.test.sh(jobshell-tests, sans Docker) passe de18 a 37 assertions. Les nouvelles couvrent : une sauvegarde marquee acceptee
alors que
schema_migrationsdiverge ; un instantane ordinaire avec la memedivergence toujours refuse ; un marqueur absent, recopie sur un autre instantane,
retouche a la main, ou venu d'une autre base qui n'accorde rien ; et le maintien
des controles d'integrite sur le retour arriere.
Verification en conditions reelles
Pile jetable
wakdorbk(detruite depuis, aucun reste), vraie remise a zerocoupee en plein
[4/6]en tuant le client de restauration pendant la remise enplace de
schema_migrations:schema_migrationsproductproduct_ingredientMenus (abime par le jury)MenusMenus (abime par le jury)Sur ce meme etat hybride : le code de
devrefuse le retour arriere en code 3 ;un instantane ordinaire (
--snapshot reference) reste refuse en code 3 avec lecorrectif ; l'empreinte de base est identique avant et apres l'interruption, ce
qui est la propriete sur laquelle repose le marqueur.
Ce que la sortie de secours ne couvre pas
Detaille dans
docs/ops/demo-reset.md: elle porte sur la compatibilite deschema, pas sur l'integrite du fichier ni sur l'identite de cible (code 7, qui
passe avant) ; ce n'est pas une signature (pas de secret dans le depot, donc elle
ecarte l'erreur de manipulation, pas une falsification deliberee et complete) ;
elle ne verifie pas que le code deploye correspond au schema restaure ; elle ne
repare pas une sauvegarde non marquee ; et elle ne couvre pas la perte du volume
de donnees, qui reste du ressort du dump nocturne.