github.com/treeverse/lakefs@v1.24.1-0.20240520134607-95648127bfb0/pkg/kv/local/driver.go (about)

     1  package local
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"sync"
     7  
     8  	"github.com/dgraph-io/badger/v4"
     9  	"github.com/treeverse/lakefs/pkg/kv"
    10  	"github.com/treeverse/lakefs/pkg/kv/kvparams"
    11  	"github.com/treeverse/lakefs/pkg/logging"
    12  )
    13  
    14  const (
    15  	DriverName = "local"
    16  )
    17  
    18  var (
    19  	driverLock = &sync.Mutex{}
    20  	dbMap      = make(map[string]*Store)
    21  )
    22  
    23  type Driver struct{}
    24  
    25  func (d *Driver) Open(ctx context.Context, kvParams kvparams.Config) (kv.Store, error) {
    26  	params := kvParams.Local
    27  	if params == nil {
    28  		return nil, fmt.Errorf("missing %s settings: %w", DriverName, kv.ErrDriverConfiguration)
    29  	}
    30  
    31  	driverLock.Lock()
    32  	defer driverLock.Unlock()
    33  	connection, ok := dbMap[params.Path]
    34  	if !ok {
    35  		// no database open for this path
    36  		var logger logging.Logger = logging.DummyLogger{}
    37  		if params.EnableLogging {
    38  			logger = logging.FromContext(ctx).WithField("store", "local")
    39  		}
    40  		opts := badger.DefaultOptions(params.Path)
    41  		opts.Logger = &BadgerLogger{logger}
    42  		db, err := badger.Open(opts)
    43  		if err != nil {
    44  			return nil, err
    45  		}
    46  		connection = &Store{
    47  			db:           db,
    48  			logger:       logger,
    49  			prefetchSize: params.PrefetchSize,
    50  			path:         params.Path,
    51  		}
    52  		dbMap[params.Path] = connection
    53  	}
    54  	connection.refCount++
    55  	return connection, nil
    56  }
    57  
    58  //nolint:gochecknoinits
    59  func init() {
    60  	kv.Register(DriverName, &Driver{})
    61  }