diff options
| author | Dmitry Vyukov <dvyukov@google.com> | 2017-12-05 13:55:23 +0100 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2017-12-05 20:08:06 +0100 |
| commit | d9c79f8842c6a8ed1e691a44c0e97f52f1bcb910 (patch) | |
| tree | 16f30877fd2bea5f6948197e37e92387f48643d8 /vm/vmimpl | |
| parent | 1aecf4ed31b674cb1bdfe29a58028b855749c1c6 (diff) | |
vm/gce: always ignore serial relay errors
GCE serial reply seems to be buggy, we see lots of "serialport: VM disconnected"
and "packet_write_wait: Connection to 1.2.3.4 port 9600: Broken pipe"
errors, which do not have any explanation.
Ignore all serial relay errors.
Diffstat (limited to 'vm/vmimpl')
| -rw-r--r-- | vm/vmimpl/merger.go | 12 | ||||
| -rw-r--r-- | vm/vmimpl/merger_test.go | 7 |
2 files changed, 16 insertions, 3 deletions
diff --git a/vm/vmimpl/merger.go b/vm/vmimpl/merger.go index b189a40f0..2de32e53b 100644 --- a/vm/vmimpl/merger.go +++ b/vm/vmimpl/merger.go @@ -18,6 +18,16 @@ type OutputMerger struct { wg sync.WaitGroup } +type MergerError struct { + Name string + R io.ReadCloser + Err error +} + +func (err MergerError) Error() string { + return fmt.Sprintf("failed to read from %v: %v", err.Name, err.Err) +} + func NewOutputMerger(tee io.Writer) *OutputMerger { return &OutputMerger{ Output: make(chan []byte, 1000), @@ -84,7 +94,7 @@ func (merger *OutputMerger) AddDecoder(name string, r io.ReadCloser, } r.Close() select { - case merger.Err <- fmt.Errorf("failed to read from %v: %v", name, err): + case merger.Err <- MergerError{name, r, err}: default: } merger.wg.Done() diff --git a/vm/vmimpl/merger_test.go b/vm/vmimpl/merger_test.go index 335dcb228..dd44af57f 100644 --- a/vm/vmimpl/merger_test.go +++ b/vm/vmimpl/merger_test.go @@ -5,6 +5,7 @@ package vmimpl import ( "bytes" + "io" "testing" "time" @@ -61,8 +62,10 @@ func TestMerger(t *testing.T) { t.Fatalf("bad line: '%s', want '%s'", got, want) } - if err := <-merger.Err; err == nil || err.Error() != "failed to read from pipe1: EOF" { - t.Fatalf("merger did not produce io.EOF: %v", err) + if err := <-merger.Err; err == nil { + t.Fatalf("merger did not produce an error on pipe close") + } else if merr := err.(MergerError); merr.Name != "pipe1" || merr.R != rp1 || merr.Err != io.EOF { + t.Fatalf("merger produced wrong error: %v", err) } wp2.Close() |
