Browse Source

Fix config bug where chain_id is default magic. Always read from genesis

pull/159/head
Jae Kwon 9 years ago
parent
commit
7c12c5aee3
6 changed files with 74 additions and 36 deletions
  1. +3
    -1
      cmd/barak/main.go
  2. +3
    -1
      cmd/debora/main.go
  3. +54
    -13
      config/config.go
  4. +2
    -11
      config/tendermint/config.go
  5. +1
    -10
      config/tendermint_test/config.go
  6. +11
    -0
      node/node.go

+ 3
- 1
cmd/barak/main.go View File

@ -50,7 +50,9 @@ func main() {
fmt.Printf("New Barak Process (PID: %d)\n", os.Getpid())
// Apply bare tendermint/* configuration.
cfg.ApplyConfig(cfg.MapConfig(map[string]interface{}{"log_level": "info"}))
config := cfg.NewMapConfig(nil)
config.Set("log_level", "info")
cfg.ApplyConfig(config)
// Read options
optionsFile := parseFlags()


+ 3
- 1
cmd/debora/main.go View File

@ -35,7 +35,9 @@ func main() {
fmt.Printf("New Debora Process (PID: %d)\n", os.Getpid())
// Apply bare tendermint/* configuration.
cfg.ApplyConfig(cfg.MapConfig(map[string]interface{}{"log_level": "notice"}))
config := cfg.NewMapConfig(nil)
config.Set("log_level", "notice")
cfg.ApplyConfig(config)
rootDir := os.Getenv("DEBROOT")
if rootDir == "" {


+ 54
- 13
config/config.go View File

@ -1,8 +1,11 @@
package config
import (
"github.com/tendermint/tendermint/Godeps/_workspace/src/github.com/naoina/toml"
"sync"
"time"
. "github.com/tendermint/tendermint/common"
)
type Config interface {
@ -19,28 +22,66 @@ type Config interface {
Set(key string, value interface{})
}
type MapConfig map[string]interface{}
type MapConfig struct {
required map[string]struct{} // blows up if trying to use before setting.
data map[string]interface{}
}
func ReadMapConfigFromFile(filePath string) (MapConfig, error) {
var configData = make(map[string]interface{})
fileBytes := MustReadFile(filePath)
err := toml.Unmarshal(fileBytes, configData)
if err != nil {
return MapConfig{}, err
}
return NewMapConfig(configData), nil
}
func NewMapConfig(data map[string]interface{}) MapConfig {
if data == nil {
data = make(map[string]interface{})
}
return MapConfig{
required: make(map[string]struct{}),
data: data,
}
}
func (cfg MapConfig) Get(key string) interface{} { return cfg[key] }
func (cfg MapConfig) GetBool(key string) bool { return cfg[key].(bool) }
func (cfg MapConfig) GetFloat64(key string) float64 { return cfg[key].(float64) }
func (cfg MapConfig) GetInt(key string) int { return cfg[key].(int) }
func (cfg MapConfig) GetString(key string) string { return cfg[key].(string) }
func (cfg MapConfig) Get(key string) interface{} {
if _, ok := cfg.required[key]; ok {
PanicSanity(Fmt("config key %v is required but was not set.", key))
}
return cfg.data[key]
}
func (cfg MapConfig) GetBool(key string) bool { return cfg.Get(key).(bool) }
func (cfg MapConfig) GetFloat64(key string) float64 { return cfg.Get(key).(float64) }
func (cfg MapConfig) GetInt(key string) int { return cfg.Get(key).(int) }
func (cfg MapConfig) GetString(key string) string { return cfg.Get(key).(string) }
func (cfg MapConfig) GetStringMap(key string) map[string]interface{} {
return cfg[key].(map[string]interface{})
return cfg.Get(key).(map[string]interface{})
}
func (cfg MapConfig) GetStringMapString(key string) map[string]string {
return cfg[key].(map[string]string)
return cfg.Get(key).(map[string]string)
}
func (cfg MapConfig) GetStringSlice(key string) []string { return cfg.Get(key).([]string) }
func (cfg MapConfig) GetTime(key string) time.Time { return cfg.Get(key).(time.Time) }
func (cfg MapConfig) IsSet(key string) bool { _, ok := cfg.data[key]; return ok }
func (cfg MapConfig) Set(key string, value interface{}) {
delete(cfg.required, key)
cfg.data[key] = value
}
func (cfg MapConfig) GetStringSlice(key string) []string { return cfg[key].([]string) }
func (cfg MapConfig) GetTime(key string) time.Time { return cfg[key].(time.Time) }
func (cfg MapConfig) IsSet(key string) bool { _, ok := cfg[key]; return ok }
func (cfg MapConfig) Set(key string, value interface{}) { cfg[key] = value }
func (cfg MapConfig) SetDefault(key string, value interface{}) {
delete(cfg.required, key)
if cfg.IsSet(key) {
return
}
cfg.data[key] = value
}
func (cfg MapConfig) SetRequired(key string) {
if cfg.IsSet(key) {
return
}
cfg[key] = value
cfg.required[key] = struct{}{}
}
//--------------------------------------------------------------------------------


+ 2
- 11
config/tendermint/config.go View File

@ -1,7 +1,6 @@
package tendermint
import (
"github.com/tendermint/tendermint/Godeps/_workspace/src/github.com/naoina/toml"
"os"
"path"
"strings"
@ -38,10 +37,8 @@ func GetConfig(rootDir string) cfg.Config {
rootDir = getTMRoot(rootDir)
initTMRoot(rootDir)
var mapConfig = cfg.MapConfig(make(map[string]interface{}))
configFilePath := path.Join(rootDir, "config.toml")
configFileBytes := MustReadFile(configFilePath)
err := toml.Unmarshal(configFileBytes, mapConfig)
mapConfig, err := cfg.ReadMapConfigFromFile(configFilePath)
if err != nil {
Exit(Fmt("Could not read config: %v", err))
}
@ -53,7 +50,7 @@ func GetConfig(rootDir string) cfg.Config {
if mapConfig.IsSet("revision_file") {
Exit("Cannot set 'revision_file' via config.toml. It must match what's in the Makefile")
}
mapConfig.SetDefault("chain_id", "tendermint_testnet_11.c") // TODO ALSO UPDATE GENESIS BELOW!!!
mapConfig.SetRequired("chain_id") // blows up if you try to use it before setting.
mapConfig.SetDefault("genesis_file", rootDir+"/genesis.json")
mapConfig.SetDefault("moniker", "anonymous")
mapConfig.SetDefault("node_laddr", "0.0.0.0:46656")
@ -73,12 +70,6 @@ func GetConfig(rootDir string) cfg.Config {
return mapConfig
}
func ensureDefault(mapConfig cfg.MapConfig, key string, value interface{}) {
if !mapConfig.IsSet(key) {
mapConfig[key] = value
}
}
var defaultConfigTmpl = `# This is a TOML config file.
# For more information, see https://github.com/toml-lang/toml


+ 1
- 10
config/tendermint_test/config.go View File

@ -3,7 +3,6 @@
package tendermint_test
import (
"github.com/tendermint/tendermint/Godeps/_workspace/src/github.com/naoina/toml"
"os"
"path"
"strings"
@ -47,10 +46,8 @@ func GetConfig(rootDir string) cfg.Config {
rootDir = getTMRoot(rootDir)
initTMRoot(rootDir)
var mapConfig = cfg.MapConfig(make(map[string]interface{}))
configFilePath := path.Join(rootDir, "config.toml")
configFileBytes := MustReadFile(configFilePath)
err := toml.Unmarshal(configFileBytes, mapConfig)
mapConfig, err := cfg.ReadMapConfigFromFile(configFilePath)
if err != nil {
Exit(Fmt("Could not read config: %v", err))
}
@ -78,12 +75,6 @@ func GetConfig(rootDir string) cfg.Config {
return mapConfig
}
func ensureDefault(mapConfig cfg.MapConfig, key string, value interface{}) {
if !mapConfig.IsSet(key) {
mapConfig[key] = value
}
}
var defaultConfigTmpl = `# This is a TOML config file.
# For more information, see https://github.com/toml-lang/toml


+ 11
- 0
node/node.go View File

@ -2,6 +2,7 @@ package node
import (
"bytes"
"io/ioutil"
"math/rand"
"net"
"net/http"
@ -297,6 +298,16 @@ func RunNode() {
if FileExists(genDocFile) {
break
}
jsonBlob, err := ioutil.ReadFile(genDocFile)
if err != nil {
Exit(Fmt("Couldn't read GenesisDoc file: %v", err))
}
genDoc := stypes.GenesisDocFromJSON(jsonBlob)
if genDoc.ChainID == "" {
PanicSanity(Fmt("Genesis doc %v must include non-empty chain_id", genDocFile))
}
config.Set("chain_id", genDoc.ChainID)
config.Set("genesis_doc", genDoc)
}
}


Loading…
Cancel
Save