From a08b640fa72bf603c8fd24cbe7700543a1a73cf5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Botond=20D=C3=A9nes?= Date: Mon, 2 Nov 2020 15:45:45 +0200 Subject: [PATCH] utils/large_bitset: use reserve_partial() to reserve _storage To avoid stalls when reserving memory for a large bloom filter. The filter creation already has a yielding loop for initialization, this patch extends it to reservation of memory too. --- utils/large_bitset.cc | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/utils/large_bitset.cc b/utils/large_bitset.cc index f72893236b..161ffef18f 100644 --- a/utils/large_bitset.cc +++ b/utils/large_bitset.cc @@ -30,8 +30,15 @@ using namespace seastar; large_bitset::large_bitset(size_t nr_bits) : _nr_bits(nr_bits) { assert(thread::running_in_thread()); - size_t nr_ints = align_up(nr_bits, bits_per_int()) / bits_per_int(); - _storage.reserve(nr_ints); + const size_t orig_nr_ints = align_up(nr_bits, bits_per_int()) / bits_per_int(); + auto nr_ints = orig_nr_ints; + while (nr_ints) { + nr_ints = _storage.reserve_partial(nr_ints); + if (need_preempt()) { + thread::yield(); + } + } + nr_ints = orig_nr_ints; while (nr_ints) { _storage.push_back(0); --nr_ints;