diff --git a/daemon/algod/server.go b/daemon/algod/server.go index 8fdacdfdd7..8a8bbde437 100644 --- a/daemon/algod/server.go +++ b/daemon/algod/server.go @@ -129,7 +129,11 @@ func (s *Server) Initialize(cfg config.Local, phonebookAddresses []string, genes return errors.New( "Initialize() overflowed when adding up ReservedFDs and RestConnectionsHardLimit; decrease them") } - err = util.SetFdSoftLimit(fdRequired) + if cfg.EnableP2P { + // TODO: Decide if this is too much, or not enough. + fdRequired = ot.Add(fdRequired, 512) + } + err = util.RaiseFdSoftLimit(fdRequired) if err != nil { return fmt.Errorf("Initialize() err: %w", err) } @@ -141,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) } @@ -190,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 e0fa929d41..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 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