diff --git a/seaweed-volume/src/server/write_queue.rs b/seaweed-volume/src/server/write_queue.rs index 6286bc81c2..2398ec75d1 100644 --- a/seaweed-volume/src/server/write_queue.rs +++ b/seaweed-volume/src/server/write_queue.rs @@ -376,9 +376,10 @@ fn process_batch(state: Arc, batch: Vec) { for (needle, fsync, response_tx, pending) in entries { // A delete reaching a remounted volume cannot cancel a write // queued for the old one. - if let (Ok(vol), Some(pending)) = (&vol, &pending) - && !vol.tracks_pending_write(pending) + if let (Ok(vol), Some(tracked)) = (&vol, &pending) + && !vol.tracks_pending_write(tracked) { + drop(pending); let _ = response_tx.send(Err(VolumeError::NotFound)); continue; } @@ -396,6 +397,9 @@ fn process_batch(state: Arc, batch: Vec) { }) .collect(), }; + // Untrack before replying, as Go does: a caller that sees its write + // finish must not still find it pending. + drop(pendings); for (response_tx, result) in senders.into_iter().zip(results) { // Send result back; ignore error if receiver dropped. let _ = response_tx.send(result);