From d9c79f8842c6a8ed1e691a44c0e97f52f1bcb910 Mon Sep 17 00:00:00 2001 From: Dmitry Vyukov Date: Tue, 5 Dec 2017 13:55:23 +0100 Subject: 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. --- vm/vmimpl/merger.go | 12 +++++++++++- vm/vmimpl/merger_test.go | 7 +++++-- 2 files changed, 16 insertions(+), 3 deletions(-) (limited to 'vm/vmimpl') 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() -- cgit mrf-deployment