Skip to content

Commit 37fd4dc

Browse files
gzliudanwanwiset25
authored andcommitted
common/fdlimit: fix macos file descriptors for Go 1.12 (ethereum#19166)
1 parent 075781f commit 37fd4dc

File tree

3 files changed

+74
-2
lines changed

3 files changed

+74
-2
lines changed

common/fdlimit/fdlimit_darwin.go

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
// Copyright 2019 The go-ethereum Authors
2+
// This file is part of the go-ethereum library.
3+
//
4+
// The go-ethereum library is free software: you can redistribute it and/or modify
5+
// it under the terms of the GNU Lesser General Public License as published by
6+
// the Free Software Foundation, either version 3 of the License, or
7+
// (at your option) any later version.
8+
//
9+
// The go-ethereum library is distributed in the hope that it will be useful,
10+
// but WITHOUT ANY WARRANTY; without even the implied warranty of
11+
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12+
// GNU Lesser General Public License for more details.
13+
//
14+
// You should have received a copy of the GNU Lesser General Public License
15+
// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
16+
17+
package fdlimit
18+
19+
import "syscall"
20+
21+
// hardlimit is the number of file descriptors allowed at max by the kernel.
22+
const hardlimit = 10240
23+
24+
// Raise tries to maximize the file descriptor allowance of this process
25+
// to the maximum hard-limit allowed by the OS.
26+
// Returns the size it was set to (may differ from the desired 'max')
27+
func Raise(max uint64) (uint64, error) {
28+
// Get the current limit
29+
var limit syscall.Rlimit
30+
if err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &limit); err != nil {
31+
return 0, err
32+
}
33+
// Try to update the limit to the max allowance
34+
limit.Cur = limit.Max
35+
if limit.Cur > max {
36+
limit.Cur = max
37+
}
38+
if err := syscall.Setrlimit(syscall.RLIMIT_NOFILE, &limit); err != nil {
39+
return 0, err
40+
}
41+
// MacOS can silently apply further caps, so retrieve the actually set limit
42+
if err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &limit); err != nil {
43+
return 0, err
44+
}
45+
return limit.Cur, nil
46+
}
47+
48+
// Current retrieves the number of file descriptors allowed to be opened by this
49+
// process.
50+
func Current() (int, error) {
51+
var limit syscall.Rlimit
52+
if err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &limit); err != nil {
53+
return 0, err
54+
}
55+
return int(limit.Cur), nil
56+
}
57+
58+
// Maximum retrieves the maximum number of file descriptors this process is
59+
// allowed to request for itself.
60+
func Maximum() (int, error) {
61+
// Retrieve the maximum allowed by dynamic OS limits
62+
var limit syscall.Rlimit
63+
if err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &limit); err != nil {
64+
return 0, err
65+
}
66+
// Cap it to OPEN_MAX (10240) because macos is a special snowflake
67+
if limit.Max > hardlimit {
68+
limit.Max = hardlimit
69+
}
70+
return int(limit.Max), nil
71+
}

common/fdlimit/fdlimit_unix.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@
1414
// You should have received a copy of the GNU Lesser General Public License
1515
// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
1616

17-
//go:build linux || darwin || netbsd || openbsd || solaris
18-
// +build linux darwin netbsd openbsd solaris
17+
//go:build linux || netbsd || openbsd || solaris
18+
// +build linux netbsd openbsd solaris
1919

2020
package fdlimit
2121

common/fdlimit/fdlimit_windows.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ package fdlimit
1818

1919
import "fmt"
2020

21+
// hardlimit is the number of file descriptors allowed at max by the kernel.
2122
const hardlimit = 16384
2223

2324
// Raise tries to maximize the file descriptor allowance of this process

0 commit comments

Comments
 (0)