summaryrefslogtreecommitdiff
path: root/internal/cache
diff options
context:
space:
mode:
Diffstat (limited to 'internal/cache')
-rw-r--r--internal/cache/cache.go2
-rw-r--r--internal/cache/db.go37
-rw-r--r--internal/cache/invalidate.go5
-rw-r--r--internal/cache/size.go19
4 files changed, 63 insertions, 0 deletions
diff --git a/internal/cache/cache.go b/internal/cache/cache.go
index 5611ddec0..2cc07de96 100644
--- a/internal/cache/cache.go
+++ b/internal/cache/cache.go
@@ -113,6 +113,7 @@ func (c *Caches) Init() {
c.initPollVote()
c.initPollVoteIDs()
c.initReport()
+ c.initScheduledStatus()
c.initSinBinStatus()
c.initStatus()
c.initStatusBookmark()
@@ -200,6 +201,7 @@ func (c *Caches) Sweep(threshold float64) {
c.DB.PollVote.Trim(threshold)
c.DB.PollVoteIDs.Trim(threshold)
c.DB.Report.Trim(threshold)
+ c.DB.ScheduledStatus.Trim(threshold)
c.DB.SinBinStatus.Trim(threshold)
c.DB.Status.Trim(threshold)
c.DB.StatusBookmark.Trim(threshold)
diff --git a/internal/cache/db.go b/internal/cache/db.go
index d31017ccd..385c5bcbb 100644
--- a/internal/cache/db.go
+++ b/internal/cache/db.go
@@ -219,6 +219,9 @@ type DBCaches struct {
// Report provides access to the gtsmodel Report database cache.
Report StructCache[*gtsmodel.Report]
+ // ScheduledStatus provides access to the gtsmodel ScheduledStatus database cache.
+ ScheduledStatus StructCache[*gtsmodel.ScheduledStatus]
+
// SinBinStatus provides access to the gtsmodel SinBinStatus database cache.
SinBinStatus StructCache[*gtsmodel.SinBinStatus]
@@ -1287,6 +1290,40 @@ func (c *Caches) initReport() {
})
}
+func (c *Caches) initScheduledStatus() {
+ // Calculate maximum cache size.
+ cap := calculateResultCacheMax(
+ sizeofScheduledStatus(), // model in-mem size.
+ config.GetCacheScheduledStatusMemRatio(),
+ )
+
+ log.Infof(nil, "cache size = %d", cap)
+
+ copyF := func(s1 *gtsmodel.ScheduledStatus) *gtsmodel.ScheduledStatus {
+ s2 := new(gtsmodel.ScheduledStatus)
+ *s2 = *s1
+
+ // Don't include ptr fields that
+ // will be populated separately.
+ s2.Account = nil
+ s2.Application = nil
+ s2.MediaAttachments = nil
+
+ return s2
+ }
+
+ c.DB.ScheduledStatus.Init(structr.CacheConfig[*gtsmodel.ScheduledStatus]{
+ Indices: []structr.IndexConfig{
+ {Fields: "ID"},
+ {Fields: "AccountID", Multiple: true},
+ },
+ MaxSize: cap,
+ IgnoreErr: ignoreErrors,
+ Copy: copyF,
+ Invalidate: c.OnInvalidateScheduledStatus,
+ })
+}
+
func (c *Caches) initSinBinStatus() {
// Calculate maximum cache size.
cap := calculateResultCacheMax(
diff --git a/internal/cache/invalidate.go b/internal/cache/invalidate.go
index 863719b77..c6c25d4eb 100644
--- a/internal/cache/invalidate.go
+++ b/internal/cache/invalidate.go
@@ -292,6 +292,11 @@ func (c *Caches) OnInvalidatePollVote(vote *gtsmodel.PollVote) {
c.DB.PollVoteIDs.Invalidate(vote.PollID)
}
+func (c *Caches) OnInvalidateScheduledStatus(status *gtsmodel.ScheduledStatus) {
+ // Invalidate cache of related media attachments.
+ c.DB.Media.InvalidateIDs("ID", status.MediaIDs)
+}
+
func (c *Caches) OnInvalidateStatus(status *gtsmodel.Status) {
// Invalidate cached stats objects for this account.
c.DB.AccountStats.Invalidate("AccountID", status.AccountID)
diff --git a/internal/cache/size.go b/internal/cache/size.go
index ab54ada87..aa22b03d7 100644
--- a/internal/cache/size.go
+++ b/internal/cache/size.go
@@ -554,6 +554,25 @@ func sizeofReport() uintptr {
}))
}
+func sizeofScheduledStatus() uintptr {
+ return uintptr(size.Of(&gtsmodel.ScheduledStatus{
+ ID: exampleID,
+ AccountID: exampleID,
+ ScheduledAt: exampleTime,
+ Text: exampleText,
+ Poll: gtsmodel.ScheduledStatusPoll{
+ Options: []string{exampleTextSmall, exampleTextSmall, exampleTextSmall, exampleTextSmall},
+ Multiple: util.Ptr(false),
+ HideTotals: util.Ptr(false),
+ },
+ MediaIDs: []string{exampleID, exampleID, exampleID},
+ Sensitive: util.Ptr(false),
+ SpoilerText: exampleText,
+ Visibility: gtsmodel.VisibilityPublic,
+ Language: "en",
+ }))
+}
+
func sizeofSinBinStatus() uintptr {
return uintptr(size.Of(&gtsmodel.SinBinStatus{
ID: exampleID,