diff --git a/packages/binary/tangle/tangle.go b/packages/binary/tangle/tangle.go index 9033cfdd65e7360ee3c364f2ed3e47705f6a7c47..185937043da051b0a1c8f1ea33db0a72726f48f8 100644 --- a/packages/binary/tangle/tangle.go +++ b/packages/binary/tangle/tangle.go @@ -4,6 +4,7 @@ import ( "container/list" "time" + "github.com/dgraph-io/badger/v2" "github.com/iotaledger/hive.go/types" "github.com/iotaledger/goshimmer/packages/binary/storageprefix" @@ -37,13 +38,13 @@ type Tangle struct { } // Constructor for the tangle. -func New(storageId []byte) (result *Tangle) { +func New(badgerInstance *badger.DB, storageId []byte) (result *Tangle) { result = &Tangle{ storageId: storageId, - transactionStorage: objectstorage.New(append(storageId, storageprefix.TangleTransaction...), transaction.FromStorage), - transactionMetadataStorage: objectstorage.New(append(storageId, storageprefix.TangleTransactionMetadata...), transactionmetadata.FromStorage), - approverStorage: objectstorage.New(append(storageId, storageprefix.TangleApprovers...), approver.FromStorage, objectstorage.PartitionKey(transaction.IdLength, transaction.IdLength)), - missingTransactionsStorage: objectstorage.New(append(storageId, storageprefix.TangleMissingTransaction...), missingtransaction.FromStorage), + transactionStorage: objectstorage.New(badgerInstance, append(storageId, storageprefix.TangleTransaction...), transaction.FromStorage, objectstorage.CacheTime(10*time.Second), objectstorage.LeakDetectionEnabled(false)), + transactionMetadataStorage: objectstorage.New(badgerInstance, append(storageId, storageprefix.TangleTransactionMetadata...), transactionmetadata.FromStorage, objectstorage.CacheTime(10*time.Second), objectstorage.LeakDetectionEnabled(false)), + approverStorage: objectstorage.New(badgerInstance, append(storageId, storageprefix.TangleApprovers...), approver.FromStorage, objectstorage.CacheTime(10*time.Second), objectstorage.PartitionKey(transaction.IdLength, transaction.IdLength), objectstorage.LeakDetectionEnabled(false)), + missingTransactionsStorage: objectstorage.New(badgerInstance, append(storageId, storageprefix.TangleMissingTransaction...), missingtransaction.FromStorage, objectstorage.CacheTime(10*time.Second), objectstorage.LeakDetectionEnabled(false)), Events: *newEvents(), } diff --git a/packages/binary/tangle/tangle_test.go b/packages/binary/tangle/tangle_test.go index 33420e87dacbb7611078bcff3875665401de8e12..c8ff887c1f0659f340749dd564f3d7f001811be2 100644 --- a/packages/binary/tangle/tangle_test.go +++ b/packages/binary/tangle/tangle_test.go @@ -5,16 +5,28 @@ import ( "testing" "time" + "github.com/dgraph-io/badger/v2" "github.com/iotaledger/hive.go/events" + "github.com/iotaledger/hive.go/database" + "github.com/iotaledger/goshimmer/packages/binary/identity" "github.com/iotaledger/goshimmer/packages/binary/tangle/model/transaction" "github.com/iotaledger/goshimmer/packages/binary/tangle/model/transaction/payload/data" "github.com/iotaledger/goshimmer/packages/binary/tangle/model/transactionmetadata" + "github.com/iotaledger/goshimmer/plugins/config" ) +var testDatabase *badger.DB + +var _ = config.PLUGIN + +func init() { + testDatabase = database.GetBadgerInstance() +} + func BenchmarkTangle_AttachTransaction(b *testing.B) { - tangle := New([]byte("TEST_BINARY_TANGLE")) + tangle := New(testDatabase, []byte("TEST_BINARY_TANGLE")) if err := tangle.Prune(); err != nil { b.Error(err) @@ -39,7 +51,7 @@ func BenchmarkTangle_AttachTransaction(b *testing.B) { } func TestTangle_AttachTransaction(t *testing.T) { - tangle := New([]byte("TEST_BINARY_TANGLE")) + tangle := New(testDatabase, []byte("TEST_BINARY_TANGLE")) if err := tangle.Prune(); err != nil { t.Error(err) diff --git a/plugins/config/config.go b/plugins/config/config.go new file mode 100644 index 0000000000000000000000000000000000000000..70513880fa272a3878d840c6cb7211fa26eb8df6 --- /dev/null +++ b/plugins/config/config.go @@ -0,0 +1,64 @@ +package config + +import ( + "github.com/iotaledger/hive.go/logger" + "github.com/iotaledger/hive.go/node" + "github.com/iotaledger/hive.go/parameter" + flag "github.com/spf13/pflag" + "github.com/spf13/viper" +) + +var ( + // flags + configName = flag.StringP("config", "c", "config", "Filename of the config file without the file extension") + configDirPath = flag.StringP("config-dir", "d", ".", "Path to the directory containing the config file") + + // viper + NodeConfig *viper.Viper + + // logger + defaultLoggerConfig = logger.Config{ + Level: "info", + DisableCaller: false, + DisableStacktrace: false, + Encoding: "console", + OutputPaths: []string{"goshimmer.log"}, + DisableEvents: false, + } +) + +func init() { + // set the default logger config + NodeConfig = viper.New() + NodeConfig.SetDefault(logger.ViperKey, defaultLoggerConfig) + + if err := Fetch(false); err != nil { + panic(err) + } + parseParameters() +} + +func parseParameters() { + for _, pluginName := range NodeConfig.GetStringSlice(node.CFG_DISABLE_PLUGINS) { + node.DisabledPlugins[node.GetPluginIdentifier(pluginName)] = true + } + for _, pluginName := range NodeConfig.GetStringSlice(node.CFG_ENABLE_PLUGINS) { + node.EnabledPlugins[node.GetPluginIdentifier(pluginName)] = true + } +} + +// Fetch fetches config values from a dir defined via CLI flag --config-dir (or the current working dir if not set). +// +// It automatically reads in a single config file starting with "config" (can be changed via the --config CLI flag) +// and ending with: .json, .toml, .yaml or .yml (in this sequence). +func Fetch(printConfig bool, ignoreSettingsAtPrint ...[]string) error { + err := parameter.LoadConfigFile(NodeConfig, *configDirPath, *configName, true, true) + if err != nil { + return err + } + + if printConfig { + parameter.PrintConfig(NodeConfig, ignoreSettingsAtPrint...) + } + return nil +} diff --git a/plugins/config/plugin.go b/plugins/config/plugin.go new file mode 100644 index 0000000000000000000000000000000000000000..0626fa17396b321ac567b28a3fb536bac9b39d42 --- /dev/null +++ b/plugins/config/plugin.go @@ -0,0 +1,12 @@ +package config + +import ( + "github.com/iotaledger/hive.go/node" +) + +// define the plugin as a placeholder, so the init methods get executed accordingly +var PLUGIN = node.NewPlugin("Config", node.Enabled, run) + +func run(ctx *node.Plugin) { + // do nothing; everything is handled in the init method +}