Unified Storage: Fix Create, Update and Delete wrt Resource Versions (#88183)

* add sqltemplate utilities, improve tests and documentation

* bunch of things

* remove unnecessary message

* add queries

* add queries

* add queries

* add folders support

* fix diff

* fix linters

* fix diff

* fix linters

* fix linters

* fix typo

* fix linters

* fix linters

* fix linters

* several fixes

* several fixes

* temporarily disable k8s integration tests for Entity Server

* postpone some tests

* postpone documentation changes

* Fix bug in create

* improve error reporting

* fix PostgeSQL parameters

* fix MySQL sqlmode

* fix MySQL-5.7

* reduce but document the number of database connection options

* remove unused code and improve docs
This commit is contained in:
Diego Augusto Molina
2024-06-05 14:23:32 -03:00
committed by GitHub
parent cbe7521a56
commit 6fcd7d9e03
43 changed files with 1867 additions and 1298 deletions
+36 -16
View File
@@ -2,6 +2,7 @@ package dbimpl
import (
"fmt"
"sync"
"github.com/dlmiddlecote/sqlstats"
"github.com/jmoiron/sqlx"
@@ -31,6 +32,9 @@ func ProvideEntityDB(db db.DB, cfg *setting.Cfg, features featuremgmt.FeatureTog
}
type EntityDB struct {
once sync.Once
onceErr error
db db.DB
features featuremgmt.FeatureToggles
engine *xorm.Engine
@@ -45,42 +49,57 @@ func (db *EntityDB) Init() error {
}
func (db *EntityDB) GetEngine() (*xorm.Engine, error) {
db.once.Do(func() {
db.onceErr = db.init()
})
return db.engine, db.onceErr
}
func (db *EntityDB) init() error {
if db.engine != nil {
return db.engine, nil
return nil
}
var engine *xorm.Engine
var err error
cfgSection := db.cfg.SectionWithEnvOverrides("entity_api")
dbType := cfgSection.Key("db_type").MustString("")
getter := &sectionGetter{
DynamicSection: db.cfg.SectionWithEnvOverrides("entity_api"),
}
dbType := getter.Key("db_type").MustString("")
// if explicit connection settings are provided, use them
if dbType != "" {
if dbType == "postgres" {
engine, err = getEnginePostgres(cfgSection, db.tracer)
engine, err = getEnginePostgres(getter, db.tracer)
if err != nil {
return nil, err
return err
}
// FIXME: this config option is cockroachdb-specific, it's not supported by postgres
// FIXME: this only sets this option for the session that we get
// from the pool right now. A *sql.DB is a pool of connections,
// there is no guarantee that the session where this is run will be
// the same where we need to change the type of a column
_, err = engine.Exec("SET SESSION enable_experimental_alter_column_type_general=true")
if err != nil {
db.log.Error("error connecting to postgres", "msg", err.Error())
// FIXME: return nil, err
}
} else if dbType == "mysql" {
engine, err = getEngineMySQL(cfgSection, db.tracer)
engine, err = getEngineMySQL(getter, db.tracer)
if err != nil {
return nil, err
return err
}
_, err = engine.Exec("SELECT 1")
if err != nil {
return nil, err
if err = engine.Ping(); err != nil {
return err
}
} else {
// TODO: sqlite support
return nil, fmt.Errorf("invalid db type specified: %s", dbType)
return fmt.Errorf("invalid db type specified: %s", dbType)
}
// register sql stat metrics
@@ -89,7 +108,7 @@ func (db *EntityDB) GetEngine() (*xorm.Engine, error) {
}
// configure sql logging
debugSQL := cfgSection.Key("log_queries").MustBool(false)
debugSQL := getter.Key("log_queries").MustBool(false)
if !debugSQL {
engine.SetLogger(&xorm.DiscardLogger{})
} else {
@@ -98,10 +117,11 @@ func (db *EntityDB) GetEngine() (*xorm.Engine, error) {
engine.ShowSQL(true)
engine.ShowExecTime(true)
}
// otherwise, try to use the grafana db connection
} else {
if db.db == nil {
return nil, fmt.Errorf("no db connection provided")
return fmt.Errorf("no db connection provided")
}
engine = db.db.GetEngine()
@@ -109,12 +129,12 @@ func (db *EntityDB) GetEngine() (*xorm.Engine, error) {
db.engine = engine
if err := migrations.MigrateEntityStore(db, db.features); err != nil {
if err := migrations.MigrateEntityStore(engine, db.cfg, db.features); err != nil {
db.engine = nil
return nil, err
return fmt.Errorf("run migrations: %w", err)
}
return db.engine, nil
return nil
}
func (db *EntityDB) GetSession() (*session.SessionDB, error) {