chore: reduce insertion size of fuzz test (#4243)

* chore: reduce size of fuzz test

* chore: get env cfg variables
This commit is contained in:
Weny Xu
2024-07-02 21:02:04 +08:00
committed by GitHub
parent 226136011e
commit be29e48a60
9 changed files with 80 additions and 25 deletions

View File

@@ -117,3 +117,20 @@ pub async fn compact_table(e: &Pool<MySql>, table_name: &Ident) -> Result<()> {
Ok(())
}
pub const GT_FUZZ_INPUT_MAX_ROWS: &str = "GT_FUZZ_INPUT_MAX_ROWS";
pub const GT_FUZZ_INPUT_MAX_TABLES: &str = "GT_FUZZ_INPUT_MAX_TABLES";
pub const GT_FUZZ_INPUT_MAX_COLUMNS: &str = "GT_FUZZ_INPUT_MAX_COLUMNS";
pub const GT_FUZZ_INPUT_MAX_ALTER_ACTIONS: &str = "GT_FUZZ_INPUT_MAX_ALTER_ACTIONS";
pub const GT_FUZZ_INPUT_MAX_INSERT_ACTIONS: &str = "GT_FUZZ_INPUT_MAX_INSERT_ACTIONS";
/// Retrieves a value from the environment variables
/// or returns a default value if the environment variable is not set.
pub fn get_from_env_or_default_value(key: &str, default_value: usize) -> usize {
let _ = dotenv::dotenv();
if let Ok(value) = env::var(key) {
value.parse().unwrap()
} else {
default_value
}
}

View File

@@ -51,8 +51,10 @@ use tests_fuzz::utils::partition::{
};
use tests_fuzz::utils::pod_failure::{inject_datanode_pod_failure, recover_pod_failure};
use tests_fuzz::utils::{
compact_table, flush_memtable, init_greptime_connections_via_env, Connections,
GT_FUZZ_CLUSTER_NAME, GT_FUZZ_CLUSTER_NAMESPACE,
compact_table, flush_memtable, get_from_env_or_default_value,
init_greptime_connections_via_env, Connections, GT_FUZZ_CLUSTER_NAME,
GT_FUZZ_CLUSTER_NAMESPACE, GT_FUZZ_INPUT_MAX_COLUMNS, GT_FUZZ_INPUT_MAX_INSERT_ACTIONS,
GT_FUZZ_INPUT_MAX_ROWS, GT_FUZZ_INPUT_MAX_TABLES,
};
use tests_fuzz::validator::row::count_values;
use tokio::sync::Semaphore;
@@ -83,10 +85,14 @@ impl Arbitrary<'_> for FuzzInput {
fn arbitrary(u: &mut Unstructured<'_>) -> arbitrary::Result<Self> {
let seed = u.int_in_range(u64::MIN..=u64::MAX)?;
let mut rng = ChaChaRng::seed_from_u64(seed);
let columns = rng.gen_range(2..64);
let rows = rng.gen_range(2..2048);
let tables = rng.gen_range(1..64);
let inserts = rng.gen_range(2..8);
let max_columns = get_from_env_or_default_value(GT_FUZZ_INPUT_MAX_COLUMNS, 64);
let columns = rng.gen_range(2..max_columns);
let max_rows = get_from_env_or_default_value(GT_FUZZ_INPUT_MAX_ROWS, 2048);
let rows = rng.gen_range(2..max_rows);
let max_tables = get_from_env_or_default_value(GT_FUZZ_INPUT_MAX_TABLES, 64);
let tables = rng.gen_range(1..max_tables);
let max_inserts = get_from_env_or_default_value(GT_FUZZ_INPUT_MAX_INSERT_ACTIONS, 8);
let inserts = rng.gen_range(2..max_inserts);
Ok(FuzzInput {
columns,
rows,

View File

@@ -42,7 +42,10 @@ use tests_fuzz::ir::{
use tests_fuzz::translator::mysql::alter_expr::AlterTableExprTranslator;
use tests_fuzz::translator::mysql::create_expr::CreateTableExprTranslator;
use tests_fuzz::translator::DslTranslator;
use tests_fuzz::utils::{init_greptime_connections_via_env, Connections};
use tests_fuzz::utils::{
get_from_env_or_default_value, init_greptime_connections_via_env, Connections,
GT_FUZZ_INPUT_MAX_ALTER_ACTIONS,
};
use tests_fuzz::validator;
struct FuzzContext {
@@ -65,7 +68,8 @@ impl Arbitrary<'_> for FuzzInput {
fn arbitrary(u: &mut Unstructured<'_>) -> arbitrary::Result<Self> {
let seed = u.int_in_range(u64::MIN..=u64::MAX)?;
let mut rng = ChaChaRng::seed_from_u64(seed);
let actions = rng.gen_range(1..256);
let max_actions = get_from_env_or_default_value(GT_FUZZ_INPUT_MAX_ALTER_ACTIONS, 256);
let actions = rng.gen_range(1..max_actions);
Ok(FuzzInput { seed, actions })
}

View File

@@ -40,7 +40,10 @@ use tests_fuzz::ir::{droppable_columns, modifiable_columns, AlterTableExpr, Crea
use tests_fuzz::translator::mysql::alter_expr::AlterTableExprTranslator;
use tests_fuzz::translator::mysql::create_expr::CreateTableExprTranslator;
use tests_fuzz::translator::DslTranslator;
use tests_fuzz::utils::{init_greptime_connections_via_env, Connections};
use tests_fuzz::utils::{
get_from_env_or_default_value, init_greptime_connections_via_env, Connections,
GT_FUZZ_INPUT_MAX_COLUMNS,
};
use tests_fuzz::validator;
struct FuzzContext {
greptime: Pool<MySql>,
@@ -67,7 +70,8 @@ enum AlterTableOption {
}
fn generate_create_table_expr<R: Rng + 'static>(rng: &mut R) -> Result<CreateTableExpr> {
let columns = rng.gen_range(2..30);
let max_columns = get_from_env_or_default_value(GT_FUZZ_INPUT_MAX_COLUMNS, 30);
let columns = rng.gen_range(2..max_columns);
let create_table_generator = CreateTableExprGeneratorBuilder::default()
.name_generator(Box::new(MappedGenerator::new(
WordGenerator,

View File

@@ -31,7 +31,10 @@ use tests_fuzz::generator::Generator;
use tests_fuzz::ir::CreateTableExpr;
use tests_fuzz::translator::mysql::create_expr::CreateTableExprTranslator;
use tests_fuzz::translator::DslTranslator;
use tests_fuzz::utils::{init_greptime_connections_via_env, Connections};
use tests_fuzz::utils::{
get_from_env_or_default_value, init_greptime_connections_via_env, Connections,
GT_FUZZ_INPUT_MAX_COLUMNS,
};
use tests_fuzz::validator;
struct FuzzContext {
@@ -54,7 +57,8 @@ impl Arbitrary<'_> for FuzzInput {
fn arbitrary(u: &mut Unstructured<'_>) -> arbitrary::Result<Self> {
let seed = u.int_in_range(u64::MIN..=u64::MAX)?;
let mut rng = ChaChaRng::seed_from_u64(seed);
let columns = rng.gen_range(2..30);
let max_columns = get_from_env_or_default_value(GT_FUZZ_INPUT_MAX_COLUMNS, 30);
let columns = rng.gen_range(2..max_columns);
Ok(FuzzInput { columns, seed })
}
}

View File

@@ -39,7 +39,10 @@ use tests_fuzz::ir::{
use tests_fuzz::translator::mysql::create_expr::CreateTableExprTranslator;
use tests_fuzz::translator::mysql::insert_expr::InsertIntoExprTranslator;
use tests_fuzz::translator::DslTranslator;
use tests_fuzz::utils::{flush_memtable, init_greptime_connections_via_env, Connections};
use tests_fuzz::utils::{
flush_memtable, get_from_env_or_default_value, init_greptime_connections_via_env, Connections,
GT_FUZZ_INPUT_MAX_COLUMNS, GT_FUZZ_INPUT_MAX_ROWS,
};
use tests_fuzz::validator;
struct FuzzContext {
@@ -63,8 +66,10 @@ impl Arbitrary<'_> for FuzzInput {
fn arbitrary(u: &mut Unstructured<'_>) -> arbitrary::Result<Self> {
let seed = u.int_in_range(u64::MIN..=u64::MAX)?;
let mut rng = ChaChaRng::seed_from_u64(seed);
let columns = rng.gen_range(2..30);
let rows = rng.gen_range(1..4096);
let max_columns = get_from_env_or_default_value(GT_FUZZ_INPUT_MAX_COLUMNS, 30);
let columns = rng.gen_range(2..max_columns);
let max_row = get_from_env_or_default_value(GT_FUZZ_INPUT_MAX_ROWS, 2048);
let rows = rng.gen_range(1..max_row);
Ok(FuzzInput {
columns,
rows,

View File

@@ -43,7 +43,9 @@ use tests_fuzz::translator::mysql::create_expr::CreateTableExprTranslator;
use tests_fuzz::translator::mysql::insert_expr::InsertIntoExprTranslator;
use tests_fuzz::translator::DslTranslator;
use tests_fuzz::utils::{
compact_table, flush_memtable, init_greptime_connections_via_env, Connections,
compact_table, flush_memtable, get_from_env_or_default_value,
init_greptime_connections_via_env, Connections, GT_FUZZ_INPUT_MAX_ROWS,
GT_FUZZ_INPUT_MAX_TABLES,
};
use tests_fuzz::validator;
struct FuzzContext {
@@ -60,14 +62,18 @@ impl FuzzContext {
struct FuzzInput {
seed: u64,
tables: usize,
rows: usize,
}
impl Arbitrary<'_> for FuzzInput {
fn arbitrary(u: &mut Unstructured<'_>) -> arbitrary::Result<Self> {
let seed = u.int_in_range(u64::MIN..=u64::MAX)?;
let mut rng = ChaChaRng::seed_from_u64(seed);
let tables = rng.gen_range(1..256);
Ok(FuzzInput { tables, seed })
let max_tables = get_from_env_or_default_value(GT_FUZZ_INPUT_MAX_TABLES, 32);
let tables = rng.gen_range(1..max_tables);
let max_row = get_from_env_or_default_value(GT_FUZZ_INPUT_MAX_ROWS, 2048);
let rows = rng.gen_range(1..max_row);
Ok(FuzzInput { tables, seed, rows })
}
}
@@ -204,11 +210,11 @@ async fn validate_values(
}
async fn insert_values<R: Rng + 'static>(
rows: usize,
ctx: &FuzzContext,
rng: &mut R,
logical_table_ctx: TableContextRef,
) -> Result<InsertIntoExpr> {
let rows = rng.gen_range(1..2048);
let insert_expr = generate_insert_expr(rows, rng, logical_table_ctx.clone())?;
let translator = InsertIntoExprTranslator;
let sql = translator.translate(&insert_expr)?;
@@ -257,7 +263,8 @@ async fn execute_insert(ctx: FuzzContext, input: FuzzInput) -> Result<()> {
info!("Create logical table: {sql}, result: {result:?}");
let logical_table_ctx = Arc::new(TableContext::from(&create_logical_table_expr));
let insert_expr = insert_values(&ctx, &mut rng, logical_table_ctx.clone()).await?;
let insert_expr =
insert_values(input.rows, &ctx, &mut rng, logical_table_ctx.clone()).await?;
validate_values(&ctx, logical_table_ctx.clone(), &insert_expr).await?;
tables.insert(logical_table_ctx.name.clone(), logical_table_ctx.clone());
if rng.gen_bool(0.1) {

View File

@@ -43,8 +43,10 @@ use tests_fuzz::translator::mysql::create_expr::CreateTableExprTranslator;
use tests_fuzz::translator::DslTranslator;
use tests_fuzz::utils::config::{get_conf_path, write_config_file};
use tests_fuzz::utils::health::HttpHealthChecker;
use tests_fuzz::utils::load_unstable_test_env_variables;
use tests_fuzz::utils::process::{ProcessManager, ProcessState, UnstableProcessController};
use tests_fuzz::utils::{
get_from_env_or_default_value, load_unstable_test_env_variables, GT_FUZZ_INPUT_MAX_TABLES,
};
use tests_fuzz::{error, validator};
use tokio::sync::watch;
@@ -61,15 +63,16 @@ impl FuzzContext {
#[derive(Clone, Debug)]
struct FuzzInput {
seed: u64,
num: usize,
tables: usize,
}
impl Arbitrary<'_> for FuzzInput {
fn arbitrary(u: &mut Unstructured<'_>) -> arbitrary::Result<Self> {
let seed = u.int_in_range(u64::MIN..=u64::MAX)?;
let mut rng = ChaChaRng::seed_from_u64(seed);
let num = rng.gen_range(1..500);
Ok(FuzzInput { seed, num })
let max_tables = get_from_env_or_default_value(GT_FUZZ_INPUT_MAX_TABLES, 256);
let tables = rng.gen_range(1..max_tables);
Ok(FuzzInput { seed, tables })
}
}
@@ -134,7 +137,7 @@ async fn execute_unstable_create_table(
let ctx = FuzzContext { greptime: mysql };
let mut table_states = HashMap::new();
for _ in 0..input.num {
for _ in 0..input.tables {
let expr = generate_create_table_expr(&mut rng);
let table_ctx = Arc::new(TableContext::from(&expr));
let table_name = expr.table_name.to_string();