From: simon gao Date: Mon, 11 Nov 2019 00:16:59 +0000 (-0500) Subject: osd:modify conf, timeout & suicide timeout, of workqueue at runtime to avoid restarti... X-Git-Tag: v17.1.0~2572^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=eab63a640dd1c0cfab83c70e2255e660a9f0eef8;p=ceph.git osd:modify conf, timeout & suicide timeout, of workqueue at runtime to avoid restarting osd Signed-off-by: simon gao --- diff --git a/src/common/WorkQueue.h b/src/common/WorkQueue.h index 8e9ee405d064..bb9e1b66b633 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 dc304659b180..5e9533932ddd 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 0b3daeb05558..5995015addc7 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(); +}