diff --git a/simulator/generation/plan.rs b/simulator/generation/plan.rs index 496680660..bd81463da 100644 --- a/simulator/generation/plan.rs +++ b/simulator/generation/plan.rs @@ -590,6 +590,7 @@ impl Display for Fault { pub struct Interaction { pub connection_index: usize, pub interaction: InteractionType, + pub ignore_error: bool, } impl Deref for Interaction { @@ -611,6 +612,15 @@ impl Interaction { Self { connection_index, interaction, + ignore_error: false, + } + } + + pub fn new_ignore_error(connection_index: usize, interaction: InteractionType) -> Self { + Self { + connection_index, + interaction, + ignore_error: true, } } } diff --git a/simulator/generation/property.rs b/simulator/generation/property.rs index e01bfedd4..1e68d439f 100644 --- a/simulator/generation/property.rs +++ b/simulator/generation/property.rs @@ -472,7 +472,7 @@ impl Property { .into_iter() .map(|q| Interaction::new(connection_index, InteractionType::Query(q))), ); - interactions.push(Interaction::new(connection_index, cq2)); + interactions.push(Interaction::new_ignore_error(connection_index, cq2)); interactions.push(Interaction::new(connection_index, assertion)); interactions diff --git a/simulator/runner/execution.rs b/simulator/runner/execution.rs index a1a7d5736..923262507 100644 --- a/simulator/runner/execution.rs +++ b/simulator/runner/execution.rs @@ -175,9 +175,14 @@ pub fn execute_interaction_turso( match &interaction.interaction { InteractionType::Query(_) => { tracing::debug!(?interaction); - let results = interaction.execute_query(conn); - if results.is_err() { - tracing::error!(?results); + let results = interaction + .execute_query(conn) + .inspect_err(|err| tracing::error!(?err)); + + if let Err(err) = &results + && !interaction.ignore_error + { + return Err(err.clone()); } stack.push(results); // TODO: skip integrity check with mvcc @@ -186,10 +191,10 @@ pub fn execute_interaction_turso( } } InteractionType::FsyncQuery(query) => { - let results = interaction.execute_fsync_query(conn.clone(), env); - if results.is_err() { - tracing::error!(?results); - } + let results = interaction + .execute_fsync_query(conn.clone(), env) + .inspect_err(|err| tracing::error!(?err)); + stack.push(results); let query_interaction = Interaction::new( @@ -217,10 +222,10 @@ pub fn execute_interaction_turso( } InteractionType::FaultyQuery(_) => { let conn = conn.clone(); - let results = interaction.execute_faulty_query(&conn, env); - if results.is_err() { - tracing::error!(?results); - } + let results = interaction + .execute_faulty_query(&conn, env) + .inspect_err(|err| tracing::error!(?err)); + stack.push(results); // Reset fault injection env.io.inject_fault(false); @@ -296,6 +301,11 @@ fn execute_interaction_rusqlite( let results = execute_query_rusqlite(conn, query).map_err(|e| { turso_core::LimboError::InternalError(format!("error executing query: {e}")) }); + if let Err(err) = &results + && !interaction.ignore_error + { + return Err(err.clone()); + } tracing::debug!("{:?}", results); stack.push(results); }