Skip to content

Commit b0a3208

Browse files
committed
Extract index module
1 parent 2eec9bb commit b0a3208

File tree

3 files changed

+43
-40
lines changed

3 files changed

+43
-40
lines changed

src/index.rs

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
use crate::models;
2+
use crate::util::diesel::Conn;
3+
use anyhow::Context;
4+
use diesel::prelude::*;
5+
use sentry::Level;
6+
7+
#[instrument(skip_all, fields(krate.name = ?name))]
8+
pub fn get_index_data(name: &str, conn: &mut impl Conn) -> anyhow::Result<Option<String>> {
9+
debug!("Looking up crate by name");
10+
let Some(krate): Option<models::Crate> =
11+
models::Crate::by_exact_name(name).first(conn).optional()?
12+
else {
13+
return Ok(None);
14+
};
15+
16+
debug!("Gathering remaining index data");
17+
let crates = krate
18+
.index_metadata(conn)
19+
.context("Failed to gather index metadata")?;
20+
21+
// This can sometimes happen when we delete versions upon owner request
22+
// but don't realize that the crate is now left with no versions at all.
23+
//
24+
// In this case we will delete the crate from the index and log a warning to
25+
// Sentry to clean this up in the database.
26+
if crates.is_empty() {
27+
let message = format!("Crate `{name}` has no versions left");
28+
sentry::capture_message(&message, Level::Warning);
29+
30+
return Ok(None);
31+
}
32+
33+
debug!("Serializing index data");
34+
let mut bytes = Vec::new();
35+
crates_io_index::write_crates(&crates, &mut bytes)
36+
.context("Failed to serialize index metadata")?;
37+
38+
let str = String::from_utf8(bytes).context("Failed to decode index metadata as utf8")?;
39+
40+
Ok(Some(str))
41+
}

src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ pub mod email;
4242
pub mod external_urls;
4343
pub mod fastly;
4444
pub mod headers;
45+
pub mod index;
4546
mod licenses;
4647
pub mod metrics;
4748
pub mod middleware;

src/worker/jobs/index/sync.rs

Lines changed: 1 addition & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,10 @@
1-
use crate::models;
1+
use crate::index::get_index_data;
22
use crate::tasks::spawn_blocking;
3-
use crate::util::diesel::Conn;
43
use crate::worker::Environment;
54
use anyhow::Context;
65
use crates_io_index::Repository;
76
use crates_io_worker::BackgroundJob;
8-
use diesel::{OptionalExtension, RunQueryDsl};
97
use diesel_async::async_connection_wrapper::AsyncConnectionWrapper;
10-
use sentry::Level;
118
use std::fs;
129
use std::fs::File;
1310
use std::io::{ErrorKind, Write};
@@ -126,39 +123,3 @@ impl BackgroundJob for SyncToSparseIndex {
126123
Ok(())
127124
}
128125
}
129-
130-
#[instrument(skip_all, fields(krate.name = ?name))]
131-
fn get_index_data(name: &str, conn: &mut impl Conn) -> anyhow::Result<Option<String>> {
132-
debug!("Looking up crate by name");
133-
let Some(krate): Option<models::Crate> =
134-
models::Crate::by_exact_name(name).first(conn).optional()?
135-
else {
136-
return Ok(None);
137-
};
138-
139-
debug!("Gathering remaining index data");
140-
let crates = krate
141-
.index_metadata(conn)
142-
.context("Failed to gather index metadata")?;
143-
144-
// This can sometimes happen when we delete versions upon owner request
145-
// but don't realize that the crate is now left with no versions at all.
146-
//
147-
// In this case we will delete the crate from the index and log a warning to
148-
// Sentry to clean this up in the database.
149-
if crates.is_empty() {
150-
let message = format!("Crate `{name}` has no versions left");
151-
sentry::capture_message(&message, Level::Warning);
152-
153-
return Ok(None);
154-
}
155-
156-
debug!("Serializing index data");
157-
let mut bytes = Vec::new();
158-
crates_io_index::write_crates(&crates, &mut bytes)
159-
.context("Failed to serialize index metadata")?;
160-
161-
let str = String::from_utf8(bytes).context("Failed to decode index metadata as utf8")?;
162-
163-
Ok(Some(str))
164-
}

0 commit comments

Comments
 (0)