Skip to content

Commit

Permalink
Simply using cmd.CommandContext()
Browse files Browse the repository at this point in the history
  • Loading branch information
josephglanville committed Mar 10, 2023
1 parent 50bc701 commit d2062ea
Showing 1 changed file with 20 additions and 27 deletions.
47 changes: 20 additions & 27 deletions input/system/selfhosted/logs.go
Original file line number Diff line number Diff line change
Expand Up @@ -393,16 +393,17 @@ func setupDockerTail(ctx context.Context, containerName string, out chan<- SelfH

func setupKubernetesTail(ctx context.Context, podName string, containerName string, out chan<- SelfHostedLogStreamItem, prefixedLogger *util.Logger) error {
go func() {
OuterLoop:
for {
cmd := exec.Command("kubectl", "logs", podName, "-c", containerName, "-f", "--tail=0")
var cancelled bool
cmd := exec.CommandContext(ctx, "kubectl", "logs", podName, "-c", containerName, "-f", "--tail=0")
// Set a custom Cancel, so we can interpret the difference between the command exiting due to failure vs context cancellation
cmd.Cancel = func() error {
cancelled = true
return cmd.Process.Kill()
}

stdout, _ := cmd.StdoutPipe()
stderr, _ := cmd.StderrPipe()
if err := cmd.Start(); err != nil {
prefixedLogger.PrintError("Failed to start kubectl logs, err: %s", err.Error())
time.Sleep(1 * time.Second)
continue
}

scanner := bufio.NewScanner(stdout)
go func() {
Expand All @@ -418,28 +419,20 @@ func setupKubernetesTail(ctx context.Context, podName string, containerName stri
}
}()

done := make(chan struct{})
go func() {
processState, _ := cmd.Process.Wait()
exitCode := processState.ExitCode()
prefixedLogger.PrintVerbose("kubectl logs exited with exitCode: %d, restarting", exitCode)
close(done)
}()
if err := cmd.Start(); err != nil {
prefixedLogger.PrintError("Failed to start kubectl logs, err: %s", err.Error())
time.Sleep(1 * time.Second)
continue
}

InnerLoop:
for {
select {
case <-ctx.Done():
prefixedLogger.PrintVerbose("Kubernetes log tail received stop signal")
if err := cmd.Process.Kill(); err != nil {
prefixedLogger.PrintError("Failed to kill kubectl logs tail process when stop received: %s", err)
}
break OuterLoop
case <-done:
time.Sleep(1 * time.Second)
break InnerLoop
}
processState, _ := cmd.Process.Wait()
if cancelled {
prefixedLogger.PrintVerbose("kubectl log tail received stop signal")
return
}
exitCode := processState.ExitCode()
prefixedLogger.PrintVerbose("kubectl logs exited with exitCode: %d, restarting", exitCode)
time.Sleep(1 * time.Second)
}
}()

Expand Down

0 comments on commit d2062ea

Please sign in to comment.