0
0
Fork 0
mirror of https://github.com/matrix-construct/construct synced 2024-09-27 11:18:51 +02:00

modules/client/sync: Fix longpoll causality violation; possible skipped or duplicated event.

This commit is contained in:
Jason Volk 2020-12-03 13:15:36 -08:00
parent 6768c23811
commit dceac7f9fc
2 changed files with 24 additions and 6 deletions

View file

@ -524,7 +524,8 @@ try
if(data.range.first >= data.range.second || data.range.second >= vm::sequence::retired)
return false;
++data.range.second;
data.range.second = std::min(data.range.second + 1, vm::sequence::retired + 1);
assert(data.range.second <= vm::sequence::retired + 1);
assert(data.range.first <= data.range.second);
}
@ -615,9 +616,16 @@ bool
ircd::m::sync::longpoll::polled(data &data,
const args &args)
{
// Increment one past-the-end.
const scope_restore range
{
data.range.second, data.range.second + 1
};
assert(data.range.second - 1 <= m::vm::sequence::retired);
const m::event::fetch event
{
std::nothrow, data.range.second
std::nothrow, data.range.second - 1
};
if(!event.valid)
@ -628,6 +636,7 @@ ircd::m::sync::longpoll::polled(data &data,
data.event, &event
};
assert(event.event_idx <= m::vm::sequence::retired);
const scope_restore their_event_idx
{
data.event_idx, event.event_idx
@ -656,9 +665,11 @@ ircd::m::sync::longpoll::polled(data &data,
{
data.event_idx && data.reflow_full_state?
std::min(data.event_idx, vm::sequence::retired + 1):
data.event_idx?
std::min(data.event_idx + 1, vm::sequence::retired + 1):
std::min(data.range.second + 1, vm::sequence::retired + 1)
std::min(data.range.second, vm::sequence::retired + 1)
};
const auto &flags
@ -732,6 +743,7 @@ bool
ircd::m::sync::linear_handle(data &data)
try
{
assert(data.event_idx <= m::vm::sequence::retired);
json::stack::checkpoint checkpoint
{
*data.out
@ -761,13 +773,16 @@ try
const auto next
{
last && completed?
data.range.second:
last && data.reflow_full_state?
std::min(last, data.range.second):
last && completed?
data.range.second:
last?
std::min(last + 1, data.range.second):
0UL
0UL
};
assert(!data.reflow_full_state || (last && !completed));
@ -830,6 +845,7 @@ ircd::m::sync::linear_proffer(data &data,
const auto closure{[&data, &wb, &ret]
(const m::event::idx &event_idx, const m::event &event)
{
assert(event_idx <= m::vm::sequence::retired);
const scope_restore their_event
{
data.event, &event

View file

@ -77,6 +77,8 @@ ircd::m::sync::rooms_linear(data &data)
0UL
};
//assert(room_head <= m::vm::sequence::retired);
assert(data.event_idx <= m::vm::sequence::retired);
const scope_restore their_head
{
data.room_head, room_head