From 12e3d1bdf84301921ff8330bf7797ff66fd0700f Mon Sep 17 00:00:00 2001 From: Aaron Son Date: Tue, 18 Jan 2022 12:53:45 -0800 Subject: [PATCH] go/libraries/doltcore/sqle: database_provider: Fix up unlocked read of p.databases map. --- .../doltcore/sqle/database_provider.go | 28 +++++++++++-------- 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/go/libraries/doltcore/sqle/database_provider.go b/go/libraries/doltcore/sqle/database_provider.go index 98d80a2377..3ca476f9ca 100644 --- a/go/libraries/doltcore/sqle/database_provider.go +++ b/go/libraries/doltcore/sqle/database_provider.go @@ -101,12 +101,9 @@ func (p DoltDatabaseProvider) WithDbFactoryUrl(url string) DoltDatabaseProvider func (p DoltDatabaseProvider) Database(name string) (db sql.Database, err error) { name = strings.ToLower(name) var ok bool - func() { - p.mu.RLock() - defer p.mu.RUnlock() - - db, ok = p.databases[name] - }() + p.mu.RLock() + db, ok = p.databases[name] + p.mu.RUnlock() if ok { return db, nil } @@ -115,15 +112,20 @@ func (p DoltDatabaseProvider) Database(name string) (db sql.Database, err error) if err != nil { return nil, err } - if ok { - p.mu.Lock() - defer p.mu.Unlock() - p.databases[name] = db - return db, nil + if !ok { + return nil, sql.ErrDatabaseNotFound.New(name) + } + + p.mu.Lock() + defer p.mu.Unlock() + if found, ok := p.databases[name]; !ok { + p.databases[name] = db + return db, nil + } else { + return found, nil } - return nil, sql.ErrDatabaseNotFound.New(name) } func (p DoltDatabaseProvider) HasDatabase(name string) bool { @@ -230,7 +232,9 @@ func (p DoltDatabaseProvider) databaseForRevision(ctx context.Context, revDB str parts := strings.SplitN(revDB, dbRevisionDelimiter, 2) dbName, revSpec := parts[0], parts[1] + p.mu.RLock() candidate, ok := p.databases[dbName] + p.mu.RUnlock() if !ok { return nil, dsess.InitialDbState{}, false, nil }