]> git.proxmox.com Git - proxmox-backup.git/blame - src/backup/store_progress.rs
fix #3331: improve progress for last snapshot in group
[proxmox-backup.git] / src / backup / store_progress.rs
CommitLineData
2260f065
DM
1#[derive(Debug, Default)]
2/// Tracker for progress of operations iterating over `Datastore` contents.
3pub struct StoreProgress {
4 /// Completed groups
5 pub done_groups: u64,
6 /// Total groups
7 pub total_groups: u64,
8 /// Completed snapshots within current group
9 pub done_snapshots: u64,
10 /// Total snapshots in current group
11 pub group_snapshots: u64,
12}
13
14impl StoreProgress {
15 pub fn new(total_groups: u64) -> Self {
16 StoreProgress {
17 total_groups,
18 .. Default::default()
19 }
20 }
21
22 /// Calculates an interpolated relative progress based on current counters.
23 pub fn percentage(&self) -> f64 {
24 let per_groups = (self.done_groups as f64) / (self.total_groups as f64);
25 if self.group_snapshots == 0 {
26 per_groups
27 } else {
28 let per_snapshots = (self.done_snapshots as f64) / (self.group_snapshots as f64);
29 per_groups + (1.0 / self.total_groups as f64) * per_snapshots
30 }
31 }
32}
33
34impl std::fmt::Display for StoreProgress {
35 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
8081e4aa
FG
36 let current_group = if self.done_groups < self.total_groups {
37 self.done_groups + 1
38 } else {
39 self.done_groups
40 };
41
2260f065
DM
42 if self.group_snapshots == 0 {
43 write!(
44 f,
45 "{:.2}% ({} of {} groups)",
46 self.percentage() * 100.0,
47 self.done_groups,
48 self.total_groups,
49 )
50 } else if self.total_groups == 1 {
51 write!(
52 f,
53 "{:.2}% ({} of {} snapshots)",
54 self.percentage() * 100.0,
55 self.done_snapshots,
56 self.group_snapshots,
57 )
8081e4aa
FG
58 } else if self.done_snapshots == self.group_snapshots {
59 write!(
60 f,
61 "{:.2}% ({} of {} groups)",
62 self.percentage() * 100.0,
63 current_group,
64 self.total_groups,
65 )
2260f065
DM
66 } else {
67 write!(
68 f,
69 "{:.2}% ({} of {} groups, {} of {} group snapshots)",
70 self.percentage() * 100.0,
71 self.done_groups,
72 self.total_groups,
73 self.done_snapshots,
74 self.group_snapshots,
75 )
76 }
77 }
78}