diff options
author | Neil Alexander <neilalexander@users.noreply.github.com> | 2020-12-16 12:15:12 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-12-16 12:15:12 +0000 |
commit | b891c00b09ed94d0fdfeb449df5e345c67208700 (patch) | |
tree | d6be6dbd5f422f3188401121c967fa3472e9097f /internal/caching/cache_roominfo.go | |
parent | 90571430330afa887912f55fa6a3b329299d927e (diff) |
Add RoomInfo cache, remove RoomServerRoomNIDsCache (#1646)
* Add RoomInfo cache, remove RoomServerRoomNID cache, ensure caches are thread-safe
* Don't panic if the roomInfo isn't known yet
* LRU package is already threadsafe
* Use RoomInfo cache to find room version if possible in Events()
* Adding comments about RoomInfoCache safety
Diffstat (limited to 'internal/caching/cache_roominfo.go')
-rw-r--r-- | internal/caching/cache_roominfo.go | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/internal/caching/cache_roominfo.go b/internal/caching/cache_roominfo.go new file mode 100644 index 00000000..f32d6ba9 --- /dev/null +++ b/internal/caching/cache_roominfo.go @@ -0,0 +1,45 @@ +package caching + +import ( + "github.com/matrix-org/dendrite/roomserver/types" +) + +// WARNING: This cache is mutable because it's entirely possible that +// the IsStub or StateSnaphotNID fields can change, even though the +// room version and room NID fields will not. This is only safe because +// the RoomInfoCache is used ONLY within the roomserver and because it +// will be kept up-to-date by the latest events updater. It MUST NOT be +// used from other components as we currently have no way to invalidate +// the cache in downstream components. + +const ( + RoomInfoCacheName = "roominfo" + RoomInfoCacheMaxEntries = 1024 + RoomInfoCacheMutable = true +) + +// RoomInfosCache contains the subset of functions needed for +// a room Info cache. It must only be used from the roomserver only +// It is not safe for use from other components. +type RoomInfoCache interface { + GetRoomInfo(roomID string) (roomInfo types.RoomInfo, ok bool) + StoreRoomInfo(roomID string, roomInfo types.RoomInfo) +} + +// GetRoomInfo must only be called from the roomserver only. It is not +// safe for use from other components. +func (c Caches) GetRoomInfo(roomID string) (types.RoomInfo, bool) { + val, found := c.RoomInfos.Get(roomID) + if found && val != nil { + if roomInfo, ok := val.(types.RoomInfo); ok { + return roomInfo, true + } + } + return types.RoomInfo{}, false +} + +// StoreRoomInfo must only be called from the roomserver only. It is not +// safe for use from other components. +func (c Caches) StoreRoomInfo(roomID string, roomInfo types.RoomInfo) { + c.RoomInfos.Set(roomID, roomInfo) +} |