From 16ed52736f38b7d42fadc5174472a48f6c623c8f Mon Sep 17 00:00:00 2001 From: Kitsune Ral Date: Fri, 2 Aug 2019 18:32:38 +0900 Subject: Room/qmc-example: consider fake state event rejection as valid This is an addition in https://github.com/matrix-org/synapse/pull/5805 - Synapse no more tolerates fake state events (which actually obviates the need for this test but fake state events still go through on older Synapses). To allow checking for both cases Room behaviour has been slightly changed (without compat breakage) to make sure the pending event status is set to ReachedServer (and pendingEventChanged() is emitted, if necessary) before merging the pending event into the timeline. --- lib/room.cpp | 3 +++ 1 file changed, 3 insertions(+) (limited to 'lib') diff --git a/lib/room.cpp b/lib/room.cpp index b32d3492..95dba857 100644 --- a/lib/room.cpp +++ b/lib/room.cpp @@ -1520,6 +1520,7 @@ QString Room::retryMessage(const QString& txnId) " events are likely to be in the timeline after retry"; } it->resetStatus(); + emit pendingEventChanged(int(it - d->unsyncedEvents.begin())); return d->doSendEvent(it->event()); } @@ -2189,6 +2190,8 @@ Room::Changes Room::Private::addNewMessageEvents(RoomEvents&& events) auto* nextPendingEvt = nextPending->get(); const auto pendingEvtIdx = int(nextPendingPair.second - unsyncedEvents.begin()); + nextPendingPair.second->setReachedServer(nextPendingEvt->id()); + emit q->pendingEventChanged(pendingEvtIdx); emit q->pendingEventAboutToMerge(nextPendingEvt, pendingEvtIdx); qDebug(EVENTS) << "Merging pending event from transaction" << nextPendingEvt->transactionId() << "into" -- cgit v1.2.3 From 2681303c2aed1bf20e385c41f1382f5aade66e35 Mon Sep 17 00:00:00 2001 From: Kitsune Ral Date: Fri, 2 Aug 2019 19:18:51 +0900 Subject: Room: avoid assertion crashes; name variables better --- lib/room.cpp | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) (limited to 'lib') diff --git a/lib/room.cpp b/lib/room.cpp index 95dba857..52f86616 100644 --- a/lib/room.cpp +++ b/lib/room.cpp @@ -1469,8 +1469,10 @@ QString Room::Private::doSendEvent(const RoomEvent* pEvent) return; } - it->setReachedServer(call->eventId()); - emit q->pendingEventChanged(int(it - unsyncedEvents.begin())); + if (it->deliveryStatus() != EventStatus::ReachedServer) { + it->setReachedServer(call->eventId()); + emit q->pendingEventChanged(int(it - unsyncedEvents.begin())); + } }); } else onEventSendingFailure(txnId); @@ -2171,10 +2173,11 @@ Room::Changes Room::Private::addNewMessageEvents(RoomEvents&& events) auto nextPendingPair = findFirstOf(it, events.end(), unsyncedEvents.begin(), unsyncedEvents.end(), isEchoEvent); - auto nextPending = nextPendingPair.first; + const auto& remoteEcho = nextPendingPair.first; + const auto& localEcho = nextPendingPair.second; - if (it != nextPending) { - RoomEventsRange eventsSpan { it, nextPending }; + if (it != remoteEcho) { + RoomEventsRange eventsSpan { it, remoteEcho }; emit q->aboutToAddNewMessages(eventsSpan); auto insertedSize = moveEventsToTimeline(eventsSpan, Newer); totalInserted += insertedSize; @@ -2183,15 +2186,16 @@ Room::Changes Room::Private::addNewMessageEvents(RoomEvents&& events) emit q->addedMessages(firstInserted->index(), timeline.back().index()); } - if (nextPending == events.end()) + if (remoteEcho == events.end()) break; - it = nextPending + 1; - auto* nextPendingEvt = nextPending->get(); - const auto pendingEvtIdx = - int(nextPendingPair.second - unsyncedEvents.begin()); - nextPendingPair.second->setReachedServer(nextPendingEvt->id()); - emit q->pendingEventChanged(pendingEvtIdx); + it = remoteEcho + 1; + auto* nextPendingEvt = remoteEcho->get(); + const auto pendingEvtIdx = int(localEcho - unsyncedEvents.begin()); + if (localEcho->deliveryStatus() != EventStatus::ReachedServer) { + localEcho->setReachedServer(nextPendingEvt->id()); + emit q->pendingEventChanged(pendingEvtIdx); + } emit q->pendingEventAboutToMerge(nextPendingEvt, pendingEvtIdx); qDebug(EVENTS) << "Merging pending event from transaction" << nextPendingEvt->transactionId() << "into" @@ -2200,13 +2204,12 @@ Room::Changes Room::Private::addNewMessageEvents(RoomEvents&& events) if (transfer.status != FileTransferInfo::None) fileTransfers.insert(nextPendingEvt->id(), transfer); // After emitting pendingEventAboutToMerge() above we cannot rely - // on the previously obtained nextPendingPair.second staying valid + // on the previously obtained localEcho staying valid // because a signal handler may send another message, thereby altering // unsyncedEvents (see #286). Fortunately, unsyncedEvents only grows at // its back so we can rely on the index staying valid at least. unsyncedEvents.erase(unsyncedEvents.begin() + pendingEvtIdx); - if (auto insertedSize = moveEventsToTimeline({ nextPending, it }, - Newer)) { + if (auto insertedSize = moveEventsToTimeline({ remoteEcho, it }, Newer)) { totalInserted += insertedSize; q->onAddNewTimelineEvents(timeline.cend() - insertedSize); } -- cgit v1.2.3