Add an early out cache for event expiration
This commit is contained in:
parent
5f8e80cd84
commit
1abb52700a
4 changed files with 93 additions and 8 deletions
|
|
@ -1467,7 +1467,7 @@ utils::updateSpaceVias()
|
|||
ChatPage::instance()->callFunctionOnGuiThread(
|
||||
[state = std::move(state),
|
||||
interval = e->matrix_error.retry_after]() {
|
||||
QTimer::singleShot(interval,
|
||||
QTimer::singleShot(interval * 3,
|
||||
ChatPage::instance(),
|
||||
[self = std::move(state)]() mutable {
|
||||
next(std::move(self));
|
||||
|
|
@ -1502,7 +1502,7 @@ utils::updateSpaceVias()
|
|||
ChatPage::instance()->callFunctionOnGuiThread(
|
||||
[state = std::move(state),
|
||||
interval = e->matrix_error.retry_after]() {
|
||||
QTimer::singleShot(interval,
|
||||
QTimer::singleShot(interval * 3,
|
||||
ChatPage::instance(),
|
||||
[self = std::move(state)]() mutable {
|
||||
next(std::move(self));
|
||||
|
|
@ -1644,9 +1644,19 @@ utils::removeExpiredEvents()
|
|||
std::string currentRoom;
|
||||
bool firstMessagesCall = true;
|
||||
std::uint64_t currentRoomCount = 0;
|
||||
|
||||
// batch token for pagination
|
||||
std::string currentRoomPrevToken;
|
||||
// event id of an event redacted in a previous run
|
||||
std::string currentRoomStopAt;
|
||||
// event id of first event redacted in the current run, hoping that the order stays the
|
||||
// same.
|
||||
std::string currentRoomFirstRedactedEvent;
|
||||
// (evtype,state_key) tuple to keep the latest state event of each.
|
||||
std::set<std::pair<std::string, std::string>> currentRoomStateEvents;
|
||||
// event ids pending redaction
|
||||
std::vector<std::string> currentRoomRedactionQueue;
|
||||
|
||||
mtx::events::account_data::nheko_extensions::EventExpiry currentExpiry;
|
||||
|
||||
static void next(std::shared_ptr<ApplyEventExpiration> state)
|
||||
|
|
@ -1664,7 +1674,8 @@ utils::removeExpiredEvents()
|
|||
ChatPage::instance()->callFunctionOnGuiThread(
|
||||
[state = std::move(state),
|
||||
interval = e->matrix_error.retry_after]() {
|
||||
QTimer::singleShot(interval,
|
||||
// triple interval to allow other traffic as well
|
||||
QTimer::singleShot(interval * 3,
|
||||
ChatPage::instance(),
|
||||
[self = std::move(state)]() mutable {
|
||||
next(std::move(self));
|
||||
|
|
@ -1681,6 +1692,10 @@ utils::removeExpiredEvents()
|
|||
}
|
||||
} else {
|
||||
nhlog::net()->info("Redacted event {} in {}", evid, state->currentRoom);
|
||||
|
||||
if (state->currentRoomFirstRedactedEvent.empty())
|
||||
state->currentRoomFirstRedactedEvent = evid;
|
||||
|
||||
state->currentRoomRedactionQueue.pop_back();
|
||||
next(std::move(state));
|
||||
}
|
||||
|
|
@ -1688,6 +1703,13 @@ utils::removeExpiredEvents()
|
|||
} else if (!state->currentRoom.empty()) {
|
||||
if (state->currentRoomPrevToken.empty() && !state->firstMessagesCall) {
|
||||
nhlog::net()->info("Finished room {}", state->currentRoom);
|
||||
|
||||
if (!state->currentRoomFirstRedactedEvent.empty())
|
||||
cache::client()->storeEventExpirationProgress(
|
||||
state->currentRoom,
|
||||
nlohmann::json(state->currentExpiry).dump(),
|
||||
state->currentRoomFirstRedactedEvent);
|
||||
|
||||
state->currentRoom.clear();
|
||||
next(std::move(state));
|
||||
return;
|
||||
|
|
@ -1708,7 +1730,7 @@ utils::removeExpiredEvents()
|
|||
mtx::http::RequestErr error) mutable {
|
||||
if (error) {
|
||||
// skip success handler
|
||||
nhlog::net()->info(
|
||||
nhlog::net()->warn(
|
||||
"Finished room {} with error {}", state->currentRoom, *error);
|
||||
state->currentRoom.clear();
|
||||
} else if (msgs.chunk.empty()) {
|
||||
|
|
@ -1725,8 +1747,22 @@ utils::removeExpiredEvents()
|
|||
continue;
|
||||
|
||||
if (std::holds_alternative<
|
||||
mtx::events::RoomEvent<mtx::events::msg::Redacted>>(e))
|
||||
mtx::events::RoomEvent<mtx::events::msg::Redacted>>(e) ||
|
||||
std::holds_alternative<
|
||||
mtx::events::StateEvent<mtx::events::msg::Redacted>>(e)) {
|
||||
if (!state->currentRoomStopAt.empty() &&
|
||||
mtx::accessors::event_id(e) == state->currentRoomStopAt) {
|
||||
// There is no filter to remove redacted events from
|
||||
// pagination, so we try to stop early by caching what event
|
||||
// we redacted last if we reached the end of a room.
|
||||
nhlog::net()->info(
|
||||
"Found previous redaction marker, stopping early: {}",
|
||||
state->currentRoom);
|
||||
state->currentRoomPrevToken.clear();
|
||||
break;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
if (std::holds_alternative<
|
||||
mtx::events::StateEvent<mtx::events::msg::Redacted>>(e))
|
||||
|
|
@ -1806,6 +1842,9 @@ utils::removeExpiredEvents()
|
|||
state->currentRoomRedactionQueue.clear();
|
||||
state->currentRoomStateEvents.clear();
|
||||
|
||||
state->currentRoomStopAt = cache::client()->loadEventExpirationProgress(
|
||||
state->currentRoom, nlohmann::json(state->currentExpiry).dump());
|
||||
|
||||
state->roomsToUpdate.pop_back();
|
||||
next(std::move(state));
|
||||
} else {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue