aboutsummaryrefslogtreecommitdiff
path: root/roomserver/internal/input/input_events.go
diff options
context:
space:
mode:
authorNeil Alexander <neilalexander@users.noreply.github.com>2022-08-18 10:37:47 +0100
committerGitHub <noreply@github.com>2022-08-18 10:37:47 +0100
commit59bc0a6f4ed0324da0387118e1761b4551aaf103 (patch)
tree8a0708cf274aae31cb8cb1a9697adb9f96960e57 /roomserver/internal/input/input_events.go
parent8d9c8f11c5c5673d48b8e5308e1f565927bdd341 (diff)
Reprocess rejected input events (#2647)
* Reprocess outliers that were previously rejected * Might as well do all events this way * More useful errors * Fix queries * Tweak condition * Don't wrap errors * Report more useful error * Flatten error on `r.Queryer.QueryStateAfterEvents` * Some more debug logging * Flatten error in `QueryRestrictedJoinAllowed` * Revert "Flatten error in `QueryRestrictedJoinAllowed`" This reverts commit 1238b4184c30e0c31ffb0f364806fa1275aba483. * Tweak `QueryStateAfterEvents` * Handle MissingStateError too * Scope to room * Clean up * Fix the error * Only apply rejection check to outliers
Diffstat (limited to 'roomserver/internal/input/input_events.go')
-rw-r--r--roomserver/internal/input/input_events.go47
1 files changed, 24 insertions, 23 deletions
diff --git a/roomserver/internal/input/input_events.go b/roomserver/internal/input/input_events.go
index 81541260..53ccd597 100644
--- a/roomserver/internal/input/input_events.go
+++ b/roomserver/internal/input/input_events.go
@@ -17,8 +17,8 @@
package input
import (
- "bytes"
"context"
+ "database/sql"
"fmt"
"time"
@@ -107,28 +107,6 @@ func (r *Inputer) processRoomEvent(
})
}
- // if we have already got this event then do not process it again, if the input kind is an outlier.
- // Outliers contain no extra information which may warrant a re-processing.
- if input.Kind == api.KindOutlier {
- evs, err2 := r.DB.EventsFromIDs(ctx, []string{event.EventID()})
- if err2 == nil && len(evs) == 1 {
- // check hash matches if we're on early room versions where the event ID was a random string
- idFormat, err2 := headered.RoomVersion.EventIDFormat()
- if err2 == nil {
- switch idFormat {
- case gomatrixserverlib.EventIDFormatV1:
- if bytes.Equal(event.EventReference().EventSHA256, evs[0].EventReference().EventSHA256) {
- logger.Debugf("Already processed event; ignoring")
- return nil
- }
- default:
- logger.Debugf("Already processed event; ignoring")
- return nil
- }
- }
- }
- }
-
// Don't waste time processing the event if the room doesn't exist.
// A room entry locally will only be created in response to a create
// event.
@@ -141,6 +119,29 @@ func (r *Inputer) processRoomEvent(
return fmt.Errorf("room %s does not exist for event %s", event.RoomID(), event.EventID())
}
+ // If we already know about this outlier and it hasn't been rejected
+ // then we won't attempt to reprocess it. If it was rejected or has now
+ // arrived as a different kind of event, then we can attempt to reprocess,
+ // in case we have learned something new or need to weave the event into
+ // the DAG now.
+ if input.Kind == api.KindOutlier && roomInfo != nil {
+ wasRejected, werr := r.DB.IsEventRejected(ctx, roomInfo.RoomNID, event.EventID())
+ switch {
+ case werr == sql.ErrNoRows:
+ // We haven't seen this event before so continue.
+ case werr != nil:
+ // Something has gone wrong trying to find out if we rejected
+ // this event already.
+ logger.WithError(werr).Errorf("Failed to check if event %q is already seen", event.EventID())
+ return werr
+ case !wasRejected:
+ // We've seen this event before and it wasn't rejected so we
+ // should ignore it.
+ logger.Debugf("Already processed event %q, ignoring", event.EventID())
+ return nil
+ }
+ }
+
var missingAuth, missingPrev bool
serverRes := &fedapi.QueryJoinedHostServerNamesInRoomResponse{}
if !isCreateEvent {