mirror of
https://github.com/ipfs/kubo.git
synced 2025-06-29 01:12:24 +08:00
Merge pull request #2466 from ipfs/feat/fd-limit-check
try to raise ulimit if its too low
This commit is contained in:
@ -40,6 +40,7 @@ const (
|
|||||||
unrestrictedApiAccessKwd = "unrestricted-api"
|
unrestrictedApiAccessKwd = "unrestricted-api"
|
||||||
unencryptTransportKwd = "disable-transport-encryption"
|
unencryptTransportKwd = "disable-transport-encryption"
|
||||||
enableGCKwd = "enable-gc"
|
enableGCKwd = "enable-gc"
|
||||||
|
adjustFDLimitKwd = "manage-fdlimit"
|
||||||
// apiAddrKwd = "address-api"
|
// apiAddrKwd = "address-api"
|
||||||
// swarmAddrKwd = "address-swarm"
|
// swarmAddrKwd = "address-swarm"
|
||||||
)
|
)
|
||||||
@ -132,6 +133,7 @@ future version, along with this notice. Please move to setting the HTTP Headers.
|
|||||||
cmds.BoolOption(unrestrictedApiAccessKwd, "Allow API access to unlisted hashes"),
|
cmds.BoolOption(unrestrictedApiAccessKwd, "Allow API access to unlisted hashes"),
|
||||||
cmds.BoolOption(unencryptTransportKwd, "Disable transport encryption (for debugging protocols)"),
|
cmds.BoolOption(unencryptTransportKwd, "Disable transport encryption (for debugging protocols)"),
|
||||||
cmds.BoolOption(enableGCKwd, "Enable automatic periodic repo garbage collection"),
|
cmds.BoolOption(enableGCKwd, "Enable automatic periodic repo garbage collection"),
|
||||||
|
cmds.BoolOption(adjustFDLimitKwd, "Check and raise file descriptor limits if needed"),
|
||||||
|
|
||||||
// TODO: add way to override addresses. tricky part: updating the config if also --init.
|
// TODO: add way to override addresses. tricky part: updating the config if also --init.
|
||||||
// cmds.StringOption(apiAddrKwd, "Address for the daemon rpc API (overrides config)"),
|
// cmds.StringOption(apiAddrKwd, "Address for the daemon rpc API (overrides config)"),
|
||||||
@ -152,10 +154,19 @@ func defaultMux(path string) corehttp.ServeOption {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var fileDescriptorCheck = func() error { return nil }
|
||||||
|
|
||||||
func daemonFunc(req cmds.Request, res cmds.Response) {
|
func daemonFunc(req cmds.Request, res cmds.Response) {
|
||||||
// let the user know we're going.
|
// let the user know we're going.
|
||||||
fmt.Printf("Initializing daemon...\n")
|
fmt.Printf("Initializing daemon...\n")
|
||||||
|
|
||||||
|
managefd, _, _ := req.Option(adjustFDLimitKwd).Bool()
|
||||||
|
if managefd {
|
||||||
|
if err := fileDescriptorCheck(); err != nil {
|
||||||
|
log.Error("setting file descriptor limit: %s", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ctx := req.InvocContext()
|
ctx := req.InvocContext()
|
||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
|
47
cmd/ipfs/ulimit_unix.go
Normal file
47
cmd/ipfs/ulimit_unix.go
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
// +build linux darwin
|
||||||
|
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"strconv"
|
||||||
|
"syscall"
|
||||||
|
)
|
||||||
|
|
||||||
|
var ipfsFileDescNum = uint64(2048)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
if val := os.Getenv("IPFS_FD_MAX"); val != "" {
|
||||||
|
n, err := strconv.Atoi(val)
|
||||||
|
if err != nil {
|
||||||
|
log.Error("bad value for IPFS_FD_MAX: %s", err)
|
||||||
|
} else {
|
||||||
|
ipfsFileDescNum = uint64(n)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fileDescriptorCheck = checkAndSetUlimit
|
||||||
|
}
|
||||||
|
|
||||||
|
func checkAndSetUlimit() error {
|
||||||
|
var rLimit syscall.Rlimit
|
||||||
|
err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &rLimit)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("error getting rlimit: %s", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if rLimit.Cur < ipfsFileDescNum {
|
||||||
|
if rLimit.Max < ipfsFileDescNum {
|
||||||
|
rLimit.Max = ipfsFileDescNum
|
||||||
|
}
|
||||||
|
fmt.Printf("Adjusting current ulimit to %d.\n", ipfsFileDescNum)
|
||||||
|
rLimit.Cur = ipfsFileDescNum
|
||||||
|
}
|
||||||
|
|
||||||
|
err = syscall.Setrlimit(syscall.RLIMIT_NOFILE, &rLimit)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("error setting ulimit: %s", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
@ -13,9 +13,6 @@ test_init_ipfs
|
|||||||
|
|
||||||
test_launch_ipfs_daemon --unrestricted-api --disable-transport-encryption
|
test_launch_ipfs_daemon --unrestricted-api --disable-transport-encryption
|
||||||
|
|
||||||
test_expect_success "convert addresses from multiaddrs" '
|
|
||||||
'
|
|
||||||
|
|
||||||
gwyaddr=$GWAY_ADDR
|
gwyaddr=$GWAY_ADDR
|
||||||
apiaddr=$API_ADDR
|
apiaddr=$API_ADDR
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user