0
0
Fork 0
mirror of https://github.com/matrix-construct/construct synced 2024-06-10 05:58:56 +02:00

ircd:Ⓜ️:room::bootstrap: Fix loss of room version information during bootstrap.

This commit is contained in:
Jason Volk 2020-03-20 12:04:19 -07:00
parent 8c8a4c8d09
commit 8ca580362f
2 changed files with 42 additions and 20 deletions

View file

@ -14,10 +14,10 @@
struct ircd::m::room::bootstrap
{
// restrap: synchronous; send_join
bootstrap(const event &, const string_view &host);
bootstrap(const event &, const string_view &host, const string_view &room_version = {});
// restrap: asynchronous; launch ctx; send_join
bootstrap(const event::id &, const string_view &host);
bootstrap(const event::id &, const string_view &host, const string_view &room_version = {});
// synchronous make_join, eval; asynchronous send_join
bootstrap(event::id::buf &, const room::id &, const m::id::user &, const string_view &host);

View file

@ -13,7 +13,7 @@ namespace ircd::m::bootstrap
struct pkg;
using send_join1_response = std::tuple<json::object, unique_buffer<mutable_buffer>>;
static event::id::buf make_join(const string_view &host, const room::id &, const user::id &);
static event::id::buf make_join(const string_view &host, const room::id &, const user::id &, const mutable_buffer &);
static send_join1_response send_join(const string_view &host, const room::id &, const event::id &, const json::object &event);
static void broadcast_join(const room &, const event &, const string_view &exclude);
static void fetch_keys(const json::array &events);
@ -34,6 +34,7 @@ struct ircd::m::bootstrap::pkg
std::string event;
std::string event_id;
std::string host;
std::string room_version;
};
decltype(ircd::m::bootstrap::log)
@ -104,23 +105,33 @@ ircd::m::room::bootstrap::bootstrap(m::event::id::buf &event_id_buf,
m::membership(member_event_idx, "join")
};
char room_version_buf[64];
string_view room_version
{
m::version(room_version_buf, room_id, std::nothrow)
};
if(existing_join)
event_id_buf = m::event_id(member_event_idx, std::nothrow);
if(!event_id_buf)
event_id_buf = m::bootstrap::make_join(host, room_id, user_id);
event_id_buf = m::bootstrap::make_join(host, room_id, user_id, room_version_buf);
if(!room_version)
m::bootstrap::make_join(host, room_id, user_id, room_version_buf);
assert(event_id_buf);
// asynchronous; returns quickly
room::bootstrap
{
event_id_buf, host
event_id_buf, host, room_version
};
}
ircd::m::room::bootstrap::bootstrap(const m::event::id &event_id,
const string_view &host)
const string_view &host,
const string_view &room_version)
try
{
static const context::flags flags
@ -145,6 +156,7 @@ try
std::string(event.source),
event.event_id,
host,
room_version,
};
context
@ -167,7 +179,8 @@ catch(const std::exception &e)
}
ircd::m::room::bootstrap::bootstrap(const m::event &event,
const string_view &host)
const string_view &host,
const string_view &room_version)
try
{
const m::event::id &event_id
@ -192,8 +205,9 @@ try
log::info
{
log, "Sending in %s for %s at %s to '%s'",
log, "Sending in %s (version %s) for %s at %s to '%s'",
string_view{room_id},
room_version,
string_view{user_id},
string_view{event_id},
host
@ -227,12 +241,12 @@ try
};
m::bootstrap::fetch_keys(auth_chain);
m::bootstrap::eval_auth_chain(auth_chain);
m::bootstrap::eval_auth_chain(auth_chain, room_version);
m::bootstrap::fetch_keys(state);
m::bootstrap::eval_state(state);
m::bootstrap::eval_state(state, room_version);
m::bootstrap::backfill(host, room_id, event_id);
m::bootstrap::backfill(host, room_id, event_id, room_version);
// After we just received and processed all of this state with only a
// recent backfill our system doesn't know if state events which are
@ -291,7 +305,7 @@ try
assert(!empty(pkg.host));
room::bootstrap
{
event, pkg.host
event, pkg.host, pkg.room_version
};
}
catch(const http::error &e)
@ -396,7 +410,8 @@ ircd::m::bootstrap::broadcast_join(const m::room &room,
void
ircd::m::bootstrap::backfill(const string_view &host,
const m::room::id &room_id,
const m::event::id &event_id)
const m::event::id &event_id,
const string_view &room_version)
try
{
log::info
@ -450,9 +465,10 @@ try
m::vm::opts vmopts;
vmopts.nothrows = -1;
vmopts.warnlog &= ~vm::fault::EXISTS;
vmopts.infolog_accept = false;
vmopts.room_version = room_version;
vmopts.fetch_state = false;
vmopts.fetch_prev = false;
vmopts.infolog_accept = false;
m::vm::eval
{
pdus, vmopts
@ -476,7 +492,8 @@ catch(const std::exception &e)
}
void
ircd::m::bootstrap::eval_state(const json::array &state)
ircd::m::bootstrap::eval_state(const json::array &state,
const string_view &room_version)
try
{
log::info
@ -488,9 +505,10 @@ try
m::vm::opts opts;
opts.nothrows = -1;
opts.warnlog &= ~vm::fault::EXISTS;
opts.infolog_accept = true;
opts.room_version = room_version;
opts.fetch_state = false;
opts.fetch_prev = false;
opts.infolog_accept = true;
m::vm::eval
{
state, opts
@ -510,7 +528,8 @@ catch(const std::exception &e)
}
void
ircd::m::bootstrap::eval_auth_chain(const json::array &auth_chain)
ircd::m::bootstrap::eval_auth_chain(const json::array &auth_chain,
const string_view &room_version)
try
{
log::info
@ -522,6 +541,7 @@ try
m::vm::opts opts;
opts.warnlog &= ~vm::fault::EXISTS;
opts.infolog_accept = true;
opts.room_version = room_version;
opts.fetch = false;
m::vm::eval
{
@ -657,7 +677,8 @@ catch(const std::exception &e)
ircd::m::event::id::buf
ircd::m::bootstrap::make_join(const string_view &host,
const m::room::id &room_id,
const m::user::id &user_id)
const m::user::id &user_id,
const mutable_buffer &room_version_buf)
try
{
const unique_buffer<mutable_buffer> buf
@ -756,15 +777,16 @@ try
m::vm::copts vmopts;
vmopts.infolog_accept = true;
vmopts.room_version = room_version;
vmopts.user_id = user_id;
vmopts.fetch = false;
vmopts.auth = false;
vmopts.user_id = user_id;
vmopts.room_version = room_version;
const vm::eval eval
{
event, content, vmopts
};
strlcpy(room_version_buf, room_version);
assert(eval.event_id);
return eval.event_id;
}