From 07d460c17c57ebfee69eddadd98ad3eabd035f6b Mon Sep 17 00:00:00 2001 From: myoungwon oh Date: Fri, 15 Sep 2017 22:30:23 +0900 Subject: [PATCH] osd: generalize PGSrub, PGRecovery, PGSnapTrim This commit will allow PGScrub, PGRecovery, PGSnapTrim to be created anywhere (e.g. TestMClockClientQueue.cc) Signed-off-by: Myoungwon Oh --- src/osd/OSD.cc | 68 ------------------- src/osd/OSD.h | 1 + src/osd/OpQueueItem.cc | 23 +++++++ src/osd/OpQueueItem.h | 93 ++++++++++++++++++-------- src/test/osd/CMakeLists.txt | 4 +- src/test/osd/TestMClockClientQueue.cc | 41 ++++++------ src/test/osd/TestMClockOpClassQueue.cc | 37 +++++----- 7 files changed, 127 insertions(+), 140 deletions(-) diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index edf05b4d2e3..39404f7ddb0 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -1691,26 +1691,6 @@ void OSDService::queue_for_peering(PG *pg) void OSDService::queue_for_snap_trim(PG *pg) { - class PGSnapTrim : public PGOpQueueable { - epoch_t epoch_queued; - public: - PGSnapTrim( - spg_t pg, - epoch_t epoch_queued) - : PGOpQueueable(pg), epoch_queued(epoch_queued) {} - op_type_t get_op_type() const override final { - return op_type_t::bg_snaptrim; - } - ostream &print(ostream &rhs) const override final { - return rhs << "PGSnapTrim(pgid=" << get_pgid() - << "epoch_queued=" << epoch_queued - << ")"; - } - void run( - OSD *osd, PGRef& pg, ThreadPool::TPHandle &handle) override final { - pg->snap_trimmer(epoch_queued); - } - }; dout(10) << "queueing " << *pg << " for snaptrim" << dendl; enqueue_back( OpQueueItem( @@ -1725,26 +1705,6 @@ void OSDService::queue_for_snap_trim(PG *pg) void OSDService::queue_for_scrub(PG *pg, bool with_high_priority) { - class PGScrub : public PGOpQueueable { - epoch_t epoch_queued; - public: - PGScrub( - spg_t pg, - epoch_t epoch_queued) - : PGOpQueueable(pg), epoch_queued(epoch_queued) {} - op_type_t get_op_type() const override final { - return op_type_t::bg_scrub; - } - ostream &print(ostream &rhs) const override final { - return rhs << "PGScrub(pgid=" << get_pgid() - << "epoch_queued=" << epoch_queued - << ")"; - } - void run( - OSD *osd, PGRef& pg, ThreadPool::TPHandle &handle) override final { - pg->scrub(epoch_queued, handle); - } - }; unsigned scrub_queue_priority = pg->scrubber.priority; if (with_high_priority && scrub_queue_priority < cct->_conf->osd_client_op_priority) { scrub_queue_priority = cct->_conf->osd_client_op_priority; @@ -1764,34 +1724,6 @@ void OSDService::_queue_for_recovery( std::pair p, uint64_t reserved_pushes) { - class PGRecovery : public PGOpQueueable { - epoch_t epoch_queued; - uint64_t reserved_pushes; - public: - PGRecovery( - spg_t pg, - epoch_t epoch_queued, - uint64_t reserved_pushes) - : PGOpQueueable(pg), - epoch_queued(epoch_queued), - reserved_pushes(reserved_pushes) {} - op_type_t get_op_type() const override final { - return op_type_t::bg_recovery; - } - virtual ostream &print(ostream &rhs) const override final { - return rhs << "PGRecovery(pgid=" << get_pgid() - << "epoch_queued=" << epoch_queued - << "reserved_pushes=" << reserved_pushes - << ")"; - } - virtual uint64_t get_reserved_pushes() const override final { - return reserved_pushes; - } - virtual void run( - OSD *osd, PGRef& pg, ThreadPool::TPHandle &handle) override final { - osd->do_recovery(pg.get(), epoch_queued, reserved_pushes, handle); - } - }; assert(recovery_lock.is_locked_by_me()); enqueue_back( OpQueueItem( diff --git a/src/osd/OSD.h b/src/osd/OSD.h index 2df4ad6e87e..4895bcbdab4 100644 --- a/src/osd/OSD.h +++ b/src/osd/OSD.h @@ -1593,6 +1593,7 @@ private: * and already requeued the items. */ friend class PGOpItem; + friend class PGRecovery; class ShardedOpWQ : public ShardedThreadPool::ShardedWQ diff --git a/src/osd/OpQueueItem.cc b/src/osd/OpQueueItem.cc index 02bd1672771..90d256f21c1 100644 --- a/src/osd/OpQueueItem.cc +++ b/src/osd/OpQueueItem.cc @@ -21,3 +21,26 @@ void PGOpItem::run(OSD *osd, { osd->dequeue_op(pg, op, handle); } + +void PGSnapTrim::run(OSD *osd, + PGRef& pg, + ThreadPool::TPHandle &handle) +{ + pg->snap_trimmer(epoch_queued); +} + +void PGScrub::run(OSD *osd, + PGRef& pg, + ThreadPool::TPHandle &handle) +{ + pg->scrub(epoch_queued, handle); +} + +void PGRecovery::run(OSD *osd, + PGRef& pg, + ThreadPool::TPHandle &handle) +{ + osd->do_recovery(pg.get(), epoch_queued, reserved_pushes, handle); +} + + diff --git a/src/osd/OpQueueItem.h b/src/osd/OpQueueItem.h index 212be71c96a..457c9ee4b47 100644 --- a/src/osd/OpQueueItem.h +++ b/src/osd/OpQueueItem.h @@ -25,34 +25,6 @@ class OSD; - -struct PGScrub { - epoch_t epoch_queued; - explicit PGScrub(epoch_t e) : epoch_queued(e) {} - ostream &operator<<(ostream &rhs) { - return rhs << "PGScrub"; - } -}; - -struct PGSnapTrim { - epoch_t epoch_queued; - explicit PGSnapTrim(epoch_t e) : epoch_queued(e) {} - ostream &operator<<(ostream &rhs) { - return rhs << "PGSnapTrim"; - } -}; - -struct PGRecovery { - epoch_t epoch_queued; - uint64_t reserved_pushes; - PGRecovery(epoch_t e, uint64_t reserved_pushes) - : epoch_queued(e), reserved_pushes(reserved_pushes) {} - ostream &operator<<(ostream &rhs) { - return rhs << "PGRecovery(epoch=" << epoch_queued - << ", reserved_pushes: " << reserved_pushes << ")"; - } -}; - class OpQueueItem { public: class OrderLocker { @@ -213,3 +185,68 @@ public: } void run(OSD *osd, PGRef& pg, ThreadPool::TPHandle &handle) override final; }; + +class PGSnapTrim : public PGOpQueueable { + epoch_t epoch_queued; +public: + PGSnapTrim( + spg_t pg, + epoch_t epoch_queued) + : PGOpQueueable(pg), epoch_queued(epoch_queued) {} + op_type_t get_op_type() const override final { + return op_type_t::bg_snaptrim; + } + ostream &print(ostream &rhs) const override final { + return rhs << "PGSnapTrim(pgid=" << get_pgid() + << "epoch_queued=" << epoch_queued + << ")"; + } + void run( + OSD *osd, PGRef& pg, ThreadPool::TPHandle &handle) override final; +}; + +class PGScrub : public PGOpQueueable { + epoch_t epoch_queued; +public: + PGScrub( + spg_t pg, + epoch_t epoch_queued) + : PGOpQueueable(pg), epoch_queued(epoch_queued) {} + op_type_t get_op_type() const override final { + return op_type_t::bg_scrub; + } + ostream &print(ostream &rhs) const override final { + return rhs << "PGScrub(pgid=" << get_pgid() + << "epoch_queued=" << epoch_queued + << ")"; + } + void run( + OSD *osd, PGRef& pg, ThreadPool::TPHandle &handle) override final; +}; + +class PGRecovery : public PGOpQueueable { + epoch_t epoch_queued; + uint64_t reserved_pushes; +public: + PGRecovery( + spg_t pg, + epoch_t epoch_queued, + uint64_t reserved_pushes) + : PGOpQueueable(pg), + epoch_queued(epoch_queued), + reserved_pushes(reserved_pushes) {} + op_type_t get_op_type() const override final { + return op_type_t::bg_recovery; + } + virtual ostream &print(ostream &rhs) const override final { + return rhs << "PGRecovery(pgid=" << get_pgid() + << "epoch_queued=" << epoch_queued + << "reserved_pushes=" << reserved_pushes + << ")"; + } + virtual uint64_t get_reserved_pushes() const override final { + return reserved_pushes; + } + virtual void run( + OSD *osd, PGRef& pg, ThreadPool::TPHandle &handle) override final; +}; diff --git a/src/test/osd/CMakeLists.txt b/src/test/osd/CMakeLists.txt index 3d5af54c222..64639d5ec8e 100644 --- a/src/test/osd/CMakeLists.txt +++ b/src/test/osd/CMakeLists.txt @@ -103,7 +103,7 @@ add_executable(unittest_mclock_op_class_queue ) add_ceph_unittest(unittest_mclock_op_class_queue) target_link_libraries(unittest_mclock_op_class_queue - global osd dmclock + global osd dmclock os ) # unittest_mclock_client_queue @@ -112,5 +112,5 @@ add_executable(unittest_mclock_client_queue ) add_ceph_unittest(unittest_mclock_client_queue) target_link_libraries(unittest_mclock_client_queue - global osd dmclock + global osd dmclock os ) diff --git a/src/test/osd/TestMClockClientQueue.cc b/src/test/osd/TestMClockClientQueue.cc index afdec02eb53..82490e594d2 100644 --- a/src/test/osd/TestMClockClientQueue.cc +++ b/src/test/osd/TestMClockClientQueue.cc @@ -43,22 +43,19 @@ public: #endif Request create_snaptrim(epoch_t e, uint64_t owner) { - return Request(spg_t(), - OpQueueItem(PGSnapTrim(e), + return Request(OpQueueItem(unique_ptr(new PGSnapTrim(spg_t(), e)), 12, 12, utime_t(), owner, e)); } Request create_scrub(epoch_t e, uint64_t owner) { - return Request(spg_t(), - OpQueueItem(PGScrub(e), + return Request(OpQueueItem(unique_ptr(new PGScrub(spg_t(), e)), 12, 12, utime_t(), owner, e)); } Request create_recovery(epoch_t e, uint64_t owner) { - return Request(spg_t(), - OpQueueItem(PGRecovery(e, 64), + return Request(OpQueueItem(unique_ptr(new PGRecovery(spg_t(), e, 64)), 12, 12, utime_t(), owner, e)); } @@ -116,21 +113,21 @@ TEST_F(MClockClientQueueTest, TestEnqueue) { q.enqueue(client1, 12, 0, create_snaptrim(104, client1)); Request r = q.dequeue(); - ASSERT_EQ(100u, r.second.get_map_epoch()); + ASSERT_EQ(100u, r.get_map_epoch()); r = q.dequeue(); - ASSERT_EQ(101u, r.second.get_map_epoch()); + ASSERT_EQ(101u, r.get_map_epoch()); r = q.dequeue(); - ASSERT_EQ(103u, r.second.get_map_epoch()); + ASSERT_EQ(103u, r.get_map_epoch()); r = q.dequeue(); - ASSERT_TRUE(r.second.get_map_epoch() == 102u || - r.second.get_map_epoch() == 104u); + ASSERT_TRUE(r.get_map_epoch() == 102u || + r.get_map_epoch() == 104u); r = q.dequeue(); - ASSERT_TRUE(r.second.get_map_epoch() == 102u || - r.second.get_map_epoch() == 104u); + ASSERT_TRUE(r.get_map_epoch() == 102u || + r.get_map_epoch() == 104u); } @@ -142,19 +139,19 @@ TEST_F(MClockClientQueueTest, TestEnqueueStrict) { q.enqueue_strict(client1, 15, create_snaptrim(104, client1)); Request r = q.dequeue(); - ASSERT_EQ(102u, r.second.get_map_epoch()); + ASSERT_EQ(102u, r.get_map_epoch()); r = q.dequeue(); - ASSERT_EQ(104u, r.second.get_map_epoch()); + ASSERT_EQ(104u, r.get_map_epoch()); r = q.dequeue(); - ASSERT_EQ(103u, r.second.get_map_epoch()); + ASSERT_EQ(103u, r.get_map_epoch()); r = q.dequeue(); - ASSERT_EQ(101u, r.second.get_map_epoch()); + ASSERT_EQ(101u, r.get_map_epoch()); r = q.dequeue(); - ASSERT_EQ(100u, r.second.get_map_epoch()); + ASSERT_EQ(100u, r.get_map_epoch()); } @@ -170,18 +167,18 @@ TEST_F(MClockClientQueueTest, TestRemoveByClass) { ASSERT_EQ(2u, filtered_out.size()); while (!filtered_out.empty()) { - auto e = filtered_out.front().second.get_map_epoch() ; + auto e = filtered_out.front().get_map_epoch() ; ASSERT_TRUE(e == 101 || e == 102); filtered_out.pop_front(); } ASSERT_EQ(3u, q.length()); Request r = q.dequeue(); - ASSERT_EQ(103u, r.second.get_map_epoch()); + ASSERT_EQ(103u, r.get_map_epoch()); r = q.dequeue(); - ASSERT_EQ(100u, r.second.get_map_epoch()); + ASSERT_EQ(100u, r.get_map_epoch()); r = q.dequeue(); - ASSERT_EQ(104u, r.second.get_map_epoch()); + ASSERT_EQ(104u, r.get_map_epoch()); } diff --git a/src/test/osd/TestMClockOpClassQueue.cc b/src/test/osd/TestMClockOpClassQueue.cc index d6fd8f46e81..1c9329cfdfa 100644 --- a/src/test/osd/TestMClockOpClassQueue.cc +++ b/src/test/osd/TestMClockOpClassQueue.cc @@ -45,22 +45,19 @@ public: #endif Request create_snaptrim(epoch_t e, uint64_t owner) { - return Request(spg_t(), - OpQueueItem(PGSnapTrim(e), + return Request(OpQueueItem(unique_ptr(new PGSnapTrim(spg_t(), e)), 12, 12, utime_t(), owner, e)); } Request create_scrub(epoch_t e, uint64_t owner) { - return Request(spg_t(), - OpQueueItem(PGScrub(e), + return Request(OpQueueItem(unique_ptr(new PGScrub(spg_t(), e)), 12, 12, utime_t(), owner, e)); } Request create_recovery(epoch_t e, uint64_t owner) { - return Request(spg_t(), - OpQueueItem(PGRecovery(e, 64), + return Request(OpQueueItem(unique_ptr(new PGRecovery(spg_t(), e, 64)), 12, 12, utime_t(), owner, e)); } @@ -118,19 +115,19 @@ TEST_F(MClockOpClassQueueTest, TestEnqueue) { q.enqueue(client1, 12, 0, create_snaptrim(104, client1)); Request r = q.dequeue(); - ASSERT_EQ(100u, r.second.get_map_epoch()); + ASSERT_EQ(100u, r.get_map_epoch()); r = q.dequeue(); - ASSERT_EQ(101u, r.second.get_map_epoch()); + ASSERT_EQ(101u, r.get_map_epoch()); r = q.dequeue(); - ASSERT_EQ(102u, r.second.get_map_epoch()); + ASSERT_EQ(102u, r.get_map_epoch()); r = q.dequeue(); - ASSERT_EQ(103u, r.second.get_map_epoch()); + ASSERT_EQ(103u, r.get_map_epoch()); r = q.dequeue(); - ASSERT_EQ(104u, r.second.get_map_epoch()); + ASSERT_EQ(104u, r.get_map_epoch()); } @@ -142,19 +139,19 @@ TEST_F(MClockOpClassQueueTest, TestEnqueueStrict) { q.enqueue_strict(client1, 15, create_snaptrim(104, client1)); Request r = q.dequeue(); - ASSERT_EQ(102u, r.second.get_map_epoch()); + ASSERT_EQ(102u, r.get_map_epoch()); r = q.dequeue(); - ASSERT_EQ(104u, r.second.get_map_epoch()); + ASSERT_EQ(104u, r.get_map_epoch()); r = q.dequeue(); - ASSERT_EQ(103u, r.second.get_map_epoch()); + ASSERT_EQ(103u, r.get_map_epoch()); r = q.dequeue(); - ASSERT_EQ(101u, r.second.get_map_epoch()); + ASSERT_EQ(101u, r.get_map_epoch()); r = q.dequeue(); - ASSERT_EQ(100u, r.second.get_map_epoch()); + ASSERT_EQ(100u, r.get_map_epoch()); } @@ -170,18 +167,18 @@ TEST_F(MClockOpClassQueueTest, TestRemoveByClass) { ASSERT_EQ(2u, filtered_out.size()); while (!filtered_out.empty()) { - auto e = filtered_out.front().second.get_map_epoch() ; + auto e = filtered_out.front().get_map_epoch() ; ASSERT_TRUE(e == 101 || e == 102); filtered_out.pop_front(); } ASSERT_EQ(3u, q.length()); Request r = q.dequeue(); - ASSERT_EQ(103u, r.second.get_map_epoch()); + ASSERT_EQ(103u, r.get_map_epoch()); r = q.dequeue(); - ASSERT_EQ(100u, r.second.get_map_epoch()); + ASSERT_EQ(100u, r.get_map_epoch()); r = q.dequeue(); - ASSERT_EQ(104u, r.second.get_map_epoch()); + ASSERT_EQ(104u, r.get_map_epoch()); } -- 2.39.5