Browse Source

:ledger: Allow to specify a diskstore via CLI

Ettore Di Giacinto 3 years ago
parent
commit
72bfa7d910
3 changed files with 26 additions and 2 deletions
  1. 5 0
      cmd/main.go
  2. 17 2
      cmd/util.go
  3. 4 0
      pkg/blockchain/store_disk.go

+ 5 - 0
cmd/main.go

@@ -28,6 +28,11 @@ var CommonFlags []cli.Flag = []cli.Flag{
 		EnvVar: "EDGEVPNMTU",
 		EnvVar: "EDGEVPNMTU",
 		Value:  1200,
 		Value:  1200,
 	},
 	},
+	&cli.StringFlag{
+		Name:   "ledger-state",
+		Usage:  "Specify a ledger state directory",
+		EnvVar: "EDGEVPNLEDGERSTATE",
+	},
 	&cli.StringFlag{
 	&cli.StringFlag{
 		Name:   "log-level",
 		Name:   "log-level",
 		Usage:  "Specify loglevel",
 		Usage:  "Specify loglevel",

+ 17 - 2
cmd/util.go

@@ -6,6 +6,7 @@ import (
 	"github.com/mudler/edgevpn/pkg/blockchain"
 	"github.com/mudler/edgevpn/pkg/blockchain"
 	"github.com/mudler/edgevpn/pkg/edgevpn"
 	"github.com/mudler/edgevpn/pkg/edgevpn"
 	"github.com/mudler/edgevpn/pkg/logger"
 	"github.com/mudler/edgevpn/pkg/logger"
+	"github.com/peterbourgon/diskv"
 	"github.com/songgao/water"
 	"github.com/songgao/water"
 	"github.com/urfave/cli"
 	"github.com/urfave/cli"
 )
 )
@@ -23,6 +24,8 @@ func cliToOpts(c *cli.Context) []edgevpn.Option {
 	logLevel := c.String("log-level")
 	logLevel := c.String("log-level")
 	libp2plogLevel := c.String("libp2p-log-level")
 	libp2plogLevel := c.String("libp2p-log-level")
 
 
+	ledgerState := c.String("ledger-state")
+
 	lvl, err := log.LevelFromString(logLevel)
 	lvl, err := log.LevelFromString(logLevel)
 	if err != nil {
 	if err != nil {
 		lvl = log.LevelError
 		lvl = log.LevelError
@@ -40,17 +43,29 @@ func cliToOpts(c *cli.Context) []edgevpn.Option {
 		token == "" {
 		token == "" {
 		llger.Fatal("EDGEVPNCONFIG or EDGEVPNTOKEN not supplied. At least a config file is required")
 		llger.Fatal("EDGEVPNCONFIG or EDGEVPNTOKEN not supplied. At least a config file is required")
 	}
 	}
-	return []edgevpn.Option{
+
+	opts := []edgevpn.Option{
 		edgevpn.Logger(llger),
 		edgevpn.Logger(llger),
 		edgevpn.LibP2PLogLevel(libp2plvl),
 		edgevpn.LibP2PLogLevel(libp2plvl),
 		edgevpn.WithInterfaceMTU(c.Int("mtu")),
 		edgevpn.WithInterfaceMTU(c.Int("mtu")),
 		edgevpn.WithPacketMTU(1420),
 		edgevpn.WithPacketMTU(1420),
 		edgevpn.WithInterfaceAddress(address),
 		edgevpn.WithInterfaceAddress(address),
 		edgevpn.WithInterfaceName(iface),
 		edgevpn.WithInterfaceName(iface),
-		edgevpn.WithStore(&blockchain.MemoryStore{}),
 		edgevpn.WithInterfaceType(water.TUN),
 		edgevpn.WithInterfaceType(water.TUN),
 		edgevpn.NetLinkBootstrap(true),
 		edgevpn.NetLinkBootstrap(true),
 		edgevpn.FromBase64(token),
 		edgevpn.FromBase64(token),
 		edgevpn.FromYaml(config),
 		edgevpn.FromYaml(config),
 	}
 	}
+
+	if ledgerState != "" {
+		opts = append(opts, edgevpn.WithStore(blockchain.NewDiskStore(diskv.New(diskv.Options{
+			BasePath:     ledgerState,
+			CacheSizeMax: uint64(50), // 50MB
+		}))))
+	} else {
+		opts = append(opts, edgevpn.WithStore(&blockchain.MemoryStore{}))
+
+	}
+
+	return opts
 }
 }

+ 4 - 0
pkg/blockchain/store_disk.go

@@ -12,6 +12,10 @@ type DiskStore struct {
 	chain *diskv.Diskv
 	chain *diskv.Diskv
 }
 }
 
 
+func NewDiskStore(d *diskv.Diskv) *DiskStore {
+	return &DiskStore{chain: d}
+}
+
 func (m *DiskStore) Add(b Block) {
 func (m *DiskStore) Add(b Block) {
 	bb, _ := json.Marshal(b)
 	bb, _ := json.Marshal(b)
 	m.chain.Write(fmt.Sprint(b.Index), bb)
 	m.chain.Write(fmt.Sprint(b.Index), bb)