Skip to content

feat: drop a stream task's future in place when its stream is dropped - #25763

Open
ranflarion wants to merge 7 commits into
apache:mainfrom
ranflarion:reclaim-spawned-tasks-on-drop
Open

ranflarion wants to merge 7 commits into
apache:mainfrom
ranflarion:reclaim-spawned-tasks-on-drop

Conversation

@ranflarion

@ranflarion ranflarion commented Sep 26, 2026 •

Copy link
Copy Markdown
Contributor

Which issue does this PR close?

Rationale for this change

Dropping a plan's stream only aborts the tasks that drive its inputs, so what they own (streams, memory reservations and the pool behind them) is released whenever the runtime next gets to them, and a caller that needs those resources back, DataFusion's own cancellation tests included, can only poll for them. The issue has the details.

What changes are included in this PR?

datafusion-common-runtime gets opt-in reclaimable spawns: SpawnedTask::spawn_reclaimable, and JoinSet::spawn_reclaimable and spawn_reclaimable_on. The task's future lives in a slot the worker locks while polling it. Dropping the handle, or calling abort_all or shutdown on the set, takes the future out and drops it on the spot when no worker is polling it, then aborts the task. Otherwise it aborts as today, and the future is dropped when that poll returns.

  • The in-place drop runs the future's destructor inside the task's runtime but outside the task, where tokio::task::try_id() is None. That is why it is opt-in, and the constructors document it. spawn and spawn_on are unchanged.
  • Reclaimable spawns hand out no AbortHandle, and the JoinSet constructors return the task's Id instead. So apart from runtime shutdown, only the owner cancels them, and it finishes the drop before aborting. The handle holds the slot only while it takes the future out, so no worker ever waits on a destructor running elsewhere.
  • A panic from the destructor is raised again when tokio drops the task, so joining reports JoinError::Panic. The exception is a runtime shutdown during abort_all, and it is documented.
  • An injected JoinSetTracer wraps the task rather than the reclaimed future, so tokio still drops the tracer inside the task. JoinSet::join_all joins through the wrapper, so dropping it reclaims before aborting.

In datafusion-physical-plan, ReceiverStreamBuilder and RecordBatchReceiverStreamBuilder get spawn_reclaimable, and their existing spawn and spawn_on are unchanged. The tasks DataFusion spawns to drive plan streams use the new methods: spawn_buffered, the builder's internal input runner behind CoalescePartitionsExec and AnalyzeExec, RepartitionExec's input tasks, BufferExec's MemoryBufferedStream, MaterializedCteExec's buffer tasks, and collect_partitioned.

Are these changes tested?

Yes. New unit tests in datafusion-common-runtime cover:

  • an idle task's future is gone by the time drop returns, and its destructor runs in the runtime but outside the task, while plain spawn keeps its task context
  • a task that is mid-poll is released when that poll returns
  • dropping the handle while the thread unwinds still releases the future in place
  • destructor panics are contained on drop, also during unwinding, and reported through abort_all and join_next
  • runtime shutdown does not wait for a destructor running on another thread
  • dropping join_all reclaims before aborting
  • joined tasks are forgotten and detached tasks keep running

An integration test in its own binary, since the tracer is process-wide, checks that an injected tracer is still dropped inside its task. Every opt-in has a test that fails when its call site goes back to spawn: the test_drop_cancel tests of AnalyzeExec, CoalescePartitionsExec and RepartitionExec and record_batch_receiver_stream_drop_cancel now assert that nothing is left right after the drop, where they polled for it before, and new tests cover spawn_buffered, BufferExec, MaterializedCteExec and collect_partitioned.

Benchmarks, measured before BufferExec, MaterializedCteExec and collect_partitioned were switched: dfbench built with --release from main (6a792c6) and from this branch. TPC-H SF10 parquet on local NVMe, on a 32 vCPU i4i.8xlarge with default target partitions, 5 iterations per run, with runs ordered main, branch, branch, main. compare.py on each adjacent pair:

main this PR compare.py
tpch SF10, round 1 6701.9 ms 6672.1 ms 21 no change, Q19 1.06x slower
tpch SF10, round 2 6702.5 ms 6642.0 ms 21 no change, Q9 1.09x faster
sort_tpch SF10, round 1 52790.4 ms 52775.9 ms 11 no change
sort_tpch SF10, round 2 52808.3 ms 52664.6 ms 11 no change

The same binary varied by up to 4.6% per query between its two runs, and the two flagged queries differ between rounds and point in opposite directions, so I read them as noise.

Are there any user-facing changes?

New public APIs: SpawnedTask::spawn_reclaimable, JoinSet::spawn_reclaimable and spawn_reclaimable_on, and spawn_reclaimable on both stream builders. Existing spawn methods keep their behavior. The tasks DataFusion spawns to drive streams under spawn_buffered, CoalescePartitionsExec, AnalyzeExec, RepartitionExec, BufferExec, MaterializedCteExec and collect_partitioned now drop their futures on the thread that drops the stream when idle. So destructors of the streams those tasks drive may run outside a tokio task, as they already do whenever a stream is not spawned.

@github-actions github-actions Bot added common Related to common crate physical-plan Changes to the physical-plan crate labels Sep 26, 2026
@codecov-commenter

codecov-commenter commented Sep 26, 2026 •

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 87.50000% with 54 lines in your changes missing coverage. Please review.
✅ Project coverage is 82.84%. Comparing base (91cd7ff) to head (c12daea).
⚠️ Report is 60 commits behind head on main.

Files with missing lines Patch % Lines
datafusion/common-runtime/src/join_set.rs 87.61% 27 Missing ⚠️
datafusion/common-runtime/src/common.rs 91.52% 14 Missing and 1 partial ⚠️
datafusion/physical-plan/src/stream.rs 52.00% 12 Missing ⚠️
Additional details and impacted files
@@           Coverage Diff            @@
##             main   #25763    +/-   ##
========================================
  Coverage   82.84%   82.84%            
========================================
  Files        1151     1151            
  Lines      455510   455920   +410     
  Branches   455510   455920   +410     
========================================
+ Hits       377362   377715   +353     
- Misses      55236    55290    +54     
- Partials    22912    22915     +3     

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@kosiew kosiew left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@ranflarion,

Thanks for working on this. The reclaimable task implementation looks sound, and the tests cover the key lifecycle, cancellation, panic-handling, and tracer behavior. I also checked the synchronous-drop path in RepartitionExec and found no lock re-entrancy issues.

I have a few non-blocking suggestions around documentation, simplifying join bookkeeping, and adding physical-plan regression coverage.

Approved.

}
}

/// Like [`Self::spawn`], but dropping the handle also drops the task's

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could you also document the panic-unwinding exception here and in the JoinSet overview? ReclaimHandle::reclaim skips reclamation when the current thread is already panicking, so even an idle future then relies on Tokio cancellation for cleanup.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Removed the exception instead of documenting it. The guard assumed a destructor panic would abort the process while the thread unwinds, but a panic caught by catch_unwind inside a destructor that runs during unwinding doesn't abort (checked on 1.95, the MSRV, and 1.99), so reclaim now drops the future in place during unwinding as well. drop_while_unwinding_releases_in_place drops a handle from a panicking closure with a destructor that panics too, and fails with the guard back. The !panicking() check in SlotFuture::drop stays, since re-raising out of a drop during unwinding does abort.

/// [JoinSet::join_next](tokio::task::JoinSet::join_next) - Await the next completed task.
pub async fn join_next(&mut self) -> Option<Result<T, JoinError>> {
self.inner.join_next().await
let joined = self.inner.join_next_with_id().await;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could we simplify the three ID-less join methods by delegating to their corresponding *_with_id methods and stripping the ID? This would avoid duplicating the forget bookkeeping and keep reclaim-map cleanup in one place for each join variant, while preserving Poll::Pending in the poll version.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done, the three go through their *_with_id versions now, so forget is only called from those

let sender = builder.tx();

builder.spawn(async move {
builder.spawn_reclaimable(async move {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could we add a focused spawn_buffered regression test that verifies dropping the output stream immediately releases resources held by an idle producer? A multi-thread runtime with controlled worker progress and an input stream owning a drop sentinel or memory reservation would help catch an accidental switch back to ordinary spawn.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Extending this to the operator opt-ins: the PR keeps the retry loop of assert_strong_count_converges_to_zero in all 11 cancellation tests, so switching RepartitionExec, CoalescePartitionsExec or AnalyzeExec back to plain spawn would still pass. The 4 tests that needed a retry on main (analyze, coalesce_partitions and repartition test_drop_cancel, and record_batch_receiver_stream_drop_cancel) could assert a zero strong count right after the drop. That would cover those sites in addition to a spawn_buffered test.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added test_spawn_buffered_drop_releases_idle_input. It runs on a one-worker runtime and parks that worker in a blocking task across the drop, so the worker can neither be polling the buffered task nor drop its future, and the input's strong count has to be 0 right after the drop. With builder.spawn it fails, and it can't pass by timing, since the only worker is held.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done, the four assert a zero strong count right after the drop. They run on a current-thread runtime, so no worker can be polling the task at that point. Each fails when its call site goes back to spawn: run_input breaks the analyze, coalesce and receiver stream tests, and either of RepartitionExec's two spawns breaks its test.

@comphead

Copy link
Copy Markdown
Contributor

This is interesting finding. Let me go through it

@comphead comphead left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @ranflarion. I read the slot and handle protocol against the callers and found no lock re-entrancy or lost wakeup. The try_lock miss in SlotFuture::poll returns Pending without a waker, which is fine because the handle aborts right after taking the future.

  • MemoryBufferedStream::new in datafusion/physical-plan/src/buffer.rs (behind BufferExec) still drives its input from SpawnedTask::spawn, and it shares an Arc<MemoryReservation> with that task. It has the same shape as the spawn_buffered task, so dropping a BufferExec stream still releases the input and the reservation only when the runtime next polls the task. Please either switch it to spawn_reclaimable or say why it stays out of scope.
  • The inline comments cover the unused builder variants, the duplicated test helpers and the forget cost for sets without reclaimable tasks.

Comment thread datafusion/physical-plan/src/stream.rs Outdated
}

/// Same as [`Self::spawn_reclaimable`] but it spawns the task on the provided runtime.
pub fn spawn_reclaimable_on<F>(&mut self, task: F, handle: &Handle)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Neither spawn_reclaimable_on on ReceiverStreamBuilder nor this one has a caller in the tree, and the existing spawn_on has a single test caller. Consider dropping both builder variants and keeping JoinSet::spawn_reclaimable_on, which JoinSet::spawn_reclaimable needs. That is two fewer public APIs to keep stable.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

removed both, JoinSet::spawn_reclaimable_on stays

Comment thread datafusion/common-runtime/src/common.rs Outdated
}

#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
async fn drop_releases_idle_task_in_place() {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This test overlaps with reclaimed_future_drops_in_the_runtime_outside_its_task. Both park a task, wait until idle and drop it, and the later one already proves the future is dropped on the dropping thread before drop returns. Merging them (add the Weak count assertion there) keeps the coverage with one test fewer.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

merged, reclaimed_future_drops_in_the_runtime_outside_its_task now also checks the strong count on the dropping thread right after drop returns

use std::sync::mpsc::{Receiver, Sender, channel};
use std::time::Duration;

struct BlockInDrop {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

BlockInDrop and the runtime and channel setup are copied from runtime_shutdown_does_not_wait_for_a_reclaiming_destructor above, and PanicOnDrop is defined again in common.rs. A small shared #[cfg(test)] helper would remove the duplicates.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

moved PanicOnDrop, BlockInDrop and the one-worker runtime into a #[cfg(test)] test_utils module

}
}

fn forget<R>(&mut self, joined: Option<&Result<(Id, R), JoinError>>) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

forget now runs on every join, including for sets with no reclaimable tasks, which is every existing JoinSet user. A HashMap::remove hashes the Id even when the map is empty (unverified for this hashbrown version). An early return on self.reclaim.is_empty() would keep their path as it was. Unmeasured.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It does hash, hashbrown's remove_entry calls make_hash before probing even when the table is empty. Added the early return, so sets without reclaimable tasks skip it.

@alamb

alamb commented Oct 22, 2026

Copy link
Copy Markdown
Contributor

marking as draft as it is waiting on comments to be addressed

@alamb
alamb marked this pull request as draft October 22, 2026 20:04
@ranflarion
ranflarion marked this pull request as ready for review October 23, 2026 16:26
@ranflarion

Copy link
Copy Markdown
Contributor Author

MemoryBufferedStream::new in datafusion/physical-plan/src/buffer.rs (behind BufferExec) still drives its input from SpawnedTask::spawn

Switched it to spawn_reclaimable. The new memory_gets_released_if_stream_drops_while_input_is_pending buffers four messages, leaves the producer parked on an input that never ends, drops the stream and checks the pool is back to 0 right away, and it fails with spawn. The existing memory_gets_released_if_stream_drops couldn't catch this, because its input finishes and the task has already exited when the stream drops.

MaterializedCteExec (#25580) arrived with the merge of main and has the same shape, each buffer task owning a body partition's stream and a spillable reservation, so it's switched too, with a test_drop_cancel. So is collect_partitioned, whose tasks each own a partition's stream, with test_collect_partitioned_drop_cancel. That leaves one plain spawn that owns a plan stream, the write path's demux task, which is dropped only together with the whole query, and I haven't checked its destructors for code that has to run inside its task, so I'd keep it for a follow-up.

@comphead

Copy link
Copy Markdown
Contributor

run benchmark tpch tpcds

@adriangbot

Copy link
Copy Markdown

🤖 Benchmark running (GKE) | trigger
Instance: c4a-highmem-16 (12 vCPU / 65 GiB) | Linux bench-c6374252693-3807-ph5q5 6.12.105+ #1 SMP Sat Sep 5 07:54:11 UTC 2026 aarch64 GNU/Linux

CPU Details (lscpu)
Architecture:                            aarch64
CPU op-mode(s):                          64-bit
Byte Order:                              Little Endian
CPU(s):                                  16
On-line CPU(s) list:                     0-15
Vendor ID:                               ARM
Model name:                              Neoverse-V2
Model:                                   1
Thread(s) per core:                      1
Core(s) per cluster:                     16
Socket(s):                               -
Cluster(s):                              1
Stepping:                                r0p1
BogoMIPS:                                2000.00
Flags:                                   fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha3 sm3 sm4 asimddp sha512 sve asimdfhm dit uscat ilrcpc flagm sb paca pacg dcpodp sve2 sveaes svepmull svebitperm svesha3 svesm4 flagm2 frint svei8mm svebf16 i8mm bf16 dgh rng bti
L1d cache:                               1 MiB (16 instances)
L1i cache:                               1 MiB (16 instances)
L2 cache:                                32 MiB (16 instances)
L3 cache:                                80 MiB (1 instance)
NUMA node(s):                            1
NUMA node0 CPU(s):                       0-15
Vulnerability Gather data sampling:      Not affected
Vulnerability Indirect target selection: Not affected
Vulnerability Itlb multihit:             Not affected
Vulnerability L1tf:                      Not affected
Vulnerability Mds:                       Not affected
Vulnerability Meltdown:                  Not affected
Vulnerability Mmio stale data:           Not affected
Vulnerability Reg file data sampling:    Not affected
Vulnerability Retbleed:                  Not affected
Vulnerability Spec rstack overflow:      Not affected
Vulnerability Spec store bypass:         Mitigation; Speculative Store Bypass disabled via prctl
Vulnerability Spectre v1:                Mitigation; __user pointer sanitization
Vulnerability Spectre v2:                Mitigation; CSV2, BHB
Vulnerability Srbds:                     Not affected
Vulnerability Tsa:                       Not affected
Vulnerability Tsx async abort:           Not affected
Vulnerability Vmscape:                   Not affected

Comparing reclaim-spawned-tasks-on-drop (697144a) to ebf4858 (merge-base) diff

Run configuration
run benchmark tpch

Results will be posted here when complete


File an issue against this benchmark runner

@adriangbot

Copy link
Copy Markdown

🤖 Benchmark running (GKE) | trigger
Instance: c4a-highmem-16 (12 vCPU / 65 GiB) | Linux bench-c6374252693-3808-hrn97 6.12.105+ #1 SMP Sat Sep 5 07:54:11 UTC 2026 aarch64 GNU/Linux

CPU Details (lscpu)
Architecture:                            aarch64
CPU op-mode(s):                          64-bit
Byte Order:                              Little Endian
CPU(s):                                  16
On-line CPU(s) list:                     0-15
Vendor ID:                               ARM
Model name:                              Neoverse-V2
Model:                                   1
Thread(s) per core:                      1
Core(s) per cluster:                     16
Socket(s):                               -
Cluster(s):                              1
Stepping:                                r0p1
BogoMIPS:                                2000.00
Flags:                                   fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha3 sm3 sm4 asimddp sha512 sve asimdfhm dit uscat ilrcpc flagm sb paca pacg dcpodp sve2 sveaes svepmull svebitperm svesha3 svesm4 flagm2 frint svei8mm svebf16 i8mm bf16 dgh rng bti
L1d cache:                               1 MiB (16 instances)
L1i cache:                               1 MiB (16 instances)
L2 cache:                                32 MiB (16 instances)
L3 cache:                                80 MiB (1 instance)
NUMA node(s):                            1
NUMA node0 CPU(s):                       0-15
Vulnerability Gather data sampling:      Not affected
Vulnerability Indirect target selection: Not affected
Vulnerability Itlb multihit:             Not affected
Vulnerability L1tf:                      Not affected
Vulnerability Mds:                       Not affected
Vulnerability Meltdown:                  Not affected
Vulnerability Mmio stale data:           Not affected
Vulnerability Reg file data sampling:    Not affected
Vulnerability Retbleed:                  Not affected
Vulnerability Spec rstack overflow:      Not affected
Vulnerability Spec store bypass:         Mitigation; Speculative Store Bypass disabled via prctl
Vulnerability Spectre v1:                Mitigation; __user pointer sanitization
Vulnerability Spectre v2:                Mitigation; CSV2, BHB
Vulnerability Srbds:                     Not affected
Vulnerability Tsa:                       Not affected
Vulnerability Tsx async abort:           Not affected
Vulnerability Vmscape:                   Not affected

Comparing reclaim-spawned-tasks-on-drop (697144a) to ebf4858 (merge-base) diff

Run configuration
run benchmark tpcds

Results will be posted here when complete


File an issue against this benchmark runner

@adriangbot

Copy link
Copy Markdown

🤖 Benchmark completed (GKE) | trigger

Instance: c4a-highmem-16 (12 vCPU / 65 GiB)

Comparing reclaim-spawned-tasks-on-drop (697144a) to ebf4858 (merge-base) diff

Run configuration
run benchmark tpch
CPU Details (lscpu)
Architecture:                            aarch64
CPU op-mode(s):                          64-bit
Byte Order:                              Little Endian
CPU(s):                                  16
On-line CPU(s) list:                     0-15
Vendor ID:                               ARM
Model name:                              Neoverse-V2
Model:                                   1
Thread(s) per core:                      1
Core(s) per cluster:                     16
Socket(s):                               -
Cluster(s):                              1
Stepping:                                r0p1
BogoMIPS:                                2000.00
Flags:                                   fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha3 sm3 sm4 asimddp sha512 sve asimdfhm dit uscat ilrcpc flagm sb paca pacg dcpodp sve2 sveaes svepmull svebitperm svesha3 svesm4 flagm2 frint svei8mm svebf16 i8mm bf16 dgh rng bti
L1d cache:                               1 MiB (16 instances)
L1i cache:                               1 MiB (16 instances)
L2 cache:                                32 MiB (16 instances)
L3 cache:                                80 MiB (1 instance)
NUMA node(s):                            1
NUMA node0 CPU(s):                       0-15
Vulnerability Gather data sampling:      Not affected
Vulnerability Indirect target selection: Not affected
Vulnerability Itlb multihit:             Not affected
Vulnerability L1tf:                      Not affected
Vulnerability Mds:                       Not affected
Vulnerability Meltdown:                  Not affected
Vulnerability Mmio stale data:           Not affected
Vulnerability Reg file data sampling:    Not affected
Vulnerability Retbleed:                  Not affected
Vulnerability Spec rstack overflow:      Not affected
Vulnerability Spec store bypass:         Mitigation; Speculative Store Bypass disabled via prctl
Vulnerability Spectre v1:                Mitigation; __user pointer sanitization
Vulnerability Spectre v2:                Mitigation; CSV2, BHB
Vulnerability Srbds:                     Not affected
Vulnerability Tsa:                       Not affected
Vulnerability Tsx async abort:           Not affected
Vulnerability Vmscape:                   Not affected
Details

Comparing HEAD and reclaim-spawned-tasks-on-drop
--------------------
Benchmark tpch_sf1.json
--------------------
┏━━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┓
┃ Query     ┃     HEAD ┃ reclaim-spawned-tasks-on-drop ┃       Change ┃
┡━━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━┩
│ QQuery 1  │ 41.62 ms │                      42.01 ms │    no change │
│ QQuery 2  │ 19.27 ms │                      19.34 ms │    no change │
│ QQuery 3  │ 29.97 ms │                      29.87 ms │    no change │
│ QQuery 4  │ 18.33 ms │                      18.07 ms │    no change │
│ QQuery 5  │ 38.07 ms │                      37.68 ms │    no change │
│ QQuery 6  │ 14.53 ms │                      14.34 ms │    no change │
│ QQuery 7  │ 45.01 ms │                      43.85 ms │    no change │
│ QQuery 8  │ 42.39 ms │                      43.33 ms │    no change │
│ QQuery 9  │ 51.31 ms │                      54.10 ms │ 1.05x slower │
│ QQuery 10 │ 42.51 ms │                      44.52 ms │    no change │
│ QQuery 11 │ 14.39 ms │                      15.02 ms │    no change │
│ QQuery 12 │ 18.90 ms │                      19.37 ms │    no change │
│ QQuery 13 │ 43.47 ms │                      43.58 ms │    no change │
│ QQuery 14 │ 25.67 ms │                      25.60 ms │    no change │
│ QQuery 15 │ 33.14 ms │                      32.87 ms │    no change │
│ QQuery 16 │ 14.44 ms │                      14.20 ms │    no change │
│ QQuery 17 │ 83.72 ms │                      83.39 ms │    no change │
│ QQuery 18 │ 82.30 ms │                      82.81 ms │    no change │
│ QQuery 19 │ 33.61 ms │                      33.63 ms │    no change │
│ QQuery 20 │ 33.21 ms │                      34.13 ms │    no change │
│ QQuery 21 │ 60.36 ms │                      59.55 ms │    no change │
│ QQuery 22 │ 15.32 ms │                      15.06 ms │    no change │
└───────────┴──────────┴───────────────────────────────┴──────────────┘
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━┓
┃ Benchmark Summary                            ┃          ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━┩
│ Total Time (HEAD)                            │ 801.57ms │
│ Total Time (reclaim-spawned-tasks-on-drop)   │ 806.34ms │
│ Average Time (HEAD)                          │  36.44ms │
│ Average Time (reclaim-spawned-tasks-on-drop) │  36.65ms │
│ Queries Faster                               │        0 │
│ Queries Slower                               │        1 │
│ Queries with No Change                       │       21 │
│ Queries with Failure                         │        0 │
└──────────────────────────────────────────────┴──────────┘

Distribution per query (min / mean ±stddev / max):

Comparing HEAD and reclaim-spawned-tasks-on-drop
--------------------
Benchmark tpch_sf1.json
--------------------
┏━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┓
┃ Query     ┃                           HEAD ┃  reclaim-spawned-tasks-on-drop ┃       Change ┃
┡━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━┩
│ QQuery 1  │ 41.62 / 44.13 ±2.45 / 48.50 ms │ 42.01 / 43.10 ±1.11 / 45.23 ms │    no change │
│ QQuery 2  │ 19.27 / 19.57 ±0.32 / 20.17 ms │ 19.34 / 19.77 ±0.66 / 21.07 ms │    no change │
│ QQuery 3  │ 29.97 / 31.34 ±1.40 / 33.30 ms │ 29.87 / 30.09 ±0.14 / 30.27 ms │    no change │
│ QQuery 4  │ 18.33 / 18.57 ±0.16 / 18.76 ms │ 18.07 / 18.51 ±0.34 / 19.02 ms │    no change │
│ QQuery 5  │ 38.07 / 39.34 ±1.40 / 41.56 ms │ 37.68 / 37.90 ±0.29 / 38.48 ms │    no change │
│ QQuery 6  │ 14.53 / 14.80 ±0.16 / 15.01 ms │ 14.34 / 15.02 ±0.87 / 16.74 ms │    no change │
│ QQuery 7  │ 45.01 / 45.89 ±0.65 / 46.85 ms │ 43.85 / 45.46 ±1.27 / 47.17 ms │    no change │
│ QQuery 8  │ 42.39 / 42.80 ±0.40 / 43.49 ms │ 43.33 / 44.05 ±0.76 / 45.52 ms │    no change │
│ QQuery 9  │ 51.31 / 53.61 ±1.26 / 54.86 ms │ 54.10 / 54.61 ±0.33 / 54.98 ms │    no change │
│ QQuery 10 │ 42.51 / 42.75 ±0.16 / 42.94 ms │ 44.52 / 45.48 ±1.11 / 46.92 ms │ 1.06x slower │
│ QQuery 11 │ 14.39 / 14.64 ±0.23 / 14.91 ms │ 15.02 / 15.20 ±0.17 / 15.50 ms │    no change │
│ QQuery 12 │ 18.90 / 19.53 ±0.47 / 20.11 ms │ 19.37 / 19.74 ±0.44 / 20.60 ms │    no change │
│ QQuery 13 │ 43.47 / 43.89 ±0.26 / 44.23 ms │ 43.58 / 44.30 ±0.51 / 45.01 ms │    no change │
│ QQuery 14 │ 25.67 / 25.92 ±0.13 / 26.03 ms │ 25.60 / 25.90 ±0.23 / 26.22 ms │    no change │
│ QQuery 15 │ 33.14 / 33.72 ±0.32 / 34.13 ms │ 32.87 / 33.62 ±0.58 / 34.45 ms │    no change │
│ QQuery 16 │ 14.44 / 14.64 ±0.13 / 14.77 ms │ 14.20 / 14.49 ±0.17 / 14.65 ms │    no change │
│ QQuery 17 │ 83.72 / 84.29 ±0.60 / 85.06 ms │ 83.39 / 84.19 ±0.61 / 85.17 ms │    no change │
│ QQuery 18 │ 82.30 / 85.24 ±3.55 / 92.12 ms │ 82.81 / 84.02 ±1.04 / 85.90 ms │    no change │
│ QQuery 19 │ 33.61 / 33.91 ±0.24 / 34.24 ms │ 33.63 / 35.82 ±2.94 / 41.62 ms │ 1.06x slower │
│ QQuery 20 │ 33.21 / 34.18 ±0.51 / 34.65 ms │ 34.13 / 34.56 ±0.42 / 35.33 ms │    no change │
│ QQuery 21 │ 60.36 / 64.69 ±3.28 / 69.76 ms │ 59.55 / 61.83 ±2.90 / 67.48 ms │    no change │
│ QQuery 22 │ 15.32 / 15.78 ±0.36 / 16.25 ms │ 15.06 / 15.40 ±0.26 / 15.78 ms │    no change │
└───────────┴────────────────────────────────┴────────────────────────────────┴──────────────┘
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━┓
┃ Benchmark Summary                            ┃          ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━┩
│ Total Time (HEAD)                            │ 823.23ms │
│ Total Time (reclaim-spawned-tasks-on-drop)   │ 823.06ms │
│ Average Time (HEAD)                          │  37.42ms │
│ Average Time (reclaim-spawned-tasks-on-drop) │  37.41ms │
│ Queries Faster                               │        0 │
│ Queries Slower                               │        2 │
│ Queries with No Change                       │       20 │
│ Queries with Failure                         │        0 │
└──────────────────────────────────────────────┴──────────┘

Resource Usage

tpch — base (merge-base)

Metric Value
Wall time 5.0s
Peak memory 1.6 GiB
Avg memory 798.2 MiB
CPU user 23.3s
CPU sys 2.0s
Peak spill 0 B

tpch — branch

Metric Value
Wall time 5.0s
Peak memory 1.7 GiB
Avg memory 799.4 MiB
CPU user 23.3s
CPU sys 1.9s
Peak spill 0 B

File an issue against this benchmark runner

@adriangbot

Copy link
Copy Markdown

🤖 Benchmark completed (GKE) | trigger

Instance: c4a-highmem-16 (12 vCPU / 65 GiB)

Comparing reclaim-spawned-tasks-on-drop (697144a) to ebf4858 (merge-base) diff

Run configuration
run benchmark tpcds
CPU Details (lscpu)
Architecture:                            aarch64
CPU op-mode(s):                          64-bit
Byte Order:                              Little Endian
CPU(s):                                  16
On-line CPU(s) list:                     0-15
Vendor ID:                               ARM
Model name:                              Neoverse-V2
Model:                                   1
Thread(s) per core:                      1
Core(s) per cluster:                     16
Socket(s):                               -
Cluster(s):                              1
Stepping:                                r0p1
BogoMIPS:                                2000.00
Flags:                                   fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha3 sm3 sm4 asimddp sha512 sve asimdfhm dit uscat ilrcpc flagm sb paca pacg dcpodp sve2 sveaes svepmull svebitperm svesha3 svesm4 flagm2 frint svei8mm svebf16 i8mm bf16 dgh rng bti
L1d cache:                               1 MiB (16 instances)
L1i cache:                               1 MiB (16 instances)
L2 cache:                                32 MiB (16 instances)
L3 cache:                                80 MiB (1 instance)
NUMA node(s):                            1
NUMA node0 CPU(s):                       0-15
Vulnerability Gather data sampling:      Not affected
Vulnerability Indirect target selection: Not affected
Vulnerability Itlb multihit:             Not affected
Vulnerability L1tf:                      Not affected
Vulnerability Mds:                       Not affected
Vulnerability Meltdown:                  Not affected
Vulnerability Mmio stale data:           Not affected
Vulnerability Reg file data sampling:    Not affected
Vulnerability Retbleed:                  Not affected
Vulnerability Spec rstack overflow:      Not affected
Vulnerability Spec store bypass:         Mitigation; Speculative Store Bypass disabled via prctl
Vulnerability Spectre v1:                Mitigation; __user pointer sanitization
Vulnerability Spectre v2:                Mitigation; CSV2, BHB
Vulnerability Srbds:                     Not affected
Vulnerability Tsa:                       Not affected
Vulnerability Tsx async abort:           Not affected
Vulnerability Vmscape:                   Not affected
Details

Comparing HEAD and reclaim-spawned-tasks-on-drop
--------------------
Benchmark tpcds_sf1.json
--------------------
┏━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┓
┃ Query     ┃       HEAD ┃ reclaim-spawned-tasks-on-drop ┃       Change ┃
┡━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━┩
│ QQuery 1  │    5.13 ms │                       5.43 ms │ 1.06x slower │
│ QQuery 2  │   79.21 ms │                      79.03 ms │    no change │
│ QQuery 3  │   28.26 ms │                      28.74 ms │    no change │
│ QQuery 4  │  616.70 ms │                     650.13 ms │ 1.05x slower │
│ QQuery 5  │   49.12 ms │                      49.59 ms │    no change │
│ QQuery 6  │   34.53 ms │                      35.17 ms │    no change │
│ QQuery 7  │   70.46 ms │                      71.84 ms │    no change │
│ QQuery 8  │   35.41 ms │                      35.93 ms │    no change │
│ QQuery 9  │   50.95 ms │                      52.64 ms │    no change │
│ QQuery 10 │   59.17 ms │                      60.26 ms │    no change │
│ QQuery 11 │  321.85 ms │                     350.87 ms │ 1.09x slower │
│ QQuery 12 │   28.23 ms │                      28.79 ms │    no change │
│ QQuery 13 │  110.29 ms │                     111.61 ms │    no change │
│ QQuery 14 │  381.53 ms │                     383.84 ms │    no change │
│ QQuery 15 │   50.92 ms │                      54.97 ms │ 1.08x slower │
│ QQuery 16 │    5.87 ms │                       6.29 ms │ 1.07x slower │
│ QQuery 17 │   77.03 ms │                      78.50 ms │    no change │
│ QQuery 18 │  102.46 ms │                     104.68 ms │    no change │
│ QQuery 19 │   40.64 ms │                      41.47 ms │    no change │
│ QQuery 20 │   34.72 ms │                      35.25 ms │    no change │
│ QQuery 21 │   16.83 ms │                      17.00 ms │    no change │
│ QQuery 22 │   62.49 ms │                      64.78 ms │    no change │
│ QQuery 23 │  298.19 ms │                     309.33 ms │    no change │
│ QQuery 24 │  187.78 ms │                     197.31 ms │ 1.05x slower │
│ QQuery 25 │  104.32 ms │                     106.32 ms │    no change │
│ QQuery 26 │   45.16 ms │                      45.52 ms │    no change │
│ QQuery 27 │    5.72 ms │                       6.16 ms │ 1.08x slower │
│ QQuery 28 │   60.84 ms │                      59.04 ms │    no change │
│ QQuery 29 │   92.00 ms │                      94.75 ms │    no change │
│ QQuery 30 │   31.22 ms │                      32.67 ms │    no change │
│ QQuery 31 │  105.66 ms │                     108.52 ms │    no change │
│ QQuery 32 │   19.55 ms │                      20.26 ms │    no change │
│ QQuery 33 │   37.48 ms │                      38.17 ms │    no change │
│ QQuery 34 │    9.53 ms │                      10.04 ms │ 1.05x slower │
│ QQuery 35 │   69.65 ms │                      73.61 ms │ 1.06x slower │
│ QQuery 36 │    5.89 ms │                       5.71 ms │    no change │
│ QQuery 37 │    7.06 ms │                       6.76 ms │    no change │
│ QQuery 38 │   62.26 ms │                      62.06 ms │    no change │
│ QQuery 39 │   72.55 ms │                      73.06 ms │    no change │
│ QQuery 40 │   23.33 ms │                      23.41 ms │    no change │
│ QQuery 41 │   12.39 ms │                      12.27 ms │    no change │
│ QQuery 42 │   24.00 ms │                      23.65 ms │    no change │
│ QQuery 43 │    4.83 ms │                       4.87 ms │    no change │
│ QQuery 44 │    8.73 ms │                       8.71 ms │    no change │
│ QQuery 45 │   37.74 ms │                      37.85 ms │    no change │
│ QQuery 46 │   11.55 ms │                      11.55 ms │    no change │
│ QQuery 47 │  224.16 ms │                     230.05 ms │    no change │
│ QQuery 48 │   89.86 ms │                      90.62 ms │    no change │
│ QQuery 49 │   70.42 ms │                      70.48 ms │    no change │
│ QQuery 50 │   57.14 ms │                      57.68 ms │    no change │
│ QQuery 51 │   91.24 ms │                      91.73 ms │    no change │
│ QQuery 52 │   24.12 ms │                      24.47 ms │    no change │
│ QQuery 53 │   29.24 ms │                      29.17 ms │    no change │
│ QQuery 54 │   53.76 ms │                      53.81 ms │    no change │
│ QQuery 55 │   23.73 ms │                      23.73 ms │    no change │
│ QQuery 56 │   38.53 ms │                      38.83 ms │    no change │
│ QQuery 57 │  163.83 ms │                     165.31 ms │    no change │
│ QQuery 58 │  104.32 ms │                     105.46 ms │    no change │
│ QQuery 59 │  113.56 ms │                     112.84 ms │    no change │
│ QQuery 60 │   38.43 ms │                      39.16 ms │    no change │
│ QQuery 61 │    9.18 ms │                       9.53 ms │    no change │
│ QQuery 62 │   43.46 ms │                      43.07 ms │    no change │
│ QQuery 63 │   28.77 ms │                      29.32 ms │    no change │
│ QQuery 64 │  349.27 ms │                     350.80 ms │    no change │
│ QQuery 65 │  125.54 ms │                     128.27 ms │    no change │
│ QQuery 66 │   74.17 ms │                      73.25 ms │    no change │
│ QQuery 67 │  244.81 ms │                     250.33 ms │    no change │
│ QQuery 68 │   11.33 ms │                      11.39 ms │    no change │
│ QQuery 69 │   54.90 ms │                      55.37 ms │    no change │
│ QQuery 70 │  102.46 ms │                     102.82 ms │    no change │
│ QQuery 71 │   34.14 ms │                      34.49 ms │    no change │
│ QQuery 72 │ 1439.15 ms │                    1554.76 ms │ 1.08x slower │
│ QQuery 73 │    9.18 ms │                       9.74 ms │ 1.06x slower │
│ QQuery 74 │  183.84 ms │                     186.47 ms │    no change │
│ QQuery 75 │  137.70 ms │                     136.70 ms │    no change │
│ QQuery 76 │   33.83 ms │                      33.65 ms │    no change │
│ QQuery 77 │   58.70 ms │                      58.28 ms │    no change │
│ QQuery 78 │  157.75 ms │                     160.19 ms │    no change │
│ QQuery 79 │   65.80 ms │                      65.40 ms │    no change │
│ QQuery 80 │   92.64 ms │                      93.63 ms │    no change │
│ QQuery 81 │   25.01 ms │                      25.01 ms │    no change │
│ QQuery 82 │   16.54 ms │                      16.02 ms │    no change │
│ QQuery 83 │   32.27 ms │                      32.00 ms │    no change │
│ QQuery 84 │   29.13 ms │                      29.14 ms │    no change │
│ QQuery 85 │   96.98 ms │                      97.18 ms │    no change │
│ QQuery 86 │   25.17 ms │                      24.73 ms │    no change │
│ QQuery 87 │   59.85 ms │                      60.67 ms │    no change │
│ QQuery 88 │   58.14 ms │                      58.63 ms │    no change │
│ QQuery 89 │   34.83 ms │                      34.61 ms │    no change │
│ QQuery 90 │   16.10 ms │                      16.39 ms │    no change │
│ QQuery 91 │   39.67 ms │                      40.03 ms │    no change │
│ QQuery 92 │   29.03 ms │                      28.84 ms │    no change │
│ QQuery 93 │   47.64 ms │                      48.51 ms │    no change │
│ QQuery 94 │   37.65 ms │                      38.10 ms │    no change │
│ QQuery 95 │   78.41 ms │                      79.59 ms │    no change │
│ QQuery 96 │   23.69 ms │                      23.48 ms │    no change │
│ QQuery 97 │   49.82 ms │                      50.31 ms │    no change │
│ QQuery 98 │   41.62 ms │                      42.82 ms │    no change │
│ QQuery 99 │   64.51 ms │                      63.34 ms │    no change │
└───────────┴────────────┴───────────────────────────────┴──────────────┘
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━┓
┃ Benchmark Summary                            ┃           ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━┩
│ Total Time (HEAD)                            │ 8784.23ms │
│ Total Time (reclaim-spawned-tasks-on-drop)   │ 9048.58ms │
│ Average Time (HEAD)                          │   88.73ms │
│ Average Time (reclaim-spawned-tasks-on-drop) │   91.40ms │
│ Queries Faster                               │         0 │
│ Queries Slower                               │        11 │
│ Queries with No Change                       │        88 │
│ Queries with Failure                         │         0 │
└──────────────────────────────────────────────┴───────────┘

Distribution per query (min / mean ±stddev / max):

Comparing HEAD and reclaim-spawned-tasks-on-drop
--------------------
Benchmark tpcds_sf1.json
--------------------
┏━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Query     ┃                                  HEAD ┃         reclaim-spawned-tasks-on-drop ┃        Change ┃
┡━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ QQuery 1  │           5.13 / 5.72 ±0.98 / 7.67 ms │           5.43 / 6.08 ±0.96 / 7.98 ms │  1.06x slower │
│ QQuery 2  │        79.21 / 79.46 ±0.26 / 79.96 ms │        79.03 / 79.66 ±0.52 / 80.45 ms │     no change │
│ QQuery 3  │        28.26 / 28.95 ±0.51 / 29.82 ms │        28.74 / 28.95 ±0.12 / 29.06 ms │     no change │
│ QQuery 4  │     616.70 / 620.70 ±2.33 / 623.39 ms │     650.13 / 653.02 ±2.93 / 658.63 ms │  1.05x slower │
│ QQuery 5  │        49.12 / 49.51 ±0.29 / 49.88 ms │        49.59 / 52.01 ±3.61 / 59.14 ms │  1.05x slower │
│ QQuery 6  │        34.53 / 35.22 ±0.42 / 35.70 ms │        35.17 / 35.72 ±0.46 / 36.46 ms │     no change │
│ QQuery 7  │        70.46 / 71.98 ±1.47 / 74.55 ms │        71.84 / 72.19 ±0.33 / 72.76 ms │     no change │
│ QQuery 8  │        35.41 / 35.77 ±0.22 / 36.03 ms │        35.93 / 36.13 ±0.11 / 36.27 ms │     no change │
│ QQuery 9  │        50.95 / 53.09 ±1.28 / 54.49 ms │        52.64 / 55.32 ±1.77 / 58.00 ms │     no change │
│ QQuery 10 │        59.17 / 60.93 ±2.34 / 65.55 ms │        60.26 / 60.61 ±0.25 / 61.02 ms │     no change │
│ QQuery 11 │     321.85 / 329.77 ±5.14 / 336.02 ms │     350.87 / 354.94 ±2.77 / 358.29 ms │  1.08x slower │
│ QQuery 12 │        28.23 / 28.55 ±0.25 / 28.87 ms │        28.79 / 29.36 ±0.40 / 29.97 ms │     no change │
│ QQuery 13 │     110.29 / 112.44 ±1.96 / 115.81 ms │     111.61 / 112.06 ±0.40 / 112.64 ms │     no change │
│ QQuery 14 │     381.53 / 384.09 ±2.60 / 387.45 ms │     383.84 / 386.35 ±2.79 / 391.66 ms │     no change │
│ QQuery 15 │        50.92 / 51.84 ±0.77 / 52.91 ms │        54.97 / 57.56 ±3.23 / 63.94 ms │  1.11x slower │
│ QQuery 16 │           5.87 / 6.00 ±0.21 / 6.42 ms │           6.29 / 6.45 ±0.11 / 6.64 ms │  1.08x slower │
│ QQuery 17 │        77.03 / 77.60 ±0.36 / 78.14 ms │        78.50 / 79.63 ±1.46 / 82.48 ms │     no change │
│ QQuery 18 │     102.46 / 103.83 ±1.66 / 107.07 ms │     104.68 / 106.16 ±1.57 / 108.90 ms │     no change │
│ QQuery 19 │        40.64 / 40.91 ±0.28 / 41.40 ms │        41.47 / 42.05 ±0.85 / 43.71 ms │     no change │
│ QQuery 20 │        34.72 / 35.48 ±0.87 / 37.13 ms │        35.25 / 35.67 ±0.34 / 36.24 ms │     no change │
│ QQuery 21 │        16.83 / 16.91 ±0.08 / 17.03 ms │        17.00 / 17.19 ±0.17 / 17.49 ms │     no change │
│ QQuery 22 │        62.49 / 63.14 ±0.38 / 63.50 ms │        64.78 / 65.41 ±0.40 / 65.92 ms │     no change │
│ QQuery 23 │     298.19 / 300.17 ±1.02 / 301.10 ms │     309.33 / 313.13 ±2.84 / 318.12 ms │     no change │
│ QQuery 24 │     187.78 / 190.63 ±1.68 / 192.05 ms │     197.31 / 199.43 ±1.56 / 201.79 ms │     no change │
│ QQuery 25 │     104.32 / 107.69 ±2.71 / 112.14 ms │     106.32 / 107.36 ±0.71 / 108.29 ms │     no change │
│ QQuery 26 │        45.16 / 45.63 ±0.60 / 46.81 ms │        45.52 / 46.50 ±1.21 / 48.85 ms │     no change │
│ QQuery 27 │           5.72 / 5.86 ±0.16 / 6.16 ms │           6.16 / 6.28 ±0.07 / 6.35 ms │  1.07x slower │
│ QQuery 28 │        60.84 / 61.00 ±0.15 / 61.28 ms │        59.04 / 60.51 ±0.85 / 61.53 ms │     no change │
│ QQuery 29 │        92.00 / 93.99 ±1.93 / 97.08 ms │       94.75 / 98.06 ±5.42 / 108.88 ms │     no change │
│ QQuery 30 │        31.22 / 31.75 ±0.30 / 32.17 ms │        32.67 / 33.42 ±1.08 / 35.57 ms │  1.05x slower │
│ QQuery 31 │     105.66 / 106.94 ±0.65 / 107.36 ms │     108.52 / 109.43 ±0.85 / 110.66 ms │     no change │
│ QQuery 32 │        19.55 / 19.72 ±0.19 / 20.08 ms │        20.26 / 20.63 ±0.25 / 20.92 ms │     no change │
│ QQuery 33 │        37.48 / 38.62 ±1.56 / 41.67 ms │        38.17 / 38.70 ±0.47 / 39.37 ms │     no change │
│ QQuery 34 │          9.53 / 9.89 ±0.32 / 10.37 ms │        10.04 / 11.15 ±1.20 / 13.43 ms │  1.13x slower │
│ QQuery 35 │        69.65 / 71.34 ±1.45 / 73.43 ms │        73.61 / 74.21 ±0.83 / 75.86 ms │     no change │
│ QQuery 36 │           5.89 / 6.07 ±0.13 / 6.22 ms │           5.71 / 5.87 ±0.19 / 6.24 ms │     no change │
│ QQuery 37 │           7.06 / 7.18 ±0.16 / 7.50 ms │           6.76 / 6.89 ±0.07 / 6.97 ms │     no change │
│ QQuery 38 │        62.26 / 62.80 ±0.44 / 63.56 ms │        62.06 / 63.40 ±1.61 / 66.46 ms │     no change │
│ QQuery 39 │        72.55 / 73.86 ±0.70 / 74.58 ms │        73.06 / 74.05 ±0.70 / 75.26 ms │     no change │
│ QQuery 40 │        23.33 / 23.60 ±0.15 / 23.79 ms │        23.41 / 23.82 ±0.30 / 24.19 ms │     no change │
│ QQuery 41 │        12.39 / 12.52 ±0.10 / 12.69 ms │        12.27 / 12.48 ±0.11 / 12.57 ms │     no change │
│ QQuery 42 │        24.00 / 24.42 ±0.37 / 24.97 ms │        23.65 / 23.98 ±0.26 / 24.41 ms │     no change │
│ QQuery 43 │           4.83 / 4.95 ±0.13 / 5.20 ms │           4.87 / 4.98 ±0.12 / 5.20 ms │     no change │
│ QQuery 44 │           8.73 / 8.84 ±0.07 / 8.92 ms │           8.71 / 8.87 ±0.09 / 8.95 ms │     no change │
│ QQuery 45 │        37.74 / 38.93 ±0.96 / 40.12 ms │        37.85 / 39.59 ±1.87 / 43.09 ms │     no change │
│ QQuery 46 │        11.55 / 11.81 ±0.35 / 12.48 ms │        11.55 / 11.84 ±0.16 / 11.96 ms │     no change │
│ QQuery 47 │     224.16 / 229.52 ±4.04 / 236.65 ms │     230.05 / 232.52 ±1.38 / 233.93 ms │     no change │
│ QQuery 48 │        89.86 / 90.70 ±0.53 / 91.23 ms │        90.62 / 91.54 ±0.94 / 92.91 ms │     no change │
│ QQuery 49 │        70.42 / 71.75 ±1.61 / 74.92 ms │        70.48 / 73.20 ±3.41 / 79.90 ms │     no change │
│ QQuery 50 │        57.14 / 58.07 ±0.90 / 59.61 ms │        57.68 / 58.49 ±0.82 / 59.87 ms │     no change │
│ QQuery 51 │        91.24 / 92.91 ±1.38 / 95.28 ms │        91.73 / 93.51 ±1.65 / 96.62 ms │     no change │
│ QQuery 52 │        24.12 / 24.33 ±0.12 / 24.47 ms │        24.47 / 26.09 ±2.95 / 31.98 ms │  1.07x slower │
│ QQuery 53 │        29.24 / 29.35 ±0.07 / 29.45 ms │        29.17 / 29.59 ±0.51 / 30.58 ms │     no change │
│ QQuery 54 │        53.76 / 54.75 ±1.44 / 57.62 ms │        53.81 / 54.58 ±0.97 / 56.49 ms │     no change │
│ QQuery 55 │        23.73 / 24.09 ±0.37 / 24.60 ms │        23.73 / 24.02 ±0.16 / 24.18 ms │     no change │
│ QQuery 56 │        38.53 / 38.69 ±0.13 / 38.94 ms │        38.83 / 39.20 ±0.20 / 39.37 ms │     no change │
│ QQuery 57 │     163.83 / 166.67 ±3.32 / 172.84 ms │     165.31 / 167.33 ±2.85 / 173.00 ms │     no change │
│ QQuery 58 │     104.32 / 106.07 ±1.45 / 108.68 ms │     105.46 / 106.39 ±0.70 / 107.29 ms │     no change │
│ QQuery 59 │     113.56 / 114.58 ±1.60 / 117.76 ms │     112.84 / 113.44 ±0.46 / 114.08 ms │     no change │
│ QQuery 60 │        38.43 / 39.07 ±0.65 / 40.08 ms │        39.16 / 39.57 ±0.31 / 40.09 ms │     no change │
│ QQuery 61 │           9.18 / 9.33 ±0.20 / 9.72 ms │           9.53 / 9.67 ±0.16 / 9.98 ms │     no change │
│ QQuery 62 │        43.46 / 44.20 ±0.99 / 46.15 ms │        43.07 / 43.26 ±0.13 / 43.45 ms │     no change │
│ QQuery 63 │        28.77 / 29.21 ±0.37 / 29.87 ms │        29.32 / 29.64 ±0.34 / 30.28 ms │     no change │
│ QQuery 64 │     349.27 / 355.51 ±5.95 / 366.14 ms │     350.80 / 355.60 ±3.56 / 360.31 ms │     no change │
│ QQuery 65 │     125.54 / 127.47 ±1.21 / 129.34 ms │     128.27 / 131.73 ±2.24 / 134.49 ms │     no change │
│ QQuery 66 │        74.17 / 75.41 ±1.43 / 77.68 ms │        73.25 / 73.98 ±0.51 / 74.83 ms │     no change │
│ QQuery 67 │     244.81 / 249.40 ±4.58 / 257.64 ms │     250.33 / 254.33 ±4.25 / 262.48 ms │     no change │
│ QQuery 68 │        11.33 / 12.89 ±2.73 / 18.35 ms │        11.39 / 11.60 ±0.27 / 12.13 ms │ +1.11x faster │
│ QQuery 69 │        54.90 / 55.36 ±0.48 / 56.02 ms │        55.37 / 56.40 ±1.52 / 59.41 ms │     no change │
│ QQuery 70 │     102.46 / 106.88 ±4.79 / 116.02 ms │     102.82 / 106.17 ±4.69 / 115.24 ms │     no change │
│ QQuery 71 │        34.14 / 35.05 ±1.37 / 37.77 ms │        34.49 / 35.46 ±0.75 / 36.71 ms │     no change │
│ QQuery 72 │ 1439.15 / 1491.70 ±34.79 / 1540.76 ms │ 1554.76 / 1629.25 ±44.69 / 1681.40 ms │  1.09x slower │
│ QQuery 73 │           9.18 / 9.42 ±0.29 / 9.99 ms │         9.74 / 10.40 ±1.02 / 12.43 ms │  1.11x slower │
│ QQuery 74 │     183.84 / 186.59 ±1.87 / 189.54 ms │     186.47 / 190.80 ±3.68 / 197.58 ms │     no change │
│ QQuery 75 │     137.70 / 140.04 ±2.25 / 144.06 ms │     136.70 / 137.35 ±0.45 / 137.92 ms │     no change │
│ QQuery 76 │        33.83 / 34.14 ±0.25 / 34.45 ms │        33.65 / 34.01 ±0.34 / 34.65 ms │     no change │
│ QQuery 77 │        58.70 / 59.29 ±0.39 / 59.80 ms │        58.28 / 59.95 ±1.75 / 63.33 ms │     no change │
│ QQuery 78 │     157.75 / 162.87 ±4.24 / 168.08 ms │     160.19 / 162.39 ±2.54 / 165.98 ms │     no change │
│ QQuery 79 │        65.80 / 66.31 ±0.39 / 66.98 ms │        65.40 / 65.68 ±0.20 / 66.01 ms │     no change │
│ QQuery 80 │       92.64 / 95.20 ±3.20 / 101.41 ms │       93.63 / 96.49 ±3.16 / 102.54 ms │     no change │
│ QQuery 81 │        25.01 / 25.31 ±0.21 / 25.62 ms │        25.01 / 25.18 ±0.15 / 25.45 ms │     no change │
│ QQuery 82 │        16.54 / 16.63 ±0.10 / 16.79 ms │        16.02 / 17.53 ±1.67 / 20.59 ms │  1.05x slower │
│ QQuery 83 │        32.27 / 32.68 ±0.25 / 33.00 ms │        32.00 / 32.41 ±0.31 / 32.90 ms │     no change │
│ QQuery 84 │        29.13 / 30.07 ±1.01 / 31.95 ms │        29.14 / 29.24 ±0.12 / 29.47 ms │     no change │
│ QQuery 85 │       96.98 / 99.68 ±1.75 / 101.77 ms │       97.18 / 99.79 ±3.34 / 106.14 ms │     no change │
│ QQuery 86 │        25.17 / 25.51 ±0.28 / 25.92 ms │        24.73 / 25.93 ±1.19 / 28.07 ms │     no change │
│ QQuery 87 │        59.85 / 60.95 ±0.69 / 62.01 ms │        60.67 / 61.67 ±0.68 / 62.71 ms │     no change │
│ QQuery 88 │        58.14 / 58.68 ±0.73 / 60.07 ms │        58.63 / 60.38 ±2.93 / 66.20 ms │     no change │
│ QQuery 89 │        34.83 / 35.78 ±1.61 / 38.99 ms │        34.61 / 35.23 ±0.52 / 35.93 ms │     no change │
│ QQuery 90 │        16.10 / 16.24 ±0.13 / 16.47 ms │        16.39 / 16.50 ±0.11 / 16.68 ms │     no change │
│ QQuery 91 │        39.67 / 39.98 ±0.17 / 40.20 ms │        40.03 / 41.06 ±1.67 / 44.38 ms │     no change │
│ QQuery 92 │        29.03 / 29.40 ±0.26 / 29.75 ms │        28.84 / 29.39 ±0.36 / 29.91 ms │     no change │
│ QQuery 93 │        47.64 / 48.24 ±0.53 / 49.19 ms │        48.51 / 48.90 ±0.32 / 49.23 ms │     no change │
│ QQuery 94 │        37.65 / 37.96 ±0.31 / 38.37 ms │        38.10 / 39.55 ±1.70 / 42.80 ms │     no change │
│ QQuery 95 │        78.41 / 80.18 ±1.72 / 83.31 ms │        79.59 / 80.52 ±0.83 / 81.97 ms │     no change │
│ QQuery 96 │        23.69 / 23.95 ±0.30 / 24.46 ms │        23.48 / 23.74 ±0.16 / 23.96 ms │     no change │
│ QQuery 97 │        49.82 / 51.23 ±0.72 / 51.76 ms │        50.31 / 51.09 ±0.84 / 52.72 ms │     no change │
│ QQuery 98 │        41.62 / 42.47 ±0.52 / 43.12 ms │        42.82 / 44.54 ±1.57 / 47.24 ms │     no change │
│ QQuery 99 │        64.51 / 66.07 ±1.92 / 69.54 ms │        63.34 / 63.80 ±0.26 / 64.08 ms │     no change │
└───────────┴───────────────────────────────────────┴───────────────────────────────────────┴───────────────┘
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━┓
┃ Benchmark Summary                            ┃           ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━┩
│ Total Time (HEAD)                            │ 8957.95ms │
│ Total Time (reclaim-spawned-tasks-on-drop)   │ 9237.20ms │
│ Average Time (HEAD)                          │   90.48ms │
│ Average Time (reclaim-spawned-tasks-on-drop) │   93.31ms │
│ Queries Faster                               │         1 │
│ Queries Slower                               │        13 │
│ Queries with No Change                       │        85 │
│ Queries with Failure                         │         0 │
└──────────────────────────────────────────────┴───────────┘

Resource Usage

tpcds — base (merge-base)

Metric Value
Wall time 50.0s
Peak memory 2.3 GiB
Avg memory 1.5 GiB
CPU user 183.9s
CPU sys 5.5s
Peak spill 0 B

tpcds — branch

Metric Value
Wall time 50.0s
Peak memory 2.0 GiB
Avg memory 1.3 GiB
CPU user 193.4s
CPU sys 5.9s
Peak spill 0 B

File an issue against this benchmark runner

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

common Related to common crate physical-plan Changes to the physical-plan crate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Dropping a plan's stream should release what its stream tasks own right away, not when the runtime next polls them

6 participants