Skip to content

Commit 261f91e

Browse files
authored
Merge pull request #9629 from Turbo87/inline-sync-index
worker/jobs: Simplify and inline `enqueue_sync_to_index()` fn
2 parents 868a502 + b19bdfd commit 261f91e

File tree

7 files changed

+22
-91
lines changed

7 files changed

+22
-91
lines changed

src/admin/delete_crate.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,8 +97,11 @@ pub async fn run(opts: Opts) -> anyhow::Result<()> {
9797
};
9898

9999
info!("{name}: Enqueuing index sync jobs…");
100-
if let Err(error) = jobs::enqueue_sync_to_index(name, conn) {
101-
warn!("{name}: Failed to enqueue index sync jobs: {error}");
100+
if let Err(error) = jobs::SyncToGitIndex::new(name).enqueue(conn) {
101+
warn!("{name}: Failed to enqueue SyncToGitIndex job: {error}");
102+
}
103+
if let Err(error) = jobs::SyncToSparseIndex::new(name).enqueue(conn) {
104+
warn!("{name}: Failed to enqueue SyncToSparseIndex job: {error}");
102105
}
103106

104107
info!("{name}: Enqueuing DeleteCrateFromStorage job…");

src/admin/delete_version.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ use crate::tasks::spawn_blocking;
55
use crate::worker::jobs;
66
use crate::{admin::dialoguer, db, schema::versions};
77
use anyhow::Context;
8+
use crates_io_worker::BackgroundJob;
89
use diesel::{Connection, ExpressionMethods, QueryDsl};
910
use diesel_async::async_connection_wrapper::AsyncConnectionWrapper;
1011

@@ -102,8 +103,11 @@ pub async fn run(opts: Opts) -> anyhow::Result<()> {
102103
})?;
103104

104105
info!(%crate_name, "Enqueuing index sync jobs");
105-
if let Err(error) = jobs::enqueue_sync_to_index(crate_name, conn) {
106-
warn!(%crate_name, ?error, "Failed to enqueue index sync jobs");
106+
if let Err(error) = jobs::SyncToGitIndex::new(crate_name).enqueue(conn) {
107+
warn!(%crate_name, ?error, "Failed to enqueue SyncToGitIndex job");
108+
}
109+
if let Err(error) = jobs::SyncToSparseIndex::new(crate_name).enqueue(conn) {
110+
warn!(%crate_name, ?error, "Failed to enqueue SyncToSparseIndex job");
107111
}
108112

109113
Ok(opts)

src/admin/yank_version.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,7 @@ use crate::db;
33
use crate::models::{Crate, Version};
44
use crate::schema::versions;
55
use crate::tasks::spawn_blocking;
6-
use crate::worker::jobs;
7-
use crate::worker::jobs::UpdateDefaultVersion;
6+
use crate::worker::jobs::{SyncToGitIndex, SyncToSparseIndex, UpdateDefaultVersion};
87
use crates_io_worker::BackgroundJob;
98
use diesel::prelude::*;
109

@@ -63,8 +62,8 @@ fn yank(opts: Opts, conn: &mut PgConnection) -> anyhow::Result<()> {
6362
.set(versions::yanked.eq(true))
6463
.execute(conn)?;
6564

66-
jobs::enqueue_sync_to_index(&krate.name, conn)?;
67-
65+
SyncToGitIndex::new(&krate.name).enqueue(conn)?;
66+
SyncToSparseIndex::new(&krate.name).enqueue(conn)?;
6867
UpdateDefaultVersion::new(krate.id).enqueue(conn)?;
6968

7069
Ok(())

src/controllers/krate/publish.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -442,7 +442,8 @@ pub async fn publish(app: AppState, req: BytesRequest) -> AppResult<Json<GoodCra
442442
))
443443
.map_err(|e| internal(format!("failed to upload crate: {e}")))?;
444444

445-
jobs::enqueue_sync_to_index(&krate.name, conn)?;
445+
jobs::SyncToGitIndex::new(&krate.name).enqueue(conn)?;
446+
jobs::SyncToSparseIndex::new(&krate.name).enqueue(conn)?;
446447

447448
SendPublishNotificationsJob::new(version.id).enqueue(conn)?;
448449

src/controllers/version/metadata.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ use crate::tasks::spawn_blocking;
2929
use crate::util::diesel::Conn;
3030
use crate::util::errors::{bad_request, custom, version_not_found, AppResult};
3131
use crate::views::{EncodableDependency, EncodableVersion};
32-
use crate::worker::jobs::{self, UpdateDefaultVersion};
32+
use crate::worker::jobs::{SyncToGitIndex, SyncToSparseIndex, UpdateDefaultVersion};
3333

3434
use super::version_and_crate;
3535

@@ -233,7 +233,8 @@ pub fn perform_version_yank_update(
233233
};
234234
insert_version_owner_action(conn, version.id, user.id, api_token_id, action)?;
235235

236-
jobs::enqueue_sync_to_index(&krate.name, conn)?;
236+
SyncToGitIndex::new(&krate.name).enqueue(conn)?;
237+
SyncToSparseIndex::new(&krate.name).enqueue(conn)?;
237238
UpdateDefaultVersion::new(krate.id).enqueue(conn)?;
238239

239240
Ok(())

src/tests/worker/git.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use crate::models::Crate;
22
use crate::tests::builders::PublishBuilder;
33
use crate::tests::util::{RequestHelper, TestApp};
44
use crate::worker::jobs;
5+
use crates_io_worker::BackgroundJob;
56
use diesel::prelude::*;
67
use http::StatusCode;
78

@@ -51,7 +52,8 @@ async fn index_smoke_test() {
5152
let krate: Crate = assert_ok!(Crate::by_name("serde").first(conn));
5253
assert_ok!(diesel::delete(crates::table.find(krate.id)).execute(conn));
5354

54-
assert_ok!(jobs::enqueue_sync_to_index("serde", conn));
55+
assert_ok!(jobs::SyncToGitIndex::new("serde").enqueue(conn));
56+
assert_ok!(jobs::SyncToSparseIndex::new("serde").enqueue(conn));
5557
});
5658

5759
app.run_pending_background_jobs().await;

src/worker/jobs/mod.rs

Lines changed: 0 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,3 @@
1-
use crate::util::diesel::Conn;
2-
use crates_io_worker::schema::background_jobs;
3-
use crates_io_worker::{BackgroundJob, EnqueueError};
4-
use diesel::dsl::{exists, not};
5-
use diesel::prelude::*;
6-
use diesel::sql_types::{Int2, Jsonb, Text};
7-
use std::fmt::Display;
8-
91
mod archive_version_downloads;
102
mod daily_db_maintenance;
113
mod delete_crate;
@@ -36,74 +28,3 @@ pub use self::send_publish_notifications::SendPublishNotificationsJob;
3628
pub use self::sync_admins::SyncAdmins;
3729
pub use self::typosquat::CheckTyposquat;
3830
pub use self::update_default_version::UpdateDefaultVersion;
39-
40-
/// Enqueue both index sync jobs (git and sparse) for a crate, unless they
41-
/// already exist in the background job queue.
42-
///
43-
/// Note that there are currently no explicit tests for this functionality,
44-
/// since our test suite only allows us to use a single database connection
45-
/// and the background worker queue locking only work when using multiple
46-
/// connections.
47-
#[instrument(name = "swirl.enqueue", skip_all, fields(message = "sync_to_index", krate = %krate))]
48-
pub fn enqueue_sync_to_index<T: Display>(
49-
krate: T,
50-
conn: &mut impl Conn,
51-
) -> Result<(), EnqueueError> {
52-
// Returns jobs with matching `job_type`, `data` and `priority`,
53-
// skipping ones that are already locked by the background worker.
54-
let find_similar_jobs_query =
55-
|job_type: &'static str, data: serde_json::Value, priority: i16| {
56-
background_jobs::table
57-
.select(background_jobs::id)
58-
.filter(background_jobs::job_type.eq(job_type))
59-
.filter(background_jobs::data.eq(data))
60-
.filter(background_jobs::priority.eq(priority))
61-
.for_update()
62-
.skip_locked()
63-
};
64-
65-
// Returns one `job_type, data, priority` row with values from the
66-
// passed-in `job`, unless a similar row already exists.
67-
let deduplicated_select_query =
68-
|job_type: &'static str, data: serde_json::Value, priority: i16| {
69-
diesel::select((
70-
job_type.into_sql::<Text>(),
71-
data.clone().into_sql::<Jsonb>(),
72-
priority.into_sql::<Int2>(),
73-
))
74-
.filter(not(exists(find_similar_jobs_query(
75-
job_type, data, priority,
76-
))))
77-
};
78-
79-
let to_git = deduplicated_select_query(
80-
SyncToGitIndex::JOB_NAME,
81-
serde_json::to_value(SyncToGitIndex::new(krate.to_string()))?,
82-
SyncToGitIndex::PRIORITY,
83-
);
84-
85-
let to_sparse = deduplicated_select_query(
86-
SyncToSparseIndex::JOB_NAME,
87-
serde_json::to_value(SyncToSparseIndex::new(krate.to_string()))?,
88-
SyncToSparseIndex::PRIORITY,
89-
);
90-
91-
// Insert index update background jobs, but only if they do not
92-
// already exist.
93-
let added_jobs_count = diesel::insert_into(background_jobs::table)
94-
.values(to_git.union_all(to_sparse))
95-
.into_columns((
96-
background_jobs::job_type,
97-
background_jobs::data,
98-
background_jobs::priority,
99-
))
100-
.execute(conn)?;
101-
102-
// Print a log event if we skipped inserting a job due to deduplication.
103-
if added_jobs_count != 2 {
104-
let skipped_jobs_count = 2 - added_jobs_count;
105-
info!(%skipped_jobs_count, "Skipped adding duplicate jobs to the background worker queue");
106-
}
107-
108-
Ok(())
109-
}

0 commit comments

Comments
 (0)