From 1c424818aac65a6766e1637ccf64ac5c351de6c3 Mon Sep 17 00:00:00 2001 From: pedrocarlo Date: Tue, 3 Jun 2025 22:21:40 -0300 Subject: [PATCH] simulator options to disable certain query types --- simulator/generation/property.rs | 4 +-- simulator/generation/query.rs | 2 +- simulator/runner/cli.rs | 8 +++++ simulator/runner/env.rs | 51 ++++++++++++++++++++++---------- 4 files changed, 46 insertions(+), 19 deletions(-) diff --git a/simulator/generation/property.rs b/simulator/generation/property.rs index 3d6adade9..451d52f49 100644 --- a/simulator/generation/property.rs +++ b/simulator/generation/property.rs @@ -461,7 +461,7 @@ pub(crate) fn remaining(env: &SimulatorEnv, stats: &InteractionStats) -> Remaini let remaining_delete = ((env.opts.max_interactions as f64 * env.opts.delete_percent / 100.0) - (stats.delete_count as f64)) .max(0.0); - let remaining_update = ((env.opts.max_interactions as f64 * env.opts.delete_percent / 100.0) + let remaining_update = ((env.opts.max_interactions as f64 * env.opts.update_percent / 100.0) - (stats.update_count as f64)) .max(0.0); let remaining_drop = ((env.opts.max_interactions as f64 * env.opts.drop_percent / 100.0) @@ -716,7 +716,7 @@ impl ArbitraryFrom<(&SimulatorEnv, &InteractionStats)> for Property { Box::new(|rng: &mut R| property_select_limit(rng, env)), ), ( - f64::min(remaining_.read, remaining_.write), + f64::min(remaining_.read, remaining_.write).min(remaining_.delete), Box::new(|rng: &mut R| property_delete_select(rng, env, &remaining_)), ), ( diff --git a/simulator/generation/query.rs b/simulator/generation/query.rs index 421df9b0d..315212f8b 100644 --- a/simulator/generation/query.rs +++ b/simulator/generation/query.rs @@ -128,7 +128,7 @@ impl ArbitraryFrom<(&SimulatorEnv, &Remaining)> for Query { Box::new(|rng| Self::Insert(Insert::arbitrary_from(rng, env))), ), ( - remaining.write, + f64::min(remaining.write, remaining.delete), Box::new(|rng| Self::Delete(Delete::arbitrary_from(rng, env))), ), ], diff --git a/simulator/runner/cli.rs b/simulator/runner/cli.rs index 28452c045..08740aa14 100644 --- a/simulator/runner/cli.rs +++ b/simulator/runner/cli.rs @@ -48,6 +48,14 @@ pub struct SimulatorCLI { pub subcommand: Option, #[clap(long, help = "disable BugBase", default_value_t = false)] pub disable_bugbase: bool, + #[clap(long, help = "disable UPDATE Statement", default_value_t = false)] + pub disable_update: bool, + #[clap(long, help = "disable DELETE Statement", default_value_t = false)] + pub disable_delete: bool, + #[clap(long, help = "disable CREATE Statement", default_value_t = false)] + pub disable_create: bool, + #[clap(long, help = "disable DROP Statement", default_value_t = false)] + pub disable_drop: bool, } #[derive(Parser, Debug, Clone, Serialize, Deserialize, PartialEq, PartialOrd, Eq, Ord)] diff --git a/simulator/runner/env.rs b/simulator/runner/env.rs index 8a7a6533a..71a3519ef 100644 --- a/simulator/runner/env.rs +++ b/simulator/runner/env.rs @@ -42,29 +42,46 @@ impl SimulatorEnv { pub(crate) fn new(seed: u64, cli_opts: &SimulatorCLI, db_path: &Path) -> Self { let mut rng = ChaCha8Rng::seed_from_u64(seed); - let (create_percent, read_percent, write_percent, delete_percent, drop_percent) = { - let total = 100.0; + let total = 100.0; - let read_percent = rng.gen_range(0.0..=total); - let write_percent = total - read_percent; + let mut create_percent = 0.0; + let mut drop_percent = 0.0; + let mut delete_percent = 0.0; + let mut update_percent = 0.0; + let read_percent = rng.gen_range(0.0..=total); + let write_percent = total - read_percent; + + if !cli_opts.disable_create { // Create percent should be 5-15% of the write percent - let create_percent = rng.gen_range(0.05..=0.15) * write_percent; + create_percent = rng.gen_range(0.05..=0.15) * write_percent; + } + if !cli_opts.disable_drop { // Drop percent should be 2-5% of the write percent - let drop_percent = rng.gen_range(0.02..=0.05) * write_percent; + drop_percent = rng.gen_range(0.02..=0.05) * write_percent; + } + if !cli_opts.disable_delete { // Delete percent should be 10-20% of the write percent - let delete_percent = rng.gen_range(0.1..=0.2) * write_percent; + delete_percent = rng.gen_range(0.1..=0.2) * write_percent; + } + if !cli_opts.disable_update { + // Update percent should be 10-20% of the write percent + // TODO: freestyling the percentage + update_percent = rng.gen_range(0.1..=0.2) * write_percent; + } - let write_percent = write_percent - create_percent - delete_percent - drop_percent; + let write_percent = + write_percent - create_percent - delete_percent - drop_percent - update_percent; - ( - create_percent, - read_percent, - write_percent, - delete_percent, - drop_percent, - ) - }; + assert_eq!( + read_percent + + write_percent + + create_percent + + drop_percent + + update_percent + + delete_percent, + total + ); let opts = SimulatorOpts { ticks: rng.gen_range(cli_opts.minimum_tests..=cli_opts.maximum_tests), @@ -76,6 +93,7 @@ impl SimulatorEnv { write_percent, delete_percent, drop_percent, + update_percent, page_size: 4096, // TODO: randomize this too max_interactions: rng.gen_range(cli_opts.minimum_tests..=cli_opts.maximum_tests), max_time_simulation: cli_opts.maximum_time, @@ -178,6 +196,7 @@ pub(crate) struct SimulatorOpts { pub(crate) read_percent: f64, pub(crate) write_percent: f64, pub(crate) delete_percent: f64, + pub(crate) update_percent: f64, pub(crate) drop_percent: f64, pub(crate) max_interactions: usize, pub(crate) page_size: usize,