Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
268 changes: 53 additions & 215 deletions src/bin/cratesfyi.rs

Large diffs are not rendered by default.

667 changes: 339 additions & 328 deletions src/build_queue.rs

Large diffs are not rendered by default.

841 changes: 424 additions & 417 deletions src/cdn.rs

Large diffs are not rendered by default.

94 changes: 75 additions & 19 deletions src/context.rs
Original file line number Diff line number Diff line change
@@ -1,27 +1,83 @@
use crate::cdn::CdnBackend;
use crate::db::Pool;
use crate::error::Result;
use crate::repositories::RepositoryStatsUpdater;
use crate::{
AsyncBuildQueue, AsyncStorage, BuildQueue, Config, Index, InstanceMetrics, RegistryApi,
ServiceMetrics, Storage,
};
use std::{future::Future, sync::Arc};
use tokio::runtime::Runtime;

pub trait Context {
fn config(&self) -> Result<Arc<Config>>;
fn async_build_queue(&self) -> impl Future<Output = Result<Arc<AsyncBuildQueue>>> + Send;
fn build_queue(&self) -> Result<Arc<BuildQueue>>;
fn storage(&self) -> Result<Arc<Storage>>;
fn async_storage(&self) -> impl Future<Output = Result<Arc<AsyncStorage>>> + Send;
fn cdn(&self) -> impl Future<Output = Result<Arc<CdnBackend>>> + Send;
fn pool(&self) -> Result<Pool>;
fn async_pool(&self) -> impl Future<Output = Result<Pool>> + Send;
fn service_metrics(&self) -> Result<Arc<ServiceMetrics>>;
fn instance_metrics(&self) -> Result<Arc<InstanceMetrics>>;
fn index(&self) -> Result<Arc<Index>>;
fn registry_api(&self) -> Result<Arc<RegistryApi>>;
fn repository_stats_updater(&self) -> Result<Arc<RepositoryStatsUpdater>>;
fn runtime(&self) -> Result<Arc<Runtime>>;
use anyhow::Result;
use std::sync::Arc;
use tokio::runtime;

pub struct Context {
pub config: Arc<Config>,
pub async_build_queue: Arc<AsyncBuildQueue>,
pub build_queue: Arc<BuildQueue>,
pub storage: Arc<Storage>,
pub async_storage: Arc<AsyncStorage>,
pub cdn: Arc<CdnBackend>,
pub pool: Pool,
pub service_metrics: Arc<ServiceMetrics>,
pub instance_metrics: Arc<InstanceMetrics>,
pub index: Arc<Index>,
pub registry_api: Arc<RegistryApi>,
pub repository_stats_updater: Arc<RepositoryStatsUpdater>,
pub runtime: Arc<runtime::Runtime>,
}

impl Context {
pub fn from_config(config: Config) -> Result<Self> {
let config = Arc::new(config);
let runtime = Arc::new(runtime::Builder::new_multi_thread().enable_all().build()?);

let instance_metrics = Arc::new(InstanceMetrics::new()?);

let pool = Pool::new(&config, runtime.clone(), instance_metrics.clone())?;
let async_storage = Arc::new(runtime.block_on(AsyncStorage::new(
pool.clone(),
instance_metrics.clone(),
config.clone(),
))?);

let async_build_queue = Arc::new(AsyncBuildQueue::new(
pool.clone(),
instance_metrics.clone(),
config.clone(),
async_storage.clone(),
));

let build_queue = Arc::new(BuildQueue::new(runtime.clone(), async_build_queue.clone()));

let storage = Arc::new(Storage::new(async_storage.clone(), runtime.clone()));

let cdn = Arc::new(runtime.block_on(CdnBackend::new(&config)));

let index = Arc::new({
let path = config.registry_index_path.clone();
if let Some(registry_url) = config.registry_url.clone() {
Index::from_url(path, registry_url)
} else {
Index::new(path)
}?
});

Ok(Self {
async_build_queue,
build_queue,
storage,
async_storage,
cdn,
pool: pool.clone(),
service_metrics: Arc::new(ServiceMetrics::new()?),
instance_metrics,
index,
registry_api: Arc::new(RegistryApi::new(
config.registry_api_host.clone(),
config.crates_io_api_call_retries,
)?),
repository_stats_updater: Arc::new(RepositoryStatsUpdater::new(&config, pool)),
runtime,
config,
})
}
}
30 changes: 15 additions & 15 deletions src/db/add_package.rs
Original file line number Diff line number Diff line change
Expand Up @@ -655,7 +655,7 @@ mod test {
#[test]
fn test_set_build_to_error() {
async_wrapper(|env| async move {
let mut conn = env.async_db().await.async_conn().await;
let mut conn = env.async_db().async_conn().await;
let crate_id = initialize_crate(&mut conn, "krate").await?;
let release_id = initialize_release(&mut conn, crate_id, "0.1.0").await?;
let build_id = initialize_build(&mut conn, release_id).await?;
Expand Down Expand Up @@ -689,7 +689,7 @@ mod test {
#[test]
fn test_finish_build_success_valid_rustc_date() {
async_wrapper(|env| async move {
let mut conn = env.async_db().await.async_conn().await;
let mut conn = env.async_db().async_conn().await;
let crate_id = initialize_crate(&mut conn, "krate").await?;
let release_id = initialize_release(&mut conn, crate_id, "0.1.0").await?;
let build_id = initialize_build(&mut conn, release_id).await?;
Expand Down Expand Up @@ -738,7 +738,7 @@ mod test {
#[test]
fn test_finish_build_success_invalid_rustc_date() {
async_wrapper(|env| async move {
let mut conn = env.async_db().await.async_conn().await;
let mut conn = env.async_db().async_conn().await;
let crate_id = initialize_crate(&mut conn, "krate").await?;
let release_id = initialize_release(&mut conn, crate_id, "0.1.0").await?;
let build_id = initialize_build(&mut conn, release_id).await?;
Expand Down Expand Up @@ -783,7 +783,7 @@ mod test {
#[test]
fn test_finish_build_error() {
async_wrapper(|env| async move {
let mut conn = env.async_db().await.async_conn().await;
let mut conn = env.async_db().async_conn().await;
let crate_id = initialize_crate(&mut conn, "krate").await?;
let release_id = initialize_release(&mut conn, crate_id, "0.1.0").await?;
let build_id = initialize_build(&mut conn, release_id).await?;
Expand Down Expand Up @@ -826,7 +826,7 @@ mod test {
#[test]
fn new_keywords() {
async_wrapper(|env| async move {
let mut conn = env.async_db().await.async_conn().await;
let mut conn = env.async_db().async_conn().await;

let release_id = env
.fake_release()
Expand Down Expand Up @@ -913,7 +913,7 @@ mod test {
.create()
.await?;

let mut conn = env.async_db().await.async_conn().await;
let mut conn = env.async_db().async_conn().await;
let kw_r = sqlx::query!(
r#"SELECT
kw.name as "name!",
Expand Down Expand Up @@ -957,7 +957,7 @@ mod test {
#[test]
fn new_owner_long_avatar() {
async_wrapper(|env| async move {
let mut conn = env.async_db().await.async_conn().await;
let mut conn = env.async_db().async_conn().await;
let crate_id = initialize_crate(&mut conn, "krate").await?;

let owner1 = CrateOwner {
Expand Down Expand Up @@ -997,7 +997,7 @@ mod test {
#[test]
fn new_owners() {
async_wrapper(|env| async move {
let mut conn = env.async_db().await.async_conn().await;
let mut conn = env.async_db().async_conn().await;
let crate_id = initialize_crate(&mut conn, "krate").await?;

let owner1 = CrateOwner {
Expand Down Expand Up @@ -1037,7 +1037,7 @@ mod test {
#[test]
fn update_owner_details() {
async_wrapper(|env| async move {
let mut conn = env.async_db().await.async_conn().await;
let mut conn = env.async_db().async_conn().await;
let crate_id = initialize_crate(&mut conn, "krate").await?;

// set initial owner details
Expand Down Expand Up @@ -1086,7 +1086,7 @@ mod test {
#[test]
fn add_new_owners_and_delete_old() {
async_wrapper(|env| async move {
let mut conn = env.async_db().await.async_conn().await;
let mut conn = env.async_db().async_conn().await;
let crate_id = initialize_crate(&mut conn, "krate").await?;

// set initial owner details
Expand Down Expand Up @@ -1203,7 +1203,7 @@ mod test {
#[test]
fn test_initialize_crate() {
async_wrapper(|env| async move {
let mut conn = env.async_db().await.async_conn().await;
let mut conn = env.async_db().async_conn().await;

let name = "krate";
let crate_id = initialize_crate(&mut conn, name).await?;
Expand All @@ -1227,7 +1227,7 @@ mod test {
#[test]
fn test_initialize_release() {
async_wrapper(|env| async move {
let mut conn = env.async_db().await.async_conn().await;
let mut conn = env.async_db().async_conn().await;
let name = "krate";
let version = "0.1.0";
let crate_id = initialize_crate(&mut conn, name).await?;
Expand All @@ -1254,7 +1254,7 @@ mod test {
#[test]
fn test_initialize_build() {
async_wrapper(|env| async move {
let mut conn = env.async_db().await.async_conn().await;
let mut conn = env.async_db().async_conn().await;
let name = "krate";
let version = "0.1.0";
let crate_id = initialize_crate(&mut conn, name).await?;
Expand All @@ -1281,7 +1281,7 @@ mod test {
#[test]
fn test_long_crate_name() {
async_wrapper(|env| async move {
let mut conn = env.async_db().await.async_conn().await;
let mut conn = env.async_db().async_conn().await;

let name: String = "krate".repeat(100);
let crate_id = initialize_crate(&mut conn, &name).await?;
Expand All @@ -1299,7 +1299,7 @@ mod test {
#[test]
fn test_long_release_version() {
async_wrapper(|env| async move {
let mut conn = env.async_db().await.async_conn().await;
let mut conn = env.async_db().async_conn().await;

let crate_id = initialize_crate(&mut conn, "krate").await?;
let version: String = "version".repeat(100);
Expand Down
8 changes: 4 additions & 4 deletions src/db/blacklist.rs
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ mod tests {
#[test]
fn test_list_blacklist() {
crate::test::async_wrapper(|env| async move {
let mut conn = env.async_db().await.async_conn().await;
let mut conn = env.async_db().async_conn().await;

// crates are added out of order to verify sorting
add_crate(&mut conn, "crate A").await?;
Expand All @@ -86,7 +86,7 @@ mod tests {
#[test]
fn test_add_to_and_remove_from_blacklist() {
crate::test::async_wrapper(|env| async move {
let mut conn = env.async_db().await.async_conn().await;
let mut conn = env.async_db().async_conn().await;

assert!(!is_blacklisted(&mut conn, "crate foo").await?);
add_crate(&mut conn, "crate foo").await?;
Expand All @@ -100,7 +100,7 @@ mod tests {
#[test]
fn test_add_twice_to_blacklist() {
crate::test::async_wrapper(|env| async move {
let mut conn = env.async_db().await.async_conn().await;
let mut conn = env.async_db().async_conn().await;

add_crate(&mut conn, "crate foo").await?;
assert!(add_crate(&mut conn, "crate foo").await.is_err());
Expand All @@ -113,7 +113,7 @@ mod tests {
#[test]
fn test_remove_non_existing_crate() {
crate::test::async_wrapper(|env| async move {
let mut conn = env.async_db().await.async_conn().await;
let mut conn = env.async_db().async_conn().await;

assert!(remove_crate(&mut conn, "crate foo").await.is_err());

Expand Down
Loading
Loading