From 30d4a89db9a18559bf17662254bc197a13046be9 Mon Sep 17 00:00:00 2001 From: Jason Volk Date: Thu, 29 Oct 2020 04:47:23 -0700 Subject: [PATCH] ircd::m::fetch: Additional legacy event_id hostpart fallback. --- matrix/fetch.cc | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/matrix/fetch.cc b/matrix/fetch.cc index 6e02e4a74..4c208ffa4 100644 --- a/matrix/fetch.cc +++ b/matrix/fetch.cc @@ -385,13 +385,21 @@ ircd::m::fetch::start(request &request) try { assert(!request.finished); + + // Attempt the user's hint first if(!request.started && !request.origin) request.origin = request.opts.hint; + // When no user hint, use legacy event_id hostpart as hint. + if(!request.started && !request.origin) + if(proffer_remote(request, request.opts.event_id.host())) + if(select_remote(request, request.opts.event_id.host())) + return true; + if(!request.started) request.started = ircd::now(); - if(!request.origin || !proffer_remote(request, request.origin)) + if(!proffer_remote(request, request.origin)) select_random_remote(request); for(; request.origin; select_random_remote(request)) @@ -577,14 +585,16 @@ ircd::m::fetch::select_random_remote(request &request) return true; // If nothing found attempt hosts from mxids - const auto room_id_host + const string_view mxid[2] { - request.opts.room_id.host() + request.opts.event_id.host(), + request.opts.room_id.host(), }; - if(room_id_host && proffer_remote(request, room_id_host)) - if(select_remote(request, room_id_host)) - return true; + for(const auto &remote : mxid) + if(proffer_remote(request, remote)) + if(select_remote(request, remote)) + return true; return false; } @@ -614,6 +624,10 @@ bool ircd::m::fetch::proffer_remote(request &request, const string_view &remote) { + // Case sentinel false. + if(!remote) + return false; + // Don't want to request from myself. if(my_host(remote)) return false;