Fix pagination by anchor for queued messages, tasks and metrics

This commit is contained in:
Maurus Decimus
2026-05-04 11:56:34 +02:00
parent ea32e5b9c3
commit 1b5e7bf771
9 changed files with 428 additions and 14 deletions

View File

@@ -472,9 +472,18 @@ pub(crate) async fn queued_message_query(
let mut total = 0;
if let Some(anchor) = req.request.anchor {
let anchor = anchor.id();
if anchor > due_from {
due_from = anchor;
let anchor_id = anchor.id();
if let Some(archive) = req.server.read_message_archive(anchor_id).await?
&& let Ok(archived) = archive.unarchive::<Message>()
&& let Some(anchor_due) = archived.next_delivery_event(queue_name)
&& anchor_due >= due_from
&& anchor_due <= due_to
{
if params.sort_ascending {
due_from = anchor_due;
} else {
due_to = anchor_due;
}
}
}

View File

@@ -399,7 +399,7 @@ pub(crate) async fn task_get(
pub(crate) async fn task_query(
mut req: RegistryQueryResponse<'_>,
) -> trc::Result<QueryResponseBuilder> {
let mut due_from = 100u64;
let mut due_from = 1u64;
let mut due_to = u64::MAX;
let mut typ = None;
@@ -466,6 +466,7 @@ pub(crate) async fn task_query(
.extract_parameters(req.server.core.jmap.query_max_results, None)?;
let mut from_id = 0u64;
let mut to_id = u64::MAX;
if let Some(anchor_id) = anchor_id
&& let Some(anchor_task) = req
.server
@@ -478,8 +479,13 @@ pub(crate) async fn task_query(
{
let anchor_due = anchor_task.due_timestamp();
if anchor_due >= due_from && anchor_due <= due_to {
due_from = anchor_due;
from_id = anchor_id;
if params.sort_ascending {
due_from = anchor_due;
from_id = anchor_id;
} else {
due_to = anchor_due;
to_id = anchor_id;
}
}
}
@@ -497,7 +503,7 @@ pub(crate) async fn task_query(
due: due_from,
}));
let to_key = ValueKey::from(ValueClass::TaskQueue(TaskQueueClass::Due {
id: u64::MAX,
id: to_id,
due: due_to,
}));

View File

@@ -411,17 +411,21 @@ pub(crate) async fn metric_query(
if ts_from != 0 {
ts_from = SnowflakeIdGenerator::from_timestamp(ts_from).unwrap_or(0);
}
if let Some(anchor) = req.request.anchor {
let anchor = anchor.id();
if anchor > ts_from {
ts_from = anchor;
}
}
if ts_to != u64::MAX {
ts_to = SnowflakeIdGenerator::from_timestamp(ts_to).unwrap_or(u64::MAX);
}
if let Some(anchor) = req.request.anchor {
let anchor = anchor.id();
if params.sort_ascending {
if anchor > ts_from {
ts_from = anchor;
}
} else if anchor < ts_to {
ts_to = anchor;
}
}
let from_key = ValueKey::from(ValueClass::Telemetry(TelemetryClass::Metric(ts_from)));
let to_key = ValueKey::from(ValueClass::Telemetry(TelemetryClass::Metric(ts_to)));