mirror of
https://github.com/matrix-org/dendrite
synced 2024-12-14 17:53:49 +01:00
Various roominfo tweaks (#2607)
This commit is contained in:
parent
eab87ef07d
commit
ca3fa58388
5 changed files with 50 additions and 16 deletions
|
@ -375,11 +375,7 @@ func (t *missingStateReq) lookupStateAfterEventLocally(ctx context.Context, room
|
||||||
defer span.Finish()
|
defer span.Finish()
|
||||||
|
|
||||||
var res parsedRespState
|
var res parsedRespState
|
||||||
roomInfo, err := t.db.RoomInfo(ctx, roomID)
|
roomState := state.NewStateResolution(t.db, t.roomInfo)
|
||||||
if err != nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
roomState := state.NewStateResolution(t.db, roomInfo)
|
|
||||||
stateAtEvents, err := t.db.StateAtEventIDs(ctx, []string{eventID})
|
stateAtEvents, err := t.db.StateAtEventIDs(ctx, []string{eventID})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
util.GetLogger(ctx).WithField("room_id", roomID).WithError(err).Warnf("failed to get state after %s locally", eventID)
|
util.GetLogger(ctx).WithField("room_id", roomID).WithError(err).Warnf("failed to get state after %s locally", eventID)
|
||||||
|
|
|
@ -351,8 +351,8 @@ func (r *Queryer) QueryServerAllowedToSeeEvent(
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if info == nil {
|
if info == nil || info.IsStub() {
|
||||||
return fmt.Errorf("QueryServerAllowedToSeeEvent: no room info for room %s", roomID)
|
return nil
|
||||||
}
|
}
|
||||||
response.AllowedToSeeEvent, err = helpers.CheckServerAllowedToSeeEvent(
|
response.AllowedToSeeEvent, err = helpers.CheckServerAllowedToSeeEvent(
|
||||||
ctx, r.DB, info, request.EventID, request.ServerName, inRoomRes.IsInRoom,
|
ctx, r.DB, info, request.EventID, request.ServerName, inRoomRes.IsInRoom,
|
||||||
|
|
|
@ -217,6 +217,14 @@ func (u *RoomUpdater) SetLatestEvents(
|
||||||
roomNID types.RoomNID, latest []types.StateAtEventAndReference, lastEventNIDSent types.EventNID,
|
roomNID types.RoomNID, latest []types.StateAtEventAndReference, lastEventNIDSent types.EventNID,
|
||||||
currentStateSnapshotNID types.StateSnapshotNID,
|
currentStateSnapshotNID types.StateSnapshotNID,
|
||||||
) error {
|
) error {
|
||||||
|
switch {
|
||||||
|
case len(latest) == 0:
|
||||||
|
return fmt.Errorf("cannot set latest events with no latest event references")
|
||||||
|
case currentStateSnapshotNID == 0:
|
||||||
|
return fmt.Errorf("cannot set latest events with invalid state snapshot NID")
|
||||||
|
case lastEventNIDSent == 0:
|
||||||
|
return fmt.Errorf("cannot set latest events with invalid latest event NID")
|
||||||
|
}
|
||||||
eventNIDs := make([]types.EventNID, len(latest))
|
eventNIDs := make([]types.EventNID, len(latest))
|
||||||
for i := range latest {
|
for i := range latest {
|
||||||
eventNIDs[i] = latest[i].EventNID
|
eventNIDs[i] = latest[i].EventNID
|
||||||
|
@ -229,8 +237,10 @@ func (u *RoomUpdater) SetLatestEvents(
|
||||||
// Since it's entirely possible that this types.RoomInfo came from the
|
// Since it's entirely possible that this types.RoomInfo came from the
|
||||||
// cache, we should make sure to update that entry so that the next run
|
// cache, we should make sure to update that entry so that the next run
|
||||||
// works from live data.
|
// works from live data.
|
||||||
u.roomInfo.SetStateSnapshotNID(currentStateSnapshotNID)
|
if u.roomInfo != nil {
|
||||||
u.roomInfo.SetIsStub(false)
|
u.roomInfo.SetStateSnapshotNID(currentStateSnapshotNID)
|
||||||
|
u.roomInfo.SetIsStub(false)
|
||||||
|
}
|
||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
@ -156,15 +156,30 @@ func (d *Database) RoomInfo(ctx context.Context, roomID string) (*types.RoomInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *Database) roomInfo(ctx context.Context, txn *sql.Tx, roomID string) (*types.RoomInfo, error) {
|
func (d *Database) roomInfo(ctx context.Context, txn *sql.Tx, roomID string) (*types.RoomInfo, error) {
|
||||||
if roomInfo, ok := d.Cache.GetRoomInfo(roomID); ok && roomInfo != nil {
|
roomInfo, ok := d.Cache.GetRoomInfo(roomID)
|
||||||
|
if ok && roomInfo != nil && !roomInfo.IsStub() {
|
||||||
|
// The data that's in the cache is not stubby, so return it.
|
||||||
return roomInfo, nil
|
return roomInfo, nil
|
||||||
}
|
}
|
||||||
roomInfo, err := d.RoomsTable.SelectRoomInfo(ctx, txn, roomID)
|
// At this point we either don't have an entry in the cache, or
|
||||||
if err == nil && roomInfo != nil {
|
// it is stubby, so let's check the roomserver_rooms table again.
|
||||||
d.Cache.StoreRoomServerRoomID(roomInfo.RoomNID, roomID)
|
roomInfoFromDB, err := d.RoomsTable.SelectRoomInfo(ctx, txn, roomID)
|
||||||
d.Cache.StoreRoomInfo(roomID, roomInfo)
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
}
|
}
|
||||||
return roomInfo, err
|
// If we have a stubby cache entry already, update it and return
|
||||||
|
// the reference to the cache entry.
|
||||||
|
if roomInfo != nil {
|
||||||
|
roomInfo.CopyFrom(roomInfoFromDB)
|
||||||
|
return roomInfo, nil
|
||||||
|
}
|
||||||
|
// Otherwise, try to admit the data into the cache and return the
|
||||||
|
// new reference from the database.
|
||||||
|
if roomInfoFromDB != nil {
|
||||||
|
d.Cache.StoreRoomServerRoomID(roomInfoFromDB.RoomNID, roomID)
|
||||||
|
d.Cache.StoreRoomInfo(roomID, roomInfoFromDB)
|
||||||
|
}
|
||||||
|
return roomInfoFromDB, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *Database) AddState(
|
func (d *Database) AddState(
|
||||||
|
@ -676,7 +691,7 @@ func (d *Database) storeEvent(
|
||||||
succeeded := false
|
succeeded := false
|
||||||
if updater == nil {
|
if updater == nil {
|
||||||
var roomInfo *types.RoomInfo
|
var roomInfo *types.RoomInfo
|
||||||
roomInfo, err = d.RoomInfo(ctx, event.RoomID())
|
roomInfo, err = d.roomInfo(ctx, txn, event.RoomID())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, 0, types.StateAtEvent{}, nil, "", fmt.Errorf("d.RoomInfo: %w", err)
|
return 0, 0, types.StateAtEvent{}, nil, "", fmt.Errorf("d.RoomInfo: %w", err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -310,3 +310,16 @@ func (r *RoomInfo) SetIsStub(isStub bool) {
|
||||||
defer r.mu.Unlock()
|
defer r.mu.Unlock()
|
||||||
r.isStub = isStub
|
r.isStub = isStub
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (r *RoomInfo) CopyFrom(r2 *RoomInfo) {
|
||||||
|
r.mu.Lock()
|
||||||
|
defer r.mu.Unlock()
|
||||||
|
|
||||||
|
r2.mu.RLock()
|
||||||
|
defer r2.mu.RUnlock()
|
||||||
|
|
||||||
|
r.RoomNID = r2.RoomNID
|
||||||
|
r.RoomVersion = r2.RoomVersion
|
||||||
|
r.stateSnapshotNID = r2.stateSnapshotNID
|
||||||
|
r.isStub = r2.isStub
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue