From 3514e47edc2d3cdaae2d92a78cc5c618d9549f13 Mon Sep 17 00:00:00 2001 From: "Guillaume J. Charmes" Date: Mon, 22 Apr 2013 11:26:34 -0700 Subject: [PATCH 1/4] Do not prevent docker from running when kernel detection fails --- runtime.go | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/runtime.go b/runtime.go index b894a2cdaf..1dfc22d632 100644 --- a/runtime.go +++ b/runtime.go @@ -295,14 +295,13 @@ func NewRuntime() (*Runtime, error) { return nil, err } - k, err := GetKernelVersion() - if err != nil { - return nil, err - } - runtime.kernelVersion = k - - if CompareKernelVersion(k, &KernelVersionInfo{Kernel: 3, Major: 8, Minor: 0}) < 0 { - log.Printf("WARNING: You are running linux kernel version %s, which might be unstable running docker. Please upgrade your kernel to 3.8.0.", k.String()) + if k, err := GetKernelVersion(); err != nil { + log.Printf("WARNING: %s\n", err) + } else { + runtime.kernelVersion = k + if CompareKernelVersion(k, &KernelVersionInfo{Kernel: 3, Major: 8, Minor: 0}) < 0 { + log.Printf("WARNING: You are running linux kernel version %s, which might be unstable running docker. Please upgrade your kernel to 3.8.0.", k.String()) + } } if cgroupMemoryMountpoint, err := FindCgroupMountpoint("memory"); err != nil { From 4ac3b803b9b7d0db1840a12f3332034938eb9550 Mon Sep 17 00:00:00 2001 From: "Guillaume J. Charmes" Date: Mon, 22 Apr 2013 11:39:56 -0700 Subject: [PATCH 2/4] Make the kernel version detection more generic --- utils.go | 43 ++++++++++++++++++++++++++----------------- 1 file changed, 26 insertions(+), 17 deletions(-) diff --git a/utils.go b/utils.go index a039ca6eb6..8f9e84f2b8 100644 --- a/utils.go +++ b/utils.go @@ -407,7 +407,12 @@ type KernelVersionInfo struct { // FIXME: this doens't build on Darwin func GetKernelVersion() (*KernelVersionInfo, error) { - var uts syscall.Utsname + var ( + uts syscall.Utsname + flavor string + kernel, major, minor int + err error + ) if err := syscall.Uname(&uts); err != nil { return nil, err @@ -422,31 +427,35 @@ func GetKernelVersion() (*KernelVersionInfo, error) { } tmp := strings.SplitN(string(release), "-", 2) - if len(tmp) != 2 { - return nil, fmt.Errorf("Unrecognized kernel version") - } tmp2 := strings.SplitN(tmp[0], ".", 3) - if len(tmp2) != 3 { - return nil, fmt.Errorf("Unrecognized kernel version") + + if len(tmp2) > 0 { + kernel, err = strconv.Atoi(tmp2[0]) + if err != nil { + return nil, err + } } - kernel, err := strconv.Atoi(tmp2[0]) - if err != nil { - return nil, err + if len(tmp2) > 1 { + major, err = strconv.Atoi(tmp2[1]) + if err != nil { + return nil, err + } } - major, err := strconv.Atoi(tmp2[1]) - if err != nil { - return nil, err + if len(tmp2) > 2 { + minor, err = strconv.Atoi(tmp2[2]) + if err != nil { + return nil, err + } } - minor, err := strconv.Atoi(tmp2[2]) - if err != nil { - return nil, err + if len(tmp) == 2 { + flavor = tmp[1] + } else { + flavor = "" } - flavor := tmp[1] - return &KernelVersionInfo{ Kernel: kernel, Major: major, From 16aeb77d5155cf33d1637073b9ca56728d472b49 Mon Sep 17 00:00:00 2001 From: "Guillaume J. Charmes" Date: Mon, 22 Apr 2013 12:08:59 -0700 Subject: [PATCH 3/4] Move the kernel detection to arch specific files --- getKernelVersion_darwin.go | 5 +++ getKernelVersion_linux.go | 65 ++++++++++++++++++++++++++++++++++++++ utils.go | 58 +--------------------------------- 3 files changed, 71 insertions(+), 57 deletions(-) create mode 100644 getKernelVersion_darwin.go create mode 100644 getKernelVersion_linux.go diff --git a/getKernelVersion_darwin.go b/getKernelVersion_darwin.go new file mode 100644 index 0000000000..36a959b8d6 --- /dev/null +++ b/getKernelVersion_darwin.go @@ -0,0 +1,5 @@ +package docker + +func getKernelVersion() (*KernelVersionInfo, error) { + return nil, fmt.Errorf("Kernel version detection is not available on darwin") +} diff --git a/getKernelVersion_linux.go b/getKernelVersion_linux.go new file mode 100644 index 0000000000..bbf5a4fad1 --- /dev/null +++ b/getKernelVersion_linux.go @@ -0,0 +1,65 @@ +package docker + +import ( + "strconv" + "strings" + "syscall" +) + +func getKernelVersion() (*KernelVersionInfo, error) { + var ( + uts syscall.Utsname + flavor string + kernel, major, minor int + err error + ) + + if err := syscall.Uname(&uts); err != nil { + return nil, err + } + + release := make([]byte, len(uts.Release)) + + i := 0 + for _, c := range uts.Release { + release[i] = byte(c) + i++ + } + + tmp := strings.SplitN(string(release), "-", 2) + tmp2 := strings.SplitN(tmp[0], ".", 3) + + if len(tmp2) > 0 { + kernel, err = strconv.Atoi(tmp2[0]) + if err != nil { + return nil, err + } + } + + if len(tmp2) > 1 { + major, err = strconv.Atoi(tmp2[1]) + if err != nil { + return nil, err + } + } + + if len(tmp2) > 2 { + minor, err = strconv.Atoi(tmp2[2]) + if err != nil { + return nil, err + } + } + + if len(tmp) == 2 { + flavor = tmp[1] + } else { + flavor = "" + } + + return &KernelVersionInfo{ + Kernel: kernel, + Major: major, + Minor: minor, + Flavor: flavor, + }, nil +} diff --git a/utils.go b/utils.go index 8f9e84f2b8..5974b7df3b 100644 --- a/utils.go +++ b/utils.go @@ -14,10 +14,8 @@ import ( "path/filepath" "regexp" "runtime" - "strconv" "strings" "sync" - "syscall" "time" ) @@ -407,61 +405,7 @@ type KernelVersionInfo struct { // FIXME: this doens't build on Darwin func GetKernelVersion() (*KernelVersionInfo, error) { - var ( - uts syscall.Utsname - flavor string - kernel, major, minor int - err error - ) - - if err := syscall.Uname(&uts); err != nil { - return nil, err - } - - release := make([]byte, len(uts.Release)) - - i := 0 - for _, c := range uts.Release { - release[i] = byte(c) - i++ - } - - tmp := strings.SplitN(string(release), "-", 2) - tmp2 := strings.SplitN(tmp[0], ".", 3) - - if len(tmp2) > 0 { - kernel, err = strconv.Atoi(tmp2[0]) - if err != nil { - return nil, err - } - } - - if len(tmp2) > 1 { - major, err = strconv.Atoi(tmp2[1]) - if err != nil { - return nil, err - } - } - - if len(tmp2) > 2 { - minor, err = strconv.Atoi(tmp2[2]) - if err != nil { - return nil, err - } - } - - if len(tmp) == 2 { - flavor = tmp[1] - } else { - flavor = "" - } - - return &KernelVersionInfo{ - Kernel: kernel, - Major: major, - Minor: minor, - Flavor: flavor, - }, nil + return getKernelVersion() } func (k *KernelVersionInfo) String() string { From c05c91ca3bb69d2c9faa0a2b15bc23b7c2a7bd8a Mon Sep 17 00:00:00 2001 From: "Guillaume J. Charmes" Date: Mon, 22 Apr 2013 13:19:50 -0700 Subject: [PATCH 4/4] Make kernel detection work without suffix --- getKernelVersion_darwin.go | 4 ++++ getKernelVersion_linux.go | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/getKernelVersion_darwin.go b/getKernelVersion_darwin.go index 36a959b8d6..be3b733b68 100644 --- a/getKernelVersion_darwin.go +++ b/getKernelVersion_darwin.go @@ -1,5 +1,9 @@ package docker +import ( + "fmt" +) + func getKernelVersion() (*KernelVersionInfo, error) { return nil, fmt.Errorf("Kernel version detection is not available on darwin") } diff --git a/getKernelVersion_linux.go b/getKernelVersion_linux.go index bbf5a4fad1..04bb1edcb8 100644 --- a/getKernelVersion_linux.go +++ b/getKernelVersion_linux.go @@ -1,6 +1,7 @@ package docker import ( + "bytes" "strconv" "strings" "syscall" @@ -26,6 +27,9 @@ func getKernelVersion() (*KernelVersionInfo, error) { i++ } + // Remove the \x00 from the release for Atoi to parse correctly + release = release[:bytes.IndexByte(release, 0)] + tmp := strings.SplitN(string(release), "-", 2) tmp2 := strings.SplitN(tmp[0], ".", 3)