diff --git a/go/libraries/doltcore/sqle/statsnoms/database.go b/go/libraries/doltcore/sqle/statsnoms/database.go index 01cdfa88b1d..4e7be79a33d 100644 --- a/go/libraries/doltcore/sqle/statsnoms/database.go +++ b/go/libraries/doltcore/sqle/statsnoms/database.go @@ -231,23 +231,26 @@ func (n *NomsStatsDatabase) initMutable(ctx context.Context, i int) error { return nil } -func (n *NomsStatsDatabase) DeleteStats(branch string, quals ...sql.StatQualifier) { +func (n *NomsStatsDatabase) DeleteStats(ctx *sql.Context, branch string, quals ...sql.StatQualifier) { n.mu.Lock() defer n.mu.Unlock() for i, b := range n.branches { if strings.EqualFold(b, branch) { for _, qual := range quals { + ctx.GetLogger().Debugf("statistics refresh: deleting index statistics: %s/%s", branch, qual) delete(n.stats[i], qual) } } } } -func (n *NomsStatsDatabase) DeleteBranchStats(ctx context.Context, branch string, flush bool) error { +func (n *NomsStatsDatabase) DeleteBranchStats(ctx *sql.Context, branch string, flush bool) error { n.mu.Lock() defer n.mu.Unlock() + ctx.GetLogger().Debugf("statistics refresh: deleting branch statistics: %s", branch) + for i, b := range n.branches { if strings.EqualFold(b, branch) { n.branches = append(n.branches[:i], n.branches[i+1:]...) diff --git a/go/libraries/doltcore/sqle/statspro/auto_refresh.go b/go/libraries/doltcore/sqle/statspro/auto_refresh.go index e87e2d46772..291cc9c138e 100644 --- a/go/libraries/doltcore/sqle/statspro/auto_refresh.go +++ b/go/libraries/doltcore/sqle/statspro/auto_refresh.go @@ -133,10 +133,6 @@ func (p *Provider) checkRefresh(ctx *sql.Context, sqlDb sql.Database, dbName, br } for _, table := range tables { - if !p.TryLockForUpdate(table, dbName, branch) { - continue - } - defer p.UnlockTable(table, dbName, branch) sqlTable, dTab, err := GetLatestTable(ctx, table, sqlDb) if err != nil { return err @@ -156,6 +152,12 @@ func (p *Provider) checkRefresh(ctx *sql.Context, sqlDb sql.Database, dbName, br ctx.GetLogger().Debugf("statistics refresh: new table hash: %s", tableHash) } + if !p.TryLockForUpdate(table, dbName, branch) { + ctx.GetLogger().Debugf("statistics refresh: table is already being updated: %s/%s.%s", branch, dbName, table) + continue + } + defer p.UnlockTable(table, dbName, branch) + iat, ok := sqlTable.(sql.IndexAddressableTable) if !ok { return fmt.Errorf("table does not support indexes %s", table) @@ -240,7 +242,7 @@ func (p *Provider) checkRefresh(ctx *sql.Context, sqlDb sql.Database, dbName, br } } - statDb.DeleteStats(branch, deletedStats...) + statDb.DeleteStats(ctx, branch, deletedStats...) if err := statDb.Flush(ctx, branch); err != nil { return err diff --git a/go/libraries/doltcore/sqle/statspro/interface.go b/go/libraries/doltcore/sqle/statspro/interface.go index ae56b834b1a..e88ef2e4054 100644 --- a/go/libraries/doltcore/sqle/statspro/interface.go +++ b/go/libraries/doltcore/sqle/statspro/interface.go @@ -36,13 +36,13 @@ type Database interface { LoadBranchStats(ctx *sql.Context, branch string) error // DeleteBranchStats removes references to in memory index statistics. // If |flush| is true delete the data from storage. - DeleteBranchStats(ctx context.Context, branch string, flush bool) error + DeleteBranchStats(ctx *sql.Context, branch string, flush bool) error // GetStat returns a branch's index statistics. GetStat(branch string, qual sql.StatQualifier) (*DoltStats, bool) //SetStat bulk replaces the statistic, deleting any previous version SetStat(ctx context.Context, branch string, qual sql.StatQualifier, stats *DoltStats) error //DeleteStats deletes a list of index statistics. - DeleteStats(branch string, quals ...sql.StatQualifier) + DeleteStats(ctx *sql.Context, branch string, quals ...sql.StatQualifier) // ReplaceChunks is an update interface that lets a stats implementation // decide how to edit stats for a stats refresh. ReplaceChunks(ctx context.Context, branch string, qual sql.StatQualifier, targetHashes []hash.Hash, dropChunks, newChunks []sql.HistogramBucket) error diff --git a/go/libraries/doltcore/sqle/statspro/stats_provider.go b/go/libraries/doltcore/sqle/statspro/stats_provider.go index 4cf3e201c44..b4fe48e3e0d 100644 --- a/go/libraries/doltcore/sqle/statspro/stats_provider.go +++ b/go/libraries/doltcore/sqle/statspro/stats_provider.go @@ -279,7 +279,7 @@ func (p *Provider) DropStats(ctx *sql.Context, qual sql.StatQualifier, _ []strin } if _, ok := statDb.GetStat(branch, qual); ok { - statDb.DeleteStats(branch, qual) + statDb.DeleteStats(ctx, branch, qual) p.UpdateStatus(qual.Db(), fmt.Sprintf("dropped statisic: %s", qual.String())) }