sstables_manager: start a fiber to reload components

Start a fiber that gets notified whenever an sstable gets deleted. The
fiber doesn't do anything yet but the following patch will add support
to reload reclaimed components if there is sufficient memory.

Signed-off-by: Lakshmi Narayanan Sreethar <lakshmi.sreethar@scylladb.com>
(cherry picked from commit f758d7b114)
This commit is contained in:
Lakshmi Narayanan Sreethar
2024-04-03 20:29:30 +05:30
parent 3933fc25de
commit d8e0cba45d
2 changed files with 21 additions and 0 deletions

View File

@@ -35,6 +35,7 @@ sstables_manager::sstables_manager(
, _dir_semaphore(dir_sem)
, _resolve_host_id(std::move(resolve_host_id))
{
_components_reloader_status = components_reloader_fiber();
}
sstables_manager::~sstables_manager() {
@@ -162,6 +163,17 @@ void sstables_manager::increment_total_reclaimable_memory_and_maybe_reclaim(ssta
smlogger.info("Reclaimed {} bytes of memory from SSTable components. Total memory reclaimed so far is {} bytes", memory_reclaimed, _total_memory_reclaimed);
}
future<> sstables_manager::components_reloader_fiber() {
sstlog.trace("components_reloader_fiber start");
while (true) {
co_await _sstable_deleted_event.when();
if (_closing) {
co_return;
}
}
}
void sstables_manager::add(sstable* sst) {
_active.push_back(*sst);
}
@@ -187,6 +199,7 @@ void sstables_manager::deactivate(sstable* sst) {
void sstables_manager::remove(sstable* sst) {
_undergoing_close.erase(_undergoing_close.iterator_to(*sst));
delete sst;
_sstable_deleted_event.signal();
maybe_done();
}
@@ -214,6 +227,9 @@ future<> sstables_manager::close() {
maybe_done();
co_await _done.get_future();
co_await _sstable_metadata_concurrency_sem.stop();
// stop the components reload fiber
_sstable_deleted_event.signal();
co_await std::move(_components_reloader_status);
}
void sstables_manager::plug_system_keyspace(db::system_keyspace& sys_ks) noexcept {

View File

@@ -108,6 +108,9 @@ private:
size_t _total_memory_reclaimed{0};
// Set of sstables from which memory has been reclaimed
set_type _reclaimed;
// Condition variable that gets notified when an sstable is deleted
seastar::condition_variable _sstable_deleted_event;
future<> _components_reloader_status = make_ready_future<>();
bool _closing = false;
promise<> _done;
@@ -191,6 +194,8 @@ private:
// memory and if the total memory usage exceeds the pre-defined threshold,
// reclaim it from the SSTable that has the most reclaimable memory.
void increment_total_reclaimable_memory_and_maybe_reclaim(sstable* sst);
// Fiber to reload reclaimed components back into memory when memory becomes available.
future<> components_reloader_fiber();
private:
db::large_data_handler& get_large_data_handler() const {
return _large_data_handler;