mirror of
https://github.com/1f349/dendrite.git
synced 2024-11-22 11:41:38 +00:00
Try to spot state deletions when they happen (#2489)
This commit is contained in:
parent
ff53398635
commit
6940c7c7dd
@ -535,8 +535,6 @@ func (r *Inputer) calculateAndSetState(
|
|||||||
roomState := state.NewStateResolution(updater, roomInfo)
|
roomState := state.NewStateResolution(updater, roomInfo)
|
||||||
|
|
||||||
if input.HasState {
|
if input.HasState {
|
||||||
stateAtEvent.Overwrite = true
|
|
||||||
|
|
||||||
// We've been told what the state at the event is so we don't need to calculate it.
|
// We've been told what the state at the event is so we don't need to calculate it.
|
||||||
// Check that those state events are in the database and store the state.
|
// Check that those state events are in the database and store the state.
|
||||||
var entries []types.StateEntry
|
var entries []types.StateEntry
|
||||||
@ -549,8 +547,6 @@ func (r *Inputer) calculateAndSetState(
|
|||||||
return fmt.Errorf("updater.AddState: %w", err)
|
return fmt.Errorf("updater.AddState: %w", err)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
stateAtEvent.Overwrite = false
|
|
||||||
|
|
||||||
// We haven't been told what the state at the event is so we need to calculate it from the prev_events
|
// We haven't been told what the state at the event is so we need to calculate it from the prev_events
|
||||||
if stateAtEvent.BeforeStateSnapshotNID, err = roomState.CalculateAndStoreStateBeforeEvent(ctx, event, isRejected); err != nil {
|
if stateAtEvent.BeforeStateSnapshotNID, err = roomState.CalculateAndStoreStateBeforeEvent(ctx, event, isRejected); err != nil {
|
||||||
return fmt.Errorf("roomState.CalculateAndStoreStateBeforeEvent: %w", err)
|
return fmt.Errorf("roomState.CalculateAndStoreStateBeforeEvent: %w", err)
|
||||||
|
@ -27,6 +27,7 @@ import (
|
|||||||
"github.com/matrix-org/dendrite/roomserver/types"
|
"github.com/matrix-org/dendrite/roomserver/types"
|
||||||
"github.com/matrix-org/gomatrixserverlib"
|
"github.com/matrix-org/gomatrixserverlib"
|
||||||
"github.com/matrix-org/util"
|
"github.com/matrix-org/util"
|
||||||
|
"github.com/sirupsen/logrus"
|
||||||
)
|
)
|
||||||
|
|
||||||
// updateLatestEvents updates the list of latest events for this room in the database and writes the
|
// updateLatestEvents updates the list of latest events for this room in the database and writes the
|
||||||
@ -258,13 +259,6 @@ func (u *latestEventsUpdater) latestState() error {
|
|||||||
return fmt.Errorf("roomState.CalculateAndStoreStateAfterEvents: %w", err)
|
return fmt.Errorf("roomState.CalculateAndStoreStateAfterEvents: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// If we are overwriting the state then we should make sure that we
|
|
||||||
// don't send anything out over federation again, it will very likely
|
|
||||||
// be a repeat.
|
|
||||||
if u.stateAtEvent.Overwrite {
|
|
||||||
u.sendAsServer = ""
|
|
||||||
}
|
|
||||||
|
|
||||||
// Now that we have a new state snapshot based on the latest events,
|
// Now that we have a new state snapshot based on the latest events,
|
||||||
// we can compare that new snapshot to the previous one and see what
|
// we can compare that new snapshot to the previous one and see what
|
||||||
// has changed. This gives us one list of removed state events and
|
// has changed. This gives us one list of removed state events and
|
||||||
@ -277,6 +271,17 @@ func (u *latestEventsUpdater) latestState() error {
|
|||||||
return fmt.Errorf("roomState.DifferenceBetweenStateSnapshots: %w", err)
|
return fmt.Errorf("roomState.DifferenceBetweenStateSnapshots: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if removed := len(u.removed) - len(u.added); removed > 0 {
|
||||||
|
logrus.WithFields(logrus.Fields{
|
||||||
|
"event_id": u.event.EventID(),
|
||||||
|
"room_id": u.event.RoomID(),
|
||||||
|
"old_state_nid": u.oldStateNID,
|
||||||
|
"new_state_nid": u.newStateNID,
|
||||||
|
"old_latest": u.oldLatest,
|
||||||
|
"new_latest": u.latest,
|
||||||
|
}).Errorf("Unexpected state deletion (removing %d events)", removed)
|
||||||
|
}
|
||||||
|
|
||||||
// Also work out the state before the event removes and the event
|
// Also work out the state before the event removes and the event
|
||||||
// adds.
|
// adds.
|
||||||
u.stateBeforeEventRemoves, u.stateBeforeEventAdds, err = roomState.DifferenceBetweeenStateSnapshots(
|
u.stateBeforeEventRemoves, u.stateBeforeEventAdds, err = roomState.DifferenceBetweeenStateSnapshots(
|
||||||
|
@ -85,7 +85,6 @@ func Test_EventsTable(t *testing.T) {
|
|||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
}
|
}
|
||||||
stateAtEvent := types.StateAtEvent{
|
stateAtEvent := types.StateAtEvent{
|
||||||
Overwrite: false,
|
|
||||||
BeforeStateSnapshotNID: types.StateSnapshotNID(stateSnapshot),
|
BeforeStateSnapshotNID: types.StateSnapshotNID(stateSnapshot),
|
||||||
IsRejected: false,
|
IsRejected: false,
|
||||||
StateEntry: types.StateEntry{
|
StateEntry: types.StateEntry{
|
||||||
|
@ -173,10 +173,6 @@ func DeduplicateStateEntries(a []StateEntry) []StateEntry {
|
|||||||
|
|
||||||
// StateAtEvent is the state before and after a matrix event.
|
// StateAtEvent is the state before and after a matrix event.
|
||||||
type StateAtEvent struct {
|
type StateAtEvent struct {
|
||||||
// Should this state overwrite the latest events and memberships of the room?
|
|
||||||
// This might be necessary when rejoining a federated room after a period of
|
|
||||||
// absence, as our state and latest events will be out of date.
|
|
||||||
Overwrite bool
|
|
||||||
// The state before the event.
|
// The state before the event.
|
||||||
BeforeStateSnapshotNID StateSnapshotNID
|
BeforeStateSnapshotNID StateSnapshotNID
|
||||||
// True if this StateEntry is rejected. State resolution should then treat this
|
// True if this StateEntry is rejected. State resolution should then treat this
|
||||||
|
Loading…
Reference in New Issue
Block a user