[feature] Status thread mute/unmute functionality (#2278)

* add db models + functions for keeping track of threads

* give em the old linty testy

* create, remove, check mutes

* swagger

* testerino

* test mute/unmute via api

* add info log about new index creation

* thread + allow muting of any remote statuses that mention a local account

* IsStatusThreadMutedBy -> IsThreadMutedByAccount

* use common processing functions in status processor

* set = NULL

* favee!

* get rekt darlings, darlings get rekt

* testrig please, have mercy muy liege
This commit is contained in:
tobi 2023-10-25 16:04:53 +02:00 committed by GitHub
commit c7b6cd7770
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
48 changed files with 1750 additions and 198 deletions

View file

@ -248,6 +248,7 @@ func (c *Caches) Sweep(threshold float64) {
c.GTS.Status().Trim(threshold)
c.GTS.StatusFave().Trim(threshold)
c.GTS.Tag().Trim(threshold)
c.GTS.ThreadMute().Trim(threshold)
c.GTS.Tombstone().Trim(threshold)
c.GTS.User().Trim(threshold)
c.Visibility.Trim(threshold)

30
internal/cache/gts.go vendored
View file

@ -57,6 +57,7 @@ type GTSCaches struct {
statusFave *result.Cache[*gtsmodel.StatusFave]
statusFaveIDs *SliceCache[string]
tag *result.Cache[*gtsmodel.Tag]
threadMute *result.Cache[*gtsmodel.ThreadMute]
tombstone *result.Cache[*gtsmodel.Tombstone]
user *result.Cache[*gtsmodel.User]
@ -93,6 +94,7 @@ func (c *GTSCaches) Init() {
c.initStatus()
c.initStatusFave()
c.initTag()
c.initThreadMute()
c.initStatusFaveIDs()
c.initTombstone()
c.initUser()
@ -249,6 +251,11 @@ func (c *GTSCaches) Tag() *result.Cache[*gtsmodel.Tag] {
return c.tag
}
// ThreadMute provides access to the gtsmodel ThreadMute database cache.
func (c *GTSCaches) ThreadMute() *result.Cache[*gtsmodel.ThreadMute] {
return c.threadMute
}
// StatusFaveIDs provides access to the status fave IDs list database cache.
func (c *GTSCaches) StatusFaveIDs() *SliceCache[string] {
return c.statusFaveIDs
@ -712,6 +719,7 @@ func (c *GTSCaches) initStatus() {
{Name: "URI"},
{Name: "URL"},
{Name: "BoostOfID.AccountID"},
{Name: "ThreadID", Multi: true},
}, func(s1 *gtsmodel.Status) *gtsmodel.Status {
s2 := new(gtsmodel.Status)
*s2 = *s1
@ -778,6 +786,28 @@ func (c *GTSCaches) initTag() {
c.tag.IgnoreErrors(ignoreErrors)
}
func (c *GTSCaches) initThreadMute() {
cap := calculateResultCacheMax(
sizeOfThreadMute(), // model in-mem size.
config.GetCacheThreadMuteMemRatio(),
)
log.Infof(nil, "cache size = %d", cap)
c.threadMute = result.New([]result.Lookup{
{Name: "ID"},
{Name: "ThreadID", Multi: true},
{Name: "AccountID", Multi: true},
{Name: "ThreadID.AccountID"},
}, func(t1 *gtsmodel.ThreadMute) *gtsmodel.ThreadMute {
t2 := new(gtsmodel.ThreadMute)
*t2 = *t1
return t2
}, cap)
c.threadMute.IgnoreErrors(ignoreErrors)
}
func (c *GTSCaches) initTombstone() {
// Calculate maximum cache size.
cap := calculateResultCacheMax(

View file

@ -194,6 +194,7 @@ func totalOfRatios() float64 {
config.GetCacheStatusFaveMemRatio() +
config.GetCacheStatusFaveIDsMemRatio() +
config.GetCacheTagMemRatio() +
config.GetCacheThreadMuteMemRatio() +
config.GetCacheTombstoneMemRatio() +
config.GetCacheUserMemRatio() +
config.GetCacheWebfingerMemRatio() +
@ -511,6 +512,16 @@ func sizeofTag() uintptr {
}))
}
func sizeOfThreadMute() uintptr {
return uintptr(size.Of(&gtsmodel.ThreadMute{
ID: exampleID,
CreatedAt: exampleTime,
UpdatedAt: exampleTime,
ThreadID: exampleID,
AccountID: exampleID,
}))
}
func sizeofTombstone() uintptr {
return uintptr(size.Of(&gtsmodel.Tombstone{
ID: exampleID,