@@ -28,6 +28,7 @@ import (
2828 "context"
2929 "fmt"
3030 "net"
31+ "syscall"
3132
3233 "github.com/AliceO2Group/Control/common/logger/infologger"
3334 "github.com/AliceO2Group/Control/core/the"
@@ -41,6 +42,9 @@ import (
4142
4243var log = logger .New (logrus .StandardLogger (),"core" )
4344
45+ const fileLimitWant = 65536
46+ const fileLimitMin = 8192
47+
4448// Run is the entry point for this scheduler.
4549// TODO: refactor Config to reflect our specific requirements
4650func Run () error {
@@ -71,6 +75,12 @@ func Run() error {
7175 // Set up channel to receive Unix Signals.
7276 signals (state )
7377
78+ // Raise soft file limit
79+ err = setLimits ()
80+ if err != nil {
81+ return err
82+ }
83+
7484 // Start the Repo Manager instance
7585 log .WithField ("level" , infologger .IL_Support ).Infof ("Starting the Control Workflows repo manager" )
7686 _ = the .RepoManager ()
@@ -99,4 +109,37 @@ func Run() error {
99109 return err
100110}
101111
112+ func setLimits () error {
113+ var rLimit syscall.Rlimit
114+
115+ err := syscall .Getrlimit (syscall .RLIMIT_NOFILE , & rLimit )
116+ if err != nil {
117+ return err
118+ }
119+ if rLimit .Cur > fileLimitWant {
120+ return nil
121+ }
122+ if rLimit .Max < fileLimitMin {
123+ err = fmt .Errorf ("need at least %v file descriptors" ,
124+ fileLimitMin )
125+ return err
126+ }
127+ if rLimit .Max < fileLimitWant {
128+ rLimit .Cur = rLimit .Max
129+ } else {
130+ rLimit .Cur = fileLimitWant
131+ }
132+ err = syscall .Setrlimit (syscall .RLIMIT_NOFILE , & rLimit )
133+ if err != nil {
134+ // try min value
135+ rLimit .Cur = fileLimitMin
136+ err = syscall .Setrlimit (syscall .RLIMIT_NOFILE , & rLimit )
137+ if err != nil {
138+ return err
139+ }
140+ }
141+
142+ return nil
143+ }
144+
102145// end Run
0 commit comments