Skip to content

Commit 2ba21db

Browse files
committed
implement CDN invalidation queue & background worker
1 parent 6b1505d commit 2ba21db

File tree

10 files changed

+623
-199
lines changed

10 files changed

+623
-199
lines changed

src/bin/cratesfyi.rs

+10-2
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,8 @@ enum CommandLine {
108108
value_enum
109109
)]
110110
repository_stats_updater: Toggle,
111+
#[arg(long = "cdn-invalidator", default_value = "enabled", value_enum)]
112+
cdn_invalidator: Toggle,
111113
},
112114

113115
StartBuildServer,
@@ -143,10 +145,14 @@ impl CommandLine {
143145
} => subcommand.handle_args(ctx, skip_if_exists)?,
144146
Self::StartRegistryWatcher {
145147
repository_stats_updater,
148+
cdn_invalidator,
146149
} => {
147150
if repository_stats_updater == Toggle::Enabled {
148151
docs_rs::utils::daemon::start_background_repository_stats_updater(&ctx)?;
149152
}
153+
if cdn_invalidator == Toggle::Enabled {
154+
docs_rs::utils::daemon::start_background_cdn_invalidator(&ctx)?;
155+
}
150156

151157
docs_rs::utils::watch_registry(ctx.build_queue()?, ctx.config()?, ctx.index()?)?;
152158
}
@@ -586,7 +592,6 @@ impl Context for BinContext {
586592
self.pool()?,
587593
self.metrics()?,
588594
self.config()?,
589-
self.cdn()?,
590595
self.storage()?,
591596
);
592597
fn storage(self) -> Storage = Storage::new(
@@ -595,7 +600,10 @@ impl Context for BinContext {
595600
self.config()?,
596601
self.runtime()?,
597602
)?;
598-
fn cdn(self) -> CdnBackend = CdnBackend::new(&self.config()?, &self.runtime()?);
603+
fn cdn(self) -> CdnBackend = CdnBackend::new(
604+
&self.config()?,
605+
&self.runtime()?,
606+
);
599607
fn config(self) -> Config = Config::from_env()?;
600608
fn metrics(self) -> Metrics = Metrics::new()?;
601609
fn runtime(self) -> Runtime = {

src/build_queue.rs

+24-51
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use crate::cdn::{self, CdnBackend};
1+
use crate::cdn;
22
use crate::db::{delete_crate, Pool};
33
use crate::docbuilder::PackageKind;
44
use crate::error::Result;
@@ -27,7 +27,6 @@ pub(crate) struct QueuedCrate {
2727
#[derive(Debug)]
2828
pub struct BuildQueue {
2929
config: Arc<Config>,
30-
cdn: Arc<CdnBackend>,
3130
storage: Arc<Storage>,
3231
pub(crate) db: Pool,
3332
metrics: Arc<Metrics>,
@@ -39,13 +38,11 @@ impl BuildQueue {
3938
db: Pool,
4039
metrics: Arc<Metrics>,
4140
config: Arc<Config>,
42-
cdn: Arc<CdnBackend>,
4341
storage: Arc<Storage>,
4442
) -> Self {
4543
BuildQueue {
4644
max_attempts: config.build_attempts.into(),
4745
config,
48-
cdn,
4946
db,
5047
metrics,
5148
storage,
@@ -191,7 +188,9 @@ impl BuildQueue {
191188
)
192189
});
193190
self.metrics.total_builds.inc();
194-
if let Err(err) = cdn::invalidate_crate(&self.config, &self.cdn, &to_process.name) {
191+
if let Err(err) =
192+
cdn::queue_crate_invalidation(&mut transaction, &self.config, &to_process.name)
193+
{
195194
report_error(&err);
196195
}
197196

@@ -321,7 +320,7 @@ impl BuildQueue {
321320
),
322321
Err(err) => report_error(&err),
323322
}
324-
if let Err(err) = cdn::invalidate_crate(&self.config, &self.cdn, krate) {
323+
if let Err(err) = cdn::queue_crate_invalidation(&mut *conn, &self.config, krate) {
325324
report_error(&err);
326325
}
327326
continue;
@@ -366,7 +365,9 @@ impl BuildQueue {
366365
yanked.is_some(),
367366
);
368367

369-
if let Err(err) = cdn::invalidate_crate(&self.config, &self.cdn, &release.name) {
368+
if let Err(err) =
369+
cdn::queue_crate_invalidation(&mut *conn, &self.config, &release.name)
370+
{
370371
report_error(&err);
371372
}
372373
}
@@ -570,11 +571,7 @@ mod tests {
570571
assert_eq!(metrics.failed_builds.get(), 1);
571572

572573
// no invalidations were run since we don't have a distribution id configured
573-
assert!(matches!(*env.cdn(), CdnBackend::Dummy(_)));
574-
if let CdnBackend::Dummy(ref invalidation_requests) = *env.cdn() {
575-
let ir = invalidation_requests.lock().unwrap();
576-
assert!(ir.is_empty());
577-
}
574+
assert!(cdn::queued_or_active_crate_invalidations(&mut *env.db().conn())?.is_empty());
578575

579576
Ok(())
580577
})
@@ -593,55 +590,31 @@ mod tests {
593590
queue.add_crate("will_succeed", "1.0.0", -1, None)?;
594591
queue.add_crate("will_fail", "1.0.0", 0, None)?;
595592

596-
assert!(matches!(*env.cdn(), CdnBackend::Dummy(_)));
597-
if let CdnBackend::Dummy(ref invalidation_requests) = *env.cdn() {
598-
let ir = invalidation_requests.lock().unwrap();
599-
assert!(ir.is_empty());
600-
}
593+
let mut conn = env.db().conn();
594+
cdn::queued_or_active_crate_invalidations(&mut *conn)?.is_empty();
601595

602596
queue.process_next_crate(|krate| {
603597
assert_eq!("will_succeed", krate.name);
604598
Ok(())
605599
})?;
606-
if let CdnBackend::Dummy(ref invalidation_requests) = *env.cdn() {
607-
let ir = invalidation_requests.lock().unwrap();
608-
assert_eq!(
609-
*ir,
610-
[
611-
("distribution_id_web".into(), "/will_succeed*".into()),
612-
("distribution_id_web".into(), "/crate/will_succeed*".into()),
613-
(
614-
"distribution_id_static".into(),
615-
"/rustdoc/will_succeed*".into()
616-
),
617-
]
618-
);
619-
}
600+
601+
let queued_invalidations = cdn::queued_or_active_crate_invalidations(&mut *conn)?;
602+
assert_eq!(queued_invalidations.len(), 3);
603+
assert!(queued_invalidations
604+
.iter()
605+
.all(|i| i.krate == "will_succeed"));
620606

621607
queue.process_next_crate(|krate| {
622608
assert_eq!("will_fail", krate.name);
623609
anyhow::bail!("simulate a failure");
624610
})?;
625-
if let CdnBackend::Dummy(ref invalidation_requests) = *env.cdn() {
626-
let ir = invalidation_requests.lock().unwrap();
627-
assert_eq!(
628-
*ir,
629-
[
630-
("distribution_id_web".into(), "/will_succeed*".into()),
631-
("distribution_id_web".into(), "/crate/will_succeed*".into()),
632-
(
633-
"distribution_id_static".into(),
634-
"/rustdoc/will_succeed*".into()
635-
),
636-
("distribution_id_web".into(), "/will_fail*".into()),
637-
("distribution_id_web".into(), "/crate/will_fail*".into()),
638-
(
639-
"distribution_id_static".into(),
640-
"/rustdoc/will_fail*".into()
641-
),
642-
]
643-
);
644-
}
611+
612+
let queued_invalidations = cdn::queued_or_active_crate_invalidations(&mut *conn)?;
613+
assert_eq!(queued_invalidations.len(), 6);
614+
assert!(queued_invalidations
615+
.iter()
616+
.skip(3)
617+
.all(|i| i.krate == "will_fail"));
645618

646619
Ok(())
647620
})

0 commit comments

Comments
 (0)