From eab63a640dd1c0cfab83c70e2255e660a9f0eef8 Mon Sep 17 00:00:00 2001 From: simon gao Date: Sun, 10 Nov 2019 19:16:59 -0500 Subject: [PATCH] osd:modify conf, timeout & suicide timeout, of workqueue at runtime to avoid restarting osd Signed-off-by: simon gao --- src/common/WorkQueue.h | 6 +++++ src/os/filestore/FileStore.cc | 8 +++++++ src/test/test_workqueue.cc | 41 +++++++++++++++++++++++++++++++++++ 3 files changed, 55 insertions(+) diff --git a/src/common/WorkQueue.h b/src/common/WorkQueue.h index 8e9ee405d06..bb9e1b66b63 100644 --- a/src/common/WorkQueue.h +++ b/src/common/WorkQueue.h @@ -97,6 +97,12 @@ protected: * so at most one copy will execute simultaneously for a given thread pool. * It can be used for non-thread-safe finalization. */ virtual void _void_process_finish(void *) = 0; + void set_timeout(time_t ti){ + timeout_interval = ceph::make_timespan(ti); + } + void set_suicide_timeout(time_t sti){ + suicide_interval = ceph::make_timespan(sti); + } }; // track thread pool size changes diff --git a/src/os/filestore/FileStore.cc b/src/os/filestore/FileStore.cc index dc304659b18..5e9533932dd 100644 --- a/src/os/filestore/FileStore.cc +++ b/src/os/filestore/FileStore.cc @@ -6092,6 +6092,8 @@ const char** FileStore::get_tracked_conf_keys() const "filestore_sloppy_crc", "filestore_sloppy_crc_block_size", "filestore_max_alloc_hint_size", + "filestore_op_thread_suicide_timeout", + "filestore_op_thread_timeout", NULL }; return KEYS; @@ -6160,6 +6162,12 @@ void FileStore::handle_conf_change(const ConfigProxy& conf, dump_stop(); } } + if (changed.count("filestore_op_thread_timeout")){ + op_wq.set_timeout(g_conf().get_val("filestore_op_thread_timeout")); + } + if (changed.count("filestore_op_thread_suicide_timeout")){ + op_wq.set_suicide_timeout(g_conf().get_val("filestore_op_thread_suicide_timeout")); + } } int FileStore::set_throttle_params() diff --git a/src/test/test_workqueue.cc b/src/test/test_workqueue.cc index 0b3daeb0555..5995015addc 100644 --- a/src/test/test_workqueue.cc +++ b/src/test/test_workqueue.cc @@ -53,3 +53,44 @@ TEST(WorkQueue, Resize) sleep(1); tp.stop(); } + +class twq : public ThreadPool::WorkQueue { +public: + twq(time_t timeout, time_t suicide_timeout, ThreadPool *tp) + : ThreadPool::WorkQueue("test_wq", ceph::make_timespan(timeout), ceph::make_timespan(suicide_timeout), tp) {} + + bool _enqueue(int* item) override { + return true; + } + void _dequeue(int* item) override { + ceph_abort(); + } + bool _empty() override { + return true; + } + int *_dequeue() override { + return nullptr; + } + void _process(int *osr, ThreadPool::TPHandle &handle) override { + } + void _process_finish(int *osr) override { + } + void _clear() override { + } +}; + +TEST(WorkQueue, change_timeout){ + ThreadPool tp(g_ceph_context, "bar", "tp_bar", 2, "filestore_op_threads"); + tp.start(); + twq wq(2, 20, &tp); + // check timeout and suicide + ASSERT_EQ(ceph::make_timespan(2), wq.timeout_interval); + ASSERT_EQ(ceph::make_timespan(20), wq.suicide_interval); + + // change the timeout and suicide and then check them + wq.set_timeout(4); + wq.set_suicide_timeout(40); + ASSERT_EQ(ceph::make_timespan(4), wq.timeout_interval); + ASSERT_EQ(ceph::make_timespan(40), wq.suicide_interval); + tp.stop(); +} -- 2.47.3