Fix Windows expansion journal persistence in alpha.13.1
Build Sanctuary / build (push) Canceled after 0s
Build Sanctuary / build (push) Canceled after 0s
This commit is contained in:
@@ -19,6 +19,80 @@ Pour générer de vrais chunks et vérifier le spawn sur d'autres graines :
|
||||
La propriété ne s'applique qu'au mod de test, jamais au mod distribué ni à une
|
||||
sauvegarde de joueur. Chaque commande repart d'un monde de développement neuf.
|
||||
|
||||
## Correctif alpha.13.1 — journal d’expansion sous Windows
|
||||
|
||||
Le 9 septembre 2026, le contrôle ciblé suivant passe sur macOS et Java 25 :
|
||||
|
||||
```sh
|
||||
./gradlew :sanctuary:expansionJournalSmoke --console=plain
|
||||
```
|
||||
|
||||
Le journal de cette exécution est `build/alpha131-journal-smoke.log` :
|
||||
`BUILD SUCCESSFUL`, en 7 secondes. Le test écrit et relit de vrais fichiers
|
||||
temporaires ; il n’ouvre aucune sauvegarde Minecraft personnelle.
|
||||
|
||||
Les contrôles existants de persistance, de corruption, d’historique immuable
|
||||
et de compatibilité des racines restent actifs. Trois scénarios couvrent le
|
||||
correctif :
|
||||
|
||||
- La politique Windows, sélectionnée par le séparateur `\`, permet la création
|
||||
du journal, une réservation, sa finalisation et leurs rechargements. Le
|
||||
callback de synchronisation du dossier, qui lèverait `AccessDeniedException`,
|
||||
n’est jamais appelé. Les écritures, remplacements atomiques et relectures du
|
||||
fichier ont réellement lieu sur le système de fichiers du Mac.
|
||||
- La politique Unix conserve une erreur `AccessDeniedException` injectée après
|
||||
le remplacement atomique. La session devient indisponible, garde son ancien
|
||||
état en mémoire et refuse toute nouvelle écriture. Le journal sur disque
|
||||
contient la réservation ; une nouvelle instance la relit et peut la terminer.
|
||||
- Une corruption injectée après le remplacement mais avant la relecture
|
||||
empêche la publication du nouveau plan et conserve le fichier endommagé.
|
||||
Le rechargement refuse ce journal au lieu de créer un historique vide.
|
||||
|
||||
**La branche Windows est simulée ; aucun processus Java ou Minecraft Windows
|
||||
natif n’a encore été exécuté pour cette validation.**
|
||||
|
||||
`check build assemblePack` passe sur les sources alpha.13.1, en 1 min 27 s,
|
||||
avec les huit GameTests du monde Moyen de graine 0. Les scénarios d’expansion
|
||||
passent ensuite dans deux processus Minecraft distincts, sur la graine 42 et
|
||||
le diamètre 724 : création (1 min 32 s), puis réouverture et nouvelle expansion
|
||||
(26 s). Deux tests requis passent à chaque étape. Commandes de reproduction :
|
||||
|
||||
```sh
|
||||
./gradlew check build assemblePack -PsanctuaryTestSeed=0 -PsanctuaryResourceSurvey=off -PsanctuaryDensityMaps=false --console=plain
|
||||
./gradlew :sanctuary:runGameTest -PsanctuaryExpansionTests=true -PsanctuaryOptionalStructureWitness=true -PsanctuaryTestDiameter=724 -PsanctuaryTestSeed=42 -PsanctuaryResourceSurvey=off -PsanctuaryDensityMaps=false --console=plain
|
||||
./gradlew :sanctuary:runGameTest -PsanctuaryExpansionTests=true -PsanctuaryExpansionReload=true -PsanctuaryOptionalStructureWitness=true -PsanctuaryTestDiameter=724 -PsanctuaryTestSeed=42 -PsanctuaryResourceSurvey=off -PsanctuaryDensityMaps=false --console=plain
|
||||
```
|
||||
|
||||
Lancer les deux scénarios d’expansion consécutivement ; le second réutilise
|
||||
uniquement leur monde de développement. Comme pour l’alpha.13, le témoin de
|
||||
camp naturel est facultatif et absent après recherche complète sur cette
|
||||
graine ; aucune nouvelle preuve de structure n’est revendiquée.
|
||||
Les [résultats alpha.13.1](benchmarks/alpha131-journal.json) conservent les
|
||||
hashes des journaux de test, les identifiants des deux processus et les régions.
|
||||
La comparaison des JAR confirme que seuls le journal, sa classe de stratégie
|
||||
et la version changent ; le switch synthétique ne change que ses numéros de
|
||||
lignes. Toutes les autres classes et ressources restent identiques.
|
||||
Les résultats des trois tailles et de l’interface ci-dessous restent ceux de
|
||||
la livraison alpha.13 ; ils n’ont pas été réexécutés pour ce correctif de stockage.
|
||||
|
||||
La cause est établie par les sources de
|
||||
[WindowsChannelFactory dans OpenJDK 25](https://github.com/openjdk/jdk/blob/jdk-25-ga/src/java.base/windows/classes/sun/nio/fs/WindowsChannelFactory.java#L206-L272) :
|
||||
`FileChannel.open` n’ajoute pas le drapeau `FILE_FLAG_BACKUP_SEMANTICS`, exigé
|
||||
pour ouvrir un répertoire selon la
|
||||
[documentation Microsoft de CreateFile](https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-createfilew#directories).
|
||||
Seule cette synchronisation du dossier est omise sous Windows ; les exceptions
|
||||
d’écriture, de remplacement ou de relecture restent bloquantes.
|
||||
|
||||
Le fichier temporaire est toujours synchronisé par `force(true)`, puis remplacé
|
||||
atomiquement et vérifié. Cette séquence ne garantit pas sous Windows la même
|
||||
durabilité du renommage en cas de coupure secteur qu’une synchronisation du
|
||||
répertoire sous Unix :
|
||||
[OpenJDK utilise MoveFileEx sans WRITE_THROUGH](https://github.com/openjdk/jdk/blob/jdk-25-ga/src/java.base/windows/classes/sun/nio/fs/WindowsFileCopy.java#L279-L294),
|
||||
et le contrat de
|
||||
[FileChannel.force](https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/nio/channels/FileChannel.html#force(boolean))
|
||||
porte sur les modifications du fichier. Aucun changement de format, de graine,
|
||||
de générateur ou de réservation enregistrée n’est introduit.
|
||||
|
||||
## Alpha.13 — génération unifiée
|
||||
|
||||
`check build assemblePack` passe, y compris le monde Moyen de graine 0 et les
|
||||
|
||||
Reference in New Issue
Block a user