aboutsummaryrefslogtreecommitdiffstats
path: root/vm
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2015-12-24 12:06:04 +0100
committerDmitry Vyukov <dvyukov@google.com>2015-12-24 12:06:04 +0100
commit05b38edce28aea69ced072da7e45dd44383afbc3 (patch)
treeba4f00ce0959260a199b13ff1d98c69db98947a5 /vm
parent58509c75a2a2d472855da0683c36d7ef2f1a6c97 (diff)
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.
Diffstat (limited to 'vm')
-rw-r--r--vm/qemu/qemu.go26
1 files 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()