From 5f3e0957179eddd088e82b8f8f493164cbc9ce37 Mon Sep 17 00:00:00 2001 From: kim <89579420+NyaaaWhatsUpDoc@users.noreply.github.com> Date: Tue, 25 Jul 2023 09:34:05 +0100 Subject: [performance] retry db queries on busy errors (#2025) * catch SQLITE_BUSY errors, wrap bun.DB to use our own busy retrier, remove unnecessary db.Error type Signed-off-by: kim * remove dead code Signed-off-by: kim * remove more dead code, add missing error arguments Signed-off-by: kim * update sqlite to use maxOpenConns() Signed-off-by: kim * add uncommitted changes Signed-off-by: kim * use direct calls-through for the ConnIface to make sure we don't double query hook Signed-off-by: kim * expose underlying bun.DB better Signed-off-by: kim * retry on the correct busy error Signed-off-by: kim * use longer possible maxRetries for db retry-backoff Signed-off-by: kim * remove the note regarding max-open-conns only applying to postgres Signed-off-by: kim * improved code commenting Signed-off-by: kim * remove unnecessary infof call (just use info) Signed-off-by: kim * rename DBConn to WrappedDB to better follow sql package name conventions Signed-off-by: kim * update test error string checks Signed-off-by: kim * shush linter Signed-off-by: kim * update backoff logic to be more transparent Signed-off-by: kim --------- Signed-off-by: kim --- internal/db/status.go | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) (limited to 'internal/db/status.go') diff --git a/internal/db/status.go b/internal/db/status.go index c0e330260..6f9848f57 100644 --- a/internal/db/status.go +++ b/internal/db/status.go @@ -26,34 +26,34 @@ import ( // Status contains functions for getting statuses, creating statuses, and checking various other fields on statuses. type Status interface { // GetStatusByID returns one status from the database, with no rel fields populated, only their linking ID / URIs - GetStatusByID(ctx context.Context, id string) (*gtsmodel.Status, Error) + GetStatusByID(ctx context.Context, id string) (*gtsmodel.Status, error) // GetStatusByURI returns one status from the database, with no rel fields populated, only their linking ID / URIs - GetStatusByURI(ctx context.Context, uri string) (*gtsmodel.Status, Error) + GetStatusByURI(ctx context.Context, uri string) (*gtsmodel.Status, error) // GetStatusByURL returns one status from the database, with no rel fields populated, only their linking ID / URIs - GetStatusByURL(ctx context.Context, uri string) (*gtsmodel.Status, Error) + GetStatusByURL(ctx context.Context, uri string) (*gtsmodel.Status, error) // PopulateStatus ensures that all sub-models of a status are populated (e.g. mentions, attachments, etc). PopulateStatus(ctx context.Context, status *gtsmodel.Status) error // PutStatus stores one status in the database. - PutStatus(ctx context.Context, status *gtsmodel.Status) Error + PutStatus(ctx context.Context, status *gtsmodel.Status) error // UpdateStatus updates one status in the database. - UpdateStatus(ctx context.Context, status *gtsmodel.Status, columns ...string) Error + UpdateStatus(ctx context.Context, status *gtsmodel.Status, columns ...string) error // DeleteStatusByID deletes one status from the database. - DeleteStatusByID(ctx context.Context, id string) Error + DeleteStatusByID(ctx context.Context, id string) error // CountStatusReplies returns the amount of replies recorded for a status, or an error if something goes wrong - CountStatusReplies(ctx context.Context, status *gtsmodel.Status) (int, Error) + CountStatusReplies(ctx context.Context, status *gtsmodel.Status) (int, error) // CountStatusReblogs returns the amount of reblogs/boosts recorded for a status, or an error if something goes wrong - CountStatusReblogs(ctx context.Context, status *gtsmodel.Status) (int, Error) + CountStatusReblogs(ctx context.Context, status *gtsmodel.Status) (int, error) // CountStatusFaves returns the amount of faves/likes recorded for a status, or an error if something goes wrong - CountStatusFaves(ctx context.Context, status *gtsmodel.Status) (int, Error) + CountStatusFaves(ctx context.Context, status *gtsmodel.Status) (int, error) // GetStatuses gets a slice of statuses corresponding to the given status IDs. GetStatusesByIDs(ctx context.Context, ids []string) ([]*gtsmodel.Status, error) @@ -64,26 +64,26 @@ type Status interface { // GetStatusParents gets the parent statuses of a given status. // // If onlyDirect is true, only the immediate parent will be returned. - GetStatusParents(ctx context.Context, status *gtsmodel.Status, onlyDirect bool) ([]*gtsmodel.Status, Error) + GetStatusParents(ctx context.Context, status *gtsmodel.Status, onlyDirect bool) ([]*gtsmodel.Status, error) // GetStatusChildren gets the child statuses of a given status. // // If onlyDirect is true, only the immediate children will be returned. - GetStatusChildren(ctx context.Context, status *gtsmodel.Status, onlyDirect bool, minID string) ([]*gtsmodel.Status, Error) + GetStatusChildren(ctx context.Context, status *gtsmodel.Status, onlyDirect bool, minID string) ([]*gtsmodel.Status, error) // IsStatusFavedBy checks if a given status has been faved by a given account ID - IsStatusFavedBy(ctx context.Context, status *gtsmodel.Status, accountID string) (bool, Error) + IsStatusFavedBy(ctx context.Context, status *gtsmodel.Status, accountID string) (bool, error) // IsStatusRebloggedBy checks if a given status has been reblogged/boosted by a given account ID - IsStatusRebloggedBy(ctx context.Context, status *gtsmodel.Status, accountID string) (bool, Error) + IsStatusRebloggedBy(ctx context.Context, status *gtsmodel.Status, accountID string) (bool, error) // IsStatusMutedBy checks if a given status has been muted by a given account ID - IsStatusMutedBy(ctx context.Context, status *gtsmodel.Status, accountID string) (bool, Error) + IsStatusMutedBy(ctx context.Context, status *gtsmodel.Status, accountID string) (bool, error) // IsStatusBookmarkedBy checks if a given status has been bookmarked by a given account ID - IsStatusBookmarkedBy(ctx context.Context, status *gtsmodel.Status, accountID string) (bool, Error) + IsStatusBookmarkedBy(ctx context.Context, status *gtsmodel.Status, accountID string) (bool, error) // GetStatusReblogs returns a slice of statuses that are a boost/reblog of the given status. // This slice will be unfiltered, not taking account of blocks and whatnot, so filter it before serving it back to a user. - GetStatusReblogs(ctx context.Context, status *gtsmodel.Status) ([]*gtsmodel.Status, Error) + GetStatusReblogs(ctx context.Context, status *gtsmodel.Status) ([]*gtsmodel.Status, error) } -- cgit v1.2.3