diff --git a/src/chasers/chaser_confirm.cpp b/src/chasers/chaser_confirm.cpp index 0ea9822c..f6ea898d 100644 --- a/src/chasers/chaser_confirm.cpp +++ b/src/chasers/chaser_confirm.cpp @@ -188,7 +188,7 @@ void chaser_confirm::reorganize(header_states& fork, size_t top, const auto& query = archive(); header_links popped{}; - while (top > fork_point) + while (top > fork_point && !closed()) { const auto link = query.to_confirmed(top); if (link.is_terminal()) @@ -223,6 +223,9 @@ void chaser_confirm::organize(header_states& fork, const header_links& popped, // Continue when suspended as write error terminates synchronous loop. for (const auto& state: fork) { + if (closed()) + return; + switch (state.ec.value()) { case database::error::bypassed: diff --git a/src/chasers/chaser_validate_batch.cpp b/src/chasers/chaser_validate_batch.cpp index dec1f32a..931a38c3 100644 --- a/src/chasers/chaser_validate_batch.cpp +++ b/src/chasers/chaser_validate_batch.cpp @@ -239,6 +239,7 @@ bool chaser_validate::mark_valids(bool startup) NOEXCEPT std::atomic_bool fault{}; constexpr auto parallel = poolstl::execution::par; + // Allow valids to drain when closed. std::for_each(parallel, batched_.cbegin(), batched_.cend(), [&](auto link) NOEXCEPT {