diff --git a/test/boost/database_test.cc b/test/boost/database_test.cc index 6477a2f745..a7e71d1da7 100644 --- a/test/boost/database_test.cc +++ b/test/boost/database_test.cc @@ -1615,7 +1615,7 @@ SEASTAR_TEST_CASE(test_disk_space_monitor_capacity_override) { .free = 12, .available = 11, }; - monitor.set_space_source([&] { return make_ready_future(orig_space); }); + auto reg = monitor.set_space_source([&] { return make_ready_future(orig_space); }); utils::phased_barrier poll_barrier("poll_barrier"); // new operation started whenever monitor calls listeners. auto op = poll_barrier.start(); diff --git a/utils/disk_space_monitor.cc b/utils/disk_space_monitor.cc index 92b8a8c797..79d6eba0d0 100644 --- a/utils/disk_space_monitor.cc +++ b/utils/disk_space_monitor.cc @@ -43,6 +43,16 @@ disk_space_monitor::~disk_space_monitor() { SCYLLA_ASSERT(_poller_fut.available()); } +disk_space_monitor::space_source_registration::space_source_registration(disk_space_monitor& m) + : _monitor(m) + , _prev_space_source(m._space_source) +{ +} + +disk_space_monitor::space_source_registration::~space_source_registration() { + _monitor._space_source = _prev_space_source; +} + future<> disk_space_monitor::start() { _space_info = co_await get_filesystem_space(); _poller_fut = poll(); diff --git a/utils/disk_space_monitor.hh b/utils/disk_space_monitor.hh index d52f56030c..d5317d64af 100644 --- a/utils/disk_space_monitor.hh +++ b/utils/disk_space_monitor.hh @@ -80,9 +80,22 @@ public: signal_connection_type listen(signal_callback_type callback); + // Registers a new space source function and returns an object that + // restores the previous one when it goes out of scope. + class space_source_registration { + disk_space_monitor& _monitor; + space_source_fn _prev_space_source; + public: + space_source_registration(disk_space_monitor& m); + + ~space_source_registration(); + }; + // Replaces default way of obtaining file system usage information. - void set_space_source(space_source_fn space_source) { + space_source_registration set_space_source(space_source_fn space_source) { + auto ret = space_source_registration(*this); _space_source = std::move(space_source); + return ret; } void trigger_poll() noexcept; @@ -93,6 +106,8 @@ private: future get_filesystem_space(); clock_type::duration get_polling_interval() const noexcept; + + friend class space_source_registration; }; } // namespace utils