@@ -8,6 +8,7 @@ use saluki_io::net::util::retry::{DefaultHttpRetryPolicy, ExponentialBackoff};
88use serde:: Deserialize ;
99use tracing:: debug;
1010
11+ const FORWARDER_RETRY_QUEUE_PAYLOADS_MAX_SIZE_BYTES : u64 = 15 * 1024 * 1024 ;
1112const RETRY_TXN_DIR : & str = "transactions_to_retry" ;
1213
1314const fn default_request_backoff_factor ( ) -> f64 {
@@ -30,10 +31,6 @@ const fn default_request_recovery_reset() -> bool {
3031 false
3132}
3233
33- const fn default_retry_queue_max_size_bytes ( ) -> u64 {
34- 15 * 1024 * 1024
35- }
36-
3734const fn default_storage_max_size_bytes ( ) -> u64 {
3835 0
3936}
@@ -91,12 +88,14 @@ pub struct RetryConfiguration {
9188 /// The maximum in-memory size of the retry queue, in bytes.
9289 ///
9390 /// Defaults to 15MiB.
94- #[ serde(
95- rename = "forwarder_retry_queue_payloads_max_size" ,
96- alias = "forwarder_retry_queue_max_size" ,
97- default = "default_retry_queue_max_size_bytes"
98- ) ]
99- retry_queue_max_size_bytes : u64 ,
91+ #[ serde( rename = "forwarder_retry_queue_payloads_max_size" ) ]
92+ retry_queue_payloads_max_size : Option < u64 > ,
93+
94+ /// The maximum in-memory size of the retry queue, in bytes. (deprecated)
95+ ///
96+ /// Defaults to 0.
97+ #[ serde( rename = "forwarder_retry_queue_max_size" ) ]
98+ retry_queue_max_size : Option < u64 > ,
10099
101100 /// The maximum size of the retry queue on disk, in bytes.
102101 ///
@@ -151,8 +150,13 @@ impl RetryConfiguration {
151150 }
152151
153152 /// Returns the maximum size of the retry queue in bytes.
154- pub const fn queue_max_size_bytes ( & self ) -> u64 {
155- self . retry_queue_max_size_bytes
153+ ///
154+ /// Preferentially uses `forwarder_retry_queue_payloads_max_size` if set, otherwise uses `forwarder_retry_queue_max_size`. If neither
155+ /// are set, defaults to 15MiB.
156+ pub fn queue_max_size_bytes ( & self ) -> u64 {
157+ self . retry_queue_payloads_max_size
158+ . or ( self . retry_queue_max_size )
159+ . unwrap_or ( FORWARDER_RETRY_QUEUE_PAYLOADS_MAX_SIZE_BYTES )
156160 }
157161
158162 /// Returns the maximum size of the retry queue on disk, in bytes.
@@ -246,4 +250,33 @@ mod tests {
246250
247251 assert_eq ! ( PathBuf :: new( ) , retry_config. storage_path( ) ) ;
248252 }
253+
254+ #[ tokio:: test]
255+ async fn queue_max_size_bytes_fallback_behavior ( ) {
256+ const OVERRIDE_FALLBACK_SIZE_BYTES : u64 = 1024 ;
257+ const OVERRIDE_PRIMARY_SIZE_BYTES : u64 = 2048 ;
258+
259+ // When neither field is set, returns the default (15 MiB).
260+ let ( config, _) = ConfigurationLoader :: for_tests ( None , None , false ) . await ;
261+ let retry_config: RetryConfiguration = config. as_typed ( ) . expect ( "should deserialize" ) ;
262+ assert_eq ! (
263+ retry_config. queue_max_size_bytes( ) ,
264+ FORWARDER_RETRY_QUEUE_PAYLOADS_MAX_SIZE_BYTES
265+ ) ;
266+
267+ // When only the deprecated field is set, uses it.
268+ let values = json ! ( { "forwarder_retry_queue_max_size" : OVERRIDE_FALLBACK_SIZE_BYTES } ) ;
269+ let ( config, _) = ConfigurationLoader :: for_tests ( Some ( values) , None , false ) . await ;
270+ let retry_config: RetryConfiguration = config. as_typed ( ) . expect ( "should deserialize" ) ;
271+ assert_eq ! ( retry_config. queue_max_size_bytes( ) , OVERRIDE_FALLBACK_SIZE_BYTES ) ;
272+
273+ // When both fields are set, the newer field takes priority.
274+ let values = json ! ( {
275+ "forwarder_retry_queue_payloads_max_size" : OVERRIDE_PRIMARY_SIZE_BYTES ,
276+ "forwarder_retry_queue_max_size" : OVERRIDE_FALLBACK_SIZE_BYTES ,
277+ } ) ;
278+ let ( config, _) = ConfigurationLoader :: for_tests ( Some ( values) , None , false ) . await ;
279+ let retry_config: RetryConfiguration = config. as_typed ( ) . expect ( "should deserialize" ) ;
280+ assert_eq ! ( retry_config. queue_max_size_bytes( ) , OVERRIDE_PRIMARY_SIZE_BYTES ) ;
281+ }
249282}
0 commit comments