fix(fuse): keep what an open file reads when its delete is queued (B186)

This commit is contained in:
nvrl committed 2026-10-05 02:51:55 +02:00
1 parent d26dc8ada4
commit c271a1897c
6 files changed
+109 -5

No files matched your search

+19
View File
@@ -12,6 +12,25 @@ Conventions:
---
## B186 — A file deleted offline while open fails a partial write with "Input/output error"
**Status:** Fixed (unverified).
**Found:** 2026-10-05, in the confirmation run on 3073052 (`three_clients_one_writer_each`
seed 4; it fails on da013c2 too). With its link down, a client opened a file it had uploaded,
deleted it, and appended to it. The append took 30 s and failed with `EIO`.
**Where:** `Core::queue_trash` in `crates/pdfs-fuse/src/lib.rs` and `Core::drain_trash` in
`crates/pdfs-fuse/src/drain.rs`.
**Cause.** A delete sent to Drive at once keeps what an open handle reads, its queued and cached
bytes, until the final close (B106). A delete queued, as local-first and offline do, dropped
them at once. A partial write fills its gaps from those bytes, so it had to download the file,
and offline it could not.
**Fix.** A queued delete of an open file keeps them as well. The final close lets go of them
once the delete has landed, and the delete landing lets go of them once the file is closed.
Sim test `a_file_deleted_offline_while_open_still_reads_and_takes_writes`.
## B185 — A new file written again just as it starts uploading waits out a retry
**Status:** Fixed (unverified).
+2
View File
@@ -107,6 +107,8 @@ by its local id, in the queue, the stored tree and pins alike.
(B184).
- **A new file written again just as it starts uploading no longer waits out a retry** before
it reaches Drive (B185).
- **A file deleted while open can still be read and written until it is closed**, offline too.
A write into it no longer failed with "Input/output error" (B186).
- **A file renamed just as its upload finished keeps its new name.** The mount no longer showed
the old name, and a second rename no longer failed with "No such file or directory" (B152,
B172).
+3 -2
View File
@@ -9,7 +9,7 @@ Tracks `docs/MILESTONE-3.0.0.md`. Update it with every commit that moves a phase
- **Phase 2**: local ids, inode = local id, one tree for every mount (2.10.0).
- **Phase 3, first part**: mkdir, create, rename, unlink and rmdir on the mount are recorded
locally and sent from the queue; `"local_first": false` brings back the old path (5e0f30c).
- Fixes from the simulation and account runs since then: B125, B127, B130 and B141 to B185.
- Fixes from the simulation and account runs since then: B125, B127, B130 and B141 to B186.
- **Sync issues, first cut** (§6.2): refusals sorted into issues, shown at once in the app,
tray and CLI; Export button and `pdfs sync export`; `pdfs sync issues`; Discard button and
`pdfs sync discard`; a warning badge on the node in the file browser.
@@ -111,7 +111,8 @@ Tracks `docs/MILESTONE-3.0.0.md`. Update it with every commit that moves a phase
what its create sent (B183). Replays with those fixed found a third: a create renamed
after it lost its answer (B184). All three fixed; no known-bug matcher fired. It was
stopped before `three_clients`. The rerun on 3073052 found a create that waited out
a retry after a write replaced its blob (B185, fixed).
a retry after a write replaced its blob (B185, fixed), and a file deleted offline
while open that lost the bytes its handle read (B186, fixed; older than 3.0.0).
- [ ] A clean account run. The one on a6f36d5 (2026-10-04, LAN: 427 passed, 12 failed)
failed B113 and B121 on every on-demand mount, two mirror-to-mirror move cases, and
the journal check. B121 was a bug (B149, fixed); B113's case still expected creates