diff --git a/hypervisor/manager/vm.go b/hypervisor/manager/vm.go index 5bb5c3cd..16679f1a 100644 --- a/hypervisor/manager/vm.go +++ b/hypervisor/manager/vm.go @@ -479,7 +479,7 @@ func (m *Manager) createVm(conn *srpc.Conn, decoder srpc.Decoder, ownerUsers := make([]string, 1, len(request.OwnerUsers)+1) ownerUsers[0] = conn.Username() if ownerUsers[0] == "" { - return errors.New("no authentication data") + return sendError(conn, encoder, errors.New("no authentication data")) } ownerUsers = append(ownerUsers, request.OwnerUsers...) vm, err := m.allocateVm(request, conn.GetAuthInformation()) @@ -2167,6 +2167,8 @@ func (vm *vmInfoType) processMonitorResponses(monitorSock net.Conn) { io.Copy(ioutil.Discard, monitorSock) // Read all and drop. vm.mutex.Lock() defer vm.mutex.Unlock() + close(vm.commandChannel) + vm.commandChannel = nil switch vm.State { case proto.StateStarting: return @@ -2190,7 +2192,6 @@ func (vm *vmInfoType) processMonitorResponses(monitorSock net.Conn) { default: vm.logger.Println("unknown state: " + vm.State.String()) } - close(vm.commandChannel) } func (vm *vmInfoType) rootLabel() string { diff --git a/hypervisor/metadatad/daemons.go b/hypervisor/metadatad/daemons.go index bcfcee21..6d284692 100644 --- a/hypervisor/metadatad/daemons.go +++ b/hypervisor/metadatad/daemons.go @@ -9,6 +9,7 @@ import ( "os/exec" "runtime" "strconv" + "time" "github.com/Symantec/Dominator/lib/log" "github.com/Symantec/Dominator/lib/log/prefixlogger" @@ -22,6 +23,12 @@ type statusType struct { err error } +func httpServe(listener net.Listener, handler http.Handler, + idleTimeout time.Duration) error { + httpServer := &http.Server{Handler: handler, IdleTimeout: idleTimeout} + return httpServer.Serve(listener) +} + func (s *server) startServer() error { cmd := exec.Command("ebtables", "-t", "nat", "-F") if output, err := cmd.CombinedOutput(); err != nil { @@ -116,8 +123,8 @@ func (s *server) createNamespace(startChannel <-chan struct{}, } statusChannel <- statusType{namespaceFd: namespaceFd, threadId: threadId} logger.Printf("starting metadata server in thread: %d\n", threadId) - go http.Serve(hypervisorListener, nil) - http.Serve(metadataListener, s) + go httpServe(hypervisorListener, nil, time.Second*5) + httpServe(metadataListener, s, time.Second*5) } func createInterface(bridge net.Interface, threadId int, diff --git a/hypervisor/rpcd/probeVmPort.go b/hypervisor/rpcd/probeVmPort.go index 68a5b4a3..caa3f25b 100644 --- a/hypervisor/rpcd/probeVmPort.go +++ b/hypervisor/rpcd/probeVmPort.go @@ -21,8 +21,7 @@ func (t *srpcType) ProbeVmPort(conn *srpc.Conn, ok, err := probeVmPort( fmt.Sprintf("%s:%d", request.IpAddress, request.PortNumber), request.Timeout) - response := hypervisor.ProbeVmPortResponse{ok, errors.ErrorToString(err)} - *reply = response + *reply = hypervisor.ProbeVmPortResponse{ok, errors.ErrorToString(err)} return nil } @@ -48,9 +47,10 @@ func probeVmPort(addr string, timeout time.Duration) (bool, error) { func probeOnce(addr string, okChannel chan<- struct{}) { if conn, err := net.DialTimeout("tcp", addr, time.Second); err == nil { + conn.Close() select { case okChannel <- struct{}{}: + default: } - conn.Close() } } diff --git a/lib/filesystem/util/api.go b/lib/filesystem/util/api.go index 29c09c2d..f558bebb 100644 --- a/lib/filesystem/util/api.go +++ b/lib/filesystem/util/api.go @@ -4,7 +4,6 @@ import ( "fmt" "io" "os" - "text/template" "github.com/Symantec/Dominator/lib/filesystem" "github.com/Symantec/Dominator/lib/log" @@ -19,7 +18,6 @@ type BootInfoType struct { KernelImageDirent *filesystem.DirectoryEntry KernelImageFile string KernelOptions string - grubTemplate *template.Template } type ComputedFile struct { diff --git a/lib/filesystem/util/writeRaw.go b/lib/filesystem/util/writeRaw.go index 4d4aef78..946a0ef9 100644 --- a/lib/filesystem/util/writeRaw.go +++ b/lib/filesystem/util/writeRaw.go @@ -34,6 +34,8 @@ const ( var ( mutex sync.Mutex defaultMkfsFeatures map[string]struct{} // Key: feature name. + grubTemplate = template.Must(template.New("grub").Parse( + grubTemplateString)) ) func checkIfPartition(device string) (bool, error) { @@ -381,11 +383,6 @@ func getBootInfo(fs *filesystem.FileSystem, rootLabel string, bootInfo.KernelImageFile = "/boot/" + dirent.Name } } - bootInfo.grubTemplate, err = template.New("grub").Parse( - grubTemplateString) - if err != nil { - return nil, err - } return bootInfo, nil } @@ -436,7 +433,7 @@ func (bootInfo *BootInfoType) writeGrubConfig(filename string) error { return fmt.Errorf("error creating GRUB config file: %s", err) } defer file.Close() - if err := bootInfo.grubTemplate.Execute(file, bootInfo); err != nil { + if err := grubTemplate.Execute(file, bootInfo); err != nil { return err } return file.Close() diff --git a/lib/objectserver/cachingreader/get.go b/lib/objectserver/cachingreader/get.go index 0c08135c..d1e08caa 100644 --- a/lib/objectserver/cachingreader/get.go +++ b/lib/objectserver/cachingreader/get.go @@ -46,6 +46,7 @@ func saveObject(filename string, if size, reader, err := objectsReader.NextObject(); err != nil { return err } else { + defer reader.Close() err := fsutil.CopyToFile(filename, privateFilePerms, reader, size) if err == nil { return nil @@ -212,7 +213,7 @@ func timeoutFunction(f func(), timeout time.Duration) { f() return } - completionChannel := make(chan struct{}) + completionChannel := make(chan struct{}, 1) go func() { f() completionChannel <- struct{}{}