瀏覽代碼

Random improvments

Guillaume J. Charmes 11 年之前
父節點
當前提交
8b2f4aab23
共有 10 個文件被更改,包括 299 次插入343 次删除
  1. 31 28
      Dockerfile
  2. 1 0
      api.go
  3. 1 2
      deviceset.go
  4. 173 204
      devmapper/deviceset_devmapper.go
  5. 55 73
      devmapper/devmapper.go
  6. 1 1
      docker/docker.go
  7. 1 1
      hack/make/test
  8. 22 24
      image.go
  9. 5 9
      server.go
  10. 9 1
      utils/utils.go

+ 31 - 28
Dockerfile

@@ -24,54 +24,57 @@
 #
 
 docker-version 0.6.1
-from	ubuntu:12.04
-maintainer	Solomon Hykes <solomon@dotcloud.com>
+from    ubuntu:12.10
+maintainer      Solomon Hykes <solomon@dotcloud.com>
 
 # Build dependencies
-run	echo 'deb http://archive.ubuntu.com/ubuntu precise main universe' > /etc/apt/sources.list
-run	apt-get update
-run	apt-get install -y -q curl
-run	apt-get install -y -q git
-run	apt-get install -y -q mercurial
-run	apt-get install -y -q build-essential
+run     apt-get update
+run     apt-get install -y -q curl
+run     apt-get install -y -q git
+run     apt-get install -y -q mercurial
+run     apt-get install -y -q build-essential
 
 # Install Go from source (for eventual cross-compiling)
-run	curl -s https://go.googlecode.com/files/go1.2rc1.src.tar.gz | tar -v -C / -xz && mv /go /goroot
-run	cd /goroot/src && ./make.bash
-env GOROOT	/goroot
-env	PATH	$PATH:/goroot/bin
-env	GOPATH	/go:/go/src/github.com/dotcloud/docker/vendor
+run     curl -s https://go.googlecode.com/files/go1.2rc1.src.tar.gz | tar -v -C / -xz && mv /go /goroot
+run     cd /goroot/src && ./make.bash
+env     GOROOT  /goroot
+env     PATH    $PATH:/goroot/bin
+env     GOPATH  /go:/go/src/github.com/dotcloud/docker/vendor
 
 # Create Go cache with tag netgo (for static compilation of Go while preserving CGO support)
-run	go install -ldflags '-w -linkmode external -extldflags "-static -Wl,--unresolved-symbols=ignore-in-shared-libs"' -tags netgo -a std
+run     go install -ldflags '-w -linkmode external -extldflags "-static -Wl,--unresolved-symbols=ignore-in-shared-libs"' -tags netgo -a std
 
 # Get lvm2 source for compiling statically
-run	git clone git://git.fedorahosted.org/git/lvm2.git /lvm2
-run	cd /lvm2 && git checkout v2_02_102
+run     git clone git://git.fedorahosted.org/git/lvm2.git /lvm2
+run     cd /lvm2 && git checkout v2_02_102
+
 # can't use git clone -b because it's not supported by git versions before 1.7.10
 run	cd /lvm2 && ./configure --enable-static_link && make && make install_device-mapper
 # see https://git.fedorahosted.org/cgit/lvm2.git/refs/tags for release tags
 
 # Ubuntu stuff
-run	apt-get install -y -q ruby1.9.3 rubygems libffi-dev
-run	gem install --no-rdoc --no-ri fpm
-run	apt-get install -y -q reprepro dpkg-sig
+run     apt-get install -y -q ruby1.9.3 rubygems libffi-dev
+run     gem install --no-rdoc --no-ri fpm
+run     apt-get install -y -q reprepro dpkg-sig
 
 # Install s3cmd 1.0.1 (earlier versions don't support env variables in the config)
-run	apt-get install -y -q python-pip
-run	pip install s3cmd
-run	pip install python-magic
-run	/bin/echo -e '[default]\naccess_key=$AWS_ACCESS_KEY\nsecret_key=$AWS_SECRET_KEY\n' > /.s3cfg
+run     apt-get install -y -q python-pip
+run     pip install s3cmd
+run     pip install python-magic
+run     /bin/echo -e '[default]\naccess_key=$AWS_ACCESS_KEY\nsecret_key=$AWS_SECRET_KEY\n' > /.s3cfg
 
 # Runtime dependencies
-run	apt-get install -y -q iptables
-run	apt-get install -y -q lxc
+run     apt-get install -y -q iptables
+run     dpkg-divert --local --rename --add /sbin/initctl && \
+        ln -s /bin/true /sbin/initctl && \
+        apt-get install -y -q lxc
 
-volume	/var/lib/docker
-workdir	/go/src/github.com/dotcloud/docker
+volume  /var/lib/docker
+workdir /go/src/github.com/dotcloud/docker
 
 # Wrap all commands in the "docker-in-docker" script to allow nested containers
 entrypoint ["hack/dind"]
 
 # Upload docker source
-add	.       /go/src/github.com/dotcloud/docker
+add     .		/go/src/github.com/dotcloud/docker
+

+ 1 - 0
api.go

@@ -620,6 +620,7 @@ func postContainersStart(srv *Server, version float64, w http.ResponseWriter, r
 	}
 	name := vars["name"]
 	if err := srv.ContainerStart(name, hostConfig); err != nil {
+		utils.Debugf("error ContainerStart: %s", err)
 		return err
 	}
 	w.WriteHeader(http.StatusNoContent)

+ 1 - 2
deviceset.go

@@ -66,9 +66,8 @@ func (wrapper *DeviceSetWrapper) HasActivatedDevice(hash string) bool {
 }
 
 func NewDeviceSetWrapper(wrapped DeviceSet, prefix string) DeviceSet {
-	wrapper := &DeviceSetWrapper{
+	return &DeviceSetWrapper{
 		wrapped: wrapped,
 		prefix:  prefix,
 	}
-	return wrapper
 }

+ 173 - 204
devmapper/deviceset_devmapper.go

@@ -1,12 +1,11 @@
 package devmapper
 
 import (
-	"github.com/dotcloud/docker/utils"
 	"encoding/json"
 	"fmt"
+	"github.com/dotcloud/docker/utils"
 	"io"
 	"io/ioutil"
-	"log"
 	"os"
 	"os/exec"
 	"path"
@@ -15,9 +14,11 @@ import (
 	"syscall"
 )
 
-const defaultDataLoopbackSize int64 = 100 * 1024 * 1024 * 1024
-const defaultMetaDataLoopbackSize int64 = 2 * 1024 * 1024 * 1024
-const defaultBaseFsSize uint64 = 10 * 1024 * 1024 * 1024
+const (
+	defaultDataLoopbackSize     int64  = 100 * 1024 * 1024 * 1024
+	defaultMetaDataLoopbackSize int64  = 2 * 1024 * 1024 * 1024
+	defaultBaseFsSize           uint64 = 10 * 1024 * 1024 * 1024
+)
 
 type DevInfo struct {
 	Hash          string       `json:"-"`
@@ -33,14 +34,14 @@ type MetaData struct {
 }
 
 type DeviceSetDM struct {
-	initialized bool
-	root        string
-	devicePrefix string
 	MetaData
+	initialized      bool
+	root             string
+	devicePrefix     string
 	TransactionId    uint64
 	NewTransactionId uint64
 	nextFreeDevice   int
-	activeMounts map[string]int
+	activeMounts     map[string]int
 }
 
 func getDevName(name string) string {
@@ -68,7 +69,7 @@ func (devices *DeviceSetDM) jsonFile() string {
 }
 
 func (devices *DeviceSetDM) getPoolName() string {
-	return fmt.Sprintf("%s-pool", devices.devicePrefix)
+	return devices.devicePrefix + "-pool"
 }
 
 func (devices *DeviceSetDM) getPoolDevName() string {
@@ -80,8 +81,7 @@ func (devices *DeviceSetDM) createTask(t TaskType, name string) (*Task, error) {
 	if task == nil {
 		return nil, fmt.Errorf("Can't create task of type %d", int(t))
 	}
-	err := task.SetName(name)
-	if err != nil {
+	if err := task.SetName(name); err != nil {
 		return nil, fmt.Errorf("Can't set task name %s", name)
 	}
 	return task, nil
@@ -92,60 +92,53 @@ func (devices *DeviceSetDM) getInfo(name string) (*Info, error) {
 	if task == nil {
 		return nil, err
 	}
-	err = task.Run()
-	if err != nil {
+	if err := task.Run(); err != nil {
 		return nil, err
 	}
-	info, err := task.GetInfo()
-	if err != nil {
-		return nil, err
-	}
-	return info, nil
+	return task.GetInfo()
 }
 
 func (devices *DeviceSetDM) getStatus(name string) (uint64, uint64, string, string, error) {
 	task, err := devices.createTask(DeviceStatus, name)
 	if task == nil {
+		utils.Debugf("getStatus: Error createTask: %s", err)
 		return 0, 0, "", "", err
 	}
-	err = task.Run()
-	if err != nil {
+	if err := task.Run(); err != nil {
+		utils.Debugf("getStatus: Error Run: %s", err)
 		return 0, 0, "", "", err
 	}
 
 	devinfo, err := task.GetInfo()
 	if err != nil {
+		utils.Debugf("getStatus: Error GetInfo: %s", err)
 		return 0, 0, "", "", err
 	}
 	if devinfo.Exists == 0 {
+		utils.Debugf("getStatus: Non existing device %s", name)
 		return 0, 0, "", "", fmt.Errorf("Non existing device %s", name)
 	}
 
-	var next uintptr = 0
-	next, start, length, target_type, params := task.GetNextTarget(next)
-
+	_, start, length, target_type, params := task.GetNextTarget(0)
 	return start, length, target_type, params, nil
 }
 
 func (devices *DeviceSetDM) setTransactionId(oldId uint64, newId uint64) error {
 	task, err := devices.createTask(DeviceTargetMsg, devices.getPoolDevName())
 	if task == nil {
+		utils.Debugf("\n--->Err: %s\n", err)
 		return err
 	}
 
-	err = task.SetSector(0)
-	if err != nil {
+	if err := task.SetSector(0); err != nil {
 		return fmt.Errorf("Can't set sector")
 	}
 
-	message := fmt.Sprintf("set_transaction_id %d %d", oldId, newId)
-	err = task.SetMessage(message)
-	if err != nil {
+	if err := task.SetMessage(fmt.Sprintf("set_transaction_id %d %d", oldId, newId)); err != nil {
 		return fmt.Errorf("Can't set message")
 	}
 
-	err = task.Run()
-	if err != nil {
+	if err := task.Run(); err != nil {
 		return fmt.Errorf("Error running setTransactionId")
 	}
 	return nil
@@ -167,18 +160,17 @@ func (devices *DeviceSetDM) ensureImage(name string, size int64) (string, error)
 		return "", err
 	}
 
-	_, err := os.Stat(filename)
-	if err != nil {
+	if _, err := os.Stat(filename); err != nil {
 		if !os.IsNotExist(err) {
 			return "", err
 		}
-		log.Printf("Creating loopback file %s for device-manage use", filename)
+		utils.Debugf("Creating loopback file %s for device-manage use", filename)
 		file, err := os.OpenFile(filename, os.O_RDWR|os.O_CREATE, 0600)
 		if err != nil {
 			return "", err
 		}
-		err = file.Truncate(size)
-		if err != nil {
+
+		if err = file.Truncate(size); err != nil {
 			return "", err
 		}
 	}
@@ -189,6 +181,7 @@ func (devices *DeviceSetDM) createPool(dataFile *os.File, metadataFile *os.File)
 	utils.Debugf("Activating device-mapper pool %s", devices.getPoolName())
 	task, err := devices.createTask(DeviceCreate, devices.getPoolName())
 	if task == nil {
+		utils.Debugf("\n--->Err: %s\n", err)
 		return err
 	}
 
@@ -198,19 +191,16 @@ func (devices *DeviceSetDM) createPool(dataFile *os.File, metadataFile *os.File)
 	}
 
 	params := metadataFile.Name() + " " + dataFile.Name() + " 512 8192"
-	err = task.AddTarget(0, size/512, "thin-pool", params)
-	if err != nil {
+	if err := task.AddTarget(0, size/512, "thin-pool", params); err != nil {
 		return fmt.Errorf("Can't add target")
 	}
 
 	var cookie uint32 = 0
-	err = task.SetCookie(&cookie, 0)
-	if err != nil {
+	if err := task.SetCookie(&cookie, 0); err != nil {
 		return fmt.Errorf("Can't set cookie")
 	}
 
-	err = task.Run()
-	if err != nil {
+	if err := task.Run(); err != nil {
 		return fmt.Errorf("Error running DeviceCreate")
 	}
 
@@ -222,10 +212,10 @@ func (devices *DeviceSetDM) createPool(dataFile *os.File, metadataFile *os.File)
 func (devices *DeviceSetDM) suspendDevice(info *DevInfo) error {
 	task, err := devices.createTask(DeviceSuspend, info.Name())
 	if task == nil {
+		utils.Debugf("\n--->Err: %s\n", err)
 		return err
 	}
-	err = task.Run()
-	if err != nil {
+	if err := task.Run(); err != nil {
 		return fmt.Errorf("Error running DeviceSuspend")
 	}
 	return nil
@@ -234,17 +224,16 @@ func (devices *DeviceSetDM) suspendDevice(info *DevInfo) error {
 func (devices *DeviceSetDM) resumeDevice(info *DevInfo) error {
 	task, err := devices.createTask(DeviceResume, info.Name())
 	if task == nil {
+		utils.Debugf("\n--->Err: %s\n", err)
 		return err
 	}
 
 	var cookie uint32 = 0
-	err = task.SetCookie(&cookie, 0)
-	if err != nil {
+	if err := task.SetCookie(&cookie, 0); err != nil {
 		return fmt.Errorf("Can't set cookie")
 	}
 
-	err = task.Run()
-	if err != nil {
+	if err := task.Run(); err != nil {
 		return fmt.Errorf("Error running DeviceSuspend")
 	}
 
@@ -256,68 +245,60 @@ func (devices *DeviceSetDM) resumeDevice(info *DevInfo) error {
 func (devices *DeviceSetDM) createDevice(deviceId int) error {
 	task, err := devices.createTask(DeviceTargetMsg, devices.getPoolDevName())
 	if task == nil {
+		utils.Debugf("\n--->Err: %s\n", err)
 		return err
 	}
 
-	err = task.SetSector(0)
-	if err != nil {
+	if err := task.SetSector(0); err != nil {
 		return fmt.Errorf("Can't set sector")
 	}
 
-	message := fmt.Sprintf("create_thin %d", deviceId)
-	err = task.SetMessage(message)
-	if err != nil {
+	if err := task.SetMessage(fmt.Sprintf("create_thin %d", deviceId)); err != nil {
 		return fmt.Errorf("Can't set message")
 	}
 
-	err = task.Run()
-	if err != nil {
+	if err := task.Run(); err != nil {
 		return fmt.Errorf("Error running createDevice")
 	}
 	return nil
 }
 
 func (devices *DeviceSetDM) createSnapDevice(deviceId int, baseInfo *DevInfo) error {
-	doSuspend := false
 	devinfo, _ := devices.getInfo(baseInfo.Name())
-	if devinfo != nil && devinfo.Exists != 0 {
-		doSuspend = true
-	}
+	doSuspend := devinfo != nil && devinfo.Exists != 0
 
 	if doSuspend {
-		err := devices.suspendDevice(baseInfo)
-		if err != nil {
+		if err := devices.suspendDevice(baseInfo); err != nil {
+			utils.Debugf("\n--->Err: %s\n", err)
 			return err
 		}
 	}
 
 	task, err := devices.createTask(DeviceTargetMsg, devices.getPoolDevName())
 	if task == nil {
-		_ = devices.resumeDevice(baseInfo)
+		devices.resumeDevice(baseInfo)
+		utils.Debugf("\n--->Err: %s\n", err)
 		return err
 	}
-	err = task.SetSector(0)
-	if err != nil {
-		_ = devices.resumeDevice(baseInfo)
+
+	if err := task.SetSector(0); err != nil {
+		devices.resumeDevice(baseInfo)
 		return fmt.Errorf("Can't set sector")
 	}
 
-	message := fmt.Sprintf("create_snap %d %d", deviceId, baseInfo.DeviceId)
-	err = task.SetMessage(message)
-	if err != nil {
-		_ = devices.resumeDevice(baseInfo)
+	if err := task.SetMessage(fmt.Sprintf("create_snap %d %d", deviceId, baseInfo.DeviceId)); err != nil {
+		devices.resumeDevice(baseInfo)
 		return fmt.Errorf("Can't set message")
 	}
 
-	err = task.Run()
-	if err != nil {
-		_ = devices.resumeDevice(baseInfo)
+	if err := task.Run(); err != nil {
+		devices.resumeDevice(baseInfo)
 		return fmt.Errorf("Error running DeviceCreate")
 	}
 
 	if doSuspend {
-		err = devices.resumeDevice(baseInfo)
-		if err != nil {
+		if err := devices.resumeDevice(baseInfo); err != nil {
+			utils.Debugf("\n--->Err: %s\n", err)
 			return err
 		}
 	}
@@ -328,22 +309,19 @@ func (devices *DeviceSetDM) createSnapDevice(deviceId int, baseInfo *DevInfo) er
 func (devices *DeviceSetDM) deleteDevice(deviceId int) error {
 	task, err := devices.createTask(DeviceTargetMsg, devices.getPoolDevName())
 	if task == nil {
+		utils.Debugf("\n--->Err: %s\n", err)
 		return err
 	}
 
-	err = task.SetSector(0)
-	if err != nil {
+	if err := task.SetSector(0); err != nil {
 		return fmt.Errorf("Can't set sector")
 	}
 
-	message := fmt.Sprintf("delete %d", deviceId)
-	err = task.SetMessage(message)
-	if err != nil {
+	if err := task.SetMessage(fmt.Sprintf("delete %d", deviceId)); err != nil {
 		return fmt.Errorf("Can't set message")
 	}
 
-	err = task.Run()
-	if err != nil {
+	if err := task.Run(); err != nil {
 		return fmt.Errorf("Error running deleteDevice")
 	}
 	return nil
@@ -352,10 +330,10 @@ func (devices *DeviceSetDM) deleteDevice(deviceId int) error {
 func (devices *DeviceSetDM) removeDevice(name string) error {
 	task, err := devices.createTask(DeviceRemove, name)
 	if task == nil {
+		utils.Debugf("\n--->Err: %s\n", err)
 		return err
 	}
-	err = task.Run()
-	if err != nil {
+	if err = task.Run(); err != nil {
 		return fmt.Errorf("Error running removeDevice")
 	}
 	return nil
@@ -364,23 +342,21 @@ func (devices *DeviceSetDM) removeDevice(name string) error {
 func (devices *DeviceSetDM) activateDevice(info *DevInfo) error {
 	task, err := devices.createTask(DeviceCreate, info.Name())
 	if task == nil {
+		utils.Debugf("\n--->Err: %s\n", err)
 		return err
 	}
 
 	params := fmt.Sprintf("%s %d", devices.getPoolDevName(), info.DeviceId)
-	err = task.AddTarget(0, info.Size/512, "thin", params)
-	if err != nil {
+	if err := task.AddTarget(0, info.Size/512, "thin", params); err != nil {
 		return fmt.Errorf("Can't add target")
 	}
 
 	var cookie uint32 = 0
-	err = task.SetCookie(&cookie, 0)
-	if err != nil {
+	if err := task.SetCookie(&cookie, 0); err != nil {
 		return fmt.Errorf("Can't set cookie")
 	}
 
-	err = task.Run()
-	if err != nil {
+	if err := task.Run(); err != nil {
 		return fmt.Errorf("Error running DeviceCreate")
 	}
 
@@ -404,61 +380,60 @@ func (devices *DeviceSetDM) allocateTransactionId() uint64 {
 func (devices *DeviceSetDM) saveMetadata() error {
 	jsonData, err := json.Marshal(devices.MetaData)
 	if err != nil {
+		utils.Debugf("\n--->Err: %s\n", err)
 		return err
 	}
 	tmpFile, err := ioutil.TempFile(filepath.Dir(devices.jsonFile()), ".json")
 	if err != nil {
+		utils.Debugf("\n--->Err: %s\n", err)
 		return err
 	}
 
 	n, err := tmpFile.Write(jsonData)
 	if err != nil {
+		utils.Debugf("\n--->Err: %s\n", err)
 		return err
 	}
 	if n < len(jsonData) {
-		err = io.ErrShortWrite
+		return io.ErrShortWrite
 	}
-	err = tmpFile.Sync()
-	if err != nil {
+	if err := tmpFile.Sync(); err != nil {
+		utils.Debugf("\n--->Err: %s\n", err)
 		return err
 	}
-	err = tmpFile.Close()
-	if err != nil {
+	if err := tmpFile.Close(); err != nil {
+		utils.Debugf("\n--->Err: %s\n", err)
 		return err
 	}
-	err = os.Rename(tmpFile.Name(), devices.jsonFile())
-	if err != nil {
+	if err := os.Rename(tmpFile.Name(), devices.jsonFile()); err != nil {
+		utils.Debugf("\n--->Err: %s\n", err)
 		return err
 	}
 
 	if devices.NewTransactionId != devices.TransactionId {
-		err = devices.setTransactionId(devices.TransactionId, devices.NewTransactionId)
-		if err != nil {
+		if err = devices.setTransactionId(devices.TransactionId, devices.NewTransactionId); err != nil {
+			utils.Debugf("\n--->Err: %s\n", err)
 			return err
 		}
 		devices.TransactionId = devices.NewTransactionId
 	}
-
 	return nil
 }
 
 func (devices *DeviceSetDM) registerDevice(id int, hash string, size uint64) (*DevInfo, error) {
-	transaction := devices.allocateTransactionId()
-
 	info := &DevInfo{
 		Hash:          hash,
 		DeviceId:      id,
 		Size:          size,
-		TransactionId: transaction,
+		TransactionId: devices.allocateTransactionId(),
 		Initialized:   false,
 		devices:       devices,
 	}
 
 	devices.Devices[hash] = info
-	err := devices.saveMetadata()
-	if err != nil {
+	if err := devices.saveMetadata(); err != nil {
 		// Try to remove unused device
-		devices.Devices[hash] = nil
+		delete(devices.Devices, hash)
 		return nil, err
 	}
 
@@ -471,9 +446,7 @@ func (devices *DeviceSetDM) activateDeviceIfNeeded(hash string) error {
 		return fmt.Errorf("Unknown device %s", hash)
 	}
 
-	name := info.Name()
-	devinfo, _ := devices.getInfo(name)
-	if devinfo != nil && devinfo.Exists != 0 {
+	if devinfo, _ := devices.getInfo(info.Name()); devinfo != nil && devinfo.Exists != 0 {
 		return nil
 	}
 
@@ -483,13 +456,12 @@ func (devices *DeviceSetDM) activateDeviceIfNeeded(hash string) error {
 func (devices *DeviceSetDM) createFilesystem(info *DevInfo) error {
 	devname := info.DevName()
 
-	err := exec.Command("mkfs.ext4", "-E",
-		"discard,lazy_itable_init=0,lazy_journal_init=0", devname).Run()
+	err := exec.Command("mkfs.ext4", "-E", "discard,lazy_itable_init=0,lazy_journal_init=0", devname).Run()
 	if err != nil {
-		err = exec.Command("mkfs.ext4", "-E",
-		"discard,lazy_itable_init=0", devname).Run()
+		err = exec.Command("mkfs.ext4", "-E", "discard,lazy_itable_init=0", devname).Run()
 	}
 	if err != nil {
+		utils.Debugf("\n--->Err: %s\n", err)
 		return err
 	}
 	return nil
@@ -498,31 +470,29 @@ func (devices *DeviceSetDM) createFilesystem(info *DevInfo) error {
 func (devices *DeviceSetDM) loadMetaData() error {
 	_, _, _, params, err := devices.getStatus(devices.getPoolName())
 	if err != nil {
+		utils.Debugf("\n--->Err: %s\n", err)
 		return err
 	}
-	var currentTransaction uint64
-	_, err = fmt.Sscanf(params, "%d", &currentTransaction)
-	if err != nil {
+
+	if _, err := fmt.Sscanf(params, "%d", &devices.TransactionId); err != nil {
+		utils.Debugf("\n--->Err: %s\n", err)
 		return err
 	}
-
-	devices.TransactionId = currentTransaction
 	devices.NewTransactionId = devices.TransactionId
 
 	jsonData, err := ioutil.ReadFile(devices.jsonFile())
 	if err != nil && !os.IsNotExist(err) {
+		utils.Debugf("\n--->Err: %s\n", err)
 		return err
 	}
 
-	metadata := &MetaData{
-		Devices: make(map[string]*DevInfo),
-	}
+	devices.MetaData.Devices = make(map[string]*DevInfo)
 	if jsonData != nil {
-		if err := json.Unmarshal(jsonData, metadata); err != nil {
+		if err := json.Unmarshal(jsonData, &devices.MetaData); err != nil {
+			utils.Debugf("\n--->Err: %s\n", err)
 			return err
 		}
 	}
-	devices.MetaData = *metadata
 
 	for hash, d := range devices.Devices {
 		d.Hash = hash
@@ -533,12 +503,11 @@ func (devices *DeviceSetDM) loadMetaData() error {
 		}
 
 		// If the transaction id is larger than the actual one we lost the device due to some crash
-		if d.TransactionId > currentTransaction {
-			log.Printf("Removing lost device %s with id %d", hash, d.TransactionId)
+		if d.TransactionId > devices.TransactionId {
+			utils.Debugf("Removing lost device %s with id %d", hash, d.TransactionId)
 			delete(devices.Devices, hash)
 		}
 	}
-
 	return nil
 }
 
@@ -549,45 +518,46 @@ func (devices *DeviceSetDM) setupBaseImage() error {
 	}
 
 	if oldInfo != nil && !oldInfo.Initialized {
-		log.Printf("Removing uninitialized base image")
+		utils.Debugf("Removing uninitialized base image")
 		if err := devices.RemoveDevice(""); err != nil {
+			utils.Debugf("\n--->Err: %s\n", err)
 			return err
 		}
 	}
 
-	log.Printf("Initializing base device-manager snapshot")
+	utils.Debugf("Initializing base device-manager snapshot")
 
 	id := devices.allocateDeviceId()
 
 	// Create initial device
-	err := devices.createDevice(id)
-	if err != nil {
+	if err := devices.createDevice(id); err != nil {
+		utils.Debugf("\n--->Err: %s\n", err)
 		return err
 	}
 
 	info, err := devices.registerDevice(id, "", defaultBaseFsSize)
 	if err != nil {
 		_ = devices.deleteDevice(id)
+		utils.Debugf("\n--->Err: %s\n", err)
 		return err
 	}
 
-	log.Printf("Creating filesystem on base device-manager snapshot")
+	utils.Debugf("Creating filesystem on base device-manager snapshot")
 
-	err = devices.activateDeviceIfNeeded("")
-	if err != nil {
+	if err = devices.activateDeviceIfNeeded(""); err != nil {
+		utils.Debugf("\n--->Err: %s\n", err)
 		return err
 	}
 
-	err = devices.createFilesystem(info)
-	if err != nil {
+	if err := devices.createFilesystem(info); err != nil {
+		utils.Debugf("\n--->Err: %s\n", err)
 		return err
 	}
 
 	info.Initialized = true
-
-	err = devices.saveMetadata()
-	if err != nil {
+	if err = devices.saveMetadata(); err != nil {
 		info.Initialized = false
+		utils.Debugf("\n--->Err: %s\n", err)
 		return err
 	}
 
@@ -597,64 +567,67 @@ func (devices *DeviceSetDM) setupBaseImage() error {
 func (devices *DeviceSetDM) initDevmapper() error {
 	info, err := devices.getInfo(devices.getPoolName())
 	if info == nil {
+		utils.Debugf("Error device getInfo: %s", err)
 		return err
 	}
+	utils.Debugf("initDevmapper(). Pool exists: %v", info.Exists)
 
 	if info.Exists != 0 {
 		/* Pool exists, assume everything is up */
-		err = devices.loadMetaData()
-		if err != nil {
+		if err := devices.loadMetaData(); err != nil {
+			utils.Debugf("Error device loadMetaData: %s\n", err)
 			return err
 		}
-		err = devices.setupBaseImage()
-		if err != nil {
+		if err := devices.setupBaseImage(); err != nil {
+			utils.Debugf("Error device setupBaseImage: %s\n", err)
 			return err
 		}
 		return nil
 	}
 
-	createdLoopback := false
-	if !devices.hasImage("data") || !devices.hasImage("metadata") {
-		/* If we create the loopback mounts we also need to initialize the base fs */
-		createdLoopback = true
-	}
+	/* If we create the loopback mounts we also need to initialize the base fs */
+	createdLoopback := !devices.hasImage("data") || !devices.hasImage("metadata")
 
 	data, err := devices.ensureImage("data", defaultDataLoopbackSize)
 	if err != nil {
+		utils.Debugf("Error device ensureImage (data): %s\n", err)
 		return err
 	}
 
 	metadata, err := devices.ensureImage("metadata", defaultMetaDataLoopbackSize)
 	if err != nil {
+		utils.Debugf("Error device ensureImage (metadata): %s\n", err)
 		return err
 	}
 
 	dataFile, err := AttachLoopDevice(data)
 	if err != nil {
+		utils.Debugf("\n--->Err: %s\n", err)
 		return err
 	}
 	defer dataFile.Close()
 
 	metadataFile, err := AttachLoopDevice(metadata)
 	if err != nil {
+		utils.Debugf("\n--->Err: %s\n", err)
 		return err
 	}
 	defer metadataFile.Close()
 
-	err = devices.createPool(dataFile, metadataFile)
-	if err != nil {
+	if err := devices.createPool(dataFile, metadataFile); err != nil {
+		utils.Debugf("\n--->Err: %s\n", err)
 		return err
 	}
 
 	if !createdLoopback {
-		err = devices.loadMetaData()
-		if err != nil {
+		if err = devices.loadMetaData(); err != nil {
+			utils.Debugf("\n--->Err: %s\n", err)
 			return err
 		}
 	}
 
-	err = devices.setupBaseImage()
-	if err != nil {
+	if err := devices.setupBaseImage(); err != nil {
+		utils.Debugf("\n--->Err: %s\n", err)
 		return err
 	}
 
@@ -663,6 +636,7 @@ func (devices *DeviceSetDM) initDevmapper() error {
 
 func (devices *DeviceSetDM) AddDevice(hash, baseHash string) error {
 	if err := devices.ensureInit(); err != nil {
+		utils.Debugf("Error init: %s\n", err)
 		return err
 	}
 
@@ -672,19 +646,20 @@ func (devices *DeviceSetDM) AddDevice(hash, baseHash string) error {
 
 	baseInfo := devices.Devices[baseHash]
 	if baseInfo == nil {
+		utils.Debugf("Base Hash not found")
 		return fmt.Errorf("Unknown base hash %s", baseHash)
 	}
 
 	deviceId := devices.allocateDeviceId()
 
-	err := devices.createSnapDevice(deviceId, baseInfo)
-	if err != nil {
+	if err := devices.createSnapDevice(deviceId, baseInfo); err != nil {
+		utils.Debugf("Error creating snap device: %s\n", err)
 		return err
 	}
 
-	_, err = devices.registerDevice(deviceId, hash, baseInfo.Size)
-	if err != nil {
-		_ = devices.deleteDevice(deviceId)
+	if _, err := devices.registerDevice(deviceId, hash, baseInfo.Size); err != nil {
+		devices.deleteDevice(deviceId)
+		utils.Debugf("Error registering device: %s\n", err)
 		return err
 	}
 	return nil
@@ -692,6 +667,7 @@ func (devices *DeviceSetDM) AddDevice(hash, baseHash string) error {
 
 func (devices *DeviceSetDM) RemoveDevice(hash string) error {
 	if err := devices.ensureInit(); err != nil {
+		utils.Debugf("\n--->Err: %s\n", err)
 		return err
 	}
 
@@ -702,31 +678,31 @@ func (devices *DeviceSetDM) RemoveDevice(hash string) error {
 
 	devinfo, _ := devices.getInfo(info.Name())
 	if devinfo != nil && devinfo.Exists != 0 {
-		err := devices.removeDevice(info.Name())
-		if err != nil {
+		if err := devices.removeDevice(info.Name()); err != nil {
+			utils.Debugf("Error removing device: %s\n", err)
 			return err
 		}
 	}
 
 	if info.Initialized {
 		info.Initialized = false
-		err := devices.saveMetadata()
-		if err != nil {
+		if err := devices.saveMetadata(); err != nil {
+			utils.Debugf("Error saving meta data: %s\n", err)
 			return err
 		}
 	}
 
-	err := devices.deleteDevice(info.DeviceId)
-	if err != nil {
+	if err := devices.deleteDevice(info.DeviceId); err != nil {
+		utils.Debugf("Error deleting device: %s\n", err)
 		return err
 	}
 
-	_ = devices.allocateTransactionId()
+	devices.allocateTransactionId()
 	delete(devices.Devices, info.Hash)
 
-	err = devices.saveMetadata()
-	if err != nil {
+	if err := devices.saveMetadata(); err != nil {
 		devices.Devices[info.Hash] = info
+		utils.Debugf("Error saving meta data: %s\n", err)
 		return err
 	}
 
@@ -735,6 +711,7 @@ func (devices *DeviceSetDM) RemoveDevice(hash string) error {
 
 func (devices *DeviceSetDM) DeactivateDevice(hash string) error {
 	if err := devices.ensureInit(); err != nil {
+		utils.Debugf("\n--->Err: %s\n", err)
 		return err
 	}
 
@@ -745,11 +722,12 @@ func (devices *DeviceSetDM) DeactivateDevice(hash string) error {
 
 	devinfo, err := devices.getInfo(info.Name())
 	if err != nil {
+		utils.Debugf("\n--->Err: %s\n", err)
 		return err
 	}
 	if devinfo.Exists != 0 {
-		err := devices.removeDevice(info.Name())
-		if err != nil {
+		if err := devices.removeDevice(info.Name()); err != nil {
+			utils.Debugf("\n--->Err: %s\n", err)
 			return err
 		}
 	}
@@ -764,9 +742,8 @@ func (devices *DeviceSetDM) Shutdown() error {
 
 	for path, count := range devices.activeMounts {
 		for i := count; i > 0; i-- {
-			err := syscall.Unmount(path, 0)
-			if err != nil {
-				fmt.Printf("Shutdown unmounting %s, error: %s\n", path, err)
+			if err := syscall.Unmount(path, 0); err != nil {
+				utils.Debugf("Shutdown unmounting %s, error: %s\n", path, err)
 			}
 		}
 		delete(devices.activeMounts, path)
@@ -774,16 +751,14 @@ func (devices *DeviceSetDM) Shutdown() error {
 
 	for _, d := range devices.Devices {
 		if err := devices.DeactivateDevice(d.Hash); err != nil {
-			fmt.Printf("Shutdown deactivate %s , error: %s\n", d.Hash, err)
+			utils.Debugf("Shutdown deactivate %s , error: %s\n", d.Hash, err)
 		}
 	}
 
-
 	pool := devices.getPoolDevName()
-	devinfo, err := devices.getInfo(pool)
-	if err == nil && devinfo.Exists != 0 {
+	if devinfo, err := devices.getInfo(pool); err == nil && devinfo.Exists != 0 {
 		if err := devices.removeDevice(pool); err != nil {
-			fmt.Printf("Shutdown deactivate %s , error: %s\n", pool, err)
+			utils.Debugf("Shutdown deactivate %s , error: %s\n", pool, err)
 		}
 	}
 
@@ -792,21 +767,23 @@ func (devices *DeviceSetDM) Shutdown() error {
 
 func (devices *DeviceSetDM) MountDevice(hash, path string) error {
 	if err := devices.ensureInit(); err != nil {
+		utils.Debugf("\n--->Err: %s\n", err)
 		return err
 	}
 
-	err := devices.activateDeviceIfNeeded(hash)
-	if err != nil {
+	if err := devices.activateDeviceIfNeeded(hash); err != nil {
+		utils.Debugf("\n--->Err: %s\n", err)
 		return err
 	}
 
 	info := devices.Devices[hash]
 
-	err = syscall.Mount(info.DevName(), path, "ext4", syscall.MS_MGC_VAL, "discard")
+	err := syscall.Mount(info.DevName(), path, "ext4", syscall.MS_MGC_VAL, "discard")
 	if err != nil && err == syscall.EINVAL {
 		err = syscall.Mount(info.DevName(), path, "ext4", syscall.MS_MGC_VAL, "")
 	}
 	if err != nil {
+		utils.Debugf("\n--->Err: %s\n", err)
 		return err
 	}
 
@@ -817,13 +794,12 @@ func (devices *DeviceSetDM) MountDevice(hash, path string) error {
 }
 
 func (devices *DeviceSetDM) UnmountDevice(hash, path string) error {
-	err := syscall.Unmount(path, 0)
-	if err != nil {
+	if err := syscall.Unmount(path, 0); err != nil {
+		utils.Debugf("\n--->Err: %s\n", err)
 		return err
 	}
 
-	count := devices.activeMounts[path]
-	if count > 1 {
+	if count := devices.activeMounts[path]; count > 1 {
 		devices.activeMounts[path] = count - 1
 	} else {
 		delete(devices.activeMounts, path)
@@ -832,14 +808,11 @@ func (devices *DeviceSetDM) UnmountDevice(hash, path string) error {
 	return nil
 }
 
-
 func (devices *DeviceSetDM) HasDevice(hash string) bool {
 	if err := devices.ensureInit(); err != nil {
 		return false
 	}
-
-	info := devices.Devices[hash]
-	return info != nil
+	return devices.Devices[hash] != nil
 }
 
 func (devices *DeviceSetDM) HasInitializedDevice(hash string) bool {
@@ -860,16 +833,13 @@ func (devices *DeviceSetDM) HasActivatedDevice(hash string) bool {
 	if info == nil {
 		return false
 	}
-	name := info.Name()
-	devinfo, _ := devices.getInfo(name)
-	if devinfo != nil && devinfo.Exists != 0 {
-		return true
-	}
-	return false
+	devinfo, _ := devices.getInfo(info.Name())
+	return devinfo != nil && devinfo.Exists != 0
 }
 
 func (devices *DeviceSetDM) SetInitialized(hash string) error {
 	if err := devices.ensureInit(); err != nil {
+		utils.Debugf("\n--->Err: %s\n", err)
 		return err
 	}
 
@@ -879,9 +849,9 @@ func (devices *DeviceSetDM) SetInitialized(hash string) error {
 	}
 
 	info.Initialized = true
-	err := devices.saveMetadata()
-	if err != nil {
+	if err := devices.saveMetadata(); err != nil {
 		info.Initialized = false
+		utils.Debugf("\n--->Err: %s\n", err)
 		return err
 	}
 
@@ -889,10 +859,11 @@ func (devices *DeviceSetDM) SetInitialized(hash string) error {
 }
 
 func (devices *DeviceSetDM) ensureInit() error {
+	utils.Debugf("ensureInit(). Initialized: %v", devices.initialized)
 	if !devices.initialized {
 		devices.initialized = true
-		err := devices.initDevmapper()
-		if err != nil {
+		if err := devices.initDevmapper(); err != nil {
+			utils.Debugf("\n--->Err: %s\n", err)
 			return err
 		}
 	}
@@ -907,13 +878,11 @@ func NewDeviceSetDM(root string) *DeviceSetDM {
 		base = "docker-" + base
 	}
 
-	devices := &DeviceSetDM{
-		initialized: false,
-		root:        root,
+	return &DeviceSetDM{
+		initialized:  false,
+		root:         root,
 		devicePrefix: base,
+		MetaData:     MetaData{Devices: make(map[string]*DevInfo)},
+		activeMounts: make(map[string]int),
 	}
-	devices.Devices = make(map[string]*DevInfo)
-	devices.activeMounts = make(map[string]int)
-
-	return devices
 }

+ 55 - 73
devmapper/devmapper.go

@@ -108,30 +108,32 @@ get_block_size(int fd)
 
 */
 import "C"
-import "unsafe"
-import "fmt"
-import "runtime"
-import "os"
+
+import (
+	"fmt"
+	"github.com/dotcloud/docker/utils"
+	"os"
+	"runtime"
+	"unsafe"
+)
 
 func SetDevDir(dir string) error {
 	c_dir := C.CString(dir)
 	defer C.free(unsafe.Pointer(c_dir))
-	res := C.dm_set_dev_dir(c_dir)
-	if res != 1 {
+
+	if res := C.dm_set_dev_dir(c_dir); res != 1 {
+		utils.Debugf("Error dm_set_dev_dir")
 		return fmt.Errorf("dm_set_dev_dir failed")
 	}
 	return nil
 }
 
 func GetLibraryVersion() (string, error) {
-	buffer := (*C.char)(C.malloc(128))
-	defer C.free(unsafe.Pointer(buffer))
-	res := C.dm_get_library_version(buffer, 128)
-	if res != 1 {
+	buffer := make([]byte, 128)
+	if res := C.dm_get_library_version((*C.char)(unsafe.Pointer(&buffer)), 128); res != 1 {
 		return "", fmt.Errorf("dm_get_library_version failed")
-	} else {
-		return C.GoString(buffer), nil
 	}
+	return string(buffer), nil
 }
 
 type TaskType int
@@ -183,18 +185,17 @@ func (t *Task) destroy() {
 }
 
 func TaskCreate(tasktype TaskType) *Task {
-	c_task := C.dm_task_create(C.int(int(tasktype)))
+	c_task := C.dm_task_create(C.int(tasktype))
 	if c_task == nil {
 		return nil
 	}
-	task := &Task{c_task}
+	task := &Task{unmanaged: c_task}
 	runtime.SetFinalizer(task, (*Task).destroy)
 	return task
 }
 
 func (t *Task) Run() error {
-	res := C.dm_task_run(t.unmanaged)
-	if res != 1 {
+	if res := C.dm_task_run(t.unmanaged); res != 1 {
 		return fmt.Errorf("dm_task_run failed")
 	}
 	return nil
@@ -204,8 +205,10 @@ func (t *Task) SetName(name string) error {
 	c_name := C.CString(name)
 	defer C.free(unsafe.Pointer(c_name))
 
-	res := C.dm_task_set_name(t.unmanaged, c_name)
-	if res != 1 {
+	if res := C.dm_task_set_name(t.unmanaged, c_name); res != 1 {
+		if os.Getenv("DEBUG") != "" {
+			C.perror(C.CString(fmt.Sprintf("[debug] Error dm_task_set_name(%s, %#v)", name, t.unmanaged)))
+		}
 		return fmt.Errorf("dm_task_set_name failed")
 	}
 	return nil
@@ -215,26 +218,22 @@ func (t *Task) SetMessage(message string) error {
 	c_message := C.CString(message)
 	defer C.free(unsafe.Pointer(c_message))
 
-	res := C.dm_task_set_message(t.unmanaged, c_message)
-	if res != 1 {
+	if res := C.dm_task_set_message(t.unmanaged, c_message); res != 1 {
 		return fmt.Errorf("dm_task_set_message failed")
 	}
 	return nil
 }
 
 func (t *Task) SetSector(sector uint64) error {
-	res := C.dm_task_set_sector(t.unmanaged, C.uint64_t(sector))
-	if res != 1 {
+	if res := C.dm_task_set_sector(t.unmanaged, C.uint64_t(sector)); res != 1 {
 		return fmt.Errorf("dm_task_set_add_node failed")
 	}
 	return nil
 }
 
 func (t *Task) SetCookie(cookie *uint32, flags uint16) error {
-	var c_cookie C.uint32_t
-	c_cookie = C.uint32_t(*cookie)
-	res := C.dm_task_set_cookie(t.unmanaged, &c_cookie, C.uint16_t(flags))
-	if res != 1 {
+	c_cookie := C.uint32_t(*cookie)
+	if res := C.dm_task_set_cookie(t.unmanaged, &c_cookie, C.uint16_t(flags)); res != 1 {
 		return fmt.Errorf("dm_task_set_add_node failed")
 	}
 	*cookie = uint32(c_cookie)
@@ -242,8 +241,7 @@ func (t *Task) SetCookie(cookie *uint32, flags uint16) error {
 }
 
 func (t *Task) SetRo() error {
-	res := C.dm_task_set_ro(t.unmanaged)
-	if res != 1 {
+	if res := C.dm_task_set_ro(t.unmanaged); res != 1 {
 		return fmt.Errorf("dm_task_set_ro failed")
 	}
 	return nil
@@ -256,8 +254,7 @@ func (t *Task) AddTarget(start uint64, size uint64, ttype string, params string)
 	c_params := C.CString(params)
 	defer C.free(unsafe.Pointer(c_params))
 
-	res := C.dm_task_add_target(t.unmanaged, C.uint64_t(start), C.uint64_t(size), c_ttype, c_params)
-	if res != 1 {
+	if res := C.dm_task_add_target(t.unmanaged, C.uint64_t(start), C.uint64_t(size), c_ttype, c_params); res != 1 {
 		return fmt.Errorf("dm_task_add_target failed")
 	}
 	return nil
@@ -267,49 +264,39 @@ func (t *Task) GetDriverVersion() (string, error) {
 	buffer := (*C.char)(C.malloc(128))
 	defer C.free(unsafe.Pointer(buffer))
 
-	res := C.dm_task_get_driver_version(t.unmanaged, buffer, 128)
-	if res != 1 {
+	if res := C.dm_task_get_driver_version(t.unmanaged, buffer, 128); res != 1 {
 		return "", fmt.Errorf("dm_task_get_driver_version")
-	} else {
-		return C.GoString(buffer), nil
 	}
+	return C.GoString(buffer), nil
 }
 
 func (t *Task) GetInfo() (*Info, error) {
 	c_info := C.struct_dm_info{}
-	res := C.dm_task_get_info(t.unmanaged, &c_info)
-	if res != 1 {
+	if res := C.dm_task_get_info(t.unmanaged, &c_info); res != 1 {
 		return nil, fmt.Errorf("dm_task_get_driver_version")
-	} else {
-		info := &Info{}
-		info.Exists = int(c_info.exists)
-		info.Suspended = int(c_info.suspended)
-		info.LiveTable = int(c_info.live_table)
-		info.InactiveTable = int(c_info.inactive_table)
-		info.OpenCount = int32(c_info.open_count)
-		info.EventNr = uint32(c_info.event_nr)
-		info.Major = uint32(c_info.major)
-		info.Minor = uint32(c_info.minor)
-		info.ReadOnly = int(c_info.read_only)
-		info.TargetCount = int32(c_info.target_count)
-
-		return info, nil
 	}
+	return &Info{
+		Exists:        int(c_info.exists),
+		Suspended:     int(c_info.suspended),
+		LiveTable:     int(c_info.live_table),
+		InactiveTable: int(c_info.inactive_table),
+		OpenCount:     int32(c_info.open_count),
+		EventNr:       uint32(c_info.event_nr),
+		Major:         uint32(c_info.major),
+		Minor:         uint32(c_info.minor),
+		ReadOnly:      int(c_info.read_only),
+		TargetCount:   int32(c_info.target_count),
+	}, nil
 }
 
 func (t *Task) GetNextTarget(next uintptr) (uintptr, uint64, uint64, string, string) {
-	nextp := unsafe.Pointer(next)
-	var c_start C.uint64_t
-	var c_length C.uint64_t
-	var c_target_type *C.char
-	var c_params *C.char
-
-	nextp = C.dm_get_next_target(t.unmanaged, nextp, &c_start, &c_length, &c_target_type, &c_params)
-
-	target_type := C.GoString(c_target_type)
-	params := C.GoString(c_params)
+	var (
+		c_start, c_length       C.uint64_t
+		c_target_type, c_params *C.char
+	)
 
-	return uintptr(nextp), uint64(c_start), uint64(c_length), target_type, params
+	nextp := C.dm_get_next_target(t.unmanaged, unsafe.Pointer(next), &c_start, &c_length, &c_target_type, &c_params)
+	return uintptr(nextp), uint64(c_start), uint64(c_length), C.GoString(c_target_type), C.GoString(c_params)
 }
 
 func AttachLoopDevice(filename string) (*os.File, error) {
@@ -321,19 +308,16 @@ func AttachLoopDevice(filename string) (*os.File, error) {
 	if res == nil {
 		return nil, fmt.Errorf("error loopback mounting")
 	}
-	file := os.NewFile(uintptr(fd), C.GoString(res))
-	C.free(unsafe.Pointer(res))
-	return file, nil
+	defer C.free(unsafe.Pointer(res))
+	return os.NewFile(uintptr(fd), C.GoString(res)), nil
 }
 
 func GetBlockDeviceSize(file *os.File) (uint64, error) {
-	fd := file.Fd()
-	size := C.get_block_size(C.int(fd))
-	if size == -1 {
+	if size := C.get_block_size(C.int(file.Fd())); size == -1 {
 		return 0, fmt.Errorf("Can't get block size")
+	} else {
+		return uint64(size), nil
 	}
-	return uint64(size), nil
-
 }
 
 func UdevWait(cookie uint32) error {
@@ -354,12 +338,10 @@ func RemoveDevice(name string) error {
 	if task == nil {
 		return fmt.Errorf("Can't create task of type DeviceRemove")
 	}
-	err := task.SetName(name)
-	if err != nil {
+	if err := task.SetName(name); err != nil {
 		return fmt.Errorf("Can't set task name %s", name)
 	}
-	err = task.Run()
-	if err != nil {
+	if err := task.Run(); err != nil {
 		return fmt.Errorf("Error running removeDevice")
 	}
 	return nil

+ 1 - 1
docker/docker.go

@@ -123,7 +123,7 @@ func daemon(pidfile string, flGraphPath string, protoAddrs []string, autoRestart
 	defer removePidFile(pidfile)
 
 	c := make(chan os.Signal, 1)
-	signal.Notify(c, os.Interrupt, os.Kill, os.Signal(syscall.SIGTERM))
+	signal.Notify(c, os.Interrupt, os.Kill, syscall.SIGTERM)
 	go func() {
 		sig := <-c
 		log.Printf("Received signal '%v', exiting\n", sig)

+ 1 - 1
hack/make/test

@@ -11,7 +11,7 @@ bundle_test() {
 		for test_dir in $(find_test_dirs); do (
 			set -x
 			cd $test_dir
-			go test -v -ldflags "$LDFLAGS" $BUILDFLAGS
+			DEBUG=1 go test -v -ldflags "$LDFLAGS" $BUILDFLAGS -run TestRunHostname
 		)  done
 	} 2>&1 | tee $DEST/test.log
 }

+ 22 - 24
image.go

@@ -378,28 +378,28 @@ func (image *Image) ensureImageDevice(devices DeviceSet) error {
 	}
 
 	utils.Debugf("Creating device-mapper device for image id %s", image.ID)
-	err = devices.AddDevice(image.ID, image.Parent)
-	if err != nil {
+	if err := devices.AddDevice(image.ID, image.Parent); err != nil {
+		utils.Debugf("Error add device: %s", err)
 		return err
 	}
 
-	err = devices.MountDevice(image.ID, mountDir)
-	if err != nil {
-		_ = devices.RemoveDevice(image.ID)
+	if err := devices.MountDevice(image.ID, mountDir); err != nil {
+		utils.Debugf("Error mounting device: %s", err)
+		devices.RemoveDevice(image.ID)
 		return err
 	}
 
-	err = ioutil.WriteFile(path.Join(mountDir, ".docker-id"), []byte(image.ID), 0600)
-	if err != nil {
-		_ = devices.UnmountDevice(image.ID, mountDir)
-		_ = devices.RemoveDevice(image.ID)
+	if err := ioutil.WriteFile(path.Join(mountDir, ".docker-id"), []byte(image.ID), 0600); err != nil {
+		utils.Debugf("Error writing file: %s", err)
+		devices.UnmountDevice(image.ID, mountDir)
+		devices.RemoveDevice(image.ID)
 		return err
 	}
 
-	err = image.applyLayer(layerPath(root), mountDir)
-	if err != nil {
-		_ = devices.UnmountDevice(image.ID, mountDir)
-		_ = devices.RemoveDevice(image.ID)
+	if err = image.applyLayer(layerPath(root), mountDir); err != nil {
+		utils.Debugf("Error applying layer: %s", err)
+		devices.UnmountDevice(image.ID, mountDir)
+		devices.RemoveDevice(image.ID)
 		return err
 	}
 
@@ -415,16 +415,15 @@ func (image *Image) ensureImageDevice(devices DeviceSet) error {
 		_ = devices.RemoveDevice(image.ID)
 		return err
 	}
-	err = image.applyLayer(dockerinitLayer, mountDir)
-	if err != nil {
-		_ = devices.UnmountDevice(image.ID, mountDir)
-		_ = devices.RemoveDevice(image.ID)
+
+	if err := image.applyLayer(dockerinitLayer, mountDir); err != nil {
+		devices.UnmountDevice(image.ID, mountDir)
+		devices.RemoveDevice(image.ID)
 		return err
 	}
 
-	err = devices.UnmountDevice(image.ID, mountDir)
-	if err != nil {
-		_ = devices.RemoveDevice(image.ID)
+	if err := devices.UnmountDevice(image.ID, mountDir); err != nil {
+		devices.RemoveDevice(image.ID)
 		return err
 	}
 
@@ -455,8 +454,8 @@ func (image *Image) Mount(runtime *Runtime, root, rw string, id string) error {
 	if err != nil {
 		return err
 	}
-	err = image.ensureImageDevice(devices)
-	if err != nil {
+
+	if err := image.ensureImageDevice(devices); err != nil {
 		return err
 	}
 
@@ -471,8 +470,7 @@ func (image *Image) Mount(runtime *Runtime, root, rw string, id string) error {
 	}
 
 	utils.Debugf("Mounting container %s at %s for container", id, root)
-	err = devices.MountDevice(id, root)
-	if err != nil {
+	if err := devices.MountDevice(id, root); err != nil {
 		return err
 	}
 

+ 5 - 9
server.go

@@ -1307,7 +1307,7 @@ func NewServer(flGraphPath string, deviceSet DeviceSet, autoRestart, enableCors
 	if err != nil {
 		return nil, err
 	}
-	srv := &Server{
+	runtime.srv = &Server{
 		runtime:     runtime,
 		enableCors:  enableCors,
 		pullingPool: make(map[string]struct{}),
@@ -1316,18 +1316,14 @@ func NewServer(flGraphPath string, deviceSet DeviceSet, autoRestart, enableCors
 		listeners:   make(map[string]chan utils.JSONMessage),
 		reqFactory:  nil,
 	}
-	runtime.srv = srv
-	return srv, nil
+	return runtime.srv, nil
 }
 
 func (srv *Server) HTTPRequestFactory(metaHeaders map[string][]string) *utils.HTTPRequestFactory {
 	if srv.reqFactory == nil {
-		ud := utils.NewHTTPUserAgentDecorator(srv.versionInfos()...)
-		md := &utils.HTTPMetaHeadersDecorator{
-			Headers: metaHeaders,
-		}
-		factory := utils.NewHTTPRequestFactory(ud, md)
-		srv.reqFactory = factory
+		srv.reqFactory = utils.NewHTTPRequestFactory(
+			utils.NewHTTPUserAgentDecorator(srv.versionInfos()...),
+			&utils.HTTPMetaHeadersDecorator{Headers: metaHeaders})
 	}
 	return srv.reqFactory
 }

+ 9 - 1
utils/utils.go

@@ -59,7 +59,15 @@ func Debugf(format string, a ...interface{}) {
 			file = file[strings.LastIndex(file, "/")+1:]
 		}
 
-		fmt.Fprintf(os.Stderr, fmt.Sprintf("[debug] %s:%d %s\n", file, line, format), a...)
+		_, file2, line2, ok := runtime.Caller(2)
+		if !ok {
+			file2 = "<unknown>"
+			line2 = -1
+		} else {
+			file2 = file2[strings.LastIndex(file2, "/")+1:]
+		}
+
+		fmt.Fprintf(os.Stderr, fmt.Sprintf("[debug] %s:%d %s:%d %s\n", file, line, file2, line2, format), a...)
 	}
 }