From 4aad14510ae958e8d802dbd00b9268b36868ad8a Mon Sep 17 00:00:00 2001 From: lash Date: Fri, 15 Dec 2017 16:30:16 +0100 Subject: [PATCH 1/4] cmd/utils: Add check on hard limit, skip test if below target --- cmd/utils/fdlimit_test.go | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/cmd/utils/fdlimit_test.go b/cmd/utils/fdlimit_test.go index 0a950a6c9dc2..f1bc33bc0caa 100644 --- a/cmd/utils/fdlimit_test.go +++ b/cmd/utils/fdlimit_test.go @@ -16,12 +16,23 @@ package utils -import "testing" +import ( + "fmt" + "syscall" + "testing" +) // TestFileDescriptorLimits simply tests whether the file descriptor allowance // per this process can be retrieved. func TestFileDescriptorLimits(t *testing.T) { target := 4096 + var limit syscall.Rlimit + if err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &limit); err != nil { + t.Fatal(err) + } + if int(limit.Max) < target { + t.Skip(fmt.Sprintf("system limit is less than desired test target: %d < %d", limit.Max, target)) + } if limit, err := getFdLimit(); err != nil || limit <= 0 { t.Fatalf("failed to retrieve file descriptor limit (%d): %v", limit, err) From 500b44cbdb2192f42a641567752b3008806ab746 Mon Sep 17 00:00:00 2001 From: lash Date: Mon, 18 Dec 2017 18:24:15 +0100 Subject: [PATCH 2/4] cmd/utils: Cross platform compatible fd limit test --- cmd/utils/fdlimit_freebsd.go | 8 ++++++++ cmd/utils/fdlimit_test.go | 5 +++-- cmd/utils/fdlimit_unix.go | 8 ++++++++ cmd/utils/fdlimit_windows.go | 4 ++++ 4 files changed, 23 insertions(+), 2 deletions(-) diff --git a/cmd/utils/fdlimit_freebsd.go b/cmd/utils/fdlimit_freebsd.go index 4cb5013c84cd..b088bb28775e 100644 --- a/cmd/utils/fdlimit_freebsd.go +++ b/cmd/utils/fdlimit_freebsd.go @@ -52,3 +52,11 @@ func getFdLimit() (int, error) { } return int(limit.Cur), nil } + +func getFdMaxLimit() (int, error) { + var limit syscall.Rlimit + if err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &limit); err != nil { + return 0, err + } + return int(limit.Max), nil +} diff --git a/cmd/utils/fdlimit_test.go b/cmd/utils/fdlimit_test.go index f1bc33bc0caa..d0b372f843c9 100644 --- a/cmd/utils/fdlimit_test.go +++ b/cmd/utils/fdlimit_test.go @@ -27,10 +27,11 @@ import ( func TestFileDescriptorLimits(t *testing.T) { target := 4096 var limit syscall.Rlimit - if err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &limit); err != nil { + hardlimit, err := getFdMaxLimit() + if err != nil { t.Fatal(err) } - if int(limit.Max) < target { + if hardlimit < target { t.Skip(fmt.Sprintf("system limit is less than desired test target: %d < %d", limit.Max, target)) } diff --git a/cmd/utils/fdlimit_unix.go b/cmd/utils/fdlimit_unix.go index 08e153bbd499..d3142853dcae 100644 --- a/cmd/utils/fdlimit_unix.go +++ b/cmd/utils/fdlimit_unix.go @@ -48,3 +48,11 @@ func getFdLimit() (int, error) { } return int(limit.Cur), nil } + +func getFdMaxLimit() (int, error) { + var limit syscall.Rlimit + if err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &limit); err != nil { + return 0, err + } + return int(limit.Max), nil +} diff --git a/cmd/utils/fdlimit_windows.go b/cmd/utils/fdlimit_windows.go index 53aad3d7a55d..71690a266eec 100644 --- a/cmd/utils/fdlimit_windows.go +++ b/cmd/utils/fdlimit_windows.go @@ -39,3 +39,7 @@ func getFdLimit() (int, error) { // Please see raiseFdLimit for the reason why we use hard coded 16K as the limit return 16384, nil } + +func getFdMaxLimit() (int, error) { + return getFdLimit() +} From 067c11c7ff6a4c0b3d4e5a54b33eba4c3a219372 Mon Sep 17 00:00:00 2001 From: lash Date: Tue, 19 Dec 2017 18:10:28 +0100 Subject: [PATCH 3/4] cmd/utils: Remove syscall.Rlimit in test --- cmd/utils/fdlimit_test.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/cmd/utils/fdlimit_test.go b/cmd/utils/fdlimit_test.go index d0b372f843c9..48489cf4c71f 100644 --- a/cmd/utils/fdlimit_test.go +++ b/cmd/utils/fdlimit_test.go @@ -18,7 +18,6 @@ package utils import ( "fmt" - "syscall" "testing" ) @@ -26,13 +25,12 @@ import ( // per this process can be retrieved. func TestFileDescriptorLimits(t *testing.T) { target := 4096 - var limit syscall.Rlimit hardlimit, err := getFdMaxLimit() if err != nil { t.Fatal(err) } if hardlimit < target { - t.Skip(fmt.Sprintf("system limit is less than desired test target: %d < %d", limit.Max, target)) + t.Skip(fmt.Sprintf("system limit is less than desired test target: %d < %d", hardlimit, target)) } if limit, err := getFdLimit(); err != nil || limit <= 0 { From 49f402876f33ba7fa931da4929243b3a660d53df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Thu, 21 Dec 2017 14:21:43 +0200 Subject: [PATCH 4/4] cmd/utils: comment fd utility method --- cmd/utils/fdlimit_freebsd.go | 2 ++ cmd/utils/fdlimit_unix.go | 2 ++ cmd/utils/fdlimit_windows.go | 2 ++ 3 files changed, 6 insertions(+) diff --git a/cmd/utils/fdlimit_freebsd.go b/cmd/utils/fdlimit_freebsd.go index b088bb28775e..f9ed8937ee9d 100644 --- a/cmd/utils/fdlimit_freebsd.go +++ b/cmd/utils/fdlimit_freebsd.go @@ -53,6 +53,8 @@ func getFdLimit() (int, error) { return int(limit.Cur), nil } +// getFdMaxLimit retrieves the maximum number of file descriptors this process is +// allowed to request for itself. func getFdMaxLimit() (int, error) { var limit syscall.Rlimit if err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &limit); err != nil { diff --git a/cmd/utils/fdlimit_unix.go b/cmd/utils/fdlimit_unix.go index d3142853dcae..c08d1fab08cf 100644 --- a/cmd/utils/fdlimit_unix.go +++ b/cmd/utils/fdlimit_unix.go @@ -49,6 +49,8 @@ func getFdLimit() (int, error) { return int(limit.Cur), nil } +// getFdMaxLimit retrieves the maximum number of file descriptors this process is +// allowed to request for itself. func getFdMaxLimit() (int, error) { var limit syscall.Rlimit if err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &limit); err != nil { diff --git a/cmd/utils/fdlimit_windows.go b/cmd/utils/fdlimit_windows.go index 71690a266eec..f239683d2adb 100644 --- a/cmd/utils/fdlimit_windows.go +++ b/cmd/utils/fdlimit_windows.go @@ -40,6 +40,8 @@ func getFdLimit() (int, error) { return 16384, nil } +// getFdMaxLimit retrieves the maximum number of file descriptors this process is +// allowed to request for itself. func getFdMaxLimit() (int, error) { return getFdLimit() }