broker: recv_batch(max) — drain a bursty inbox in one round-trip
This commit is contained in:
parent
96ffb0e39a
commit
77b89bf2c6
9 changed files with 354 additions and 11 deletions
|
|
@ -87,6 +87,15 @@ async fn serve(stream: UnixStream, agent: String, coord: Arc<Coordinator>) -> Re
|
|||
/// positive `wait_seconds`.
|
||||
const RECV_LONG_POLL_MAX: std::time::Duration = std::time::Duration::from_secs(180);
|
||||
|
||||
/// Server-side hard cap on `RecvBatch.max`. Bounds the size of a
|
||||
/// single round-trip so a confused caller can't drain the entire
|
||||
/// inbox in one go and blow past wire-buffer sizes; everything above
|
||||
/// the cap silently clamps. 32 is comfortably above the burst sizes
|
||||
/// we've seen in practice (post-rebuild rescue, multi-agent reply
|
||||
/// storms) and well under the per-message `MESSAGE_MAX_BYTES` * N
|
||||
/// envelope budget.
|
||||
const RECV_BATCH_MAX: u32 = 32;
|
||||
|
||||
fn recv_timeout(wait_seconds: Option<u64>) -> std::time::Duration {
|
||||
match wait_seconds {
|
||||
Some(s) => std::time::Duration::from_secs(s).min(RECV_LONG_POLL_MAX),
|
||||
|
|
@ -114,6 +123,25 @@ async fn dispatch(req: &AgentRequest, agent: &str, coord: &Arc<Coordinator>) ->
|
|||
message: format!("{e:#}"),
|
||||
},
|
||||
},
|
||||
AgentRequest::RecvBatch { max } => {
|
||||
let cap = (*max).min(RECV_BATCH_MAX) as usize;
|
||||
match broker.recv_batch(agent, cap) {
|
||||
Ok(deliveries) => AgentResponse::Batch {
|
||||
messages: deliveries
|
||||
.into_iter()
|
||||
.map(|d| hive_sh4re::DeliveredMessage {
|
||||
from: d.message.from,
|
||||
body: d.message.body,
|
||||
id: d.id,
|
||||
redelivered: d.redelivered,
|
||||
})
|
||||
.collect(),
|
||||
},
|
||||
Err(e) => AgentResponse::Err {
|
||||
message: format!("{e:#}"),
|
||||
},
|
||||
}
|
||||
}
|
||||
AgentRequest::Status => match broker.count_pending(agent) {
|
||||
Ok(unread) => AgentResponse::Status { unread },
|
||||
Err(e) => AgentResponse::Err {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue