Skip to content

Commit 0c6ec13

Browse files
committed
downloads_counter: persist all counters on shutdown
1 parent 17c8bef commit 0c6ec13

File tree

2 files changed

+31
-1
lines changed

2 files changed

+31
-1
lines changed

src/bin/server.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
5454
// Start the background thread periodically persisting download counts to the database.
5555
downloads_counter_thread(app.clone());
5656

57-
let handler = cargo_registry::build_handler(app);
57+
let handler = cargo_registry::build_handler(app.clone());
5858

5959
// On every server restart, ensure the categories available in the database match
6060
// the information in *src/categories.toml*.
@@ -167,6 +167,11 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
167167
}
168168
}
169169

170+
println!("Persisting remaining downloads counters");
171+
if let Err(err) = app.downloads_counter.persist_all_shards(&app) {
172+
println!("downloads_counter error: {}", err);
173+
}
174+
170175
println!("Server has gracefully shutdown!");
171176
Ok(())
172177
}

src/downloads_counter.rs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,31 @@ impl DownloadsCounter {
5757
}
5858
}
5959

60+
pub fn persist_all_shards(&self, app: &App) -> Result<(), Error> {
61+
let conn = app.primary_database.get()?;
62+
63+
let mut counted_downloads = 0;
64+
let mut counted_versions = 0;
65+
let mut pending_downloads = 0;
66+
for shard in self.inner.shards() {
67+
let shard = std::mem::take(&mut *shard.write());
68+
let stats = self.persist_shard(&conn, shard)?;
69+
70+
counted_downloads += stats.counted_downloads;
71+
counted_versions += stats.counted_versions;
72+
pending_downloads = stats.pending_downloads;
73+
}
74+
75+
println!(
76+
"download_counter all_shards counted_versions={} counted_downloads={} pending_downloads={}",
77+
counted_versions,
78+
counted_downloads,
79+
pending_downloads,
80+
);
81+
82+
Ok(())
83+
}
84+
6085
pub fn persist_next_shard(&self, app: &App) -> Result<(), Error> {
6186
let conn = app.primary_database.get()?;
6287

0 commit comments

Comments
 (0)