mirror of
https://github.com/LBRYFoundation/reflector.go.git
synced 2025-08-23 09:17:24 +00:00
The problem is that inserting an sd blob with ~5k blobs takes longer than 30 seconds. So the client times out and retries the request. At that point, reflector is not done inserting so it replies with a smaller number of blobs than it should. The client uploads that many blobs and marks the stream as reflected. The remaining blobs never get uploaded. Doing the insert inside a transaction should be faster than doing 10k (2 per blob) inserts independently.
45 lines
895 B
Go
45 lines
895 B
Go
package db
|
|
|
|
import (
|
|
"database/sql"
|
|
|
|
"github.com/lbryio/lbry.go/v2/extras/errors"
|
|
)
|
|
|
|
// Executor can perform SQL queries.
|
|
type Executor interface {
|
|
Exec(query string, args ...interface{}) (sql.Result, error)
|
|
Query(query string, args ...interface{}) (*sql.Rows, error)
|
|
QueryRow(query string, args ...interface{}) *sql.Row
|
|
}
|
|
|
|
// Transactor can commit and rollback, on top of being able to execute queries.
|
|
type Transactor interface {
|
|
Commit() error
|
|
Rollback() error
|
|
|
|
Executor
|
|
}
|
|
|
|
// Begin begins a transaction
|
|
func Begin(db interface{}) (Transactor, error) {
|
|
type beginner interface {
|
|
Begin() (Transactor, error)
|
|
}
|
|
|
|
creator, ok := db.(beginner)
|
|
if ok {
|
|
return creator.Begin()
|
|
}
|
|
|
|
type sqlBeginner interface {
|
|
Begin() (*sql.Tx, error)
|
|
}
|
|
|
|
creator2, ok := db.(sqlBeginner)
|
|
if ok {
|
|
return creator2.Begin()
|
|
}
|
|
|
|
return nil, errors.Err("database does not support transactions")
|
|
}
|