Skip to content

Commit 89c3ae5

Browse files
committed
teepod: More efficient pagination
1 parent 6710c2b commit 89c3ae5

File tree

1 file changed

+25
-20
lines changed

1 file changed

+25
-20
lines changed

teepod/src/app.rs

Lines changed: 25 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -332,23 +332,27 @@ impl App {
332332
|| vm.config.manifest.image.contains(&request.keyword)
333333
}
334334
})
335+
.cloned()
336+
.collect::<Vec<_>>();
337+
infos.sort_by(|a, b| {
338+
a.config
339+
.manifest
340+
.created_at_ms
341+
.cmp(&b.config.manifest.created_at_ms)
342+
});
343+
344+
let total = infos.len() as u32;
345+
let vms = paginate(infos, request.page, request.page_size)
335346
.map(|vm| {
336347
vm.merged_info(
337348
vms.get(&vm.config.manifest.id),
338349
&self.work_dir(&vm.config.manifest.id),
339350
)
340351
})
352+
.map(|info| info.to_pb(&self.config.gateway))
341353
.collect::<Vec<_>>();
342-
343-
infos.sort_by(|a, b| a.manifest.created_at_ms.cmp(&b.manifest.created_at_ms));
344-
345-
let total = infos.len() as u32;
346-
347-
infos = paginate(infos, request.page, request.page_size);
348-
349-
let gw = &self.config.gateway;
350354
Ok(StatusResponse {
351-
vms: infos.into_iter().map(|info| info.to_pb(gw)).collect(),
355+
vms,
352356
port_mapping_enabled: self.config.cvm.port_mapping.enabled,
353357
total,
354358
})
@@ -603,18 +607,19 @@ impl App {
603607
}
604608
}
605609

606-
fn paginate<T>(items: Vec<T>, page: u32, page_size: u32) -> Vec<T> {
610+
fn paginate<T>(items: Vec<T>, page: u32, page_size: u32) -> impl Iterator<Item = T> {
611+
let skip;
612+
let take;
607613
if page == 0 || page_size == 0 {
608-
return items;
609-
}
610-
let page = page - 1;
611-
let start = page * page_size;
612-
let end = start + page_size;
613-
items
614-
.into_iter()
615-
.skip(start as usize)
616-
.take(end as usize)
617-
.collect()
614+
skip = 0;
615+
take = items.len();
616+
} else {
617+
let page = page - 1;
618+
let start = page * page_size;
619+
skip = start as usize;
620+
take = page_size as usize;
621+
}
622+
items.into_iter().skip(skip).take(take)
618623
}
619624

620625
#[derive(Clone)]

0 commit comments

Comments
 (0)