From 45ae719bd9d7bbffad0e2338149d87c47f18a4e6 Mon Sep 17 00:00:00 2001 From: kim <89579420+NyaaaWhatsUpDoc@users.noreply.github.com> Date: Fri, 18 Nov 2022 17:29:25 +0000 Subject: [PATCH] [performance] replace account emojis relational query with separate calls to emojiDB to rely on cache (#1074) Signed-off-by: kim Signed-off-by: kim --- internal/db/bundb/account.go | 20 +++++++++++++++++--- internal/db/bundb/bundb.go | 1 + 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/internal/db/bundb/account.go b/internal/db/bundb/account.go index 1e9c390d8..52316a7a7 100644 --- a/internal/db/bundb/account.go +++ b/internal/db/bundb/account.go @@ -36,6 +36,7 @@ type accountDB struct { conn *DBConn cache *result.Cache[*gtsmodel.Account] + emojis *emojiDB status *statusDB } @@ -63,8 +64,7 @@ func (a *accountDB) newAccountQ(account *gtsmodel.Account) *bun.SelectQuery { NewSelect(). Model(account). Relation("AvatarMediaAttachment"). - Relation("HeaderMediaAttachment"). - Relation("Emojis") + Relation("HeaderMediaAttachment") } func (a *accountDB) GetAccountByID(ctx context.Context, id string) (*gtsmodel.Account, db.Error) { @@ -149,7 +149,8 @@ func (a *accountDB) GetInstanceAccount(ctx context.Context, domain string) (*gts } func (a *accountDB) getAccount(ctx context.Context, lookup string, dbQuery func(*gtsmodel.Account) error, keyParts ...any) (*gtsmodel.Account, db.Error) { - return a.cache.Load(lookup, func() (*gtsmodel.Account, error) { + // Fetch account from database cache with loader callback + account, err := a.cache.Load(lookup, func() (*gtsmodel.Account, error) { var account gtsmodel.Account // Not cached! Perform database query @@ -159,6 +160,19 @@ func (a *accountDB) getAccount(ctx context.Context, lookup string, dbQuery func( return &account, nil }, keyParts...) + if err != nil { + return nil, err + } + + if len(account.EmojiIDs) > 0 { + // Set the account's related emojis + account.Emojis, err = a.emojis.emojisFromIDs(ctx, account.EmojiIDs) + if err != nil { + return nil, err + } + } + + return account, nil } func (a *accountDB) PutAccount(ctx context.Context, account *gtsmodel.Account) db.Error { diff --git a/internal/db/bundb/bundb.go b/internal/db/bundb/bundb.go index 44b0b1807..b316f2106 100644 --- a/internal/db/bundb/bundb.go +++ b/internal/db/bundb/bundb.go @@ -171,6 +171,7 @@ func NewBunDBService(ctx context.Context) (db.DB, error) { user := &userDB{conn: conn} // Setup DB cross-referencing + account.emojis = emoji account.status = status admin.users = user status.accounts = account