You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
FS/PAGE-CACHE: la eviction bajo presión de caché pierde escrituras del device (snapshot_extract falla) #709
neofs_v2_snapshot_extract_file falla: assertion failed: expected true: buf2.iter().all(|&x| x == 0xAB)
— B_REC (fichero extraído del snapshot de un B.TXT de 5000 B) no contiene los
0xAB esperados.
Reproducción / aislamiento
No lo causa el código del test ni el del teclado: el mismo kernel pasa el test
con 2 layouts cargados al boot y falla con 15 (solo cambia el contenido
de la imagen, data/keyboard/*.kbd):
2 .kbd en la imagen → 968 passed.
15 .kbd en la imagen → 967 passed, 1 failed (neofs_v2_snapshot_extract_file).
Cargar más .kbd al boot llena la PageCache global (128 entradas) y fuerza
evictiones durante el test; el device de test (register_test_device) escribe
5000 B que, según parece, se pierden en la eviction.
Hipótesis
Path de eviction/flush con dev_tag (ver #560): al evictar una víctima dirty
de otro device se decide no reescribirla en vez de forzar su flush, o el dev/dev_tag que recibe file_write/flush no coincide con el slot, con lo
que la página dirty se descarta. Con caché vacía (2 layouts) no hay eviction y
el test pasa; con la caché llena, sí.
Impacto
Pérdida silenciosa de escrituras en disco bajo presión de caché (corrupción).
Bloquea habilitar más layouts de teclado (y cualquier uso intensivo de caché).
Relacionado
#560 (cerrada) — flush/eviction por dev_tag; #78 (write-back ordenado).
Criterios de aceptación
Evictar una página dirty la flushea a su propio device, o falla de forma
visible (nunca la descarta en silencio).
neofs_v2_snapshot_extract_file pasa con la caché llena (15 .kbd cargados).
Test de regresión: escritura en device A + presión de caché con device B.
Clave del hash por device: se cambió la clave del hash de páginas de lba a (dev_tag << 48) ^ lba (page_key) en read_page/get_page_mut/load_page/get_or_load_slot/populate_slot/evict_slot/evict_lru/invalidate_*/mark_dirty_sector/peek, y evict_lru pasa a preferir una víctima clean para no descartar dirty.
Conclusión: hace falta un arreglo dedicado con un test de repro mínimo (dos devices + presión de caché) antes de tocar la caché, porque el fallo se entrelaza con COW/invalidación/readahead. Revertido; el árbol queda verde con 2 layouts.
Nueva evidencia con el fix de alias ya implementado (PR #710):
Con la clave de páginas por dev_tagyevict_lru prefiriendo víctima clean, con 2 layouts la suite queda verde (969/969, incluye el nuevo test page_cache_devices_do_not_alias).
Pero con los 15 .kbd cargados sigue fallando neofs_v2_snapshot_extract_file (buf2.iter().all(|&x| x == 0xAB)). El panic de neofs_v2_cow_reclaims_garbage de mi primer intento era un bug mío (populate_slot recibía la clave combinada en vez del LBA) ya corregido.
Conclusión: la causa de snapshot_extractno es el alias por LBA ni la eviction de dirty. Candidatos siguientes: invalidate_range/invalidate_inode (descartan páginas dirty sin flush) o el snapshot/COW de NE2 (dependiente del estado de caché). Sigo con esa vía por separado; #710 no cierra esto.
Activity
feat(kbd): generate layouts from XKB, drop the .klc sources
feat(kbd): layouts desde XKB (sin .klc) + tests + migración (#705)
alexis900 commentedon Oct 14, 2026
Notas de un intento de arreglo (revertido):
hashde páginas delbaa(dev_tag << 48) ^ lba(page_key) enread_page/get_page_mut/load_page/get_or_load_slot/populate_slot/evict_slot/evict_lru/invalidate_*/mark_dirty_sector/peek, yevict_lrupasa a preferir una víctima clean para no descartar dirty..kbdcargados,neofs_v2_snapshot_extract_filedejó de aparecer peroneofs_v2_cow_reclaims_garbagepanicó conResult::unwrap() on an Err(IOError). Es decir, tocar solo la clave no arregla FS/PAGE-CACHE: la eviction bajo presión de caché pierde escrituras del device (snapshot_extract falla) #709 y rompe COW.Conclusión: hace falta un arreglo dedicado con un test de repro mínimo (dos devices + presión de caché) antes de tocar la caché, porque el fallo se entrelaza con COW/invalidación/readahead. Revertido; el árbol queda verde con 2 layouts.
alexis900 commentedon Oct 14, 2026
Cerrada a petición del usuario.
alexis900 commentedon Oct 14, 2026
Nueva evidencia con el fix de alias ya implementado (PR #710):
dev_tagyevict_lruprefiriendo víctima clean, con 2 layouts la suite queda verde (969/969, incluye el nuevo testpage_cache_devices_do_not_alias)..kbdcargados sigue fallandoneofs_v2_snapshot_extract_file(buf2.iter().all(|&x| x == 0xAB)). El panic deneofs_v2_cow_reclaims_garbagede mi primer intento era un bug mío (populate_slotrecibía la clave combinada en vez del LBA) ya corregido.Conclusión: la causa de
snapshot_extractno es el alias por LBA ni la eviction de dirty. Candidatos siguientes:invalidate_range/invalidate_inode(descartan páginas dirty sin flush) o el snapshot/COW de NE2 (dependiente del estado de caché). Sigo con esa vía por separado; #710 no cierra esto.fix(page-cache): scope page keys by device; never drop a dirty victim (…