diff --git a/.travis.yml b/.travis.yml index 00d65bd2c..80b6b1d85 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,6 +9,7 @@ go: - 1.7.4 install: + - sudo sysctl -w vm.max_map_count=262144 - go get -u github.com/golang/lint/golint - sudo apt-get update - sudo apt-get install docker-engine diff --git a/cmd/amp/platform_infrastructure.go b/cmd/amp/platform_infrastructure.go index 4f8e42380..e26e6f463 100644 --- a/cmd/amp/platform_infrastructure.go +++ b/cmd/amp/platform_infrastructure.go @@ -4,6 +4,14 @@ import ( "github.com/appcelerator/amp/config" "github.com/docker/docker/api/types/mount" "github.com/docker/docker/api/types/swarm" + + "bytes" + "errors" + "os" + "os/exec" + "os/user" + "strconv" + "strings" ) const ( @@ -675,3 +683,53 @@ func getAMPInfrastructureStack(m *ampManager) *ampStack { //return stack return &stack } + +// system prerequisites +func systemPrerequisites(m *ampManager) (err error) { + sysctl := false + // checks if GOOS is set + goos := os.Getenv("GOOS") + if goos == "linux" { + sysctl = true + } else if goos == "" { + // check if sysctl exists on the system + if _, err := os.Stat("/etc/sysctl.conf"); err == nil { + sysctl = true + } + } + if sysctl { + var out bytes.Buffer + var stderr bytes.Buffer + mmcmin := 262144 + cmd := exec.Command("sysctl", "-n", "vm.max_map_count") + cmd.Stdout = &out + cmd.Stderr = &stderr + err = cmd.Run() + mmc, err := strconv.Atoi(strings.TrimRight(out.String(), "\n")) + if err != nil { + return err + } + if mmc < mmcmin { + // admin rights are needed + u, err := user.Current() + if err != nil { + return err + } + uid, err := strconv.Atoi(u.Uid) + if err != nil { + return err + } + if uid != 0 { + return errors.New("vm.max_map_count should be at least 262144, admin rights are needed to update it") + } + if m.verbose { + m.printf(colRegular, "setting max virtual memory areas\n") + } + cmd = exec.Command("sysctl", "-w", "vm.max_map_count=262144") + err = cmd.Run() + } else if m.verbose { + m.printf(colRegular, "max virtual memory areas is already at a safe value\n") + } + } + return +} diff --git a/cmd/amp/platform_start.go b/cmd/amp/platform_start.go index dca86b7f7..cc271d676 100644 --- a/cmd/amp/platform_start.go +++ b/cmd/amp/platform_start.go @@ -57,6 +57,10 @@ func startAMP(cmd *cobra.Command, args []string) error { manager.printf(colWarn, "Mode force: start anyway\n") } } + if err := systemPrerequisites(manager); err != nil { + manager.printf(colError, "Prerequisite error: %v\n", err) + os.Exit(1) + } if err := manager.start(stack); err != nil { manager.printf(colError, "Start error: %v\n", err) if err := manager.stop(stack); err != nil {