From 519d4c48bbf1201e1cca7c94bab17317a2d8b50c Mon Sep 17 00:00:00 2001 From: Henrik Ingo Date: Fri, 31 Jan 2025 14:13:16 +0200 Subject: [PATCH 01/19] Use GH action from henrikingo --- .github/workflows/push_only.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/push_only.yml b/.github/workflows/push_only.yml index 1c10bbb62..8194e68b6 100644 --- a/.github/workflows/push_only.yml +++ b/.github/workflows/push_only.yml @@ -25,7 +25,8 @@ jobs: run: cargo bench 2>&1 | tee output.txt - name: Analyze benchmark result with Nyrkiö - uses: nyrkio/github-action-benchmark@HEAD + uses: henrikingo/github-action-benchmark@HEAD + # uses: nyrkio/github-action-benchmark@HEAD with: name: turso tool: criterion From 6c674cf4529cc1bb59c31ee5dd421d043951b3fd Mon Sep 17 00:00:00 2001 From: Henrik Ingo Date: Fri, 7 Feb 2025 02:39:39 +0200 Subject: [PATCH 02/19] Use staging.nyrkio.com --- .github/workflows/push_only.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/push_only.yml b/.github/workflows/push_only.yml index 8194e68b6..742a933b3 100644 --- a/.github/workflows/push_only.yml +++ b/.github/workflows/push_only.yml @@ -35,7 +35,9 @@ jobs: # Nyrkiö configuration nyrkio-enable: true # Get yours from https://nyrkio.com/docs/getting-started - nyrkio-token: ${{ secrets.NYRKIO_JWT_TOKEN }} + nyrkio-token: ${{ secrets.STAGING_JWT_TOKEN }} + nyrkio-api-root: https://staging.nyrkio.com/api/v0 + nyrkio-org: nyrkio # Old way... # Explicitly set this to null. We don't want threshold based alerts today. From ebac4dd875cab9303d08413d881362d031c223f9 Mon Sep 17 00:00:00 2001 From: Henrik Ingo Date: Fri, 7 Feb 2025 08:44:17 +0200 Subject: [PATCH 03/19] test non-org path --- .github/workflows/push_only.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/push_only.yml b/.github/workflows/push_only.yml index 742a933b3..f25f5c26e 100644 --- a/.github/workflows/push_only.yml +++ b/.github/workflows/push_only.yml @@ -37,7 +37,7 @@ jobs: # Get yours from https://nyrkio.com/docs/getting-started nyrkio-token: ${{ secrets.STAGING_JWT_TOKEN }} nyrkio-api-root: https://staging.nyrkio.com/api/v0 - nyrkio-org: nyrkio + # nyrkio-org: nyrkio # Old way... # Explicitly set this to null. We don't want threshold based alerts today. From cdc7f0f3e9c275efe478acc92ca466ed9d03e4a6 Mon Sep 17 00:00:00 2001 From: Henrik Ingo Date: Sat, 8 Feb 2025 18:28:43 +0200 Subject: [PATCH 04/19] mv push_only.yml to another name in anticipation of adding PRs --- .github/workflows/{push_only.yml => rust_perf.yml} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .github/workflows/{push_only.yml => rust_perf.yml} (100%) diff --git a/.github/workflows/push_only.yml b/.github/workflows/rust_perf.yml similarity index 100% rename from .github/workflows/push_only.yml rename to .github/workflows/rust_perf.yml From 3ab99760d289c30c98f4920ef3b7a4c21e1db3bd Mon Sep 17 00:00:00 2001 From: Henrik Ingo Date: Sat, 8 Feb 2025 18:37:49 +0200 Subject: [PATCH 05/19] =?UTF-8?q?Enable=20Nyrki=C3=B6=20also=20for=20PR?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/rust.yml | 7 ------- .github/workflows/rust_perf.yml | 6 +++++- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 0e9c1c36d..6421e9016 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -64,13 +64,6 @@ jobs: run: curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh - run: wasm-pack build --target nodejs bindings/wasm - bench: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - name: Bench - run: cargo bench - test-limbo: runs-on: ubuntu-latest steps: diff --git a/.github/workflows/rust_perf.yml b/.github/workflows/rust_perf.yml index f25f5c26e..5a1b07ab9 100644 --- a/.github/workflows/rust_perf.yml +++ b/.github/workflows/rust_perf.yml @@ -1,9 +1,11 @@ -name: Benchmarks+Nyrkiö +name: Rust Benchmarks+Nyrkiö # Pull request support isn't integrated to the github-action-benchmark so run only post-merge on: push: branches: [ "main", "master", "notmain", "add-nyrkio" ] + pull_request: + branches: [ "main", "notmain", "master" ] env: CARGO_TERM_COLOR: never @@ -34,6 +36,8 @@ jobs: fail-on-alert: true # Nyrkiö configuration nyrkio-enable: true + # Make results and change points public, so that any oss contributor can see them + nyrkio-public: true # Get yours from https://nyrkio.com/docs/getting-started nyrkio-token: ${{ secrets.STAGING_JWT_TOKEN }} nyrkio-api-root: https://staging.nyrkio.com/api/v0 From 3ff548b8c5dc96db85e6801610aaa8e7c622e8bf Mon Sep 17 00:00:00 2001 From: Henrik Ingo Date: Mon, 10 Feb 2025 04:28:52 +0200 Subject: [PATCH 06/19] Add explicitly all alerting options to workflow yml Set pvalue and threshold from workflow --- .github/workflows/rust_perf.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.github/workflows/rust_perf.yml b/.github/workflows/rust_perf.yml index 5a1b07ab9..d4cba22b3 100644 --- a/.github/workflows/rust_perf.yml +++ b/.github/workflows/rust_perf.yml @@ -33,15 +33,25 @@ jobs: name: turso tool: criterion output-file-path: output.txt + # What to do if a change is immediately detected by Nyrkiö. + # Note that smaller changes are only detected with delay, usually after a change + # persisted over 2-7 commits. + # Note that Nyrkiö will find all changes, also improvements. This means fail-on-alert + # on pull events isn't compatible with this workflow being required to pass branch protection. fail-on-alert: true + comment-on-alert: true + comment-always: true # Nyrkiö configuration nyrkio-enable: true # Make results and change points public, so that any oss contributor can see them nyrkio-public: true + # Get yours from https://nyrkio.com/docs/getting-started nyrkio-token: ${{ secrets.STAGING_JWT_TOKEN }} nyrkio-api-root: https://staging.nyrkio.com/api/v0 # nyrkio-org: nyrkio + nyrkio-settings-pvalue: 0.01% + nyrkio-settings-threshold: 1% # Old way... # Explicitly set this to null. We don't want threshold based alerts today. From 4ae4706d343636d5edb6f2a3dd8842e2c12526df Mon Sep 17 00:00:00 2001 From: Henrik Ingo Date: Thu, 13 Feb 2025 00:38:28 +0200 Subject: [PATCH 07/19] Workflow: Use nyrkio-org --- .github/workflows/rust_perf.yml | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/.github/workflows/rust_perf.yml b/.github/workflows/rust_perf.yml index d4cba22b3..0404b2e6d 100644 --- a/.github/workflows/rust_perf.yml +++ b/.github/workflows/rust_perf.yml @@ -23,8 +23,13 @@ jobs: # - name: Install dependencies # run: npm install && npm run build - - name: Bench - run: cargo bench 2>&1 | tee output.txt + # - name: Bench + # run: cargo bench 2>&1 | tee output.txt + - name: Bench (fake) + run: | + pwd + ls + cp .github/data/limbo-cargo-output.txt output.txt - name: Analyze benchmark result with Nyrkiö uses: henrikingo/github-action-benchmark@HEAD @@ -49,7 +54,7 @@ jobs: # Get yours from https://nyrkio.com/docs/getting-started nyrkio-token: ${{ secrets.STAGING_JWT_TOKEN }} nyrkio-api-root: https://staging.nyrkio.com/api/v0 - # nyrkio-org: nyrkio + nyrkio-org: nyrkio nyrkio-settings-pvalue: 0.01% nyrkio-settings-threshold: 1% From 83a7e2ec72e691e017a72b9acb03e7ed18adb877 Mon Sep 17 00:00:00 2001 From: Henrik Ingo Date: Thu, 13 Feb 2025 03:35:27 +0200 Subject: [PATCH 08/19] Add a sample cargo outputfile to use for faster testing --- .github/data/limbo-cargo-output.txt | 222 ++++++++++++++++++++++++++++ .github/workflows/rust_perf.yml | 10 +- 2 files changed, 227 insertions(+), 5 deletions(-) create mode 100644 .github/data/limbo-cargo-output.txt diff --git a/.github/data/limbo-cargo-output.txt b/.github/data/limbo-cargo-output.txt new file mode 100644 index 000000000..5a33c5fd0 --- /dev/null +++ b/.github/data/limbo-cargo-output.txt @@ -0,0 +1,222 @@ +Benchmarking limbo/Prepare statement: 'SELECT 1' +Benchmarking limbo/Prepare statement: 'SELECT 1': Warming up for 3.0000 s +Benchmarking limbo/Prepare statement: 'SELECT 1': Collecting 100 samples in estimated 5.0062 s (2.4M iterations) +Benchmarking limbo/Prepare statement: 'SELECT 1': Analyzing +limbo/Prepare statement: 'SELECT 1' + time: [2.0631 µs 2.0688 µs 2.0763 µs] + thrpt: [481.63 Kelem/s 483.37 Kelem/s 484.70 Kelem/s] +Found 13 outliers among 100 measurements (13.00%) + 1 (1.00%) low severe + 5 (5.00%) high mild + 7 (7.00%) high severe +Benchmarking limbo/Prepare statement: 'SELECT * FROM users LIMIT 1' +Benchmarking limbo/Prepare statement: 'SELECT * FROM users LIMIT 1': Warming up for 3.0000 s +Benchmarking limbo/Prepare statement: 'SELECT * FROM users LIMIT 1': Collecting 100 samples in estimated 5.0159 s (1.3M iterations) +Benchmarking limbo/Prepare statement: 'SELECT * FROM users LIMIT 1': Analyzing +limbo/Prepare statement: 'SELECT * FROM users LIMIT 1' + time: [3.9747 µs 3.9842 µs 3.9937 µs] + thrpt: [250.39 Kelem/s 250.99 Kelem/s 251.59 Kelem/s] +Found 17 outliers among 100 measurements (17.00%) + 5 (5.00%) low severe + 3 (3.00%) low mild + 3 (3.00%) high mild + 6 (6.00%) high severe +Benchmarking limbo/Prepare statement: 'SELECT first_name, count(1) FROM users GROUP BY first_name HAVING count(1)... +Benchmarking limbo/Prepare statement: 'SELECT first_name, count(1) FROM users GROUP BY first_name HAVING count(1)...: Warming up for 3.0000 s +Benchmarking limbo/Prepare statement: 'SELECT first_name, count(1) FROM users GROUP BY first_name HAVING count(1)...: Collecting 100 samples in estimated 5.0099 s (500k iterations) +Benchmarking limbo/Prepare statement: 'SELECT first_name, count(1) FROM users GROUP BY first_name HAVING count(1)...: Analyzing +limbo/Prepare statement: 'SELECT first_name, count(1) FROM users GROUP BY first_name HAVING count(1)... + time: [10.220 µs 10.280 µs 10.358 µs] + thrpt: [96.544 Kelem/s 97.281 Kelem/s 97.846 Kelem/s] +Found 13 outliers among 100 measurements (13.00%) + 1 (1.00%) low severe + 2 (2.00%) high mild + 10 (10.00%) high severe +Benchmarking limbo/Execute prepared statement: 'SELECT 1' +Benchmarking limbo/Execute prepared statement: 'SELECT 1': Warming up for 3.0000 s +Benchmarking limbo/Execute prepared statement: 'SELECT 1': Collecting 100 samples in estimated 5.0006 s (27M iterations) +Benchmarking limbo/Execute prepared statement: 'SELECT 1': Analyzing +limbo/Execute prepared statement: 'SELECT 1' + time: [181.95 ns 182.33 ns 182.70 ns] + thrpt: [5.4736 Melem/s 5.4844 Melem/s 5.4960 Melem/s] +Found 18 outliers among 100 measurements (18.00%) + 6 (6.00%) low severe + 3 (3.00%) low mild + 6 (6.00%) high mild + 3 (3.00%) high severe +Benchmarking limbo/Execute prepared statement: 'SELECT * FROM users LIMIT 1' +Benchmarking limbo/Execute prepared statement: 'SELECT * FROM users LIMIT 1': Warming up for 3.0000 s +Benchmarking limbo/Execute prepared statement: 'SELECT * FROM users LIMIT 1': Collecting 100 samples in estimated 5.0008 s (4.0M iterations) +Benchmarking limbo/Execute prepared statement: 'SELECT * FROM users LIMIT 1': Analyzing +limbo/Execute prepared statement: 'SELECT * FROM users LIMIT 1' + time: [1.2549 µs 1.2572 µs 1.2594 µs] + thrpt: [794.03 Kelem/s 795.44 Kelem/s 796.89 Kelem/s] +Found 15 outliers among 100 measurements (15.00%) + 6 (6.00%) low severe + 3 (3.00%) high mild + 6 (6.00%) high severe +Benchmarking limbo/Execute prepared statement: 'SELECT * FROM users LIMIT 100' +Benchmarking limbo/Execute prepared statement: 'SELECT * FROM users LIMIT 100': Warming up for 3.0000 s +Benchmarking limbo/Execute prepared statement: 'SELECT * FROM users LIMIT 100': Collecting 100 samples in estimated 5.0047 s (4.0M iterations) +Benchmarking limbo/Execute prepared statement: 'SELECT * FROM users LIMIT 100': Analyzing +limbo/Execute prepared statement: 'SELECT * FROM users LIMIT 100' + time: [1.2503 µs 1.2528 µs 1.2560 µs] + thrpt: [796.20 Kelem/s 798.23 Kelem/s 799.84 Kelem/s] +Found 14 outliers among 100 measurements (14.00%) + 2 (2.00%) low severe + 1 (1.00%) low mild + 5 (5.00%) high mild + 6 (6.00%) high severe + +Benchmarking rusqlite/Prepare statement: 'SELECT 1' +Benchmarking rusqlite/Prepare statement: 'SELECT 1': Warming up for 3.0000 s +Benchmarking rusqlite/Prepare statement: 'SELECT 1': Collecting 100 samples in estimated 5.0010 s (6.5M iterations) +Benchmarking rusqlite/Prepare statement: 'SELECT 1': Analyzing +rusqlite/Prepare statement: 'SELECT 1' + time: [768.58 ns 770.50 ns 772.43 ns] + thrpt: [1.2946 Melem/s 1.2979 Melem/s 1.3011 Melem/s] +Found 16 outliers among 100 measurements (16.00%) + 5 (5.00%) low severe + 2 (2.00%) low mild + 1 (1.00%) high mild + 8 (8.00%) high severe +Benchmarking rusqlite/Prepare statement: 'SELECT * FROM users LIMIT 1' +Benchmarking rusqlite/Prepare statement: 'SELECT * FROM users LIMIT 1': Warming up for 3.0000 s +Benchmarking rusqlite/Prepare statement: 'SELECT * FROM users LIMIT 1': Collecting 100 samples in estimated 5.0083 s (1.6M iterations) +Benchmarking rusqlite/Prepare statement: 'SELECT * FROM users LIMIT 1': Analyzing +rusqlite/Prepare statement: 'SELECT * FROM users LIMIT 1' + time: [3.2006 µs 3.2038 µs 3.2084 µs] + thrpt: [311.68 Kelem/s 312.13 Kelem/s 312.45 Kelem/s] +Found 11 outliers among 100 measurements (11.00%) + 5 (5.00%) low severe + 1 (1.00%) low mild + 2 (2.00%) high mild + 3 (3.00%) high severe +Benchmarking rusqlite/Execute prepared statement: 'SELECT 1' +Benchmarking rusqlite/Execute prepared statement: 'SELECT 1': Warming up for 3.0000 s +Benchmarking rusqlite/Execute prepared statement: 'SELECT 1': Collecting 100 samples in estimated 5.0002 s (82M iterations) +Benchmarking rusqlite/Execute prepared statement: 'SELECT 1': Analyzing +rusqlite/Execute prepared statement: 'SELECT 1' + time: [60.613 ns 60.788 ns 61.098 ns] + thrpt: [16.367 Melem/s 16.451 Melem/s 16.498 Melem/s] +Found 8 outliers among 100 measurements (8.00%) + 1 (1.00%) low mild + 1 (1.00%) high mild + 6 (6.00%) high severe +Benchmarking rusqlite/Execute prepared statement: 'SELECT * FROM users LIMIT 1' +Benchmarking rusqlite/Execute prepared statement: 'SELECT * FROM users LIMIT 1': Warming up for 3.0000 s +Benchmarking rusqlite/Execute prepared statement: 'SELECT * FROM users LIMIT 1': Collecting 100 samples in estimated 5.0014 s (4.3M iterations) +Benchmarking rusqlite/Execute prepared statement: 'SELECT * FROM users LIMIT 1': Analyzing +rusqlite/Execute prepared statement: 'SELECT * FROM users LIMIT 1' + time: [1.1686 µs 1.1702 µs 1.1716 µs] + thrpt: [853.52 Kelem/s 854.55 Kelem/s 855.74 Kelem/s] +Found 13 outliers among 100 measurements (13.00%) + 2 (2.00%) low severe + 1 (1.00%) low mild + 6 (6.00%) high mild + 4 (4.00%) high severe +Benchmarking rusqlite/Execute prepared statement: 'SELECT * FROM users LIMIT 100' +Benchmarking rusqlite/Execute prepared statement: 'SELECT * FROM users LIMIT 100': Warming up for 3.0000 s +Benchmarking rusqlite/Execute prepared statement: 'SELECT * FROM users LIMIT 100': Collecting 100 samples in estimated 5.0016 s (4.3M iterations) +Benchmarking rusqlite/Execute prepared statement: 'SELECT * FROM users LIMIT 100': Analyzing +rusqlite/Execute prepared statement: 'SELECT * FROM users LIMIT 100' + time: [1.1643 µs 1.1710 µs 1.1789 µs] + thrpt: [848.26 Kelem/s 853.98 Kelem/s 858.85 Kelem/s] +Found 17 outliers among 100 measurements (17.00%) + 5 (5.00%) low severe + 3 (3.00%) low mild + 4 (4.00%) high mild + 5 (5.00%) high severe + + Running unittests src/lib.rs (target/release/deps/limbo_ext-8b70654a7fccf221) + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + Running unittests src/lib.rs (target/release/deps/limbo_libsql-66ab9a0ee1a27f4c) + +running 1 test +test params::tests::test_serialize_array ... ignored + +test result: ok. 0 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 0.00s + + Running unittests src/lib.rs (target/release/deps/limbo_macros-669ce5abb31e687e) + Running unittests main.rs (target/release/deps/limbo_sim-d28081335520ff9c) + +running 0 tests + Running unittests src/lib.rs (target/release/deps/limbo_sqlite3-1d7f53c447b1fc8a) + Running unittests src/lib.rs (target/release/deps/limbo_uuid-c0d9c3b2e9e30eee) + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + Running unittests src/lib.rs (target/release/deps/_limbo-9562557e55b9bbed) + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + + Running unittests src/lib.rs (target/release/deps/sqlite3_parser-475bbf4de217f28a) + +running 38 tests +test lexer::sql::test::alter_add_column_primary_key ... ignored +test lexer::sql::test::alter_add_column_unique ... ignored +test lexer::sql::test::alter_rename_same ... ignored +test lexer::sql::test::cast_without_typename ... ignored +test lexer::sql::test::column_specified_more_than_once ... ignored +test lexer::sql::test::count_named_placeholders ... ignored +test lexer::sql::test::count_numbered_placeholders ... ignored +test lexer::sql::test::count_placeholders ... ignored +test lexer::sql::test::count_unused_placeholders ... ignored +test lexer::sql::test::create_strict_table_generated_column ... ignored +test lexer::sql::test::create_strict_table_missing_datatype ... ignored +test lexer::sql::test::create_strict_table_unknown_datatype ... ignored +test lexer::sql::test::create_table_with_only_generated_column ... ignored +test lexer::sql::test::create_table_without_column ... ignored +test lexer::sql::test::create_table_without_rowid_missing_pk ... ignored +test lexer::sql::test::create_temporary_table_with_qualified_name ... ignored +test lexer::sql::test::create_view_duplicate_column_name ... ignored + Running benches/keyword.rs (target/release/deps/keyword-255a8492c4f11233) +test lexer::sql::test::create_view_mismatch_count ... ignored +test lexer::sql::test::delete_order_by_without_limit ... ignored +test lexer::sql::test::duplicate_column ... ignored +test lexer::sql::test::extra_comments_between_statements ... ignored +test lexer::sql::test::extra_semicolons_between_statements ... ignored +test lexer::sql::test::foreign_key_on_column ... ignored +test lexer::sql::test::indexed_by_clause_within_triggers ... ignored +test lexer::sql::test::insert_default_values ... ignored +test lexer::sql::test::insert_mismatch_count ... ignored +test lexer::sql::test::missing_join_clause ... ignored +test lexer::sql::test::natural_join_on ... ignored +test lexer::sql::test::only_semicolons_no_statements ... ignored +test lexer::sql::test::qualified_table_name_within_triggers ... ignored +test lexer::sql::test::selects_compound_mismatch_columns_count ... ignored +test lexer::sql::test::unknown_table_option ... ignored +test lexer::sql::test::update_order_by_without_limit ... ignored +test lexer::sql::test::values_mismatch_columns_count ... ignored +test lexer::sql::test::vtab_args ... ignored +test lexer::sql::tests::fallible_iterator ... ignored +test lexer::sql::tests::invalid_number_literal ... ignored +test parser::ast::test::test_dequote ... ignored + +test result: ok. 0 passed; 0 failed; 38 ignored; 0 measured; 0 filtered out; finished in 0.00s + + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s diff --git a/.github/workflows/rust_perf.yml b/.github/workflows/rust_perf.yml index 0404b2e6d..8b75d54f2 100644 --- a/.github/workflows/rust_perf.yml +++ b/.github/workflows/rust_perf.yml @@ -25,11 +25,11 @@ jobs: # - name: Bench # run: cargo bench 2>&1 | tee output.txt - - name: Bench (fake) - run: | - pwd - ls - cp .github/data/limbo-cargo-output.txt output.txt + - name: Bench (fake) + run: | + pwd + ls + cp .github/data/limbo-cargo-output.txt output.txt - name: Analyze benchmark result with Nyrkiö uses: henrikingo/github-action-benchmark@HEAD From ca24400985d205abaf13ffe95ab8fa639a1b6fcd Mon Sep 17 00:00:00 2001 From: Henrik Ingo Date: Thu, 13 Feb 2025 03:55:23 +0200 Subject: [PATCH 09/19] Without org --- .github/workflows/rust_perf.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/rust_perf.yml b/.github/workflows/rust_perf.yml index 8b75d54f2..cb5e90fca 100644 --- a/.github/workflows/rust_perf.yml +++ b/.github/workflows/rust_perf.yml @@ -54,7 +54,7 @@ jobs: # Get yours from https://nyrkio.com/docs/getting-started nyrkio-token: ${{ secrets.STAGING_JWT_TOKEN }} nyrkio-api-root: https://staging.nyrkio.com/api/v0 - nyrkio-org: nyrkio + # nyrkio-org: nyrkio nyrkio-settings-pvalue: 0.01% nyrkio-settings-threshold: 1% From ba479c892fa731e892cab5d2fd94a6e372e28c87 Mon Sep 17 00:00:00 2001 From: Henrik Ingo Date: Tue, 18 Feb 2025 02:24:23 +0200 Subject: [PATCH 10/19] fix yml --- .github/workflows/rust_perf.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/rust_perf.yml b/.github/workflows/rust_perf.yml index cb5e90fca..c129895ed 100644 --- a/.github/workflows/rust_perf.yml +++ b/.github/workflows/rust_perf.yml @@ -25,11 +25,11 @@ jobs: # - name: Bench # run: cargo bench 2>&1 | tee output.txt - - name: Bench (fake) - run: | - pwd - ls - cp .github/data/limbo-cargo-output.txt output.txt + - name: Bench (fake) + run: | + pwd + ls + cp .github/data/limbo-cargo-output.txt output.txt - name: Analyze benchmark result with Nyrkiö uses: henrikingo/github-action-benchmark@HEAD From a79e75094f3fcd27083e97579cf2f03cbfc0f26c Mon Sep 17 00:00:00 2001 From: Henrik Ingo Date: Mon, 10 Feb 2025 04:34:03 +0200 Subject: [PATCH 11/19] Rename the push_only.yml workflow in anticipation of adding PRs --- .github/workflows/rust_perf.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/rust_perf.yml b/.github/workflows/rust_perf.yml index c129895ed..dd961ad87 100644 --- a/.github/workflows/rust_perf.yml +++ b/.github/workflows/rust_perf.yml @@ -34,6 +34,7 @@ jobs: - name: Analyze benchmark result with Nyrkiö uses: henrikingo/github-action-benchmark@HEAD # uses: nyrkio/github-action-benchmark@HEAD + with: name: turso tool: criterion From b356a84d6992a2dda44b2724f1d0bb5babc33bdc Mon Sep 17 00:00:00 2001 From: Henrik Ingo Date: Mon, 10 Feb 2025 04:43:19 +0200 Subject: [PATCH 12/19] =?UTF-8?q?Enable=20Nyrki=C3=B6=20also=20on=20PRs.?= =?UTF-8?q?=20(Non-blocking=20mode.)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Rename push_only.yml workflow to rust_perf.yml - Move the 'bench' task from rust.yml to rust_perf.yml - More Nyrkio configuration options exposed: Team support (everyone in gh/tursodatabase can access Nyrkiö) Public results Alerting options: Comment on PR, if change detected, don't fail task --- .github/workflows/rust_perf.yml | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/.github/workflows/rust_perf.yml b/.github/workflows/rust_perf.yml index dd961ad87..f34b90bec 100644 --- a/.github/workflows/rust_perf.yml +++ b/.github/workflows/rust_perf.yml @@ -1,9 +1,8 @@ name: Rust Benchmarks+Nyrkiö -# Pull request support isn't integrated to the github-action-benchmark so run only post-merge on: push: - branches: [ "main", "master", "notmain", "add-nyrkio" ] + branches: [ "main", "master", "notmain" ] pull_request: branches: [ "main", "notmain", "master" ] @@ -41,12 +40,12 @@ jobs: output-file-path: output.txt # What to do if a change is immediately detected by Nyrkiö. # Note that smaller changes are only detected with delay, usually after a change - # persisted over 2-7 commits. + # persisted over 2-7 commits. Go to nyrkiö.com to view those or configure alerts. # Note that Nyrkiö will find all changes, also improvements. This means fail-on-alert # on pull events isn't compatible with this workflow being required to pass branch protection. - fail-on-alert: true + fail-on-alert: false comment-on-alert: true - comment-always: true + comment-always: false # Nyrkiö configuration nyrkio-enable: true # Make results and change points public, so that any oss contributor can see them @@ -55,11 +54,16 @@ jobs: # Get yours from https://nyrkio.com/docs/getting-started nyrkio-token: ${{ secrets.STAGING_JWT_TOKEN }} nyrkio-api-root: https://staging.nyrkio.com/api/v0 - # nyrkio-org: nyrkio + # Make results and change points public, so that any oss contributor can see them + nyrkio-public: true nyrkio-settings-pvalue: 0.01% nyrkio-settings-threshold: 1% + # Team support = results are visible and manageable to everyone in the same Github org + # nyrkio-org: tursodatabase + # nyrkio-org: nyrkio # Old way... # Explicitly set this to null. We don't want threshold based alerts today. external-data-json-path: null gh-repository: null + From cf971cb6c2692eeed31995dce91aa6295489978f Mon Sep 17 00:00:00 2001 From: Henrik Ingo Date: Mon, 10 Feb 2025 22:47:14 +0200 Subject: [PATCH 13/19] Maybe better to turn on never-fail immediately This allows PRs to succeed regardless of who submitted them. Feels friendlier that way. --- .github/workflows/rust_perf.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/rust_perf.yml b/.github/workflows/rust_perf.yml index f34b90bec..7dc2bb111 100644 --- a/.github/workflows/rust_perf.yml +++ b/.github/workflows/rust_perf.yml @@ -48,6 +48,11 @@ jobs: comment-always: false # Nyrkiö configuration nyrkio-enable: true + # Get yours from https://nyrkio.com/docs/getting-started + nyrkio-token: ${{ secrets.NYRKIO_JWT_TOKEN }} + # You may not want share the NYRKIO_JWT_TOKEN token with pull requests, for example. + # In that case this task would unnecessarily fail for random contributors. Don't want that: + never-fail: true # Make results and change points public, so that any oss contributor can see them nyrkio-public: true @@ -66,4 +71,3 @@ jobs: # Explicitly set this to null. We don't want threshold based alerts today. external-data-json-path: null gh-repository: null - From 24839e6f01f96b0ad26b44e1a959963ca6d51465 Mon Sep 17 00:00:00 2001 From: Henrik Ingo Date: Tue, 18 Feb 2025 01:43:25 +0200 Subject: [PATCH 14/19] =?UTF-8?q?Add=20Nyrki=C3=B6=20to=20the=20new=20clic?= =?UTF-8?q?kbench=20task?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/rust.yml | 6 ----- .github/workflows/rust_perf.yml | 43 +++++++++++++++++++++++++++++++++ perf/clickbench/run.sh | 8 +++--- 3 files changed, 48 insertions(+), 9 deletions(-) diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 6421e9016..67d6d7e23 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -88,9 +88,3 @@ jobs: - name: Test run: SQLITE_EXEC="sqlite3" make test-compat - clickbench: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - name: Clickbench - run: make clickbench diff --git a/.github/workflows/rust_perf.yml b/.github/workflows/rust_perf.yml index 7dc2bb111..12614dc4b 100644 --- a/.github/workflows/rust_perf.yml +++ b/.github/workflows/rust_perf.yml @@ -71,3 +71,46 @@ jobs: # Explicitly set this to null. We don't want threshold based alerts today. external-data-json-path: null gh-repository: null + + clickbench: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-node@v4 + with: + node-version: 20 + + - name: Clickbench + run: make clickbench + + - name: Analyze benchmark result with Nyrkiö + uses: nyrkio/github-action-benchmark@HEAD + with: + name: clickbench + tool: time + output-file-path: [clickbench-limbo.txt, clickbench-sqlite3.txt] + # What to do if a change is immediately detected by Nyrkiö. + # Note that smaller changes are only detected with delay, usually after a change + # persisted over 2-7 commits. Go to nyrkiö.com to view those or configure alerts. + # Note that Nyrkiö will find all changes, also improvements. This means fail-on-alert + # on pull events isn't compatible with this workflow being required to pass branch protection. + fail-on-alert: false + comment-on-alert: true + comment-always: false + # Nyrkiö configuration + nyrkio-enable: true + # Get yours from https://nyrkio.com/docs/getting-started + nyrkio-token: ${{ secrets.NYRKIO_JWT_TOKEN }} + # You may not want share the NYRKIO_JWT_TOKEN token with pull requests, for example. + # In that case this task would unnecessarily fail for random contributors. Don't want that: + never-fail: true + # Make results and change points public, so that any oss contributor can see them + nyrkio-public: true + # Team support = results are visible and manageable to everyone in the same Github org + nyrkio-org: tursodatabase + + # Old way... + # Explicitly set this to null. We don't want threshold based alerts today. + external-data-json-path: null + gh-repository: null + diff --git a/perf/clickbench/run.sh b/perf/clickbench/run.sh index 6a317571b..ed7616f25 100755 --- a/perf/clickbench/run.sh +++ b/perf/clickbench/run.sh @@ -25,18 +25,20 @@ clear_caches() { # Clear caches once echo "The script might ask you to enter the password for sudo, in order to clear system caches." clear_caches +count=1; # Run the queries, skipping any that are commented out # Between each invocation to Limbo/Sqlite, purge the caches grep -v '^--' "$CLICKBENCH_DIR/queries.sql" | while read -r query; do - echo "$query"; + echo "$count $query" | tee -a "${REPO_ROOT}/clickbench-limbo.txt" | tee -a "${REPO_ROOT}/clickbench-sqlite3.txt" for _ in $(seq 1 $TRIES); do clear_caches echo "----limbo----" - time "$RELEASE_BUILD_DIR/limbo" --quiet "$CLICKBENCH_DIR/mydb" <<< "${query}" + time "$RELEASE_BUILD_DIR/limbo" --quiet "$CLICKBENCH_DIR/mydb" <<< "${query}" | tee -a "${REPO_ROOT}/clickbench-limbo.txt" clear_caches echo echo "----sqlite----" - time sqlite3 "$CLICKBENCH_DIR/mydb" <<< "${query}" + time sqlite3 "$CLICKBENCH_DIR/mydb" <<< "${query}" | tee -a "${REPO_ROOT}/clickbench-sqlite3.txt" done; + count=$(($count+1)) done; From ff38d93d3e4c12ec0cb9cb0a1e213b2b9b56e1e6 Mon Sep 17 00:00:00 2001 From: Henrik Ingo Date: Tue, 18 Feb 2025 02:45:16 +0200 Subject: [PATCH 15/19] fix yml --- .github/workflows/rust_perf.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/workflows/rust_perf.yml b/.github/workflows/rust_perf.yml index 12614dc4b..a9fe95101 100644 --- a/.github/workflows/rust_perf.yml +++ b/.github/workflows/rust_perf.yml @@ -56,11 +56,8 @@ jobs: # Make results and change points public, so that any oss contributor can see them nyrkio-public: true - # Get yours from https://nyrkio.com/docs/getting-started - nyrkio-token: ${{ secrets.STAGING_JWT_TOKEN }} nyrkio-api-root: https://staging.nyrkio.com/api/v0 # Make results and change points public, so that any oss contributor can see them - nyrkio-public: true nyrkio-settings-pvalue: 0.01% nyrkio-settings-threshold: 1% # Team support = results are visible and manageable to everyone in the same Github org From 32e73d7fb5fb36600635526a32080754b4bd2300 Mon Sep 17 00:00:00 2001 From: Henrik Ingo Date: Tue, 18 Feb 2025 02:52:46 +0200 Subject: [PATCH 16/19] =?UTF-8?q?Nyrki=C3=B6:=20Analyze=20limbo=20and=20sq?= =?UTF-8?q?lite3=20clickbench=20results=20separately?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/rust_perf.yml | 47 ++++++++++++++++++++++----------- perf/clickbench/run.sh | 8 +++--- 2 files changed, 36 insertions(+), 19 deletions(-) diff --git a/.github/workflows/rust_perf.yml b/.github/workflows/rust_perf.yml index a9fe95101..0659e796c 100644 --- a/.github/workflows/rust_perf.yml +++ b/.github/workflows/rust_perf.yml @@ -22,17 +22,11 @@ jobs: # - name: Install dependencies # run: npm install && npm run build - # - name: Bench - # run: cargo bench 2>&1 | tee output.txt - - name: Bench (fake) - run: | - pwd - ls - cp .github/data/limbo-cargo-output.txt output.txt + - name: Bench + run: cargo bench 2>&1 | tee output.txt - name: Analyze benchmark result with Nyrkiö - uses: henrikingo/github-action-benchmark@HEAD - # uses: nyrkio/github-action-benchmark@HEAD + uses: nyrkio/github-action-benchmark@HEAD with: name: turso @@ -56,13 +50,12 @@ jobs: # Make results and change points public, so that any oss contributor can see them nyrkio-public: true - nyrkio-api-root: https://staging.nyrkio.com/api/v0 + nyrkio-api-root: https://nyrkio.com/api/v0 # Make results and change points public, so that any oss contributor can see them nyrkio-settings-pvalue: 0.01% - nyrkio-settings-threshold: 1% + nyrkio-settings-threshold: 2% # Team support = results are visible and manageable to everyone in the same Github org # nyrkio-org: tursodatabase - # nyrkio-org: nyrkio # Old way... # Explicitly set this to null. We don't want threshold based alerts today. @@ -71,6 +64,7 @@ jobs: clickbench: runs-on: ubuntu-latest + environment: test steps: - uses: actions/checkout@v3 - uses: actions/setup-node@v4 @@ -80,12 +74,12 @@ jobs: - name: Clickbench run: make clickbench - - name: Analyze benchmark result with Nyrkiö + - name: Analyze LIMBO result with Nyrkiö uses: nyrkio/github-action-benchmark@HEAD with: - name: clickbench + name: clickbench/limbo tool: time - output-file-path: [clickbench-limbo.txt, clickbench-sqlite3.txt] + output-file-path: clickbench-limbo.txt # What to do if a change is immediately detected by Nyrkiö. # Note that smaller changes are only detected with delay, usually after a change # persisted over 2-7 commits. Go to nyrkiö.com to view those or configure alerts. @@ -103,11 +97,32 @@ jobs: never-fail: true # Make results and change points public, so that any oss contributor can see them nyrkio-public: true + + nyrkio-api-root: https://nyrkio.com/api/v0 # Team support = results are visible and manageable to everyone in the same Github org - nyrkio-org: tursodatabase + # nyrkio-org: tursodatabase # Old way... # Explicitly set this to null. We don't want threshold based alerts today. external-data-json-path: null gh-repository: null + - name: Analyze SQLITE3 result with Nyrkiö + uses: nyrkio/github-action-benchmark@HEAD + with: + name: clickbench/sqlite3 + tool: time + output-file-path: clickbench-sqlite3.txt + fail-on-alert: false + comment-on-alert: true + comment-always: false + nyrkio-enable: true + nyrkio-token: ${{ secrets.NYRKIO_JWT_TOKEN }} + never-fail: true + nyrkio-public: true + nyrkio-api-root: https://nyrkio.com/api/v0 + # nyrkio-org: tursodatabase + + external-data-json-path: null + gh-repository: null + diff --git a/perf/clickbench/run.sh b/perf/clickbench/run.sh index ed7616f25..ea5bdf428 100755 --- a/perf/clickbench/run.sh +++ b/perf/clickbench/run.sh @@ -30,15 +30,17 @@ count=1; # Run the queries, skipping any that are commented out # Between each invocation to Limbo/Sqlite, purge the caches grep -v '^--' "$CLICKBENCH_DIR/queries.sql" | while read -r query; do - echo "$count $query" | tee -a "${REPO_ROOT}/clickbench-limbo.txt" | tee -a "${REPO_ROOT}/clickbench-sqlite3.txt" + echo "$count $query" + ((echo "$count $query") 2>&1) | tee -a clickbench-limbo.txt > /dev/null + ((echo "$count $query") 2>&1) | tee -a clickbench-sqlite3.txt >/dev/null for _ in $(seq 1 $TRIES); do clear_caches echo "----limbo----" - time "$RELEASE_BUILD_DIR/limbo" --quiet "$CLICKBENCH_DIR/mydb" <<< "${query}" | tee -a "${REPO_ROOT}/clickbench-limbo.txt" + ((time "$RELEASE_BUILD_DIR/limbo" --quiet "$CLICKBENCH_DIR/mydb" <<< "${query}") 2>&1) | tee -a clickbench-limbo.txt clear_caches echo echo "----sqlite----" - time sqlite3 "$CLICKBENCH_DIR/mydb" <<< "${query}" | tee -a "${REPO_ROOT}/clickbench-sqlite3.txt" + ((time sqlite3 "$CLICKBENCH_DIR/mydb" <<< "${query}") 2>&1) | tee -a clickbench-sqlite3.txt done; count=$(($count+1)) done; From 49a4d45c927fa6f4fc0729e3dc28fcf32926af7a Mon Sep 17 00:00:00 2001 From: Henrik Ingo Date: Sat, 8 Feb 2025 18:28:43 +0200 Subject: [PATCH 17/19] mv push_only.yml to another name in anticipation of adding PRs --- .github/workflows/rust_perf.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/rust_perf.yml b/.github/workflows/rust_perf.yml index 0659e796c..2b9a57577 100644 --- a/.github/workflows/rust_perf.yml +++ b/.github/workflows/rust_perf.yml @@ -27,11 +27,11 @@ jobs: - name: Analyze benchmark result with Nyrkiö uses: nyrkio/github-action-benchmark@HEAD - with: name: turso tool: criterion output-file-path: output.txt + # What to do if a change is immediately detected by Nyrkiö. # Note that smaller changes are only detected with delay, usually after a change # persisted over 2-7 commits. Go to nyrkiö.com to view those or configure alerts. From 633a56749a60588d89219f50ef674be0c17bc50d Mon Sep 17 00:00:00 2001 From: Henrik Ingo Date: Sat, 8 Feb 2025 18:37:49 +0200 Subject: [PATCH 18/19] =?UTF-8?q?Enable=20Nyrki=C3=B6=20also=20on=20PRs.?= =?UTF-8?q?=20(Non-blocking=20mode.)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Rename push_only.yml workflow to rust_perf.yml - Move the 'bench' task from rust.yml to rust_perf.yml - More Nyrkio configuration options exposed: Team support (everyone in gh/tursodatabase can access Nyrkiö) Public results Alerting options: Comment on PR, if change detected, don't fail task --- .github/workflows/rust_perf.yml | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/.github/workflows/rust_perf.yml b/.github/workflows/rust_perf.yml index 2b9a57577..9d4a0bde3 100644 --- a/.github/workflows/rust_perf.yml +++ b/.github/workflows/rust_perf.yml @@ -22,8 +22,13 @@ jobs: # - name: Install dependencies # run: npm install && npm run build - - name: Bench - run: cargo bench 2>&1 | tee output.txt + # - name: Bench + # run: cargo bench 2>&1 | tee output.txt + - name: Bench (fake) + run: | + pwd + ls + cp .github/data/limbo-cargo-output.txt output.txt - name: Analyze benchmark result with Nyrkiö uses: nyrkio/github-action-benchmark@HEAD @@ -49,11 +54,16 @@ jobs: never-fail: true # Make results and change points public, so that any oss contributor can see them nyrkio-public: true - nyrkio-api-root: https://nyrkio.com/api/v0 # Make results and change points public, so that any oss contributor can see them nyrkio-settings-pvalue: 0.01% nyrkio-settings-threshold: 2% + + # Get yours from https://nyrkio.com/docs/getting-started + nyrkio-token: ${{ secrets.NYRKIO_JWT_TOKEN }} + nyrkio-settings-pvalue: 0.01% + nyrkio-settings-threshold: 1% + # Team support = results are visible and manageable to everyone in the same Github org # nyrkio-org: tursodatabase From 811b6df64d5d181ae6b80f4dd2cf7200d14959fa Mon Sep 17 00:00:00 2001 From: Henrik Ingo Date: Tue, 18 Feb 2025 01:43:25 +0200 Subject: [PATCH 19/19] =?UTF-8?q?Add=20Nyrki=C3=B6=20to=20the=20new=20clic?= =?UTF-8?q?kbench=20task?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/rust_perf.yml | 41 +++++++++++++++++++++++++++++++++ perf/clickbench/run.sh | 1 + 2 files changed, 42 insertions(+) diff --git a/.github/workflows/rust_perf.yml b/.github/workflows/rust_perf.yml index 9d4a0bde3..0a0e86750 100644 --- a/.github/workflows/rust_perf.yml +++ b/.github/workflows/rust_perf.yml @@ -54,6 +54,7 @@ jobs: never-fail: true # Make results and change points public, so that any oss contributor can see them nyrkio-public: true + nyrkio-api-root: https://nyrkio.com/api/v0 # Make results and change points public, so that any oss contributor can see them nyrkio-settings-pvalue: 0.01% @@ -64,6 +65,46 @@ jobs: nyrkio-settings-pvalue: 0.01% nyrkio-settings-threshold: 1% + # Old way... + # Explicitly set this to null. We don't want threshold based alerts today. + external-data-json-path: null + gh-repository: null + + clickbench: + runs-on: ubuntu-latest + environment: test + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-node@v4 + with: + node-version: 20 + + - name: Clickbench + run: make clickbench + + - name: Analyze LIMBO result with Nyrkiö + uses: nyrkio/github-action-benchmark@HEAD + with: + name: clickbench/limbo + tool: time + output-file-path: clickbench-limbo.txt + # What to do if a change is immediately detected by Nyrkiö. + # Note that smaller changes are only detected with delay, usually after a change + # persisted over 2-7 commits. Go to nyrkiö.com to view those or configure alerts. + # Note that Nyrkiö will find all changes, also improvements. This means fail-on-alert + # on pull events isn't compatible with this workflow being required to pass branch protection. + fail-on-alert: false + comment-on-alert: true + comment-always: false + # Nyrkiö configuration + nyrkio-enable: true + # Get yours from https://nyrkio.com/docs/getting-started + nyrkio-token: ${{ secrets.NYRKIO_JWT_TOKEN }} + # You may not want share the NYRKIO_JWT_TOKEN token with pull requests, for example. + # In that case this task would unnecessarily fail for random contributors. Don't want that: + never-fail: true + # Make results and change points public, so that any oss contributor can see them + nyrkio-public: true # Team support = results are visible and manageable to everyone in the same Github org # nyrkio-org: tursodatabase diff --git a/perf/clickbench/run.sh b/perf/clickbench/run.sh index ea5bdf428..a21be2c32 100755 --- a/perf/clickbench/run.sh +++ b/perf/clickbench/run.sh @@ -30,6 +30,7 @@ count=1; # Run the queries, skipping any that are commented out # Between each invocation to Limbo/Sqlite, purge the caches grep -v '^--' "$CLICKBENCH_DIR/queries.sql" | while read -r query; do + echo "$count $query" ((echo "$count $query") 2>&1) | tee -a clickbench-limbo.txt > /dev/null ((echo "$count $query") 2>&1) | tee -a clickbench-sqlite3.txt >/dev/null