delete watchquest benchmark bin
This commit is contained in:
parent
71fae193be
commit
cc14c30fcf
1 changed files with 0 additions and 176 deletions
|
@ -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<Julid> = 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<Julid> {
|
|
||||||
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<R: Rng>(
|
|
||||||
user: Julid,
|
|
||||||
movies: &[Julid],
|
|
||||||
w2w_db: &SqlitePool,
|
|
||||||
rng: &mut R,
|
|
||||||
normal: Normal<f32>,
|
|
||||||
) {
|
|
||||||
let mut tasks = JoinSet::new();
|
|
||||||
let num_movies = rng.sample(normal) as usize;
|
|
||||||
let quests: Vec<WatchQuest> = 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<OsString>,
|
|
||||||
}
|
|
Loading…
Reference in a new issue