Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions chain/chain_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -463,7 +463,8 @@ func TestChainFromIntersect(t *testing.T) {
Slot: testBlocks[testForkPointIndex].MockSlot,
},
}
db, err := database.New(nil, nil, "")
const testCacheSize int64 = 1 << 20
db, err := database.New(nil, nil, "", testCacheSize)
if err != nil {
t.Fatalf("unexpected error creating database: %s", err)
}
Expand Down Expand Up @@ -521,7 +522,8 @@ func TestChainFork(t *testing.T) {
MockPrevHash: testHashPrefix + "00a5",
},
}
db, err := database.New(nil, nil, "")
const testCacheSize int64 = 1 << 20
db, err := database.New(nil, nil, "", testCacheSize)
if err != nil {
t.Fatalf("unexpected error creating database: %s", err)
}
Expand Down
9 changes: 9 additions & 0 deletions config.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ import (
type ListenerConfig = connmanager.ListenerConfig

type Config struct {
badgerCacheSize int64
cardanoNodeConfig *cardano.CardanoNodeConfig
dataDir string
intersectPoints []ocommon.Point
Expand Down Expand Up @@ -243,3 +244,11 @@ func WithTracingStdout(stdout bool) ConfigOptionFunc {
c.tracingStdout = stdout
}
}

// WithBadgerCacheSize sets the maximum cache size (in bytes).This controls memory usage by limiting the size of block and index caches.
// If not set, the default size defined in internal config will be used.
func WithBadgerCacheSize(cacheSize int64) ConfigOptionFunc {
return func(c *Config) {
c.badgerCacheSize = cacheSize
}
}
3 changes: 2 additions & 1 deletion database/database.go
Original file line number Diff line number Diff line change
Expand Up @@ -97,12 +97,13 @@ func New(
logger *slog.Logger,
promRegistry prometheus.Registerer,
dataDir string,
badgerCacheSize int64,
) (*Database, error) {
metadataDb, err := metadata.New("sqlite", dataDir, logger, promRegistry)
if err != nil {
return nil, err
}
blobDb, err := blob.New("badger", dataDir, logger, promRegistry)
blobDb, err := blob.New("badger", dataDir, logger, promRegistry, badgerCacheSize)
if err != nil {
return nil, err
}
Expand Down
3 changes: 2 additions & 1 deletion database/database_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,8 @@ func TestInMemorySqliteMultipleTransaction(t *testing.T) {
}
return nil
}
db, err := database.New(nil, nil, "") // in-memory
const testCacheSize int64 = 1 << 20
db, err := database.New(nil, nil, "", testCacheSize) // in-memory
if err != nil {
t.Fatalf("unexpected error: %s", err)
}
Expand Down
6 changes: 4 additions & 2 deletions database/plugin/blob/badger/database.go
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ func New(
dataDir string,
logger *slog.Logger,
promRegistry prometheus.Registerer,
badgerCacheSize int64,
) (*BlobStoreBadger, error) {
var blobDb *badger.DB
var err error
Expand Down Expand Up @@ -91,8 +92,9 @@ func New(
db.gcEnabled = true
badgerOpts := badger.DefaultOptions(blobDir).
WithLogger(NewBadgerLogger(logger)).
// The default INFO logging is a bit verbose
WithLoggingLevel(badger.WARNING)
WithLoggingLevel(badger.WARNING).
WithBlockCacheSize(int64(float64(badgerCacheSize) * 0.75)). // 75% for block cache
WithIndexCacheSize(int64(float64(badgerCacheSize) * 0.25)) // 25% for index cache
blobDb, err = badger.Open(badgerOpts)
if err != nil {
return nil, err
Expand Down
3 changes: 2 additions & 1 deletion database/plugin/blob/store.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ func New(
pluginName, dataDir string,
logger *slog.Logger,
promRegistry prometheus.Registerer,
badgerCacheSize int64,
) (BlobStore, error) {
return badgerPlugin.New(dataDir, logger, promRegistry)
return badgerPlugin.New(dataDir, logger, promRegistry, badgerCacheSize)
}
6 changes: 5 additions & 1 deletion dingo.yaml.example
Original file line number Diff line number Diff line change
Expand Up @@ -50,4 +50,8 @@ utxorpcPort: 9090

# Ignore prior chain history and start from current tip (default: false)
# This is experimental and may break — use with caution
intersectTip: false
intersectTip: false

# Maximum cache size in bytes used by BadgerDB for block/index cache
# Default: 1073741824 (1 GB)
badgerCacheSize: 1073741824
2 changes: 2 additions & 0 deletions internal/config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ func FromContext(ctx context.Context) *Config {
}

type Config struct {
BadgerCacheSize int64 `split_words:"true" yaml:"badgerCacheSize"`
BindAddr string `split_words:"true" yaml:"bindAddr"`
CardanoConfig string ` yaml:"cardanoConfig" envconfig:"config"`
DatabasePath string `split_words:"true" yaml:"databasePath"`
Expand All @@ -60,6 +61,7 @@ type Config struct {
}

var globalConfig = &Config{
BadgerCacheSize: 1073741824,
BindAddr: "0.0.0.0",
CardanoConfig: "./config/cardano/preview/config.json",
DatabasePath: ".dingo",
Expand Down
4 changes: 4 additions & 0 deletions internal/config/config_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (

func resetGlobalConfig() {
globalConfig = &Config{
BadgerCacheSize: 1073741824,
BindAddr: "0.0.0.0",
CardanoConfig: "./config/cardano/preview/config.json",
DatabasePath: ".dingo",
Expand All @@ -28,6 +29,7 @@ func resetGlobalConfig() {
func TestLoad_CompareFullStruct(t *testing.T) {
resetGlobalConfig()
yamlContent := `
badgerCacheSize: 8388608
bindAddr: "127.0.0.1"
cardanoConfig: "./cardano/preview/config.json"
databasePath: ".dingo"
Expand All @@ -52,6 +54,7 @@ tlsKeyFilePath: "key1.pem"
defer os.Remove(tmpFile)

expected := &Config{
BadgerCacheSize: 8388608,
BindAddr: "127.0.0.1",
CardanoConfig: "./cardano/preview/config.json",
DatabasePath: ".dingo",
Expand Down Expand Up @@ -92,6 +95,7 @@ func TestLoad_WithoutConfigFile_UsesDefaults(t *testing.T) {

// Expected is the original default values from globalConfig
expected := &Config{
BadgerCacheSize: 1073741824,
BindAddr: "0.0.0.0",
CardanoConfig: "./config/cardano/preview/config.json",
DatabasePath: ".dingo",
Expand Down
2 changes: 1 addition & 1 deletion internal/node/load.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ func Load(cfg *config.Config, logger *slog.Logger, immutableDir string) error {
)
}
// Load database
db, err := database.New(logger, nil, cfg.DatabasePath)
db, err := database.New(logger, nil, cfg.DatabasePath, cfg.BadgerCacheSize)
if err != nil {
return err
}
Expand Down
1 change: 1 addition & 0 deletions internal/node/node.go
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,7 @@ func Run(cfg *config.Config, logger *slog.Logger) error {
dingo.WithIntersectTip(cfg.IntersectTip),
dingo.WithLogger(logger),
dingo.WithDatabasePath(cfg.DatabasePath),
dingo.WithBadgerCacheSize(cfg.BadgerCacheSize),
dingo.WithNetwork(cfg.Network),
dingo.WithCardanoNodeConfig(nodeCfg),
dingo.WithListeners(listeners...),
Expand Down
2 changes: 1 addition & 1 deletion node.go
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ func (n *Node) Run() error {
}
// Load database
dbNeedsRecovery := false
db, err := database.New(n.config.logger, n.config.promRegistry, n.config.dataDir)
db, err := database.New(n.config.logger, n.config.promRegistry, n.config.dataDir, n.config.badgerCacheSize)
if db == nil {
n.config.logger.Error(
"failed to create database",
Expand Down
Loading