From: Matan Breizman Date: Tue, 7 Feb 2023 19:48:42 +0000 (+0000) Subject: crimson/osd/pg: Implement context_registry_on_change() X-Git-Tag: v19.0.0~1624^2~6 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=f468c673253e3fdd30677e424674f58a8affd963;p=ceph.git crimson/osd/pg: Implement context_registry_on_change() Signed-off-by: Matan Breizman --- diff --git a/src/crimson/osd/pg.cc b/src/crimson/osd/pg.cc index 352d88285ff2..52aee483560c 100644 --- a/src/crimson/osd/pg.cc +++ b/src/crimson/osd/pg.cc @@ -1426,6 +1426,7 @@ seastar::future<> PG::stop() void PG::on_change(ceph::os::Transaction &t) { logger().debug("{} {}:", *this, __func__); + context_registry_on_change(); obc_loader.notify_on_change(is_primary()); recovery_backend->on_peering_interval_change(t); backend->on_actingset_changed(is_primary()); @@ -1439,6 +1440,17 @@ void PG::on_change(ceph::os::Transaction &t) { } } +void PG::context_registry_on_change() { + obc_registry.for_each([](ObjectContextRef obc) { + assert(obc); + for (auto j = obc->watchers.begin(); + j != obc->watchers.end(); + j = obc->watchers.erase(j)) { + j->second->discard_state(); + } + }); +} + bool PG::can_discard_op(const MOSDOp& m) const { if ((m.get_flags() & (CEPH_OSD_FLAG_BALANCE_READS | CEPH_OSD_FLAG_LOCALIZE_READS)) diff --git a/src/crimson/osd/pg.h b/src/crimson/osd/pg.h index a98d67861db1..6d26f58748ff 100644 --- a/src/crimson/osd/pg.h +++ b/src/crimson/osd/pg.h @@ -744,6 +744,7 @@ private: bool can_discard_replica_op(const Message& m, epoch_t m_map_epoch) const; bool can_discard_op(const MOSDOp& m) const; + void context_registry_on_change(); bool is_missing_object(const hobject_t& soid) const { return peering_state.get_pg_log().get_missing().get_items().count(soid); } diff --git a/src/crimson/osd/watch.h b/src/crimson/osd/watch.h index 84c43b3fec40..e69fb4ca14e5 100644 --- a/src/crimson/osd/watch.h +++ b/src/crimson/osd/watch.h @@ -45,7 +45,6 @@ class Watch : public seastar::enable_shared_from_this { seastar::future<> start_notify(NotifyRef); seastar::future<> send_notify_msg(NotifyRef); seastar::future<> send_disconnect_msg(); - void discard_state(); void do_watch_timeout(Ref pg); friend Notify; @@ -77,6 +76,8 @@ public: } void got_ping(utime_t); + void discard_state(); + seastar::future<> remove(); /// Call when notify_ack received on notify_id