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:
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user