From a159c1c483d9305f0f42455eb212c5f6f44d34ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Arma=C3=ABl=20Gu=C3=A9neau?= Date: Wed, 13 May 2026 18:52:18 +0200 Subject: [PATCH] add missing repair-on-read for k2v range reads --- src/api/k2v/batch.rs | 2 ++ src/api/k2v/index.rs | 2 ++ src/api/k2v/range.rs | 36 +++++++++++++++++++++++++++--------- 3 files changed, 31 insertions(+), 9 deletions(-) diff --git a/src/api/k2v/batch.rs b/src/api/k2v/batch.rs index 8a2d1196..fffcaf83 100644 --- a/src/api/k2v/batch.rs +++ b/src/api/k2v/batch.rs @@ -114,6 +114,7 @@ async fn handle_read_batch_query( query.limit, Some(filter), EnumerationOrder::from_reverse(query.reverse), + monotonic_read, ) .await?; @@ -222,6 +223,7 @@ async fn handle_delete_batch_query( None, Some(filter), EnumerationOrder::Forward, + K2VMonotonicRead::NonMonotonic, ) .await?; assert!(!more); diff --git a/src/api/k2v/index.rs b/src/api/k2v/index.rs index 5188c32f..bb3a628d 100644 --- a/src/api/k2v/index.rs +++ b/src/api/k2v/index.rs @@ -4,6 +4,7 @@ use serde::Serialize; use garage_table::util::*; use garage_model::k2v::item_table::{BYTES, CONFLICTS, ENTRIES, VALUES}; +use garage_model::k2v::rpc::K2VMonotonicRead; use garage_api_common::helpers::*; @@ -40,6 +41,7 @@ pub async fn handle_read_index( limit, Some((DeletedFilter::NotDeleted, node_id_vec)), EnumerationOrder::from_reverse(reverse), + K2VMonotonicRead::NonMonotonic, ) .await?; diff --git a/src/api/k2v/range.rs b/src/api/k2v/range.rs index dc1bdaac..bb851041 100644 --- a/src/api/k2v/range.rs +++ b/src/api/k2v/range.rs @@ -4,6 +4,8 @@ use std::sync::Arc; +use garage_model::k2v::rpc::K2VMonotonicRead; + use garage_table::replication::TableShardedReplication; use garage_table::*; @@ -23,6 +25,7 @@ pub(crate) async fn read_range( limit: Option, filter: Option, enumeration_order: EnumerationOrder, + monotonic_read: K2VMonotonicRead, ) -> Result<(Vec, bool, Option), Error> where F: TableSchema + 'static, @@ -53,15 +56,30 @@ where 1000, limit.map(|x| x as usize).unwrap_or(usize::MAX - 10) - entries.len() + 2, ); - let get_ret = table - .get_range( - partition_key, - start.clone(), - filter.clone(), - n_get, - enumeration_order, - ) - .await?; + let get_ret = match monotonic_read { + K2VMonotonicRead::Monotonic => { + table + .get_range_monotonic( + partition_key, + start.clone(), + filter.clone(), + n_get, + enumeration_order, + ) + .await? + } + K2VMonotonicRead::NonMonotonic => { + table + .get_range( + partition_key, + start.clone(), + filter.clone(), + n_get, + enumeration_order, + ) + .await? + } + }; let get_ret_len = get_ret.len();