Fixes #9955 In #9348 we handled the problem of failing to delete segment files on disk, and the need to recompute disk footprint to keep data flow consistent across intermittent failures. However, because _reserve_segments and _recycled_segments are queues, we have to empty them to inspect the contents. One would think it is ok for these queues to be empty for a while, whilst we do some recaclulating, including disk listing -> continuation switching. But then one (i.e. I) misses the fact that these queues use the pop_eventually mechanism, which does _not_ handle a scenario where we push something into an empty queue, thus triggering the future that resumes a waiting task, but then pop the element immediately, before the waiting task is run. In fact, _iff_ one does this, not only will things break, they will in fact start creating undefined behaviour, because the underlying std::queue<T, circular_buffer> will _not_ do any bounds checks on the pop/push operations -> we will pop an empty queue, immediately making it non-empty, but using undefined memory (with luck null/zeroes). Strictly speakging, seastar::queue::pop_eventually should be fixed to handle the scenario, but nontheless we can fix the usage here as well, by simply copy objects and do the calculation "in background" while we potentially start popping queue again. Closes #9966
102 KiB
102 KiB