diff options
author | 2023-07-25 09:34:05 +0100 | |
---|---|---|
committer | 2023-07-25 10:34:05 +0200 | |
commit | 5f3e0957179eddd088e82b8f8f493164cbc9ce37 (patch) | |
tree | b169630ef1ac269dc96d74b533f6663dc0f1e6fc /internal/db/bundb/search.go | |
parent | [feature/performance] support uncaching remote emoji + scheduled cleanup func... (diff) | |
download | gotosocial-5f3e0957179eddd088e82b8f8f493164cbc9ce37.tar.xz |
[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 <grufwub@gmail.com>
* remove dead code
Signed-off-by: kim <grufwub@gmail.com>
* remove more dead code, add missing error arguments
Signed-off-by: kim <grufwub@gmail.com>
* update sqlite to use maxOpenConns()
Signed-off-by: kim <grufwub@gmail.com>
* add uncommitted changes
Signed-off-by: kim <grufwub@gmail.com>
* use direct calls-through for the ConnIface to make sure we don't double query hook
Signed-off-by: kim <grufwub@gmail.com>
* expose underlying bun.DB better
Signed-off-by: kim <grufwub@gmail.com>
* retry on the correct busy error
Signed-off-by: kim <grufwub@gmail.com>
* use longer possible maxRetries for db retry-backoff
Signed-off-by: kim <grufwub@gmail.com>
* remove the note regarding max-open-conns only applying to postgres
Signed-off-by: kim <grufwub@gmail.com>
* improved code commenting
Signed-off-by: kim <grufwub@gmail.com>
* remove unnecessary infof call (just use info)
Signed-off-by: kim <grufwub@gmail.com>
* rename DBConn to WrappedDB to better follow sql package name conventions
Signed-off-by: kim <grufwub@gmail.com>
* update test error string checks
Signed-off-by: kim <grufwub@gmail.com>
* shush linter
Signed-off-by: kim <grufwub@gmail.com>
* update backoff logic to be more transparent
Signed-off-by: kim <grufwub@gmail.com>
---------
Signed-off-by: kim <grufwub@gmail.com>
Diffstat (limited to 'internal/db/bundb/search.go')
-rw-r--r-- | internal/db/bundb/search.go | 20 |
1 files changed, 10 insertions, 10 deletions
diff --git a/internal/db/bundb/search.go b/internal/db/bundb/search.go index 1d7eefd48..f4e41d0f4 100644 --- a/internal/db/bundb/search.go +++ b/internal/db/bundb/search.go @@ -56,7 +56,7 @@ import ( // This isn't ideal, of course, but at least we could cover the most common use case of // a caller paging down through results. type searchDB struct { - conn *DBConn + db *WrappedDB state *state.State } @@ -89,7 +89,7 @@ func (s *searchDB) SearchForAccounts( frontToBack = true ) - q := s.conn. + q := s.db. NewSelect(). TableExpr("? AS ?", bun.Ident("accounts"), bun.Ident("account")). // Select only IDs from table. @@ -148,7 +148,7 @@ func (s *searchDB) SearchForAccounts( } if err := q.Scan(ctx, &accountIDs); err != nil { - return nil, s.conn.ProcessError(err) + return nil, s.db.ProcessError(err) } if len(accountIDs) == 0 { @@ -183,7 +183,7 @@ func (s *searchDB) SearchForAccounts( // followedAccounts returns a subquery that selects only IDs // of accounts that are followed by the given accountID. func (s *searchDB) followedAccounts(accountID string) *bun.SelectQuery { - return s.conn. + return s.db. NewSelect(). TableExpr("? AS ?", bun.Ident("follows"), bun.Ident("follow")). Column("follow.target_account_id"). @@ -196,7 +196,7 @@ func (s *searchDB) followedAccounts(accountID string) *bun.SelectQuery { // in the concatenation. func (s *searchDB) accountText(following bool) *bun.SelectQuery { var ( - accountText = s.conn.NewSelect() + accountText = s.db.NewSelect() query string args []interface{} ) @@ -225,7 +225,7 @@ func (s *searchDB) accountText(following bool) *bun.SelectQuery { // different number of placeholders depending on // following/not following. COALESCE calls ensure // that we're not trying to concatenate null values. - d := s.conn.Dialect().Name() + d := s.db.Dialect().Name() switch { case d == dialect.SQLite && following: @@ -276,7 +276,7 @@ func (s *searchDB) SearchForStatuses( frontToBack = true ) - q := s.conn. + q := s.db. NewSelect(). TableExpr("? AS ?", bun.Ident("statuses"), bun.Ident("status")). // Select only IDs from table @@ -326,7 +326,7 @@ func (s *searchDB) SearchForStatuses( } if err := q.Scan(ctx, &statusIDs); err != nil { - return nil, s.conn.ProcessError(err) + return nil, s.db.ProcessError(err) } if len(statusIDs) == 0 { @@ -361,11 +361,11 @@ func (s *searchDB) SearchForStatuses( // statusText returns a subquery that selects a concatenation // of status content and content warning as "status_text". func (s *searchDB) statusText() *bun.SelectQuery { - statusText := s.conn.NewSelect() + statusText := s.db.NewSelect() // SQLite and Postgres use different // syntaxes for concatenation. - switch s.conn.Dialect().Name() { + switch s.db.Dialect().Name() { case dialect.SQLite: statusText = statusText.ColumnExpr( |