Régression critique (#158)
Commit responsable : ada6568 (fix #157)
Symptôme : Après le fix #157, la sync est totalement morte dans les deux sens :
- LOCAL → GhD: : New File, Copy, Rename, Delete — OK localement, rien ne se propage
- GhD: → LOCAL : New File, Copy, Rename, Delete — OK sur GhD:, rien ne se propage
Root cause
Le fix #157 utilisait CF_OPERATION_TRANSFER_PLACEHOLDERS_FLAG_DISABLE_ON_DEMAND_POPULATION dans ghd_cf_ack_placeholders. Ce flag modifie le reparse point CF du répertoire via CfExecute, ce qui interfère avec ReadDirectoryChangesW (fsnotify) et/ou bloque les opérations de fichiers CF dans la sync root.
Analyse
| Commit |
Bug |
Verdict |
c960386 (#152) |
placeholderOK guard |
Bénin — n'affecte que le badge CF, pas le download |
e96c48d (#153) |
filepath.ToSlash(evt.Path) |
No-op — le watcher relativise déjà en forward-slash |
e99fedb (#154) |
SHChangeNotify trailing sep |
Bénin — n'affecte pas la sync engine |
007e813 |
Tests #153-155 |
Bénin |
80d618b (#156) |
hrAlreadyPlaceholder no-op |
Bénin — ne touche pas CF state |
ada6568 (#157) |
DISABLE_ON_DEMAND_POPULATION |
ROOT CAUSE #158 |
Fix
cgo_cfapi_windows.c : Revert → CF_OPERATION_TRANSFER_PLACEHOLDERS_FLAG_NONE (pas de modification du reparse point)
provider.go : Ajout cooldown dedup 30s dans ghdOnFetchPlaceholders
- 1ère invocation par path :
OnFetchPlaceholders → backend.List() → CfCreatePlaceholders → store timestamp
- Invocations suivantes dans la fenêtre 30s : ack immédiat (S_OK, FLAG_NONE) sans appeler backend.List()
SyncProvider : Ajout populatedDirs sync.Map pour tracking des timestamps
Tests
| Test |
Vérifie |
TestRegression158_AckFlag_None |
Le flag ack est FLAG_NONE (pas DISABLE_ON_DEMAND) |
TestRegression157_TransferFlags_ConstantValues |
Valeurs SDK Windows exactes |
TestRegression158_Cooldown_NeverPopulated |
1ère invocation non skippée |
TestRegression158_Cooldown_WithinWindow |
Invocation dans 30s skippée |
TestRegression158_Cooldown_AtBoundary |
Exactement 30s → non skippé |
TestRegression158_Cooldown_AfterExpiry |
Après expiry → non skippé |
TestRegression158_Cooldown_DifferentPaths |
Cooldown indépendant par path |
18/18 packages PASS — race detector ✓
Régression critique (#158)
Commit responsable :
ada6568(fix #157)Symptôme : Après le fix #157, la sync est totalement morte dans les deux sens :
Root cause
Le fix #157 utilisait
CF_OPERATION_TRANSFER_PLACEHOLDERS_FLAG_DISABLE_ON_DEMAND_POPULATIONdansghd_cf_ack_placeholders. Ce flag modifie le reparse point CF du répertoire viaCfExecute, ce qui interfère avecReadDirectoryChangesW(fsnotify) et/ou bloque les opérations de fichiers CF dans la sync root.Analyse
c960386(#152)placeholderOKguarde96c48d(#153)filepath.ToSlash(evt.Path)e99fedb(#154)SHChangeNotifytrailing sep007e81380d618b(#156)hrAlreadyPlaceholderno-opada6568(#157)Fix
cgo_cfapi_windows.c: Revert →CF_OPERATION_TRANSFER_PLACEHOLDERS_FLAG_NONE(pas de modification du reparse point)provider.go: Ajout cooldown dedup 30s dansghdOnFetchPlaceholdersOnFetchPlaceholders→ backend.List() → CfCreatePlaceholders → store timestampSyncProvider: AjoutpopulatedDirs sync.Mappour tracking des timestampsTests
TestRegression158_AckFlag_NoneTestRegression157_TransferFlags_ConstantValuesTestRegression158_Cooldown_NeverPopulatedTestRegression158_Cooldown_WithinWindowTestRegression158_Cooldown_AtBoundaryTestRegression158_Cooldown_AfterExpiryTestRegression158_Cooldown_DifferentPaths18/18 packages PASS — race detector ✓