Skip to content

Commit 1d12678

Browse files
committed
0.1.6: fix stall on empty batch
1 parent a0b9c6d commit 1d12678

File tree

6 files changed

+24
-13
lines changed

6 files changed

+24
-13
lines changed

Cargo.lock

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ cargo add batched
99
Or add this to your `Cargo.toml`:
1010
```toml
1111
[dependencies]
12-
batched = "0.1.5"
12+
batched = "0.1.6"
1313
```
1414

1515
## #[batched]

batched/Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[package]
22
name = "batched"
33
description = "rust macro util for batching expensive operations"
4-
version = "0.1.5"
4+
version = "0.1.6"
55
edition = "2024"
66
license = "MIT"
77
readme = "../README.md"
@@ -10,7 +10,7 @@ keywords = ["batch", "performance", "efficient"]
1010

1111

1212
[dependencies]
13-
batched_derive = { version = "0.1.5", path = "../batched_derive" }
13+
batched_derive = { version = "0.1.6", path = "../batched_derive" }
1414

1515
[dev-dependencies]
1616
tokio = { version = "1.44.2", features = ["full"] }

batched/tests/test.rs

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use std::time::Instant;
1+
use std::time::{Duration, Instant};
22

33
use batched::batched;
44

@@ -10,9 +10,7 @@ async fn simple() {
1010
}
1111

1212
for _ in 0..99 {
13-
tokio::task::spawn(async move {
14-
add_multiple(vec![1, 1, 1]).await
15-
});
13+
tokio::task::spawn(async move { add_multiple(vec![1, 1, 1]).await });
1614
}
1715

1816
let total = add_multiple(vec![1, 1, 1]).await;
@@ -31,6 +29,17 @@ async fn propagates_errors() {
3129
assert_eq!(result.is_err(), true);
3230
}
3331

32+
#[tokio::test]
33+
async fn empty_batch_works() {
34+
#[batched(window = 100, limit = 1000)]
35+
fn add(numbers: Vec<u32>) -> u32 {
36+
numbers.iter().sum()
37+
}
38+
39+
let timeout = tokio::time::timeout(Duration::from_secs(1), add_multiple(vec![])).await;
40+
timeout.expect("batch timed out");
41+
}
42+
3443
#[tokio::test]
3544
async fn batched_window_works() {
3645
#[batched(window = 1000, limit = 1000)]
@@ -42,4 +51,4 @@ async fn batched_window_works() {
4251
add_multiple(vec![1, 1, 1]).await;
4352
let after = before.elapsed();
4453
assert!(after.as_secs() == 1);
45-
}
54+
}

batched_derive/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[package]
22
name = "batched_derive"
33
description = "rust macro util for batching expensive operations"
4-
version = "0.1.5"
4+
version = "0.1.6"
55
edition = "2024"
66
license = "MIT"
77
readme = "../README.md"

batched_derive/src/builder.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ pub fn build_code(call_function: Function, options: Attributes) -> TokenStream {
5555

5656
loop {
5757
let mut timer = tokio::time::interval(window);
58+
let mut recieved_first_batch = false;
5859

5960
loop {
6061
tokio::select! {
@@ -63,9 +64,10 @@ pub fn build_code(call_function: Function, options: Attributes) -> TokenStream {
6364
return;
6465
}
6566

66-
if buffer.is_empty() {
67+
if !recieved_first_batch {
6768
timer.reset();
6869
}
70+
recieved_first_batch = true;
6971

7072
let (mut calls, channel) = event.unwrap();
7173
buffer.append(&mut calls);
@@ -76,7 +78,7 @@ pub fn build_code(call_function: Function, options: Attributes) -> TokenStream {
7678
}
7779

7880
_ = async {
79-
if buffer.is_empty() {
81+
if !recieved_first_batch {
8082
std::future::pending().await
8183
} else {
8284
timer.tick().await

0 commit comments

Comments
 (0)