Skip to content

Commit c248307

Browse files
omerfirmakwojciechos
authored andcommitted
Add --db-max-handles (#1587)
1 parent 59bc3ab commit c248307

File tree

5 files changed

+26
-6
lines changed

5 files changed

+26
-6
lines changed

cmd/juno/juno.go

+4
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ const (
6363
remoteDBF = "remote-db"
6464
rpcMaxBlockScanF = "rpc-max-block-scan"
6565
dbCacheSizeF = "db-cache-size"
66+
dbMaxHandlesF = "db-max-handles"
6667
gwAPIKeyF = "gw-api-key" //nolint: gosec
6768

6869
defaultConfig = ""
@@ -86,6 +87,7 @@ const (
8687
defaultRemoteDB = ""
8788
defaultRPCMaxBlockScan = math.MaxUint
8889
defaultCacheSizeMb = 8
90+
defaultMaxHandles = 1024
8991
defaultGwAPIKey = ""
9092

9193
configFlagUsage = "The yaml configuration file."
@@ -119,6 +121,7 @@ const (
119121
remoteDBUsage = "gRPC URL of a remote Juno node"
120122
rpcMaxBlockScanUsage = "Maximum number of blocks scanned in single starknet_getEvents call"
121123
dbCacheSizeUsage = "Determines the amount of memory (in megabytes) allocated for caching data in the database."
124+
dbMaxHandlesUsage = "A soft limit on the number of open files that can be used by the DB"
122125
gwAPIKeyUsage = "API key for gateway endpoints to avoid throttling" //nolint: gosec
123126
)
124127

@@ -249,6 +252,7 @@ func NewCmd(config *node.Config, run func(*cobra.Command, []string) error) *cobr
249252
junoCmd.Flags().Uint(rpcMaxBlockScanF, defaultRPCMaxBlockScan, rpcMaxBlockScanUsage)
250253
junoCmd.Flags().Uint(dbCacheSizeF, defaultCacheSizeMb, dbCacheSizeUsage)
251254
junoCmd.Flags().String(gwAPIKeyF, defaultGwAPIKey, gwAPIKeyUsage)
255+
junoCmd.Flags().Int(dbMaxHandlesF, defaultMaxHandles, dbMaxHandlesUsage)
252256

253257
return junoCmd
254258
}

cmd/juno/juno_test.go

+14
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ func TestConfigPrecedence(t *testing.T) {
4646
defaultMaxVMs := uint(3 * runtime.GOMAXPROCS(0))
4747
defaultRPCMaxBlockScan := uint(math.MaxUint)
4848
defaultMaxCacheSize := uint(8)
49+
defaultMaxHandles := 1024
4950

5051
tests := map[string]struct {
5152
cfgFile bool
@@ -82,6 +83,7 @@ func TestConfigPrecedence(t *testing.T) {
8283
MaxVMQueue: 2 * defaultMaxVMs,
8384
RPCMaxBlockScan: defaultRPCMaxBlockScan,
8485
DBCacheSize: defaultMaxCacheSize,
86+
DBMaxHandles: defaultMaxHandles,
8587
},
8688
},
8789
"config file path is empty string": {
@@ -111,6 +113,7 @@ func TestConfigPrecedence(t *testing.T) {
111113
MaxVMQueue: 2 * defaultMaxVMs,
112114
RPCMaxBlockScan: defaultRPCMaxBlockScan,
113115
DBCacheSize: defaultMaxCacheSize,
116+
DBMaxHandles: defaultMaxHandles,
114117
},
115118
},
116119
"config file doesn't exist": {
@@ -145,6 +148,7 @@ func TestConfigPrecedence(t *testing.T) {
145148
MaxVMQueue: 2 * defaultMaxVMs,
146149
RPCMaxBlockScan: defaultRPCMaxBlockScan,
147150
DBCacheSize: defaultMaxCacheSize,
151+
DBMaxHandles: defaultMaxHandles,
148152
},
149153
},
150154
"config file with all settings but without any other flags": {
@@ -181,6 +185,7 @@ pprof: true
181185
MaxVMQueue: 2 * defaultMaxVMs,
182186
RPCMaxBlockScan: defaultRPCMaxBlockScan,
183187
DBCacheSize: defaultMaxCacheSize,
188+
DBMaxHandles: defaultMaxHandles,
184189
},
185190
},
186191
"config file with some settings but without any other flags": {
@@ -214,6 +219,7 @@ http-port: 4576
214219
MaxVMQueue: 2 * defaultMaxVMs,
215220
RPCMaxBlockScan: defaultRPCMaxBlockScan,
216221
DBCacheSize: defaultMaxCacheSize,
222+
DBMaxHandles: defaultMaxHandles,
217223
},
218224
},
219225
"all flags without config file": {
@@ -245,6 +251,7 @@ http-port: 4576
245251
MaxVMQueue: 2 * defaultMaxVMs,
246252
RPCMaxBlockScan: defaultRPCMaxBlockScan,
247253
DBCacheSize: defaultMaxCacheSize,
254+
DBMaxHandles: defaultMaxHandles,
248255
},
249256
},
250257
"some flags without config file": {
@@ -277,6 +284,7 @@ http-port: 4576
277284
MaxVMQueue: 2 * defaultMaxVMs,
278285
RPCMaxBlockScan: defaultRPCMaxBlockScan,
279286
DBCacheSize: defaultMaxCacheSize,
287+
DBMaxHandles: defaultMaxHandles,
280288
},
281289
},
282290
"all setting set in both config file and flags": {
@@ -333,6 +341,7 @@ db-cache-size: 8
333341
MaxVMQueue: 2 * defaultMaxVMs,
334342
RPCMaxBlockScan: defaultRPCMaxBlockScan,
335343
DBCacheSize: 9,
344+
DBMaxHandles: defaultMaxHandles,
336345
},
337346
},
338347
"some setting set in both config file and flags": {
@@ -368,6 +377,7 @@ network: goerli
368377
MaxVMQueue: 2 * defaultMaxVMs,
369378
RPCMaxBlockScan: defaultRPCMaxBlockScan,
370379
DBCacheSize: defaultMaxCacheSize,
380+
DBMaxHandles: defaultMaxHandles,
371381
},
372382
},
373383
"some setting set in default, config file and flags": {
@@ -399,6 +409,7 @@ network: goerli
399409
MaxVMQueue: 2 * defaultMaxVMs,
400410
RPCMaxBlockScan: defaultRPCMaxBlockScan,
401411
DBCacheSize: defaultMaxCacheSize,
412+
DBMaxHandles: defaultMaxHandles,
402413
},
403414
},
404415
"only set env variables": {
@@ -428,6 +439,7 @@ network: goerli
428439
MaxVMQueue: 2 * defaultMaxVMs,
429440
RPCMaxBlockScan: defaultRPCMaxBlockScan,
430441
DBCacheSize: defaultMaxCacheSize,
442+
DBMaxHandles: defaultMaxHandles,
431443
},
432444
},
433445
"some setting set in both env variables and flags": {
@@ -458,6 +470,7 @@ network: goerli
458470
MaxVMQueue: 2 * defaultMaxVMs,
459471
RPCMaxBlockScan: defaultRPCMaxBlockScan,
460472
DBCacheSize: defaultMaxCacheSize,
473+
DBMaxHandles: defaultMaxHandles,
461474
},
462475
},
463476
"some setting set in both env variables and config file": {
@@ -489,6 +502,7 @@ network: goerli
489502
RPCMaxBlockScan: defaultRPCMaxBlockScan,
490503
DBCacheSize: defaultMaxCacheSize,
491504
GatewayAPIKey: "apikey",
505+
DBMaxHandles: defaultMaxHandles,
492506
},
493507
},
494508
}

db/pebble/db.go

+4-3
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,15 @@ type DB struct {
2525
}
2626

2727
// New opens a new database at the given path
28-
func New(path string, cache uint, logger pebble.Logger) (db.DB, error) {
28+
func New(path string, cache uint, maxOpenFiles int, logger pebble.Logger) (db.DB, error) {
2929
// Ensure that the specified cache size meets a minimum threshold.
3030
if cache < minCache {
3131
cache = minCache
3232
}
3333
pDB, err := newPebble(path, &pebble.Options{
34-
Logger: logger,
35-
Cache: pebble.NewCache(int64(cache * megabyte)),
34+
Logger: logger,
35+
Cache: pebble.NewCache(int64(cache * megabyte)),
36+
MaxOpenFiles: maxOpenFiles,
3637
})
3738
if err != nil {
3839
return nil, err

node/node.go

+3-2
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,8 @@ type Config struct {
7777
MaxVMQueue uint `mapstructure:"max-vm-queue"`
7878
RPCMaxBlockScan uint `mapstructure:"rpc-max-block-scan"`
7979

80-
DBCacheSize uint `mapstructure:"db-cache-size"`
80+
DBCacheSize uint `mapstructure:"db-cache-size"`
81+
DBMaxHandles int `mapstructure:"db-max-handles"`
8182

8283
GatewayAPIKey string `mapstructure:"gw-api-key"`
8384
}
@@ -111,7 +112,7 @@ func New(cfg *Config, version string) (*Node, error) { //nolint:gocyclo,funlen
111112
if dbIsRemote {
112113
database, err = remote.New(cfg.RemoteDB, context.TODO(), log, grpc.WithTransportCredentials(insecure.NewCredentials()))
113114
} else {
114-
database, err = pebble.New(cfg.DatabasePath, cfg.DBCacheSize, dbLog)
115+
database, err = pebble.New(cfg.DatabasePath, cfg.DBCacheSize, cfg.DBMaxHandles, dbLog)
115116
}
116117
if err != nil {
117118
return nil, fmt.Errorf("open DB: %w", err)

node/node_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ func TestNetworkVerificationOnNonEmptyDB(t *testing.T) {
6767
t.Run(description, func(t *testing.T) {
6868
dbPath := t.TempDir()
6969
log := utils.NewNopZapLogger()
70-
database, err := pebble.New(dbPath, 1, log)
70+
database, err := pebble.New(dbPath, 1, 1, log)
7171
require.NoError(t, err)
7272
chain := blockchain.New(database, network, log)
7373
syncer := sync.New(chain, adaptfeeder.New(feeder.NewTestClient(t, network)), log, 0, false)

0 commit comments

Comments
 (0)