Skip to content

Commit df70b7c

Browse files
committed
improve airbyte command handling
1 parent 32fb854 commit df70b7c

File tree

1 file changed

+45
-21
lines changed

1 file changed

+45
-21
lines changed

pkg/providers/airbyte/storage.go

Lines changed: 45 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -313,7 +313,7 @@ func (a *Storage) writeFile(fileName, fileData string) error {
313313
return os.WriteFile(
314314
fullPath,
315315
[]byte(fileData),
316-
0664,
316+
0o664,
317317
)
318318
}
319319

@@ -411,43 +411,67 @@ func (a *Storage) runRawCommand(args ...string) (io.Reader, io.Reader, error) {
411411
return a.cw.Run(ctx, opts)
412412
}
413413

414+
// safeReadFrom safely reads from an io.Reader into a buffer using defer/recover to handle panics
415+
// Returns the number of bytes read and any error that occurred during reading
416+
func safeReadFrom(dst *bytes.Buffer, src io.Reader) (n int64, err error) {
417+
// Use defer/recover to catch any panics that might occur during ReadFrom
418+
defer func() {
419+
if r := recover(); r != nil {
420+
err = xerrors.Errorf("panic during read: %v", r)
421+
}
422+
}()
423+
424+
// Only attempt to read if source is not nil
425+
if src == nil {
426+
return 0, nil
427+
}
428+
429+
return dst.ReadFrom(src)
430+
}
431+
414432
func (a *Storage) runCommand(args ...string) ([]byte, error) {
415-
outReader, errReader, err := a.runRawCommand(args...)
433+
outReader, errReader, cmdErr := a.runRawCommand(args...)
416434

417435
outBuf := new(bytes.Buffer)
418436
errBuf := new(bytes.Buffer)
419437

420-
if outReader != nil {
421-
if _, err := outBuf.ReadFrom(outReader); err != nil {
422-
return nil, xerrors.Errorf("failed to read stdout: %w", err)
423-
}
424-
}
438+
// Safely read from stdout
439+
_, outReadErr := safeReadFrom(outBuf, outReader)
425440

426-
if errReader != nil {
427-
if _, err := errBuf.ReadFrom(outReader); err != nil {
428-
return nil, xerrors.Errorf("failed to read stdout: %w", err)
429-
}
430-
}
441+
// Safely read from stderr
442+
_, errReadErr := safeReadFrom(errBuf, errReader)
431443

432-
if err != nil {
433-
// TODO: duplicated code
444+
// Log command details if there was an error with the command execution
445+
if cmdErr != nil {
434446
opts := a.baseOpts()
435447
opts.Command = args
436448

437449
a.logger.Errorf("command: %s stdout:\n%s", opts.String(), outBuf.String())
438450
a.logger.Errorf("command: %s stderr:\n%s", opts.String(), errBuf.String())
439451

440-
return nil, xerrors.Errorf("failed: %w", err)
452+
return nil, xerrors.Errorf("command failed: %w", cmdErr)
453+
}
454+
455+
if outReadErr != nil {
456+
return nil, xerrors.Errorf("failed to read stdout: %w", outReadErr)
441457
}
442458

443-
scr := bufio.NewScanner(errReader)
444-
var errs util.Errors
445-
for scr.Scan() {
446-
errs = append(errs, xerrors.New(scr.Text()))
459+
if errReadErr != nil {
460+
return nil, xerrors.Errorf("failed to read stderr: %w", errReadErr)
447461
}
448-
if len(errs) > 0 {
449-
a.logger.Warnf("stderr: %v", log.Error(errs))
462+
463+
// Scan the captured errBuf for stderr messages
464+
if errBuf.Len() > 0 {
465+
scanner := bufio.NewScanner(bytes.NewReader(errBuf.Bytes()))
466+
var errs util.Errors
467+
for scanner.Scan() {
468+
errs = append(errs, xerrors.New(scanner.Text()))
469+
}
470+
if len(errs) > 0 {
471+
a.logger.Warnf("stderr: %v", log.Error(errs))
472+
}
450473
}
474+
451475
return outBuf.Bytes(), nil
452476
}
453477

0 commit comments

Comments
 (0)