From 554066a39b9bba8f6a96315fcb66049dd2582503 Mon Sep 17 00:00:00 2001 From: cce <51567+cce@users.noreply.github.com> Date: Wed, 2 Apr 2025 12:16:26 -0400 Subject: [PATCH 1/2] only set rlimit if needed, and add P2P fdRequired --- daemon/algod/server.go | 4 ++++ util/util.go | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/daemon/algod/server.go b/daemon/algod/server.go index 8fdacdfdd7..546b0d778e 100644 --- a/daemon/algod/server.go +++ b/daemon/algod/server.go @@ -129,6 +129,10 @@ func (s *Server) Initialize(cfg config.Local, phonebookAddresses []string, genes return errors.New( "Initialize() overflowed when adding up ReservedFDs and RestConnectionsHardLimit; decrease them") } + if cfg.EnableP2P { + // TODO: Decide if this is too much, or not enough. + fdRequired = ot.Add(fdRequired, 512) + } err = util.SetFdSoftLimit(fdRequired) if err != nil { return fmt.Errorf("Initialize() err: %w", err) diff --git a/util/util.go b/util/util.go index e0fa929d41..70be413621 100644 --- a/util/util.go +++ b/util/util.go @@ -43,6 +43,10 @@ func SetFdSoftLimit(newLimit uint64) error { if err != nil { return fmt.Errorf("SetFdSoftLimit() err: %w", err) } + if newLimit <= rLimit.Cur { + // Current limit is sufficient; no need to change it. + return nil + } rLimit.Cur = newLimit err = syscall.Setrlimit(syscall.RLIMIT_NOFILE, &rLimit) From 32597373689ce577ace81ef6b300563ec107e820 Mon Sep 17 00:00:00 2001 From: cce <51567+cce@users.noreply.github.com> Date: Thu, 3 Apr 2025 12:08:24 -0400 Subject: [PATCH 2/2] add RaiseFdSoftLimit --- daemon/algod/server.go | 6 +++--- util/util.go | 22 ++++++++++++++++++---- util/util_windows.go | 5 +++++ 3 files changed, 26 insertions(+), 7 deletions(-) diff --git a/daemon/algod/server.go b/daemon/algod/server.go index 546b0d778e..8a8bbde437 100644 --- a/daemon/algod/server.go +++ b/daemon/algod/server.go @@ -133,7 +133,7 @@ func (s *Server) Initialize(cfg config.Local, phonebookAddresses []string, genes // TODO: Decide if this is too much, or not enough. fdRequired = ot.Add(fdRequired, 512) } - err = util.SetFdSoftLimit(fdRequired) + err = util.RaiseFdSoftLimit(fdRequired) if err != nil { return fmt.Errorf("Initialize() err: %w", err) } @@ -145,7 +145,7 @@ func (s *Server) Initialize(cfg config.Local, phonebookAddresses []string, genes return errors.New( "Initialize() overflowed when adding up fdRequired and 1000 needed for pebbledb") } - err = util.SetFdSoftLimit(fdRequired) + err = util.RaiseFdSoftLimit(fdRequired) if err != nil { return fmt.Errorf("Initialize() failed to set FD limit for pebbledb backend, err: %w", err) } @@ -194,7 +194,7 @@ func (s *Server) Initialize(cfg config.Local, phonebookAddresses []string, genes } } } - fdErr = util.SetFdSoftLimit(maxFDs) + fdErr = util.RaiseFdSoftLimit(maxFDs) if fdErr != nil { // do not fail but log the error s.log.Errorf("Failed to set a new RLIMIT_NOFILE value to %d (max %d): %s", fdRequired, hard, fdErr.Error()) diff --git a/util/util.go b/util/util.go index 70be413621..74c8d2e219 100644 --- a/util/util.go +++ b/util/util.go @@ -36,6 +36,24 @@ func GetFdLimits() (soft uint64, hard uint64, err error) { return rLimit.Cur, rLimit.Max, nil } +// RaiseFdSoftLimit raises the file descriptors soft limit to the specified value, +// or leave it unchanged if the value is less than the current. +func RaiseFdSoftLimit(newLimit uint64) error { + soft, hard, err := GetFdLimits() + if err != nil { + return fmt.Errorf("RaiseFdSoftLimit() err: %w", err) + } + if newLimit <= soft { + // Current limit is sufficient; no need to change it. + return nil + } + if newLimit > hard { + // New limit exceeds the hard limit; set it to the hard limit. + newLimit = hard + } + return SetFdSoftLimit(newLimit) +} + // SetFdSoftLimit sets a new file descriptors soft limit. func SetFdSoftLimit(newLimit uint64) error { var rLimit syscall.Rlimit @@ -43,10 +61,6 @@ func SetFdSoftLimit(newLimit uint64) error { if err != nil { return fmt.Errorf("SetFdSoftLimit() err: %w", err) } - if newLimit <= rLimit.Cur { - // Current limit is sufficient; no need to change it. - return nil - } rLimit.Cur = newLimit err = syscall.Setrlimit(syscall.RLIMIT_NOFILE, &rLimit) diff --git a/util/util_windows.go b/util/util_windows.go index e1e1b7924b..392a5698e5 100644 --- a/util/util_windows.go +++ b/util/util_windows.go @@ -31,6 +31,11 @@ func GetFdLimits() (soft uint64, hard uint64, err error) { return math.MaxUint64, math.MaxUint64, nil // syscall.RLIM_INFINITY } +// RaiseFdSoftLimit raises the file descriptors soft limit. +func RaiseFdSoftLimit(_ uint64) error { + return nil +} + // SetFdSoftLimit sets a new file descriptors soft limit. func SetFdSoftLimit(_ uint64) error { return nil