Skip to content

Commit

Permalink
refactor(server/v2): late bound storeBuilder (#22206)
Browse files Browse the repository at this point in the history
  • Loading branch information
kocubinski authored Oct 10, 2024
1 parent c39ec6f commit 742cb07
Show file tree
Hide file tree
Showing 2 changed files with 9 additions and 81 deletions.
87 changes: 8 additions & 79 deletions server/v2/store/commands.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,13 @@ package store

import (
"fmt"
"os"
"path/filepath"
"strings"

"github.com/spf13/cobra"
"github.com/spf13/viper"

"cosmossdk.io/log"
serverv2 "cosmossdk.io/server/v2"
storev2 "cosmossdk.io/store/v2"
"cosmossdk.io/store/v2/db"
"cosmossdk.io/store/v2/root"
)

Expand Down Expand Up @@ -45,7 +41,7 @@ Supported app-db-backend types include 'goleveldb', 'rocksdb', 'pebbledb'.`,

logger := log.NewLogger(cmd.OutOrStdout())

rootStore, keepRecent, err := createRootStore(cmd, vp, logger)
rootStore, opts, err := createRootStore(vp, logger)
if err != nil {
return fmt.Errorf("can not create root store %w", err)
}
Expand All @@ -60,7 +56,7 @@ Supported app-db-backend types include 'goleveldb', 'rocksdb', 'pebbledb'.`,
return fmt.Errorf("the database has no valid heights to prune, the latest height: %v", latestHeight)
}

diff := latestHeight - keepRecent
diff := latestHeight - opts.SCPruningOption.KeepRecent
cmd.Printf("pruning heights up to %v\n", diff)

err = rootStore.Prune(latestHeight)
Expand All @@ -79,81 +75,14 @@ Supported app-db-backend types include 'goleveldb', 'rocksdb', 'pebbledb'.`,
return cmd
}

func createRootStore(cmd *cobra.Command, v *viper.Viper, logger log.Logger) (storev2.RootStore, uint64, error) {
tempViper := v
rootDir := v.GetString(serverv2.FlagHome)
// handle FlagAppDBBackend
var dbType db.DBType
if cmd.Flags().Changed(FlagAppDBBackend) {
dbStr, err := cmd.Flags().GetString(FlagAppDBBackend)
if err != nil {
return nil, 0, err
}
dbType = db.DBType(dbStr)
} else {
dbType = db.DBType(v.GetString(FlagAppDBBackend))
}
scRawDb, err := db.NewDB(dbType, "application", filepath.Join(rootDir, "data"), nil)
func createRootStore(v *viper.Viper, logger log.Logger) (storev2.RootStore, root.Options, error) {
storeConfig, err := UnmarshalConfig(v.AllSettings())
if err != nil {
panic(err)
}

// handle KeepRecent & Interval flags
if cmd.Flags().Changed(FlagKeepRecent) {
keepRecent, err := cmd.Flags().GetUint64(FlagKeepRecent)
if err != nil {
return nil, 0, err
}

// viper has an issue that we could not override subitem then Unmarshal key
// so we can not do viper.Set() as comment below
// https://github.com/spf13/viper/issues/1106
// Do it by a hacky: overwrite app.toml file then read config again.

// v.Set("store.options.sc-pruning-option.keep-recent", keepRecent) // entry that read from app.toml
// v.Set("store.options.ss-pruning-option.keep-recent", keepRecent)

err = overrideKeepRecent(filepath.Join(rootDir, "config"), keepRecent)
if err != nil {
return nil, 0, err
}

tempViper, err = serverv2.ReadConfig(filepath.Join(rootDir, "config"))
if err != nil {
return nil, 0, err
}
return nil, root.Options{}, fmt.Errorf("failed to unmarshal config: %w", err)
}

storeOpts := root.DefaultStoreOptions()
if v != nil && v.Sub("store.options") != nil {
if err := v.Sub("store.options").Unmarshal(&storeOpts); err != nil {
return nil, 0, fmt.Errorf("failed to store options: %w", err)
}
}

store, err := root.CreateRootStore(&root.FactoryOptions{
Logger: logger,
RootDir: rootDir,
Options: storeOpts,
SCRawDB: scRawDb,
})

return store, tempViper.GetUint64("store.options.sc-pruning-option.keep-recent"), err
}

func overrideKeepRecent(configPath string, keepRecent uint64) error {
bz, err := os.ReadFile(filepath.Join(configPath, "app.toml"))
store, err := root.NewBuilder().Build(logger, storeConfig)
if err != nil {
return err
return nil, root.Options{}, fmt.Errorf("failed to create store backend: %w", err)
}
lines := strings.Split(string(bz), "\n")

for i, line := range lines {
if strings.Contains(line, "keep-recent") {
lines[i] = fmt.Sprintf("keep-recent = %d", keepRecent)
}
}
output := strings.Join(lines, "\n")

return os.WriteFile(filepath.Join(configPath, "app.toml"), []byte(output), 0o600)
return store, storeConfig.Options, nil
}
3 changes: 1 addition & 2 deletions server/v2/store/snapshot.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,7 @@ func (s *Server[T]) ExportSnapshotCmd() *cobra.Command {
}

logger := log.NewLogger(cmd.OutOrStdout())
// app := appCreator(logger, db, nil, viper)
rootStore, _, err := createRootStore(cmd, v, logger)
rootStore, _, err := createRootStore(v, logger)
if err != nil {
return err
}
Expand Down

0 comments on commit 742cb07

Please sign in to comment.