From d1a64471a25288b32c6dec8b57c197a7cfc013c2 Mon Sep 17 00:00:00 2001 From: Jason Volk Date: Sat, 7 Sep 2019 16:26:51 -0700 Subject: [PATCH] ircd::m::room::members: Move the present join optimization implementation from origins. --- include/ircd/m/room/members.h | 3 ++ ircd/m_room.cc | 73 +++++++++++++++++++++++------------ 2 files changed, 51 insertions(+), 25 deletions(-) diff --git a/include/ircd/m/room/members.h b/include/ircd/m/room/members.h index 9a9d347bf..fc7fdae1b 100644 --- a/include/ircd/m/room/members.h +++ b/include/ircd/m/room/members.h @@ -26,6 +26,9 @@ struct ircd::m::room::members m::room room; + bool for_each_join_present(const closure &) const; + + public: bool for_each(const string_view &membership, const closure &) const; bool for_each(const string_view &membership, const closure_idx &) const; bool for_each(const closure &) const; diff --git a/ircd/m_room.cc b/ircd/m_room.cc index aa40f0e81..00fa5d183 100644 --- a/ircd/m_room.cc +++ b/ircd/m_room.cc @@ -1040,8 +1040,7 @@ ircd::m::local_only(const room &room) room }; - return members.for_each([&ret] - (const id::user &user_id) + return members.for_each([](const id::user &user_id) { return my(user_id); }); @@ -3003,24 +3002,29 @@ const // joined members optimization. Only possible when seeking // membership="join" on the present state of the room. if(membership == "join" && present) - return this->for_each(membership, [this, &closure, &state] - (const id::user &member) + return for_each_join_present([&closure, &state] + (const id::user &user_id) { - const auto event_idx + const auto &event_idx { - state.get(std::nothrow, "m.room.member", member) + state.get(std::nothrow, "m.room.member", user_id) }; - if(likely(event_idx)) - return closure(member, event_idx); - - log::error + if(unlikely(!event_idx)) { - log, "Failed to find member event_idx:%zu for %s in present state of %s", - event_idx, - string_view{member}, - string_view{room.room_id}, - }; + log::error + { + log, "Failed member:%s event_idx:%lu in room_joined of %s", + string_view{user_id}, + event_idx, + string_view{state.room_id}, + }; + + return true; + } + + if(!closure(user_id, event_idx)) + return false; return true; }); @@ -3052,16 +3056,7 @@ const // joined members optimization. Only possible when seeking // membership="join" on the present state of the room. if(membership == "join" && present) - return room::origins::_for_each(room, [this, &closure] - (const string_view &key) - { - const string_view &member - { - std::get<1>(dbs::room_joined_key(key)) - }; - - return closure(member); - }); + return for_each_join_present(closure); return this->for_each(membership, [&closure] (const auto &user_id, const auto &event_idx) @@ -3070,6 +3065,34 @@ const }); } +bool +ircd::m::room::members::for_each_join_present(const closure &closure) +const +{ + db::domain &index + { + dbs::room_joined + }; + + auto it + { + index.begin(room.room_id) + }; + + for(; bool(it); ++it) + { + const auto &[origin, user_id] + { + dbs::room_joined_key(it->first) + }; + + if(!closure(user_id)) + return false; + } + + return true; +} + bool ircd::m::room::members::membership(const event::idx &event_idx, const string_view &membership)