mirror of
https://github.com/matrix-construct/construct
synced 2024-11-16 15:00:51 +01:00
ircd:Ⓜ️:sync: Undress since token for clear-cache+reload in R!ot. (matrix-org/matrix-doc/#2855)
This commit is contained in:
parent
4ec6cf3fab
commit
92b960730a
2 changed files with 83 additions and 37 deletions
|
@ -135,13 +135,26 @@ ircd::m::sync::make_since(const mutable_buffer &buf,
|
|||
const int64_t &val,
|
||||
const string_view &flags)
|
||||
{
|
||||
return fmt::sprintf
|
||||
const string_view &prefix
|
||||
{
|
||||
val?
|
||||
"ctor_"_sv:
|
||||
""_sv
|
||||
};
|
||||
|
||||
const string_view &snapshot
|
||||
{
|
||||
buf, "ctor_%lu%s%s",
|
||||
val,
|
||||
flags?
|
||||
"_0_"_sv:
|
||||
flags,
|
||||
flags
|
||||
};
|
||||
|
||||
return fmt::sprintf
|
||||
{
|
||||
buf, "%s%lu%s%s",
|
||||
prefix,
|
||||
val,
|
||||
snapshot,
|
||||
flags,
|
||||
};
|
||||
}
|
||||
|
|
|
@ -14,7 +14,7 @@ namespace ircd::m::sync
|
|||
struct response;
|
||||
|
||||
static const_buffer flush(data &, resource::response::chunked &, const const_buffer &);
|
||||
static void empty_response(data &, const uint64_t &next_batch);
|
||||
static bool empty_response(data &, const uint64_t &next_batch);
|
||||
static bool linear_handle(data &);
|
||||
static bool polylog_handle(data &);
|
||||
static bool longpoll_handle(data &);
|
||||
|
@ -27,6 +27,7 @@ namespace ircd::m::sync
|
|||
extern conf::item<bool> longpoll_enable;
|
||||
extern conf::item<bool> polylog_phased;
|
||||
extern conf::item<bool> polylog_only;
|
||||
extern conf::item<bool> MSC2855;
|
||||
|
||||
extern resource::method method_get;
|
||||
extern const string_view description;
|
||||
|
@ -150,6 +151,13 @@ ircd::m::sync::longpoll_enable
|
|||
{ "default", true },
|
||||
};
|
||||
|
||||
decltype(ircd::m::sync::MSC2855)
|
||||
ircd::m::sync::MSC2855
|
||||
{
|
||||
{ "name", "ircd.client.sync.MSC2855.enable" },
|
||||
{ "default", true },
|
||||
};
|
||||
|
||||
//
|
||||
// GET sync
|
||||
//
|
||||
|
@ -202,8 +210,13 @@ ircd::m::sync::handle_get(client &client,
|
|||
// event which doesn't exist yet. There is no reason for the since parameter
|
||||
// to be greater than that, unless it's a negative integer and phased
|
||||
// sync is enabled
|
||||
if(!polylog_phased || !phased_range)
|
||||
if(range.first > range.second)
|
||||
const bool invalid_since
|
||||
{
|
||||
(!polylog_phased || !phased_range)
|
||||
&& (range.first > range.second)
|
||||
};
|
||||
|
||||
if(unlikely(invalid_since && !MSC2855))
|
||||
throw m::NOT_FOUND
|
||||
{
|
||||
"Since parameter '%lu' is too far in the future."
|
||||
|
@ -346,36 +359,38 @@ ircd::m::sync::handle_get(client &client,
|
|||
// The return value from the operation will be false if no output was
|
||||
// generated by the sync operation, indicating we should finally send an
|
||||
// empty response.
|
||||
const bool complete
|
||||
bool complete
|
||||
{
|
||||
should_linear?
|
||||
linear_handle(data):
|
||||
|
||||
should_polylog?
|
||||
polylog_handle(data):
|
||||
|
||||
false
|
||||
|| invalid_since
|
||||
};
|
||||
|
||||
if(complete)
|
||||
return std::move(response);
|
||||
if(!complete && should_polylog)
|
||||
complete = polylog_handle(data);
|
||||
|
||||
if(longpoll_handle(data))
|
||||
return std::move(response);
|
||||
if(!complete && should_linear)
|
||||
complete = linear_handle(data);
|
||||
|
||||
const auto &next_batch
|
||||
if(!complete)
|
||||
complete = longpoll_handle(data);
|
||||
|
||||
if(!complete || invalid_since)
|
||||
complete = empty_response(data, uint64_t
|
||||
{
|
||||
invalid_since?
|
||||
0UL:
|
||||
|
||||
polylog_only?
|
||||
data.range.first:
|
||||
|
||||
data.range.second
|
||||
};
|
||||
});
|
||||
|
||||
empty_response(data, next_batch);
|
||||
assert(complete);
|
||||
return std::move(response);
|
||||
}
|
||||
|
||||
void
|
||||
bool
|
||||
ircd::m::sync::empty_response(data &data,
|
||||
const uint64_t &next_batch)
|
||||
{
|
||||
|
@ -404,12 +419,30 @@ ircd::m::sync::empty_response(data &data,
|
|||
}
|
||||
};
|
||||
|
||||
log::debug
|
||||
const auto &reason
|
||||
{
|
||||
log, "request %s timeout @%lu",
|
||||
loghead(data),
|
||||
next_batch
|
||||
next_batch?
|
||||
"timeout"_sv:
|
||||
"MSC2855 clear cache & reload"_sv
|
||||
};
|
||||
|
||||
const auto &level
|
||||
{
|
||||
next_batch?
|
||||
log::DEBUG:
|
||||
log::WARNING
|
||||
};
|
||||
|
||||
log::logf
|
||||
{
|
||||
log, level,
|
||||
"request %s %s @%lu",
|
||||
loghead(data),
|
||||
reason,
|
||||
next_batch,
|
||||
};
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
ircd::const_buffer
|
||||
|
|
Loading…
Reference in a new issue