view_update_generator: Increase the registration_queue_size

When repair writes a sstable to disk, we check if the sstable needs view
update processing. If yes, the sstable will be placed into the staging
dir for processing, with the _registration_sem semaphore to prevent too
many pending unprocessed sstables.

We have seen multiple cases in the field where view update processing is
inefficient and way too slow which blocks the base table repair to
finish on time.

This patch increases the registration_queue_size to a bigger number to
mitigate the problem that slow view update processing blocks repair.

It is better to have a consistent base table + inconsistent view table
than inconsistent base table + inconsistent view table.

Currently, sstables in staging dir are not compacted. So we could not
increase the _registration_sem with too big number to avoid accumulate
too many sstables.

The view_build_test.cc is updated to make the test pass.

Closes #14241
This commit is contained in:
Asias He
2023-06-14 13:36:09 +08:00
committed by Botond Dénes
parent e8ee0a2f86
commit d3034e0fab
2 changed files with 12 additions and 12 deletions

View File

@@ -50,7 +50,7 @@ using wait_for_all_updates = bool_class<wait_for_all_updates_tag>;
class view_update_generator : public async_sharded_service<view_update_generator> {
public:
static constexpr size_t registration_queue_size = 5;
static constexpr size_t registration_queue_size = 100;
private:
replica::database& _db;

View File

@@ -464,17 +464,17 @@ SEASTAR_TEST_CASE(test_view_update_generator) {
BOOST_REQUIRE_EQUAL(view_update_generator.available_register_units(), db::view::view_update_generator::registration_queue_size);
parallel_for_each(ssts.begin(), ssts.begin() + 10, [&] (shared_sstable& sst) {
return view_update_generator.register_staging_sstable(sst, t);
}).get();
BOOST_REQUIRE_EQUAL(view_update_generator.available_register_units(), db::view::view_update_generator::registration_queue_size);
parallel_for_each(ssts.begin() + 10, ssts.end(), [&] (shared_sstable& sst) {
return view_update_generator.register_staging_sstable(sst, t);
}).get();
BOOST_REQUIRE_EQUAL(view_update_generator.available_register_units(), db::view::view_update_generator::registration_queue_size);
auto register_and_check_semaphore = [&view_update_generator, t] (std::vector<shared_sstable>::iterator b, std::vector<shared_sstable>::iterator e) {
std::vector<future<>> register_futures;
for (auto it = b; it != e; ++it) {
register_futures.emplace_back(view_update_generator.register_staging_sstable(*it, t));
}
const auto qsz = db::view::view_update_generator::registration_queue_size;
when_all(register_futures.begin(), register_futures.end()).get();
REQUIRE_EVENTUALLY_EQUAL(view_update_generator.available_register_units(), qsz);
};
register_and_check_semaphore(ssts.begin(), ssts.begin() + 10);
register_and_check_semaphore(ssts.begin() + 10, ssts.end());
auto select_by_p_id = e.prepare("SELECT * FROM t WHERE p = ?").get();
auto select_by_p_and_c_id = e.prepare("SELECT * FROM t WHERE p = ? and c = ?").get();