func (c *migrationFields) send(m proto.Message) error { /* gorilla websocket doesn't allow concurrent writes, and * panic()s if it sees them (which is reasonable). If e.g. we * happen to fail, get scheduled, start our write, then get * unscheduled before the write is bit to a new thread which is * receiving an error from the other side (due to our previous * close), we can engage in these concurrent writes, which * casuses the whole daemon to panic. * * Instead, let's lock sends to the controlConn so that we only ever * write one message at the time. */ c.controlLock.Lock() defer c.controlLock.Unlock() w, err := c.controlConn.NextWriter(websocket.BinaryMessage) if err != nil { return err } defer w.Close() data, err := proto.Marshal(m) if err != nil { return err } return shared.WriteAll(w, data) }
func (c *containerLXD) applyPostDeviceConfig() error { // applies config that must be delayed until after devices are // instantiated, see bug #588 and fix #635 if lxcConfig, ok := c.config["raw.lxc"]; ok { if err := validateRawLxc(lxcConfig); err != nil { return err } f, err := ioutil.TempFile("", "lxd_config_") if err != nil { return err } err = shared.WriteAll(f, []byte(lxcConfig)) f.Close() defer os.Remove(f.Name()) if err != nil { return err } if err := c.c.LoadConfigFile(f.Name()); err != nil { return fmt.Errorf("problem applying raw.lxc, perhaps there is a syntax error?") } } return nil }
func (c *migrationFields) send(m proto.Message) error { w, err := c.controlConn.NextWriter(websocket.BinaryMessage) if err != nil { return err } defer w.Close() data, err := proto.Marshal(m) if err != nil { return err } return shared.WriteAll(w, data) }
func (c *lxdContainer) applyConfig(config map[string]string, fromProfile bool) error { var err error for k, v := range config { switch k { case "limits.cpus": // TODO - Come up with a way to choose cpus for multiple // containers var vint int count, err := fmt.Sscanf(v, "%d", &vint) if err != nil { return err } if count != 1 || vint < 0 || vint > 65000 { return fmt.Errorf("Bad cpu limit: %s\n", v) } cpuset := fmt.Sprintf("0-%d", vint-1) err = c.c.SetConfigItem("lxc.cgroup.cpuset.cpus", cpuset) case "limits.memory": err = c.c.SetConfigItem("lxc.cgroup.memory.limit_in_bytes", v) default: if strings.HasPrefix(k, "user.") { // ignore for now err = nil } /* Things like security.privileged need to be propagated */ c.config[k] = v } if err != nil { shared.Debugf("error setting %s: %q\n", k, err) return err } } if fromProfile { return nil } if lxcConfig, ok := config["raw.lxc"]; ok { if err := validateRawLxc(lxcConfig); err != nil { return err } f, err := ioutil.TempFile("", "lxd_config_") if err != nil { return err } err = shared.WriteAll(f, []byte(lxcConfig)) f.Close() defer os.Remove(f.Name()) if err != nil { return err } if err := c.c.LoadConfigFile(f.Name()); err != nil { return fmt.Errorf("problem applying raw.lxc, perhaps there is a syntax error?") } } return nil }