From cc14c30fcfbd6cdaecd85d0ba629154d098b4be9 Mon Sep 17 00:00:00 2001 From: Joe Ardent Date: Sat, 29 Jul 2023 12:29:40 -0700 Subject: [PATCH] delete watchquest benchmark bin --- src/bin/import_users.rs | 176 ---------------------------------------- 1 file changed, 176 deletions(-) delete mode 100644 src/bin/import_users.rs diff --git a/src/bin/import_users.rs b/src/bin/import_users.rs deleted file mode 100644 index b007564..0000000 --- a/src/bin/import_users.rs +++ /dev/null @@ -1,176 +0,0 @@ -use std::{ffi::OsString, time::Duration}; - -use clap::Parser; -use julid::Julid; -use rand::{seq::SliceRandom, thread_rng, Rng}; -use rand_distr::Normal; -use sqlx::{ - query_scalar, - sqlite::{SqliteConnectOptions, SqlitePoolOptions}, - SqlitePool, -}; -use tokio::{runtime, task::JoinSet}; -use tokio_retry::Retry; -use what2watch::{ - get_db_pool, - import_utils::{add_omega_watches, add_users, add_watch_quests}, - User, WatchQuest, -}; - -fn main() { - let cli = Cli::parse(); - let path = cli.db_path; - let num_users = cli.users; - let mpu = cli.movies_per_user as f32; - let dict = if let Some(dict) = cli.words { - dict - } else { - "/usr/share/dict/words".into() - }; - - let words = std::fs::read_to_string(dict).expect("tried to open {dict:?}"); - let words: Vec<&str> = words.split('\n').collect(); - - let opts = SqliteConnectOptions::new().filename(path).read_only(true); - - let rt = runtime::Builder::new_multi_thread() - .enable_all() - .build() - .unwrap(); - - let movie_db = rt - .block_on( - SqlitePoolOptions::new() - .idle_timeout(Duration::from_secs(3)) - .connect_with(opts), - ) - .expect("could not open movies db"); - let w2w_db = get_db_pool(); - - let users = &rt.block_on(gen_users(num_users, &words, &w2w_db)); - - let _ = &rt - .block_on(add_omega_watches(&w2w_db, &movie_db, 10_000)) - .unwrap(); - - let movies: Vec = rt - .block_on(query_scalar("select id from watches").fetch_all(&w2w_db)) - .unwrap(); - - let rng = &mut thread_rng(); - - let normal = Normal::new(mpu, mpu / 10.0).unwrap(); - let start = std::time::Instant::now(); - rt.block_on(async { - for &user in users { - add_quests(user, &movies, &w2w_db, rng, normal).await; - } - }); - let rows: i32 = rt - .block_on(sqlx::query_scalar("select count(*) from watch_quests").fetch_one(&w2w_db)) - .unwrap(); - rt.block_on(w2w_db.close()); - let end = std::time::Instant::now(); - let dur = (end - start).as_secs_f32(); - println!("Added {rows} quests in {dur} seconds"); -} - -//-************************************************************************ -// add the users -//-************************************************************************ -async fn gen_users(num: usize, words: &[&str], pool: &SqlitePool) -> Vec { - let mut rng = thread_rng(); - let rng = &mut rng; - let range = 0usize..(words.len()); - let mut users = Vec::with_capacity(num); - for _ in 0..num { - let n1 = rng.gen_range(range.clone()); - let n2 = rng.gen_range(range.clone()); - let n3 = rng.gen_range(range.clone()); - let nn = rng.gen_range(0..200); - - let n1 = words[n1].replace('\'', ""); - let n2 = words[n2].replace('\'', ""); - let email_domain = words[n3].replace('\'', ""); - - let username = format!("{n1}_{n2}{nn}"); - let displayname = Some(format!("{n1} {n2}")); - let email = Some(format!("{username}@{email_domain}")); - - let user = User { - id: 0.into(), - username, - displayname, - email, - last_seen: None, - pwhash: "can't password this".to_string(), - }; - users.push(user); - } - add_users(pool, &users).await.unwrap(); - - users.into_iter().map(|u| u.id).collect() -} - -//-************************************************************************ -// batch add quests -//-************************************************************************ -async fn add_quests( - user: Julid, - movies: &[Julid], - w2w_db: &SqlitePool, - rng: &mut R, - normal: Normal, -) { - let mut tasks = JoinSet::new(); - let num_movies = rng.sample(normal) as usize; - let quests: Vec = movies - .choose_multiple(rng, num_movies) - .cloned() - .map(|watch| WatchQuest { - user, - watch, - is_public: true, - already_watched: false, - }) - .collect(); - - let retry_strategy = tokio_retry::strategy::ExponentialBackoff::from_millis(10) - .map(tokio_retry::strategy::jitter) - .take(3); - - let db = w2w_db.clone(); - tasks.spawn(async move { - let movies = quests; - ( - user, - Retry::spawn(retry_strategy, || async { - add_watch_quests(&db, &movies).await - }) - .await, - ) - }); - - // get the stragglers - while (tasks.join_next().await).is_some() {} -} - -#[derive(Debug, Parser)] -pub struct Cli { - /// path to the movie database - #[clap(long = "database", short)] - pub db_path: OsString, - - /// number of users to create - #[clap(long, short, default_value_t = 1000)] - pub users: usize, - - /// expected gaussian value for number of movies per use - #[clap(long = "movies", short, default_value_t = 100)] - pub movies_per_user: u32, - - /// path to the dictionary to be used for usernames [default: - /// /usr/share/dict/words] - #[clap(long, short)] - pub words: Option, -}