Skip to content

Commit 79508f1

Browse files
committed
teepod: More efficient pagination
1 parent 28cffb0 commit 79508f1

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
@@ -331,23 +331,27 @@ impl App {
331331
|| vm.config.manifest.app_id.contains(&request.keyword)
332332
}
333333
})
334+
.cloned()
335+
.collect::<Vec<_>>();
336+
infos.sort_by(|a, b| {
337+
a.config
338+
.manifest
339+
.created_at_ms
340+
.cmp(&b.config.manifest.created_at_ms)
341+
});
342+
343+
let total = infos.len() as u32;
344+
let vms = paginate(infos, request.page, request.page_size)
334345
.map(|vm| {
335346
vm.merged_info(
336347
vms.get(&vm.config.manifest.id),
337348
&self.work_dir(&vm.config.manifest.id),
338349
)
339350
})
351+
.map(|info| info.to_pb(&self.config.gateway))
340352
.collect::<Vec<_>>();
341-
342-
infos.sort_by(|a, b| a.manifest.created_at_ms.cmp(&b.manifest.created_at_ms));
343-
344-
let total = infos.len() as u32;
345-
346-
infos = paginate(infos, request.page, request.page_size);
347-
348-
let gw = &self.config.gateway;
349353
Ok(StatusResponse {
350-
vms: infos.into_iter().map(|info| info.to_pb(gw)).collect(),
354+
vms,
351355
port_mapping_enabled: self.config.cvm.port_mapping.enabled,
352356
total,
353357
})
@@ -602,18 +606,19 @@ impl App {
602606
}
603607
}
604608

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

619624
#[derive(Clone)]

0 commit comments

Comments
 (0)