mirror of
https://github.com/hoernschen/dendrite.git
synced 2025-07-29 12:42:46 +00:00
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
This commit is contained in:
parent
8d9c8f11c5
commit
59bc0a6f4e
7 changed files with 65 additions and 28 deletions
|
@ -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 {
|
||||
|
|
|
@ -72,13 +72,10 @@ func (r *Queryer) QueryStateAfterEvents(
|
|||
|
||||
prevStates, err := r.DB.StateAtEventIDs(ctx, request.PrevEventIDs)
|
||||
if err != nil {
|
||||
switch err.(type) {
|
||||
case types.MissingEventError:
|
||||
util.GetLogger(ctx).Errorf("QueryStateAfterEvents: MissingEventError: %s", err)
|
||||
if _, ok := err.(types.MissingEventError); ok {
|
||||
return nil
|
||||
default:
|
||||
return err
|
||||
}
|
||||
return err
|
||||
}
|
||||
response.PrevEventsExist = true
|
||||
|
||||
|
@ -95,6 +92,12 @@ func (r *Queryer) QueryStateAfterEvents(
|
|||
)
|
||||
}
|
||||
if err != nil {
|
||||
if _, ok := err.(types.MissingEventError); ok {
|
||||
return nil
|
||||
}
|
||||
if _, ok := err.(types.MissingStateError); ok {
|
||||
return nil
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue