From 8fa371e01120463007a6a3be19644d987ef2903b Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Tue, 17 Mar 2026 19:50:43 -0700 Subject: [PATCH] Add version mismatch check to SetState matching Go's State.Update Go's State.Update compares the incoming version with the stored version and returns "version mismatch" error if they differ. This provides optimistic concurrency control. The Rust implementation was accepting any version unconditionally. --- seaweed-volume/src/server/grpc_server.rs | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/seaweed-volume/src/server/grpc_server.rs b/seaweed-volume/src/server/grpc_server.rs index 4aa5b79f1..e0afe4d11 100644 --- a/seaweed-volume/src/server/grpc_server.rs +++ b/seaweed-volume/src/server/grpc_server.rs @@ -852,8 +852,15 @@ impl VolumeServer for VolumeGrpcService { let req = request.into_inner(); if let Some(new_state) = &req.state { - // Match Go: simply apply the state without version checking. - // Go's SetState calls vs.store.State.Update(req.GetState()) unconditionally. + // Go's State.Update checks version: if incoming version != stored version → error. + let current_version = self.state.state_version.load(Ordering::Relaxed); + if new_state.version != current_version { + return Err(Status::failed_precondition(format!( + "version mismatch for VolumeServerState (got {}, want {})", + new_state.version, current_version + ))); + } + self.state .maintenance .store(new_state.maintenance, Ordering::Relaxed);