Skip to content
Snippets Groups Projects
Select Git revision
  • 9c97a7a094ed9013ea5f520ff3f5a127c7952c41
  • without_tipselection default
  • develop protected
  • fix/grafana-local-dashboard
  • wasp
  • fix/dashboard-explorer-freeze
  • master
  • feat/timerqueue
  • test/sync_debug_and_650
  • feat/sync_revamp_inv
  • wip/sync
  • tool/db-recovery
  • portcheck/fix
  • fix/synchronization
  • feat/new-dashboard-analysis
  • feat/refactored-analysis-dashboard
  • feat/new-analysis-dashboard
  • test/demo-prometheus-fpc
  • prometheus_metrics
  • wip/analysis-server
  • merge/fpc-test-value-transfer
  • v0.2.2
  • v0.2.1
  • v0.2.0
  • v0.1.3
  • v0.1.2
  • v0.1.1
  • v0.1.0
28 results

database.go

Blame
  • user avatar
    Luca Moser authored and GitHub committed
    * migrates to hive.go database package
    
    * review fixes
    
    * alias types and vars from hive.go's db package
    
    * Move database to tempdir to prevent sideeffects in tests
    
    * fix import
    
    Co-authored-by: default avatarWolfgang Welz <welzwo@gmail.com>
    9c97a7a0
    History
    database.go 1.74 KiB
    package database
    
    import (
    	"io/ioutil"
    	"os"
    	"runtime"
    	"sync"
    
    	"github.com/dgraph-io/badger/v2"
    	"github.com/iotaledger/goshimmer/packages/parameter"
    	"github.com/iotaledger/hive.go/database"
    	"github.com/iotaledger/hive.go/logger"
    )
    
    var (
    	instance       *badger.DB
    	once           sync.Once
    	ErrKeyNotFound = database.ErrKeyNotFound
    )
    
    type (
    	Database     = database.Database
    	Entry        = database.Entry
    	KeyOnlyEntry = database.KeyOnlyEntry
    	KeyPrefix    = database.KeyPrefix
    	Value        = database.Value
    )
    
    func Get(dbPrefix byte, optionalBadger ...*badger.DB) (Database, error) {
    	return database.Get(dbPrefix, optionalBadger...)
    }
    
    func GetBadgerInstance() *badger.DB {
    	once.Do(func() {
    		dbDir := parameter.NodeConfig.GetString(CFG_DIRECTORY)
    
    		var dbDirClear bool
    		// check whether the database is new, by checking whether any file exists within
    		// the database directory
    		fileInfos, err := ioutil.ReadDir(dbDir)
    		if err != nil {
    			// panic on other errors, for example permission related
    			if !os.IsNotExist(err) {
    				panic(err)
    			}
    			dbDirClear = true
    		}
    		if len(fileInfos) == 0 {
    			dbDirClear = true
    		}
    
    		opts := badger.DefaultOptions(dbDir)
    		opts.Logger = nil
    		if runtime.GOOS == "windows" {
    			opts = opts.WithTruncate(true)
    		}
    
    		db, err := database.CreateDB(dbDir, opts)
    		if err != nil {
    			// errors should cause a panic to avoid singleton deadlocks
    			panic(err)
    		}
    		instance = db
    
    		// up on the first caller, check whether the version of the database is compatible
    		checkDatabaseVersion(dbDirClear)
    	})
    	return instance
    }
    
    func CleanupBadgerInstance(log *logger.Logger) {
    	db := GetBadgerInstance()
    	log.Info("Running Badger database garbage collection")
    	var err error
    	for err == nil {
    		err = db.RunValueLogGC(0.7)
    	}
    }