fix(main): move noDbCommands check before expensive git operations
Fixes #1093: `bd version` was spawning 5-7 git subprocesses before checking if it even needed database access. Moved the noDbCommands early-return check to run BEFORE: - ensureForkProtection() (spawns ~5 git commands) - signalOrchestratorActivity() (spawns git config) This eliminates unnecessary process churn for simple commands like `bd version`, `bd help`, `bd completion`, etc. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
committed by
Steve Yegge
parent
634b01a609
commit
97adc19cf5
@@ -233,9 +233,6 @@ var rootCmd = &cobra.Command{
|
|||||||
// Set up signal-aware context for graceful cancellation
|
// Set up signal-aware context for graceful cancellation
|
||||||
rootCtx, rootCancel = signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM)
|
rootCtx, rootCancel = signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM)
|
||||||
|
|
||||||
// Signal orchestrator daemon about bd activity (best-effort, for exponential backoff)
|
|
||||||
defer signalOrchestratorActivity()
|
|
||||||
|
|
||||||
// Apply verbosity flags early (before any output)
|
// Apply verbosity flags early (before any output)
|
||||||
debug.SetVerbose(verboseFlag)
|
debug.SetVerbose(verboseFlag)
|
||||||
debug.SetQuiet(quietFlag)
|
debug.SetQuiet(quietFlag)
|
||||||
@@ -332,27 +329,9 @@ var rootCmd = &cobra.Command{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Protect forks from accidentally committing upstream issue database
|
// GH#1093: Check noDbCommands BEFORE expensive operations (ensureForkProtection,
|
||||||
ensureForkProtection()
|
// signalOrchestratorActivity) to avoid spawning git subprocesses for simple commands
|
||||||
|
// like "bd version" that don't need database access.
|
||||||
// Performance profiling setup
|
|
||||||
// When --profile is enabled, force direct mode to capture actual database operations
|
|
||||||
// rather than just RPC serialization/network overhead. This gives accurate profiles
|
|
||||||
// of the storage layer, query performance, and business logic.
|
|
||||||
if profileEnabled {
|
|
||||||
noDaemon = true
|
|
||||||
timestamp := time.Now().Format("20060102-150405")
|
|
||||||
if f, _ := os.Create(fmt.Sprintf("bd-profile-%s-%s.prof", cmd.Name(), timestamp)); f != nil {
|
|
||||||
profileFile = f
|
|
||||||
_ = pprof.StartCPUProfile(f)
|
|
||||||
}
|
|
||||||
if f, _ := os.Create(fmt.Sprintf("bd-trace-%s-%s.out", cmd.Name(), timestamp)); f != nil {
|
|
||||||
traceFile = f
|
|
||||||
_ = trace.Start(f)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Skip database initialization for commands that don't need a database
|
|
||||||
noDbCommands := []string{
|
noDbCommands := []string{
|
||||||
cmdDaemon,
|
cmdDaemon,
|
||||||
"__complete", // Cobra's internal completion command (shell completions work without db)
|
"__complete", // Cobra's internal completion command (shell completions work without db)
|
||||||
@@ -398,6 +377,30 @@ var rootCmd = &cobra.Command{
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Signal orchestrator daemon about bd activity (best-effort, for exponential backoff)
|
||||||
|
// GH#1093: Moved after noDbCommands check to avoid git subprocesses for simple commands
|
||||||
|
defer signalOrchestratorActivity()
|
||||||
|
|
||||||
|
// Protect forks from accidentally committing upstream issue database
|
||||||
|
ensureForkProtection()
|
||||||
|
|
||||||
|
// Performance profiling setup
|
||||||
|
// When --profile is enabled, force direct mode to capture actual database operations
|
||||||
|
// rather than just RPC serialization/network overhead. This gives accurate profiles
|
||||||
|
// of the storage layer, query performance, and business logic.
|
||||||
|
if profileEnabled {
|
||||||
|
noDaemon = true
|
||||||
|
timestamp := time.Now().Format("20060102-150405")
|
||||||
|
if f, _ := os.Create(fmt.Sprintf("bd-profile-%s-%s.prof", cmd.Name(), timestamp)); f != nil {
|
||||||
|
profileFile = f
|
||||||
|
_ = pprof.StartCPUProfile(f)
|
||||||
|
}
|
||||||
|
if f, _ := os.Create(fmt.Sprintf("bd-trace-%s-%s.out", cmd.Name(), timestamp)); f != nil {
|
||||||
|
traceFile = f
|
||||||
|
_ = trace.Start(f)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Auto-detect sandboxed environment (Phase 2 for GH #353)
|
// Auto-detect sandboxed environment (Phase 2 for GH #353)
|
||||||
// Only auto-enable if user hasn't explicitly set --sandbox or --no-daemon
|
// Only auto-enable if user hasn't explicitly set --sandbox or --no-daemon
|
||||||
if !cmd.Flags().Changed("sandbox") && !cmd.Flags().Changed("no-daemon") {
|
if !cmd.Flags().Changed("sandbox") && !cmd.Flags().Changed("no-daemon") {
|
||||||
|
|||||||
Reference in New Issue
Block a user