diff --git a/go/go.mod b/go/go.mod index 17c0cbd1f58..a8527d24c65 100644 --- a/go/go.mod +++ b/go/go.mod @@ -87,6 +87,7 @@ require ( golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 golang.org/x/text v0.14.0 gonum.org/v1/plot v0.11.0 + gopkg.in/errgo.v2 v2.1.0 gopkg.in/yaml.v3 v3.0.1 ) diff --git a/go/go.sum b/go/go.sum index 29cdbd71dd9..a453ec55622 100644 --- a/go/go.sum +++ b/go/go.sum @@ -183,8 +183,6 @@ github.com/dolthub/fslock v0.0.3 h1:iLMpUIvJKMKm92+N1fmHVdxJP5NdyDK5bK7z7Ba2s2U= github.com/dolthub/fslock v0.0.3/go.mod h1:QWql+P17oAAMLnL4HGB5tiovtDuAjdDTPbuqx7bYfa0= github.com/dolthub/go-icu-regex v0.0.0-20230524105445-af7e7991c97e h1:kPsT4a47cw1+y/N5SSCkma7FhAPw7KeGmD6c9PBZW9Y= github.com/dolthub/go-icu-regex v0.0.0-20230524105445-af7e7991c97e/go.mod h1:KPUcpx070QOfJK1gNe0zx4pA5sicIK1GMikIGLKC168= -github.com/dolthub/go-mysql-server v0.18.1-0.20240322215643-a37b5789fdfa h1:0zCZ+swvNZyY3UoiDhFlE3P9d4/SPDlMDPQxI4kLzWw= -github.com/dolthub/go-mysql-server v0.18.1-0.20240322215643-a37b5789fdfa/go.mod h1:QxRD0cXwzXR095E8YemBcGVMhE2UoHOdx4TOr7Yy8GU= github.com/dolthub/go-mysql-server v0.18.1-0.20240325171905-0282dcfe9334 h1:JNSMwsSDxPdRX8HhV00ybYIBsJ+yoG3WyclltERhC0M= github.com/dolthub/go-mysql-server v0.18.1-0.20240325171905-0282dcfe9334/go.mod h1:QxRD0cXwzXR095E8YemBcGVMhE2UoHOdx4TOr7Yy8GU= github.com/dolthub/ishell v0.0.0-20221214210346-d7db0b066488 h1:0HHu0GWJH0N6a6keStrHhUAK5/o9LVfkh44pvsV4514= @@ -1157,6 +1155,7 @@ gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= +gopkg.in/errgo.v2 v2.1.0 h1:0vLT13EuvQ0hNvakwLuFZ/jYrLp5F3kcWHXdRggjCE8= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= diff --git a/go/libraries/doltcore/sqle/statspro/auto_refresh.go b/go/libraries/doltcore/sqle/statspro/auto_refresh.go index 694db39ca97..5edd389439a 100644 --- a/go/libraries/doltcore/sqle/statspro/auto_refresh.go +++ b/go/libraries/doltcore/sqle/statspro/auto_refresh.go @@ -40,22 +40,7 @@ func (p *Provider) InitAutoRefresh(ctxFactory func(ctx context.Context) (*sql.Co return err } - dSess := dsess.DSessFromSess(ctx.Session) - var branches []string - if _, bs, _ := sql.SystemVariables.GetGlobal(dsess.DoltStatsBranches); bs == "" { - defaultBranch, _ := dSess.GetBranch() - if defaultBranch != "" { - branches = append(branches, defaultBranch) - } - } else { - for _, branch := range strings.Split(bs.(string), ",") { - branches = append(branches, strings.TrimSpace(branch)) - } - } - - if branches == nil { - branches = []string{p.pro.DefaultBranch()} - } + branches := p.getStatsBranches(ctx) return p.InitAutoRefreshWithParams(ctxFactory, dbName, bThreads, intervalSec, thresholdf64, branches) } diff --git a/go/libraries/doltcore/sqle/statspro/configure.go b/go/libraries/doltcore/sqle/statspro/configure.go index 405e11572f8..6b8b0aa2d6a 100644 --- a/go/libraries/doltcore/sqle/statspro/configure.go +++ b/go/libraries/doltcore/sqle/statspro/configure.go @@ -40,22 +40,7 @@ func (p *Provider) Configure(ctx context.Context, ctxFactory func(ctx context.Co return err } - dSess := dsess.DSessFromSess(loadCtx.Session) - var branches []string - if _, bs, _ := sql.SystemVariables.GetGlobal(dsess.DoltStatsBranches); bs == "" { - defaultBranch, _ := dSess.GetBranch() - if defaultBranch != "" { - branches = append(branches, defaultBranch) - } - } else { - for _, branch := range strings.Split(bs.(string), ",") { - branches = append(branches, strings.TrimSpace(branch)) - } - } - - if branches == nil { - branches = []string{p.pro.DefaultBranch()} - } + branches := p.getStatsBranches(loadCtx) var autoEnabled bool var intervalSec time.Duration @@ -94,7 +79,7 @@ func (p *Provider) Configure(ctx context.Context, ctxFactory func(ctx context.Co return err } - if err := p.Load(loadCtx, fs, db, branches); err != nil { + if p.Load(loadCtx, fs, db, branches); err != nil { return err } if autoEnabled { @@ -106,6 +91,29 @@ func (p *Provider) Configure(ctx context.Context, ctxFactory func(ctx context.Co return eg.Wait() } +// getStatsBranches returns the set of branches whose statistics are tracked. +// The order of precedence is (1) global variable, (2) session current branch, +// (3) engine default branch. +func (p *Provider) getStatsBranches(ctx *sql.Context) []string { + dSess := dsess.DSessFromSess(ctx.Session) + var branches []string + if _, bs, _ := sql.SystemVariables.GetGlobal(dsess.DoltStatsBranches); bs == "" { + defaultBranch, _ := dSess.GetBranch() + if defaultBranch != "" { + branches = append(branches, defaultBranch) + } + } else { + for _, branch := range strings.Split(bs.(string), ",") { + branches = append(branches, strings.TrimSpace(branch)) + } + } + + if branches == nil { + branches = []string{p.pro.DefaultBranch()} + } + return branches +} + func (p *Provider) LoadStats(ctx *sql.Context, db, branch string) error { if statDb, ok := p.getStatDb(db); ok { return statDb.LoadBranchStats(ctx, branch) @@ -115,17 +123,19 @@ func (p *Provider) LoadStats(ctx *sql.Context, db, branch string) error { // Load scans the statistics tables, populating the |stats| attribute. // Statistics are not available for reading until we've finished loading. -func (p *Provider) Load(ctx *sql.Context, fs filesys.Filesys, db dsess.SqlDatabase, branches []string) error { +func (p *Provider) Load(ctx *sql.Context, fs filesys.Filesys, db dsess.SqlDatabase, branches []string) { // |statPath| is either file://./stat or mem://stat statsDb, err := p.sf.Init(ctx, db, p.pro, fs, env.GetCurrentUserHomeDir) if err != nil { ctx.Warn(0, err.Error()) - return nil + return } for _, branch := range branches { err = statsDb.LoadBranchStats(ctx, branch) if err != nil { + // if branch name is invalid, continue loading rest + // TODO: differentiate bad branch name from other errors ctx.Warn(0, err.Error()) continue } @@ -134,5 +144,5 @@ func (p *Provider) Load(ctx *sql.Context, fs filesys.Filesys, db dsess.SqlDataba p.mu.Lock() defer p.mu.Unlock() p.setStatDb(strings.ToLower(db.Name()), statsDb) - return nil + return } diff --git a/go/libraries/doltcore/sqle/statspro/initdbhook.go b/go/libraries/doltcore/sqle/statspro/initdbhook.go index fb3cd30984d..6dc94ac109b 100644 --- a/go/libraries/doltcore/sqle/statspro/initdbhook.go +++ b/go/libraries/doltcore/sqle/statspro/initdbhook.go @@ -46,24 +46,7 @@ func NewInitDatabaseHook( return err } } - - dSess := dsess.DSessFromSess(ctx.Session) - var branches []string - if _, bs, _ := sql.SystemVariables.GetGlobal(dsess.DoltStatsBranches); bs == "" { - defaultBranch, _ := dSess.GetBranch() - if defaultBranch != "" { - branches = append(branches, defaultBranch) - } - } else { - for _, branch := range strings.Split(bs.(string), ",") { - branches = append(branches, strings.TrimSpace(branch)) - } - } - - if branches == nil { - branches = []string{pro.DefaultBranch()} - } - + statsDb, err := statsProv.sf.Init(ctx, db, statsProv.pro, denv.FS, env.GetCurrentUserHomeDir) if err != nil { ctx.Warn(0, err.Error())