diff --git a/pkg/logtrace/log.go b/pkg/logtrace/log.go index 90846308..c5b0f25d 100644 --- a/pkg/logtrace/log.go +++ b/pkg/logtrace/log.go @@ -149,3 +149,9 @@ func Warn(ctx context.Context, message string, fields Fields) { func Debug(ctx context.Context, message string, fields Fields) { logWithLevel(zapcore.DebugLevel, ctx, message, fields) } + +// Fatal logs an error message and exits cleanly without stack traces +func Fatal(ctx context.Context, message string, fields Fields) { + logWithLevel(zapcore.ErrorLevel, ctx, message, fields) + os.Exit(1) +} diff --git a/supernode/cmd/start.go b/supernode/cmd/start.go index ddeb4168..a03823ea 100644 --- a/supernode/cmd/start.go +++ b/supernode/cmd/start.go @@ -57,33 +57,31 @@ The supernode will connect to the Lumera network and begin participating in the // Initialize keyring kr, err := keyring.InitKeyring(appConfig.KeyringConfig.Backend, appConfig.GetKeyringDir()) if err != nil { - logtrace.Error(ctx, "Failed to initialize keyring", logtrace.Fields{"error": err.Error()}) - return err + logtrace.Fatal(ctx, "Failed to initialize keyring", logtrace.Fields{"error": err.Error()}) } // Initialize Lumera client lumeraClient, err := initLumeraClient(ctx, appConfig, kr) if err != nil { - return fmt.Errorf("failed to initialize Lumera client: %w", err) + logtrace.Fatal(ctx, "Failed to initialize Lumera client", logtrace.Fields{"error": err.Error()}) } // Initialize RaptorQ store for Cascade processing rqStore, err := initRQStore(ctx, appConfig) if err != nil { - return fmt.Errorf("failed to initialize RaptorQ store: %w", err) + logtrace.Fatal(ctx, "Failed to initialize RaptorQ store", logtrace.Fields{"error": err.Error()}) } // Initialize P2P service p2pService, err := initP2PService(ctx, appConfig, lumeraClient, kr, rqStore, nil, nil) if err != nil { - return fmt.Errorf("failed to initialize P2P service: %w", err) + logtrace.Fatal(ctx, "Failed to initialize P2P service", logtrace.Fields{"error": err.Error()}) } // Initialize the supernode supernodeInstance, err := NewSupernode(ctx, appConfig, kr, p2pService, rqStore, lumeraClient) if err != nil { - logtrace.Error(ctx, "Failed to initialize supernode", logtrace.Fields{"error": err.Error()}) - return err + logtrace.Fatal(ctx, "Failed to initialize supernode", logtrace.Fields{"error": err.Error()}) } // Configure cascade service @@ -118,7 +116,7 @@ The supernode will connect to the Lumera network and begin participating in the // Create gRPC server grpcServer, err := server.New(serverConfig, "service", kr, lumeraClient, cascadeActionServer, supernodeServer) if err != nil { - return fmt.Errorf("failed to create gRPC server: %w", err) + logtrace.Fatal(ctx, "Failed to create gRPC server", logtrace.Fields{"error": err.Error()}) } // Start the services diff --git a/supernode/node/supernode/server/server.go b/supernode/node/supernode/server/server.go index b9e53060..8c7ad5fe 100644 --- a/supernode/node/supernode/server/server.go +++ b/supernode/node/supernode/server/server.go @@ -55,8 +55,7 @@ func (server *Server) Run(ctx context.Context) error { addresses := strings.Split(server.config.ListenAddresses, ",") if err := server.setupGRPCServer(); err != nil { - logtrace.Error(ctx, "Failed to setup gRPC server", logtrace.Fields{logtrace.FieldModule: "server", logtrace.FieldError: err.Error()}) - return fmt.Errorf("failed to setup gRPC server: %w", err) + logtrace.Fatal(ctx, "Failed to setup gRPC server", logtrace.Fields{logtrace.FieldModule: "server", logtrace.FieldError: err.Error()}) } // Custom server options