From 57dd095372afd40f8448676ca1712c7bf1b6c2b8 Mon Sep 17 00:00:00 2001 From: Fred Carle Date: Mon, 8 Aug 2022 15:33:52 -0400 Subject: [PATCH] =?UTF-8?q?fix=20panic=20on=20start=20with=20=E2=80=94no-p?= =?UTF-8?q?2p?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cli/start.go | 41 ++++++++++++++++++++++++----------------- 1 file changed, 24 insertions(+), 17 deletions(-) diff --git a/cli/start.go b/cli/start.go index 1a41d9e655..d5ab66e196 100644 --- a/cli/start.go +++ b/cli/start.go @@ -21,6 +21,7 @@ import ( ma "github.com/multiformats/go-multiaddr" httpapi "github.com/sourcenetwork/defradb/api/http" + "github.com/sourcenetwork/defradb/client" "github.com/sourcenetwork/defradb/config" badgerds "github.com/sourcenetwork/defradb/datastore/badger/v3" "github.com/sourcenetwork/defradb/db" @@ -71,12 +72,12 @@ var startCmd = &cobra.Command{ return nil }, RunE: func(cmd *cobra.Command, args []string) error { - n, err := start(cmd.Context()) + n, db, err := start(cmd.Context()) if err != nil { return err } - wait(cmd.Context(), n) + wait(cmd.Context(), n, db) return nil }, @@ -131,7 +132,7 @@ func init() { rootCmd.AddCommand(startCmd) } -func start(ctx context.Context) (*node.Node, error) { +func start(ctx context.Context) (*node.Node, client.DB, error) { log.FeedbackInfo(ctx, "Starting DefraDB service...") var rootstore ds.Batching @@ -154,7 +155,7 @@ func start(ctx context.Context) (*node.Node, error) { } if err != nil { - return nil, fmt.Errorf("failed to open datastore: %w", err) + return nil, nil, fmt.Errorf("failed to open datastore: %w", err) } var options []db.Option @@ -168,7 +169,7 @@ func start(ctx context.Context) (*node.Node, error) { db, err := db.NewDB(ctx, rootstore, options...) if err != nil { - return nil, fmt.Errorf("failed to create database: %w", err) + return nil, nil, fmt.Errorf("failed to create database: %w", err) } // init the p2p node @@ -184,7 +185,7 @@ func start(ctx context.Context) (*node.Node, error) { if err != nil { n.Close() //nolint:errcheck db.Close(ctx) - return nil, fmt.Errorf("failed to start P2P node: %w", err) + return nil, nil, fmt.Errorf("failed to start P2P node: %w", err) } // parse peers and bootstrap @@ -192,7 +193,7 @@ func start(ctx context.Context) (*node.Node, error) { log.Debug(ctx, "Parsing bootstrap peers", logging.NewKV("Peers", cfg.Net.Peers)) addrs, err := netutils.ParsePeers(strings.Split(cfg.Net.Peers, ",")) if err != nil { - return nil, fmt.Errorf("failed to parse bootstrap peers %v: %w", cfg.Net.Peers, err) + return nil, nil, fmt.Errorf("failed to parse bootstrap peers %v: %w", cfg.Net.Peers, err) } log.Debug(ctx, "Bootstrapping with peers", logging.NewKV("Addresses", addrs)) n.Boostrap(addrs) @@ -201,21 +202,21 @@ func start(ctx context.Context) (*node.Node, error) { if err := n.Start(); err != nil { n.Close() //nolint:errcheck db.Close(ctx) - return nil, fmt.Errorf("failed to start P2P listeners: %w", err) + return nil, nil, fmt.Errorf("failed to start P2P listeners: %w", err) } MtcpAddr, err := ma.NewMultiaddr(cfg.Net.TCPAddress) if err != nil { - return nil, fmt.Errorf("failed to parse multiaddress: %w", err) + return nil, nil, fmt.Errorf("failed to parse multiaddress: %w", err) } addr, err := netutils.TCPAddrFromMultiAddr(MtcpAddr) if err != nil { - return nil, fmt.Errorf("failed to parse TCP address: %w", err) + return nil, nil, fmt.Errorf("failed to parse TCP address: %w", err) } rpcTimeoutDuration, err := cfg.Net.RPCTimeoutDuration() if err != nil { - return nil, fmt.Errorf("failed to parse RPC timeout duration: %w", err) + return nil, nil, fmt.Errorf("failed to parse RPC timeout duration: %w", err) } server := grpc.NewServer(grpc.KeepaliveParams(keepalive.ServerParameters{ @@ -223,7 +224,7 @@ func start(ctx context.Context) (*node.Node, error) { })) tcplistener, err := gonet.Listen("tcp", addr) if err != nil { - return nil, fmt.Errorf("failed to listen on TCP address %v: %w", addr, err) + return nil, nil, fmt.Errorf("failed to listen on TCP address %v: %w", addr, err) } netService := netapi.NewService(n.Peer) @@ -237,9 +238,15 @@ func start(ctx context.Context) (*node.Node, error) { }() } - s := http.NewServer(db, http.WithAddress(cfg.API.Address), http.WithPeerID(n.PeerID().String())) + sOpt := []func(*http.Server){ + http.WithAddress(cfg.API.Address), + } + if n != nil { + sOpt = append(sOpt, http.WithPeerID(n.PeerID().String())) + } + s := http.NewServer(db, sOpt...) if err := s.Listen(ctx); err != nil { - return nil, fmt.Errorf("failed to listen on TCP address %v: %w", s.Addr, err) + return nil, nil, fmt.Errorf("failed to listen on TCP address %v: %w", s.Addr, err) } // run the server in a separate goroutine @@ -264,11 +271,11 @@ func start(ctx context.Context) (*node.Node, error) { } }() - return n, nil + return n, db, nil } // wait waits for an interrupt signal to close the program. -func wait(ctx context.Context, n *node.Node) { +func wait(ctx context.Context, n *node.Node, db client.DB) { // setup signal handlers signalCh := make(chan os.Signal, 1) signal.Notify(signalCh, os.Interrupt) @@ -278,6 +285,6 @@ func wait(ctx context.Context, n *node.Node) { if n != nil { n.Close() //nolint:errcheck } - n.DB.Close(ctx) + db.Close(ctx) os.Exit(0) }