Skip to content

Commit 7a52690

Browse files
committed
fix(retry): resolve async closure compilation error in tests
- Replace mutable variable capture with Arc<AtomicU32> - Use Ordering::Relaxed for thread-safe counter - Fixes: captured variable cannot escape FnMut closure body - All 12 execution-engine tests now pass
1 parent d453214 commit 7a52690

1 file changed

Lines changed: 23 additions & 13 deletions

File tree

rust/execution-engine/src/retry.rs

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -122,41 +122,51 @@ impl RetryPolicy {
122122
#[cfg(test)]
123123
mod tests {
124124
use super::*;
125+
use std::sync::atomic::{AtomicU32, Ordering};
126+
use std::sync::Arc;
125127

126128
#[tokio::test]
127129
async fn test_retry_success_on_second_attempt() {
128130
let policy = RetryPolicy::new(3, 10);
129-
let mut attempts = 0;
131+
let attempts = Arc::new(AtomicU32::new(0));
132+
let attempts_clone = attempts.clone();
130133

131134
let result = policy
132-
.execute(|| async {
133-
attempts += 1;
134-
if attempts < 2 {
135-
Err("temporary error")
136-
} else {
137-
Ok(42)
135+
.execute(|| {
136+
let attempts = attempts_clone.clone();
137+
async move {
138+
let current = attempts.fetch_add(1, Ordering::Relaxed) + 1;
139+
if current < 2 {
140+
Err("temporary error")
141+
} else {
142+
Ok(42)
143+
}
138144
}
139145
})
140146
.await;
141147

142148
assert!(result.is_ok());
143149
assert_eq!(result.unwrap(), 42);
144-
assert_eq!(attempts, 2);
150+
assert_eq!(attempts.load(Ordering::Relaxed), 2);
145151
}
146152

147153
#[tokio::test]
148154
async fn test_retry_max_attempts() {
149155
let policy = RetryPolicy::new(3, 10);
150-
let mut attempts = 0;
156+
let attempts = Arc::new(AtomicU32::new(0));
157+
let attempts_clone = attempts.clone();
151158

152159
let result = policy
153-
.execute(|| async {
154-
attempts += 1;
155-
Err::<i32, &str>("persistent error")
160+
.execute(|| {
161+
let attempts = attempts_clone.clone();
162+
async move {
163+
attempts.fetch_add(1, Ordering::Relaxed);
164+
Err::<i32, &str>("persistent error")
165+
}
156166
})
157167
.await;
158168

159169
assert!(result.is_err());
160-
assert_eq!(attempts, 3);
170+
assert_eq!(attempts.load(Ordering::Relaxed), 3);
161171
}
162172
}

0 commit comments

Comments
 (0)