Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

heap-use-after-free hit in cross_shard_barrier_test #11303

Closed
bhalevy opened this issue Aug 17, 2022 · 9 comments
Closed

heap-use-after-free hit in cross_shard_barrier_test #11303

bhalevy opened this issue Aug 17, 2022 · 9 comments
Assignees
Milestone

Comments

@bhalevy
Copy link
Member

bhalevy commented Aug 17, 2022

Seen in https://jenkins.scylladb.com/job/scylla-master/job/build/1132/artifact/testlog/aarch64/debug/cross_shard_barrier_test.2404.log
Scylla version 055340a

=== TEST.PY STARTING TEST cross_shard_barrier_test.2404 ===
export UBSAN_OPTIONS='halt_on_error=1:abort_on_error=1:suppressions=/jenkins/workspace/scylla-master/build/scylla/ubsan-suppressions.supp'
export ASAN_OPTIONS='disable_coredump=0:abort_on_error=1:detect_stack_use_after_return=1'
build/debug/test/unit/cross_shard_barrier_test -c2 -m2G --overprovisioned --unsafe-bypass-fsync 1 --kernel-page-cache 1 --blocked-reactor-notify-ms 2000000 --collectd 0 --max-networking-io-control-blocks=100
=== TEST.PY TEST cross_shard_barrier_test.2404 OUTPUT ===
WARNING: debug mode. Not for benchmarking or production
WARN  2022-08-17 05:51:41,311 [shard 0] seastar - Creation of perf_event based stall detector failed, falling back to posix timer: std::system_error (error system:13, perf_event_open() failed: Permission denied)
WARN  2022-08-17 05:51:41,311 [shard 1] seastar - Creation of perf_event based stall detector failed, falling back to posix timer: std::system_error (error system:13, perf_event_open() failed: Permission denied)
INFO  2022-08-17 05:51:41,322 [shard 0] seastar - Created fair group io-queue-0, capacity rate 2147483:2147483, limit 12582912, rate 16777216 (factor 1), threshold 2000
INFO  2022-08-17 05:51:41,322 [shard 0] seastar - IO queue uses 0.75ms latency goal for device 0
INFO  2022-08-17 05:51:41,322 [shard 0] seastar - Created io group dev(0), length limit 4194304:4194304, rate 2147483647:2147483647
INFO  2022-08-17 05:51:41,323 [shard 0] seastar - Created io queue dev(0) capacities: 512:2000:2000 1024:3000:3000 2048:5000:5000 4096:9000:9000 8192:17000:17000 16384:33000:33000 32768:65000:65000 65536:129000:129000 131072:257000:257000
==16825==WARNING: ASan doesn't fully support makecontext/swapcontext functions and may produce false positives in some cases!
=================================================================
==16825==ERROR: AddressSanitizer: heap-use-after-free on address 0xffff8cf27120 at pc 0x00000ae39728 bp 0xffff909cf6e0 sp 0xffff909cf6f8
READ of size 8 at 0xffff8cf27120 thread T1 (reactor-1)
    #0 0xae39724  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0xae39724)
    #1 0xae396a0  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0xae396a0)
    #2 0xae390d4  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0xae390d4)
    #3 0xae3b47c  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0xae3b47c)
    #4 0xae3aad8  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0xae3aad8)
    #5 0xae3d394  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0xae3d394)
    #6 0x108c6f94  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0x108c6f94)
    #7 0x108cc5c8  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0x108cc5c8)
    #8 0x108d01e4  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0x108d01e4)
    #9 0x109a4a3c  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0x109a4a3c)
    #10 0x109a36ec  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0x109a36ec)
    #11 0x109a3468  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0x109a3468)
    #12 0x109a2994  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0x109a2994)
    #13 0xb0b27f4  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0xb0b27f4)
    #14 0x1085f1bc  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0x1085f1bc)
    #15 0xffff9ba4e004  (/lib64/libpthread.so.0+0x8004)
    #16 0xffff9ade75d8  (/lib64/libc.so.6+0xda5d8)

Decoded:

std::__shared_ptr<utils::cross_shard_barrier::barrier, (__gnu_cxx::_Lock_policy)2>::get() const at /usr/lib/gcc/aarch64-redhat-linux/11/../../../../include/c++/11/bits/shared_ptr_base.h:1296
std::__shared_ptr_access<utils::cross_shard_barrier::barrier, (__gnu_cxx::_Lock_policy)2, false, false>::_M_get() const at /usr/lib/gcc/aarch64-redhat-linux/11/../../../../include/c++/11/bits/shared_ptr_base.h:993
std::__shared_ptr_access<utils::cross_shard_barrier::barrier, (__gnu_cxx::_Lock_policy)2, false, false>::operator->() const at /usr/lib/gcc/aarch64-redhat-linux/11/../../../../include/c++/11/bits/shared_ptr_base.h:987
operator() at ././utils/cross-shard-barrier.hh:131
seastar::future<void> seastar::futurize<seastar::future<void> >::invoke<utils::cross_shard_barrier::complete()::{lambda()#1}&>(utils::cross_shard_barrier::complete()::{lambda()#1}&) at ././seastar/include/seastar/core/future.hh:2149
seastar::smp_message_queue::async_work_item<utils::cross_shard_barrier::complete()::{lambda()#1}>::run_and_dispose() at ././seastar/include/seastar/core/smp.hh:231
seastar::reactor::run_tasks(seastar::reactor::task_queue&) at ./build/debug/seastar/./seastar/src/core/reactor.cc:2345
seastar::reactor::run_some_tasks() at ./build/debug/seastar/./seastar/src/core/reactor.cc:2752
seastar::reactor::do_run() at ./build/debug/seastar/./seastar/src/core/reactor.cc:2921
operator() at ./build/debug/seastar/./seastar/src/core/reactor.cc:4145
void std::__invoke_impl<void, seastar::smp::configure(seastar::smp_options const&, seastar::reactor_options const&)::$_90&>(std::__invoke_other, seastar::smp::configure(seastar::smp_options const&, seastar::reactor_options const&)::$_90&) at /usr/lib/gcc/aarch64-redhat-linux/11/../../../../include/c++/11/bits/invoke.h:61
std::enable_if<is_invocable_r_v<void, seastar::smp::configure(seastar::smp_options const&, seastar::reactor_options const&)::$_90&>, void>::type std::__invoke_r<void, seastar::smp::configure(seastar::smp_options const&, seastar::reactor_options const&)::$_90&>(seastar::smp::configure(seastar::smp_options const&, seastar::reactor_options const&)::$_90&) at /usr/lib/gcc/aarch64-redhat-linux/11/../../../../include/c++/11/bits/invoke.h:111
std::_Function_handler<void (), seastar::smp::configure(seastar::smp_options const&, seastar::reactor_options const&)::$_90>::_M_invoke(std::_Any_data const&) at /usr/lib/gcc/aarch64-redhat-linux/11/../../../../include/c++/11/bits/std_function.h:290
std::function<void ()>::operator()() const at /usr/lib/gcc/aarch64-redhat-linux/11/../../../../include/c++/11/bits/std_function.h:590
seastar::posix_thread::start_routine(void*) at ./build/debug/seastar/./seastar/src/core/posix.cc:60
0xffff8cf27120 is located 32 bytes inside of 5160-byte region [0xffff8cf27100,0xffff8cf28528)
freed by thread T0 here:
    #0 0xae08e40  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0xae08e40)
    #1 0xae202f8  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0xae202f8)
    #2 0xae1d1f8  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0xae1d1f8)
    #3 0xae1f428  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0xae1f428)
    #4 0xae48268  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0xae48268)
    #5 0xae480e8  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0xae480e8)
    #6 0xae47788  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0xae47788)
    #7 0xae4747c  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0xae4747c)
    #8 0xae472fc  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0xae472fc)
    #9 0xae47178  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0xae47178)
    #10 0xae47074  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0xae47074)
    #11 0xae47000  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0xae47000)
    #12 0xae46e30  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0xae46e30)
    #13 0x10c4d318  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0x10c4d318)
    #14 0x10c4d068  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0x10c4d068)
    #15 0x10c4cf5c  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0x10c4cf5c)
    #16 0x10c4ca90  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0x10c4ca90)
    #17 0x10c4c5bc  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0x10c4c5bc)
    #18 0x10c4d490  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0x10c4d490)
    #19 0x10c4c760  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0x10c4c760)
    #20 0x10c4c254  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0x10c4c254)
    #21 0x10c4be84  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0x10c4be84)
    #22 0xae1b894  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0xae1b894)
    #23 0xae46914  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0xae46914)
    #24 0xae46784  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0xae46784)
    #25 0xae46640  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0xae46640)
    #26 0xae465e4  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0xae465e4)
    #27 0xae276b8  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0xae276b8)
    #28 0xae27424  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0xae27424)
    #29 0xae2725c  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0xae2725c)

Decoded:

operator delete(void*) at ??:?
~shared_ptr_count_for at ././seastar/include/seastar/core/shared_ptr.hh:465
~shared_ptr at ././seastar/include/seastar/core/shared_ptr.hh:538
seastar::shared_ptr<worker>::operator=(seastar::shared_ptr<worker>&&) at ././seastar/include/seastar/core/shared_ptr.hh:550
seastar::shared_ptr<worker>::operator=(decltype(nullptr)) at ././seastar/include/seastar/core/shared_ptr.hh:556
operator() at ././seastar/include/seastar/core/sharded.hh:708
seastar::future<void> seastar::futurize<seastar::future<void> >::invoke<seastar::sharded<worker>::stop()::{lambda(seastar::future<void>)#1}::operator()(seastar::future<void>) const::{lambda(unsigned int)#1}::operator()(unsigned int) const::{lambda()#1}&>(seastar::sharded<worker>::stop()::{lambda(seastar::future<void>)#1}::operator()(seastar::future<void>) const::{lambda(unsigned int)#1}::operator()(unsigned int) const::{lambda()#1}&) at ././seastar/include/seastar/core/future.hh:2149
seastar::futurize<std::invoke_result<seastar::sharded<worker>::stop()::{lambda(seastar::future<void>)#1}::operator()(seastar::future<void>) const::{lambda(unsigned int)#1}::operator()(unsigned int) const::{lambda()#1}>::type>::type seastar::smp::submit_to<seastar::sharded<worker>::stop()::{lambda(seastar::future<void>)#1}::operator()(seastar::future<void>) const::{lambda(unsigned int)#1}::operator()(unsigned int) const::{lambda()#1}>(unsigned int, seastar::smp_submit_to_options, seastar::sharded<worker>::stop()::{lambda(seastar::future<void>)#1}::operator()(seastar::future<void>) const::{lambda(unsigned int)#1}::operator()(unsigned int) const::{lambda()#1}&&) at ././seastar/include/seastar/core/smp.hh:349
seastar::futurize<std::invoke_result<seastar::sharded<worker>::stop()::{lambda(seastar::future<void>)#1}::operator()(seastar::future<void>) const::{lambda(unsigned int)#1}::operator()(unsigned int) const::{lambda()#1}>::type>::type seastar::smp::submit_to<seastar::sharded<worker>::stop()::{lambda(seastar::future<void>)#1}::operator()(seastar::future<void>) const::{lambda(unsigned int)#1}::operator()(unsigned int) const::{lambda()#1}>(unsigned int, seastar::sharded<worker>::stop()::{lambda(seastar::future<void>)#1}::operator()(seastar::future<void>) const::{lambda(unsigned int)#1}::operator()(unsigned int) const::{lambda()#1}&&) at ././seastar/include/seastar/core/smp.hh:376
operator() at ././seastar/include/seastar/core/sharded.hh:704
seastar::future<void> std::__invoke_impl<seastar::future<void>, seastar::sharded<worker>::stop()::{lambda(seastar::future<void>)#1}::operator()(seastar::future<void>) const::{lambda(unsigned int)#1}&, unsigned int>(std::__invoke_other, seastar::sharded<worker>::stop()::{lambda(seastar::future<void>)#1}::operator()(seastar::future<void>) const::{lambda(unsigned int)#1}&, unsigned int&&) at /usr/lib/gcc/aarch64-redhat-linux/11/../../../../include/c++/11/bits/invoke.h:61
std::enable_if<is_invocable_r_v<seastar::future<void>, seastar::sharded<worker>::stop()::{lambda(seastar::future<void>)#1}::operator()(seastar::future<void>) const::{lambda(unsigned int)#1}&, unsigned int>, seastar::sharded<worker>::stop()::{lambda(seastar::future<void>)#1}::operator()(seastar::future<void>) const::{lambda(unsigned int)#1}&>::type std::__invoke_r<seastar::future<void>, seastar::sharded<worker>::stop()::{lambda(seastar::future<void>)#1}::operator()(seastar::future<void>) const::{lambda(unsigned int)#1}&, unsigned int>(std::enable_if&&, (seastar::future<void>&&)...) at /usr/lib/gcc/aarch64-redhat-linux/11/../../../../include/c++/11/bits/invoke.h:114
std::_Function_handler<seastar::future<void> (unsigned int), seastar::sharded<worker>::stop()::{lambda(seastar::future<void>)#1}::operator()(seastar::future<void>) const::{lambda(unsigned int)#1}>::_M_invoke(std::_Any_data const&, unsigned int&&) at /usr/lib/gcc/aarch64-redhat-linux/11/../../../../include/c++/11/bits/std_function.h:290
std::function<seastar::future<void> (unsigned int)>::operator()(unsigned int) const at /usr/lib/gcc/aarch64-redhat-linux/11/../../../../include/c++/11/bits/std_function.h:590
seastar::future<void> seastar::futurize<seastar::future<void> >::invoke<std::function<seastar::future<void> (unsigned int)>, unsigned int>(std::function<seastar::future<void> (unsigned int)>&&, unsigned int&&) at ./build/debug/seastar/./seastar/include/seastar/core/future.hh:2149
auto seastar::futurize_invoke<std::function<seastar::future<void> (unsigned int)>, unsigned int>(std::function<seastar::future<void> (unsigned int)>&&, unsigned int&&) at ./build/debug/seastar/./seastar/include/seastar/core/future.hh:2180
seastar::future<void> seastar::parallel_for_each<boost::range_detail::integer_iterator<unsigned int>, boost::range_detail::integer_iterator<unsigned int>, std::function<seastar::future<void> (unsigned int)> >(boost::range_detail::integer_iterator<unsigned int>, boost::range_detail::integer_iterator<unsigned int>, std::function<seastar::future<void> (unsigned int)>&&) at ./build/debug/seastar/./seastar/include/seastar/core/loop.hh:566
seastar::future<void> seastar::internal::parallel_for_each_impl<boost::integer_range<unsigned int>, std::function<seastar::future<void> (unsigned int)> >(boost::integer_range<unsigned int>&&, std::function<seastar::future<void> (unsigned int)>&&) at ./build/debug/seastar/./seastar/include/seastar/core/loop.hh:616
seastar::future<void> seastar::futurize<seastar::future<void> >::invoke<seastar::future<void> (*&)(boost::integer_range<unsigned int>&&, std::function<seastar::future<void> (unsigned int)>&&), boost::integer_range<unsigned int>, std::function<seastar::future<void> (unsigned int)> >(seastar::future<void> (*&)(boost::integer_range<unsigned int>&&, std::function<seastar::future<void> (unsigned int)>&&), boost::integer_range<unsigned int>&&, std::function<seastar::future<void> (unsigned int)>&&) at ./build/debug/seastar/./seastar/include/seastar/core/future.hh:2149
auto seastar::futurize_invoke<seastar::future<void> (*&)(boost::integer_range<unsigned int>&&, std::function<seastar::future<void> (unsigned int)>&&), boost::integer_range<unsigned int>, std::function<seastar::future<void> (unsigned int)> >(seastar::future<void> (*&)(boost::integer_range<unsigned int>&&, std::function<seastar::future<void> (unsigned int)>&&), boost::integer_range<unsigned int>&&, std::function<seastar::future<void> (unsigned int)>&&) at ./build/debug/seastar/./seastar/include/seastar/core/future.hh:2180
seastar::future<void> seastar::parallel_for_each<boost::integer_range<unsigned int>, std::function<seastar::future<void> (unsigned int)> >(boost::integer_range<unsigned int>&&, std::function<seastar::future<void> (unsigned int)>&&) at ./build/debug/seastar/./seastar/include/seastar/core/loop.hh:631
seastar::internal::sharded_parallel_for_each(unsigned int, std::function<seastar::future<void> (unsigned int)>) at ./build/debug/seastar/./seastar/src/core/sharded.cc:33
seastar::sharded<worker>::sharded_parallel_for_each(std::function<seastar::future<void> (unsigned int)>) at ././seastar/include/seastar/core/sharded.hh:160
operator() at ././seastar/include/seastar/core/sharded.hh:703
seastar::future<void> seastar::futurize<seastar::future<void> >::invoke<seastar::sharded<worker>::stop()::{lambda(seastar::future<void>)#1}&, seastar::future<void> >(seastar::sharded<worker>::stop()::{lambda(seastar::future<void>)#1}&, seastar::future<void>&&) at ././seastar/include/seastar/core/future.hh:2149
operator() at ././seastar/include/seastar/core/future.hh:1666
seastar::noncopyable_function<seastar::future<void> (seastar::future<void>&&)>::direct_vtable_for<seastar::future<void>::then_wrapped_maybe_erase<true, seastar::future<void>, seastar::sharded<worker>::stop()::{lambda(seastar::future<void>)#1}>(seastar::sharded<worker>::stop()::{lambda(seastar::future<void>)#1}&&)::{lambda(seastar::future<void>&&)#1}>::call(seastar::noncopyable_function<seastar::future<void> (seastar::future<void>&&)> const*, seastar::future<void>&&) at ././seastar/include/seastar/util/noncopyable_function.hh:124
seastar::noncopyable_function<seastar::future<void> (seastar::future<void>&&)>::operator()(seastar::future<void>&&) const at ././seastar/include/seastar/util/noncopyable_function.hh:209
operator() at ././seastar/include/seastar/core/future.hh:1682
void seastar::futurize<seastar::future<void> >::satisfy_with_result_of<seastar::future<void>::then_wrapped_nrvo<seastar::future<void>, seastar::noncopyable_function<seastar::future<void> (seastar::future<void>&&)> >(seastar::noncopyable_function<seastar::future<void> (seastar::future<void>&&)>&&)::{lambda(seastar::internal::promise_base_with_type<void>&&, seastar::noncopyable_function<seastar::future<void> (seastar::future<void>&&)>&, seastar::future_state<seastar::internal::monostate>&&)#1}::operator()(seastar::internal::promise_base_with_type<void>&&, seastar::noncopyable_function<seastar::future<void> (seastar::future<void>&&)>&, seastar::future_state<seastar::internal::monostate>&&) const::{lambda()#1}>(seastar::internal::promise_base_with_type<void>&&, seastar::future<void>::then_wrapped_nrvo<seastar::future<void>, seastar::noncopyable_function<seastar::future<void> (seastar::future<void>&&)> >(seastar::noncopyable_function<seastar::future<void> (seastar::future<void>&&)>&&)::{lambda(seastar::internal::promise_base_with_type<void>&&, seastar::noncopyable_function<seastar::future<void> (seastar::future<void>&&)>&, seastar::future_state<seastar::internal::monostate>&&)#1}::operator()(seastar::internal::promise_base_with_type<void>&&, seastar::noncopyable_function<seastar::future<void> (seastar::future<void>&&)>&, seastar::future_state<seastar::internal::monostate>&&) const::{lambda()#1}&&) at ././seastar/include/seastar/core/future.hh:2134
previously allocated by thread T0 here:
    #0 0xae084b8  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0xae084b8)
    #1 0xae1f9d8  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0xae1f9d8)
    #2 0xae1f88c  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0xae1f88c)
    #3 0xae1f7f8  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0xae1f7f8)
    #4 0xae1f730  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0xae1f730)
    #5 0xae1f620  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0xae1f620)
    #6 0xae1f528  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0xae1f528)
    #7 0xae1f4d8  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0xae1f4d8)
    #8 0xae1f290  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0xae1f290)
    #9 0xae1f158  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0xae1f158)
    #10 0xae1ed68  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0xae1ed68)
    #11 0xae1e9ec  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0xae1e9ec)
    #12 0xae1e88c  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0xae1e88c)
    #13 0xae1e6e8  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0xae1e6e8)
    #14 0xae1e5bc  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0xae1e5bc)
    #15 0xae1e530  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0xae1e530)
    #16 0xae1e16c  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0xae1e16c)
    #17 0x10c4d318  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0x10c4d318)
    #18 0x10c4d068  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0x10c4d068)
    #19 0x10c4cf5c  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0x10c4cf5c)
    #20 0x10c4ca90  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0x10c4ca90)
    #21 0x10c4c5bc  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0x10c4c5bc)
    #22 0x10c4d490  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0x10c4d490)
    #23 0x10c4c760  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0x10c4c760)
    #24 0x10c4c254  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0x10c4c254)
    #25 0x10c4be84  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0x10c4be84)
    #26 0xae1b894  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0xae1b894)
    #27 0xae195c8  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0xae195c8)
    #28 0xae0cf7c  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0xae0cf7c)
    #29 0xae0cc40  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0xae0cc40)

Decoded:

operator new(unsigned long) at ??:?
seastar::shared_ptr<worker> seastar::shared_ptr_make_helper<worker, false>::make<utils::cross_shard_barrier>(utils::cross_shard_barrier&&) at ././seastar/include/seastar/core/shared_ptr.hh:632
seastar::shared_ptr<worker> seastar::make_shared<worker, utils::cross_shard_barrier>(utils::cross_shard_barrier&&) at ././seastar/include/seastar/core/shared_ptr.hh:650
seastar::shared_ptr<worker> seastar::sharded<worker>::create_local_service<utils::cross_shard_barrier>(utils::cross_shard_barrier&&) at ././seastar/include/seastar/core/sharded.hh:464
operator() at ././seastar/include/seastar/core/sharded.hh:595
seastar::shared_ptr<worker> std::__invoke_impl<seastar::shared_ptr<worker>, seastar::sharded<worker>::start<utils::cross_shard_barrier>(utils::cross_shard_barrier&&)::{lambda(unsigned int)#1}::operator()(unsigned int)::{lambda()#1}::operator()()::{lambda(utils::cross_shard_barrier)#1}, utils::cross_shard_barrier&>(std::__invoke_other, seastar::sharded<worker>::start<utils::cross_shard_barrier>(utils::cross_shard_barrier&&)::{lambda(unsigned int)#1}::operator()(unsigned int)::{lambda()#1}::operator()()::{lambda(utils::cross_shard_barrier)#1}&&, utils::cross_shard_barrier&) at /usr/lib/gcc/aarch64-redhat-linux/11/../../../../include/c++/11/bits/invoke.h:61
std::__invoke_result<seastar::sharded<worker>::start<utils::cross_shard_barrier>(utils::cross_shard_barrier&&)::{lambda(unsigned int)#1}::operator()(unsigned int)::{lambda()#1}::operator()()::{lambda(utils::cross_shard_barrier)#1}, utils::cross_shard_barrier&>::type std::__invoke<seastar::sharded<worker>::start<utils::cross_shard_barrier>(utils::cross_shard_barrier&&)::{lambda(unsigned int)#1}::operator()(unsigned int)::{lambda()#1}::operator()()::{lambda(utils::cross_shard_barrier)#1}, utils::cross_shard_barrier&>(seastar::sharded<worker>::start<utils::cross_shard_barrier>(utils::cross_shard_barrier&&)::{lambda(unsigned int)#1}::operator()(unsigned int)::{lambda()#1}::operator()()::{lambda(utils::cross_shard_barrier)#1}&&, (utils::cross_shard_barrier&)...) at /usr/lib/gcc/aarch64-redhat-linux/11/../../../../include/c++/11/bits/invoke.h:96
decltype(auto) std::__apply_impl<seastar::sharded<worker>::start<utils::cross_shard_barrier>(utils::cross_shard_barrier&&)::{lambda(unsigned int)#1}::operator()(unsigned int)::{lambda()#1}::operator()()::{lambda(utils::cross_shard_barrier)#1}, std::tuple<utils::cross_shard_barrier>&, 0ul>(seastar::sharded<worker>::start<utils::cross_shard_barrier>(utils::cross_shard_barrier&&)::{lambda(unsigned int)#1}::operator()(unsigned int)::{lambda()#1}::operator()()::{lambda(utils::cross_shard_barrier)#1}&&, std::tuple<utils::cross_shard_barrier>&, std::integer_sequence<unsigned long, 0ul>) at /usr/lib/gcc/aarch64-redhat-linux/11/../../../../include/c++/11/tuple:1858
decltype(auto) std::apply<seastar::sharded<worker>::start<utils::cross_shard_barrier>(utils::cross_shard_barrier&&)::{lambda(unsigned int)#1}::operator()(unsigned int)::{lambda()#1}::operator()()::{lambda(utils::cross_shard_barrier)#1}, std::tuple<utils::cross_shard_barrier>&>(seastar::sharded<worker>::start<utils::cross_shard_barrier>(utils::cross_shard_barrier&&)::{lambda(unsigned int)#1}::operator()(unsigned int)::{lambda()#1}::operator()()::{lambda(utils::cross_shard_barrier)#1}&&, std::tuple<utils::cross_shard_barrier>&) at /usr/lib/gcc/aarch64-redhat-linux/11/../../../../include/c++/11/tuple:1869
operator() at ././seastar/include/seastar/core/sharded.hh:594
seastar::future<void> seastar::futurize<void>::invoke<seastar::sharded<worker>::start<utils::cross_shard_barrier>(utils::cross_shard_barrier&&)::{lambda(unsigned int)#1}::operator()(unsigned int)::{lambda()#1}>(seastar::sharded<worker>::start<utils::cross_shard_barrier>(utils::cross_shard_barrier&&)::{lambda(unsigned int)#1}::operator()(unsigned int)::{lambda()#1}&&) at ././seastar/include/seastar/core/future.hh:2146
seastar::futurize<std::invoke_result<seastar::sharded<worker>::start<utils::cross_shard_barrier>(utils::cross_shard_barrier&&)::{lambda(unsigned int)#1}::operator()(unsigned int)::{lambda()#1}>::type>::type seastar::smp::submit_to<seastar::sharded<worker>::start<utils::cross_shard_barrier>(utils::cross_shard_barrier&&)::{lambda(unsigned int)#1}::operator()(unsigned int)::{lambda()#1}>(unsigned int, seastar::smp_submit_to_options, seastar::futurize&&) at ././seastar/include/seastar/core/smp.hh:342
seastar::futurize<std::invoke_result<seastar::sharded<worker>::start<utils::cross_shard_barrier>(utils::cross_shard_barrier&&)::{lambda(unsigned int)#1}::operator()(unsigned int)::{lambda()#1}>::type>::type seastar::smp::submit_to<seastar::sharded<worker>::start<utils::cross_shard_barrier>(utils::cross_shard_barrier&&)::{lambda(unsigned int)#1}::operator()(unsigned int)::{lambda()#1}>(unsigned int, seastar::futurize&&) at ././seastar/include/seastar/core/smp.hh:376
operator() at ././seastar/include/seastar/core/sharded.hh:593
seastar::future<void> std::__invoke_impl<seastar::future<void>, seastar::sharded<worker>::start<utils::cross_shard_barrier>(utils::cross_shard_barrier&&)::{lambda(unsigned int)#1}&, unsigned int>(std::__invoke_other, seastar::sharded<worker>::start<utils::cross_shard_barrier>(utils::cross_shard_barrier&&)::{lambda(unsigned int)#1}&, unsigned int&&) at /usr/lib/gcc/aarch64-redhat-linux/11/../../../../include/c++/11/bits/invoke.h:61
std::enable_if<is_invocable_r_v<seastar::future<void>, seastar::sharded<worker>::start<utils::cross_shard_barrier>(utils::cross_shard_barrier&&)::{lambda(unsigned int)#1}&, unsigned int>, std::enable_if>::type std::__invoke_r<seastar::future<void>, seastar::sharded<worker>::start<utils::cross_shard_barrier>(utils::cross_shard_barrier&&)::{lambda(unsigned int)#1}&, unsigned int>(seastar::future<void>&&, (seastar::sharded<worker>::start<utils::cross_shard_barrier>(utils::cross_shard_barrier&&)::{lambda(unsigned int)#1}&)...) at /usr/lib/gcc/aarch64-redhat-linux/11/../../../../include/c++/11/bits/invoke.h:114
std::_Function_handler<seastar::future<void> (unsigned int), seastar::sharded<worker>::start<utils::cross_shard_barrier>(utils::cross_shard_barrier&&)::{lambda(unsigned int)#1}>::_M_invoke(std::_Any_data const&, unsigned int&&) at /usr/lib/gcc/aarch64-redhat-linux/11/../../../../include/c++/11/bits/std_function.h:290
std::function<seastar::future<void> (unsigned int)>::operator()(unsigned int) const at /usr/lib/gcc/aarch64-redhat-linux/11/../../../../include/c++/11/bits/std_function.h:590
seastar::future<void> seastar::futurize<seastar::future<void> >::invoke<std::function<seastar::future<void> (unsigned int)>, unsigned int>(std::function<seastar::future<void> (unsigned int)>&&, unsigned int&&) at ./build/debug/seastar/./seastar/include/seastar/core/future.hh:2149
auto seastar::futurize_invoke<std::function<seastar::future<void> (unsigned int)>, unsigned int>(std::function<seastar::future<void> (unsigned int)>&&, unsigned int&&) at ./build/debug/seastar/./seastar/include/seastar/core/future.hh:2180
seastar::future<void> seastar::parallel_for_each<boost::range_detail::integer_iterator<unsigned int>, boost::range_detail::integer_iterator<unsigned int>, std::function<seastar::future<void> (unsigned int)> >(boost::range_detail::integer_iterator<unsigned int>, boost::range_detail::integer_iterator<unsigned int>, std::function<seastar::future<void> (unsigned int)>&&) at ./build/debug/seastar/./seastar/include/seastar/core/loop.hh:566
seastar::future<void> seastar::internal::parallel_for_each_impl<boost::integer_range<unsigned int>, std::function<seastar::future<void> (unsigned int)> >(boost::integer_range<unsigned int>&&, std::function<seastar::future<void> (unsigned int)>&&) at ./build/debug/seastar/./seastar/include/seastar/core/loop.hh:616
seastar::future<void> seastar::futurize<seastar::future<void> >::invoke<seastar::future<void> (*&)(boost::integer_range<unsigned int>&&, std::function<seastar::future<void> (unsigned int)>&&), boost::integer_range<unsigned int>, std::function<seastar::future<void> (unsigned int)> >(seastar::future<void> (*&)(boost::integer_range<unsigned int>&&, std::function<seastar::future<void> (unsigned int)>&&), boost::integer_range<unsigned int>&&, std::function<seastar::future<void> (unsigned int)>&&) at ./build/debug/seastar/./seastar/include/seastar/core/future.hh:2149
auto seastar::futurize_invoke<seastar::future<void> (*&)(boost::integer_range<unsigned int>&&, std::function<seastar::future<void> (unsigned int)>&&), boost::integer_range<unsigned int>, std::function<seastar::future<void> (unsigned int)> >(seastar::future<void> (*&)(boost::integer_range<unsigned int>&&, std::function<seastar::future<void> (unsigned int)>&&), boost::integer_range<unsigned int>&&, std::function<seastar::future<void> (unsigned int)>&&) at ./build/debug/seastar/./seastar/include/seastar/core/future.hh:2180
seastar::future<void> seastar::parallel_for_each<boost::integer_range<unsigned int>, std::function<seastar::future<void> (unsigned int)> >(boost::integer_range<unsigned int>&&, std::function<seastar::future<void> (unsigned int)>&&) at ./build/debug/seastar/./seastar/include/seastar/core/loop.hh:631
seastar::internal::sharded_parallel_for_each(unsigned int, std::function<seastar::future<void> (unsigned int)>) at ./build/debug/seastar/./seastar/src/core/sharded.cc:33
seastar::sharded<worker>::sharded_parallel_for_each(std::function<seastar::future<void> (unsigned int)>) at ././seastar/include/seastar/core/sharded.hh:160
seastar::future<void> seastar::sharded<worker>::start<utils::cross_shard_barrier>(utils::cross_shard_barrier&&) at ././seastar/include/seastar/core/sharded.hh:591
operator() at ./test/unit/cross_shard_barrier_test.cc:103
void std::__invoke_impl<void, main::$_0::operator()() const::{lambda()#1}>(std::__invoke_other, main::$_0::operator()() const::{lambda()#1}&&) at /usr/lib/gcc/aarch64-redhat-linux/11/../../../../include/c++/11/bits/invoke.h:61
Thread T1 (reactor-1) created by T0 here:
    #0 0xad548a8  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0xad548a8)
    #1 0x1085f868  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0x1085f868)
    #2 0x1085f3bc  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0x1085f3bc)
    #3 0x10b721b0  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0x10b721b0)
    #4 0x10b70f10  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0x10b70f10)
    #5 0x10b7143c  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0x10b7143c)
    #6 0x10a018a8  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0x10a018a8)
    #7 0x108e7524  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0x108e7524)
    #8 0x108ec104  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0x108ec104)
    #9 0x1070ad48  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0x1070ad48)
    #10 0x10709430  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0x10709430)
    #11 0x1070b760  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0x1070b760)
    #12 0xae0ac5c  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0xae0ac5c)
    #13 0xffff9ad31b18  (/lib64/libc.so.6+0x24b18)
    #14 0xad3e78c  (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0xad3e78c)

SUMMARY: AddressSanitizer: heap-use-after-free (/jenkins/workspace/scylla-master/build/scylla/build/debug/test/unit/cross_shard_barrier_test+0xae39724) 
Shadow bytes around the buggy address:
  0x200ff19e4dd0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x200ff19e4de0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x200ff19e4df0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x200ff19e4e00: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x200ff19e4e10: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
=>0x200ff19e4e20: fd fd fd fd[fd]fd fd fd fd fd fd fd fd fd fd fd
  0x200ff19e4e30: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd
  0x200ff19e4e40: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd
  0x200ff19e4e50: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd
  0x200ff19e4e60: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd
  0x200ff19e4e70: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd
Shadow byte legend (one shadow byte represents 8 application bytes):
  Addressable:           00
  Partially addressable: 01 02 03 04 05 06 07 
  Heap left redzone:       fa
  Freed heap region:       fd
  Stack left redzone:      f1
  Stack mid redzone:       f2
  Stack right redzone:     f3
  Stack after return:      f5
  Stack use after scope:   f8
  Global redzone:          f9
  Global init order:       f6
  Poisoned by user:        f7
  Container overflow:      fc
  Array cookie:            ac
  Intra object redzone:    bb
  ASan internal:           fe
  Left alloca redzone:     ca
  Right alloca redzone:    cb
  Shadow gap:              cc
==16825==ABORTING
Aborting on shard 1.
Backtrace:
  0xad83237
  0x10a210fb
  0x10a20d63
  0x108adcf3
  0x108d185b
  0x109a246b
  0x109a262f
  0x109a24e7
  linux-vdso.so.1+0x5e7
  /lib64/libc.so.6+0x3874f
  /lib64/libc.so.6+0x247db
  0xadf4157
  0xadf2377
  0xadd92eb
  0xadd8d03
  0xadd9ab7
  0xae39727
  0xae396a3
  0xae390d7
  0xae3b47f
  0xae3aadb
  0xae3d397
  0x108c6f97
  0x108cc5cb
  0x108d01e7
  0x109a4a3f
  0x109a36ef
  0x109a346b
  0x109a2997
  0xb0b27f7
  0x1085f1bf
  /lib64/libpthread.so.0+0x8007
  /lib64/libc.so.6+0xda5db
=== TEST.PY SUMMARY START ===
Test exited with code -6

=== TEST.PY SUMMARY END ===
@bhalevy
Copy link
Member Author

bhalevy commented Aug 17, 2022

@xemul I'm not sure if the bug is it the cross-shard barrier itself or in the test.

@bhalevy
Copy link
Member Author

bhalevy commented Sep 8, 2022

It looks like the test worker doesn't "close" the cross_shard_barrier before it's destroyed.
Now, the cross_shard_barrier doesn't have a close method, is complete() supposed to leave the barrier ready for destroy?

@xemul
Copy link
Contributor

xemul commented Sep 15, 2022

It's cross_shard_barrier::abort() leaves background fiber behind

@xemul
Copy link
Contributor

xemul commented Sep 15, 2022

Yup, reproduced it with artificial delay in abort's completion fiber

@xemul
Copy link
Contributor

xemul commented Sep 15, 2022

Normally it doesn't happen, because c.s.b.'s completion invoke-on-all is queued before worker's stop calls. But debug-mode re-orders the queue

xemul added a commit to xemul/scylla that referenced this issue Sep 15, 2022
When cross-shard barrier is abort()-ed it spawns a background fiber
that will wake-up other shards (if they are sleeping) with exception.

This fiber is implicitly waited by the owning sharded service .stop,
because barrier usage is like this:

    sharded<service> s;
    co_await s.invoke_on_all([] {
        ...
        barrier.abort();
    });
    ...
    co_await s.stop();

If abort happens, the invoke_on_all() will only resolve _after_ it
queues up the waking lambdas into smp queues, thus the subseqent stop
will queue its stopping lambdas after barrier's ones.

However, in debug mode the queue can be shuffled, so the owning service
can suddenly be freed from under the barrier's feet causing use after
free. Fortunately, this can be easily fixed by capturing the shared
pointer on the shared barrier instead of a regular pointer on the
shard-local barrier.

fixes: scylladb#11303

Signed-off-by: Pavel Emelyanov <xemul@scylladb.com>
@avikivity
Copy link
Member

Not sure whether to backport or not. @xemul please backport or not (and explain why).

xemul added a commit that referenced this issue Oct 3, 2022
When cross-shard barrier is abort()-ed it spawns a background fiber
that will wake-up other shards (if they are sleeping) with exception.

This fiber is implicitly waited by the owning sharded service .stop,
because barrier usage is like this:

    sharded<service> s;
    co_await s.invoke_on_all([] {
        ...
        barrier.abort();
    });
    ...
    co_await s.stop();

If abort happens, the invoke_on_all() will only resolve _after_ it
queues up the waking lambdas into smp queues, thus the subseqent stop
will queue its stopping lambdas after barrier's ones.

However, in debug mode the queue can be shuffled, so the owning service
can suddenly be freed from under the barrier's feet causing use after
free. Fortunately, this can be easily fixed by capturing the shared
pointer on the shared barrier instead of a regular pointer on the
shard-local barrier.

fixes: #11303

Signed-off-by: Pavel Emelyanov <xemul@scylladb.com>

Closes #11553
@DoronArazii DoronArazii added this to the 5.2 milestone Nov 16, 2022
@avikivity
Copy link
Member

@xemul ^

@xemul
Copy link
Contributor

xemul commented Mar 9, 2023

Not needed:
5.1 has the fix
5.0 doesn't have cross_shard_barrier::abort()

@avikivity
Copy link
Member

Removing label per above.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

5 participants