mirror of
https://github.com/superseriousbusiness/gotosocial
synced 2025-06-05 21:59:39 +02:00
[performance] overhaul struct (+ result) caching library for simplicity, performance and multiple-result lookups (#2535)
* rewrite cache library as codeberg.org/gruf/go-structr, implement in gotosocial
* use actual go-structr release version (not just commit hash)
* revert go toolchain changes (damn you go for auto changing this)
* fix go mod woes
* ensure %w is used in calls to errs.Appendf()
* fix error checking
* fix possible panic
* remove unnecessary start/stop functions, move to main Cache{} struct, add note regarding which caches require start/stop
* fix copy-paste artifact... 😇
* fix all comment copy-paste artifacts
* remove dropID() function, now we can just use slices.DeleteFunc()
* use util.Deduplicate() instead of collate(), move collate to util
* move orderByIDs() to util package and "generify"
* add a util.DeleteIf() function, use this to delete entries on failed population
* use slices.DeleteFunc() instead of util.DeleteIf() (i had the logic mixed up in my head somehow lol)
* add note about how collate differs from deduplicate
This commit is contained in:
35
internal/cache/visibility.go
vendored
35
internal/cache/visibility.go
vendored
@@ -18,18 +18,16 @@
|
||||
package cache
|
||||
|
||||
import (
|
||||
"codeberg.org/gruf/go-cache/v3/result"
|
||||
"codeberg.org/gruf/go-structr"
|
||||
"github.com/superseriousbusiness/gotosocial/internal/config"
|
||||
"github.com/superseriousbusiness/gotosocial/internal/log"
|
||||
)
|
||||
|
||||
type VisibilityCache struct {
|
||||
*result.Cache[*CachedVisibility]
|
||||
structr.Cache[*CachedVisibility]
|
||||
}
|
||||
|
||||
// Init will initialize the visibility cache in this collection.
|
||||
// NOTE: the cache MUST NOT be in use anywhere, this is not thread-safe.
|
||||
func (c *VisibilityCache) Init() {
|
||||
func (c *Caches) initVisibility() {
|
||||
// Calculate maximum cache size.
|
||||
cap := calculateResultCacheMax(
|
||||
sizeofVisibility(), // model in-mem size.
|
||||
@@ -38,25 +36,22 @@ func (c *VisibilityCache) Init() {
|
||||
|
||||
log.Infof(nil, "Visibility cache size = %d", cap)
|
||||
|
||||
c.Cache = result.New([]result.Lookup{
|
||||
{Name: "ItemID", Multi: true},
|
||||
{Name: "RequesterID", Multi: true},
|
||||
{Name: "Type.RequesterID.ItemID"},
|
||||
}, func(v1 *CachedVisibility) *CachedVisibility {
|
||||
copyF := func(v1 *CachedVisibility) *CachedVisibility {
|
||||
v2 := new(CachedVisibility)
|
||||
*v2 = *v1
|
||||
return v2
|
||||
}, cap)
|
||||
}
|
||||
|
||||
c.Cache.IgnoreErrors(ignoreErrors)
|
||||
}
|
||||
|
||||
// Start will attempt to start the visibility cache, or panic.
|
||||
func (c *VisibilityCache) Start() {
|
||||
}
|
||||
|
||||
// Stop will attempt to stop the visibility cache, or panic.
|
||||
func (c *VisibilityCache) Stop() {
|
||||
c.Visibility.Init(structr.Config[*CachedVisibility]{
|
||||
Indices: []structr.IndexConfig{
|
||||
{Fields: "ItemID", Multiple: true},
|
||||
{Fields: "RequesterID", Multiple: true},
|
||||
{Fields: "Type,RequesterID,ItemID"},
|
||||
},
|
||||
MaxSize: cap,
|
||||
IgnoreErr: ignoreErrors,
|
||||
CopyValue: copyF,
|
||||
})
|
||||
}
|
||||
|
||||
// VisibilityType represents a visibility lookup type.
|
||||
|
Reference in New Issue
Block a user