Skip to content

FS/PAGE-CACHE: la eviction bajo presión de caché pierde escrituras del device (snapshot_extract falla) #709

Open

Description

@alexis900

Síntoma

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.

Activity

  1. added
    area/fsNeoFS, VFS, FAT32
    area/kernelNúcleo del kernel: scheduler, memoria, IPC
    priority/highAlta prioridad, siguiente milestone
    on Oct 13, 2026
  2. alexis900 commented on Oct 14, 2026

    @alexis900
    CollaboratorAuthor

    Notas de un intento de arreglo (revertido):

    • 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.
    • Efecto: con los 15 .kbd cargados, neofs_v2_snapshot_extract_file dejó de aparecer pero neofs_v2_cow_reclaims_garbage panicó con Result::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.

  3. alexis900 commented on Oct 14, 2026

    @alexis900
    CollaboratorAuthor

    Cerrada a petición del usuario.

  4. alexis900 commented on Oct 14, 2026

    @alexis900
    CollaboratorAuthor

    Nueva evidencia con el fix de alias ya implementado (PR #710):

    • Con la clave de páginas por dev_tag y evict_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_extract no 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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    area/fsNeoFS, VFS, FAT32area/kernelNúcleo del kernel: scheduler, memoria, IPCpriority/highAlta prioridad, siguiente milestonetype/bugBug o error

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions