try to raise ulimit if its too low
License: MIT Signed-off-by: Jeromy <jeromyj@gmail.com>
Jeromy committed
Mar 14, 2016 at 17:10 UTC
48ee44c46a0abbc42f40b2637fa75ceb6b090a40
2 files changed
+56
cmd/ipfs/daemon.go
+6
@@ -152,10 +152,16 @@ func defaultMux(path string) corehttp.ServeOption {
152
}
153
}
154
155
+var fileDescriptorCheck = func() error { return nil }
156
+
157
func daemonFunc(req cmds.Request, res cmds.Response) {
158
// let the user know we're going.
159
fmt.Printf("Initializing daemon...\n")
160
161
+ if err := fileDescriptorCheck(); err != nil {
162
+ log.Error("setting file descriptor limit: %s", err)
163
+ }
164
+
165
ctx := req.InvocContext()
166
167
go func() {
cmd/ipfs/ulimit_unix.go
new
+50
@@ -0,0 +1,50 @@
1
+// +build linux darwin
2
+
3
+package main
4
+
5
+import (
6
+ "fmt"
7
+ "os"
8
+ "strconv"
9
+ "syscall"
10
+)
11
+
12
+var ipfsFileDescNum = uint64(1024)
13
+
14
+func init() {
15
+ if val := os.Getenv("IPFS_FD_MAX"); val != "" {
16
+ n, err := strconv.Atoi(val)
17
+ if err != nil {
18
+ log.Error("bad value for IPFS_FD_MAX: %s", err)
19
+ } else {
20
+ ipfsFileDescNum = uint64(n)
21
+ }
22
+ }
23
+ fileDescriptorCheck = checkAndSetUlimit
24
+}
25
+
26
+func checkAndSetUlimit() error {
27
+ var rLimit syscall.Rlimit
28
+ err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &rLimit)
29
+ if err != nil {
30
+ return fmt.Errorf("error getting rlimit: %s", err)
31
+ }
32
+
33
+ if rLimit.Cur < ipfsFileDescNum {
34
+ if rLimit.Max > ipfsFileDescNum {
35
+ fmt.Printf("Adjusting current ulimit to %d.\n", rLimit.Max)
36
+ rLimit.Cur = rLimit.Max
37
+ } else {
38
+ fmt.Printf("Adjusting current and maximum ulimit to %d.\n", ipfsFileDescNum)
39
+ rLimit.Cur = ipfsFileDescNum
40
+ rLimit.Max = ipfsFileDescNum
41
+ }
42
+ }
43
+
44
+ err = syscall.Setrlimit(syscall.RLIMIT_NOFILE, &rLimit)
45
+ if err != nil {
46
+ return fmt.Errorf("error setting ulimit: %s", err)
47
+ }
48
+
49
+ return nil
50
+}