From 05b38edce28aea69ced072da7e45dd44383afbc3 Mon Sep 17 00:00:00 2001 From: Dmitry Vyukov Date: Thu, 24 Dec 2015 12:06:04 +0100 Subject: vm/qemu: fix output reading bug If qemu boot retries several times due to busy tcp port, it ends up with several output reading goroutines. That completely messes output. --- vm/qemu/qemu.go | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/vm/qemu/qemu.go b/vm/qemu/qemu.go index 6116bcacc..a02a762dc 100644 --- a/vm/qemu/qemu.go +++ b/vm/qemu/qemu.go @@ -5,6 +5,7 @@ package qemu import ( "fmt" + "math/rand" "net" "os" "os/exec" @@ -38,6 +39,19 @@ type instance struct { } func ctor(cfg *vm.Config) (vm.Instance, error) { + for i := 0; ; i++ { + inst, err := ctorImpl(cfg) + if err == nil { + return inst, nil + } + if i < 1000 && strings.Contains(err.Error(), "could not set up host forwarding rule") { + continue + } + return nil, err + } +} + +func ctorImpl(cfg *vm.Config) (vm.Instance, error) { inst := &instance{ cfg: cfg, image: filepath.Join(cfg.Workdir, "image"), @@ -63,16 +77,10 @@ func ctor(cfg *vm.Config) (vm.Instance, error) { return nil, fmt.Errorf("failed to create pipe: %v", err) } - for i := 0; ; i++ { - err := inst.Boot() - if err == nil { - break - } - if i < 1000 && strings.Contains(err.Error(), "could not set up host forwarding rule") { - continue - } + if err := inst.Boot(); err != nil { return nil, err } + closeInst = nil return inst, nil } @@ -122,7 +130,7 @@ func (inst *instance) Close() { func (inst *instance) Boot() error { for { // Find an unused TCP port. - inst.port = int(time.Now().UnixNano()%(64<<10-1<<10) + 1<<10) + inst.port = rand.Intn(64<<10-1<<10) + 1<<10 ln, err := net.Listen("tcp", fmt.Sprintf("localhost:%v", inst.port)) if err == nil { ln.Close() -- cgit mrf-deployment