Make minio server compile on OpenBSD, NetBSD, Solaris (#3719)

This commit is contained in:
Krishnan Parthasarathi
2017-02-09 11:57:35 +05:30
committed by Harshavardhana
parent 0c7694894b
commit e5773e11c6
24 changed files with 545 additions and 141 deletions

View File

@@ -51,6 +51,8 @@ const (
globalMinioDefaultOwnerID = "minio"
globalMinioDefaultStorageClass = "STANDARD"
globalWindowsOSName = "windows"
globalNetBSDOSName = "netbsd"
globalSolarisOSName = "solaris"
// Add new global values here.
)

View File

@@ -1,4 +1,4 @@
// +build linux darwin dragonfly freebsd netbsd openbsd
// +build linux darwin freebsd netbsd openbsd
/*
* Minio Cloud Storage, (C) 2016 Minio, Inc.

View File

@@ -1,4 +1,4 @@
// +build !linux,!darwin,!openbsd,!freebsd,!netbsd,!dragonfly
// +build !linux,!darwin,!openbsd,!freebsd,!netbsd
/*
* Minio Cloud Storage, (C) 2016 Minio, Inc.

View File

@@ -1,7 +1,7 @@
// +build linux darwin dragonfly freebsd netbsd openbsd
// +build linux darwin dragonfly freebsd netbsd openbsd solaris
/*
* Minio Cloud Storage, (C) 2016 Minio, Inc.
* Minio Cloud Storage, (C) 2016, 2017 Minio, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.

View File

@@ -153,11 +153,20 @@ func getDiskInfo(diskPath string) (di disk.Info, err error) {
return di, err
}
// List of operating systems where we ignore disk space
// verification.
var ignoreDiskFreeOS = []string{
globalWindowsOSName,
globalNetBSDOSName,
globalSolarisOSName,
}
// checkDiskFree verifies if disk path has sufficient minimum free disk space and files.
func (s *posix) checkDiskFree() (err error) {
// We don't validate disk space or inode utilization on windows.
// Each windows calls to 'GetVolumeInformationW' takes around 3-5seconds.
if runtime.GOOS == globalWindowsOSName {
// And StatFS is not supported by Go for solaris and netbsd.
if contains(ignoreDiskFreeOS, runtime.GOOS) {
return nil
}

View File

@@ -1,4 +1,4 @@
// +build !windows,!plan9
// +build !windows,!plan9,!openbsd
/*
* Minio Cloud Storage, (C) 2016 Minio, Inc.

View File

@@ -0,0 +1,83 @@
// +build openbsd
/*
* Minio Cloud Storage, (C) 2017 Minio, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cmd
import (
"syscall"
"github.com/minio/minio/pkg/sys"
)
// For all unixes we need to bump allowed number of open files to a
// higher value than its usual default of '1024'. The reasoning is
// that this value is too small for a server.
func setMaxOpenFiles() error {
var rLimit syscall.Rlimit
err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &rLimit)
if err != nil {
return err
}
// Set the current limit to Max, it is usually around 4096.
// TO increase this limit further user has to manually edit
// `/etc/security/limits.conf`
rLimit.Cur = rLimit.Max
return syscall.Setrlimit(syscall.RLIMIT_NOFILE, &rLimit)
}
// Set max memory used by minio as a process, this value is usually
// set to 'unlimited' but we need to validate additionally to verify
// if any hard limit is set by the user, in such a scenario would need
// to reset the global max cache size to be 80% of the hardlimit set
// by the user. This is done to honor the system limits and not crash.
func setMaxMemory() error {
var rLimit syscall.Rlimit
err := syscall.Getrlimit(syscall.RLIMIT_DATA, &rLimit)
if err != nil {
return err
}
// Set the current limit to Max, it is default 'unlimited'.
// TO decrease this limit further user has to manually edit
// `/etc/security/limits.conf`
rLimit.Cur = rLimit.Max
err = syscall.Setrlimit(syscall.RLIMIT_DATA, &rLimit)
if err != nil {
return err
}
err = syscall.Getrlimit(syscall.RLIMIT_DATA, &rLimit)
if err != nil {
return err
}
// Validate if rlimit memory is set to lower
// than max cache size. Then we should use such value.
if uint64(rLimit.Cur) < globalMaxCacheSize {
globalMaxCacheSize = uint64(float64(50*rLimit.Cur) / 100)
}
// Make sure globalMaxCacheSize is less than RAM size.
stats, err := sys.GetStats()
if err != nil && err != sys.ErrNotImplemented {
return err
}
// If TotalRAM is >= minRAMSize we proceed to enable cache.
// cache is always 50% of the totalRAM.
if err == nil && stats.TotalRAM >= minRAMSize {
globalMaxCacheSize = uint64(float64(50*stats.TotalRAM) / 100)
}
return nil
}