diff --git a/go.mod b/go.mod index 4668415..958399f 100644 --- a/go.mod +++ b/go.mod @@ -32,7 +32,6 @@ require ( github.com/google/uuid v1.3.0 github.com/hashicorp/go-multierror v1.1.0 github.com/jaytaylor/html2text v0.0.0-20200412013138-3577fbdbcff7 - github.com/kr/text v0.2.0 // indirect github.com/mattn/go-isatty v0.0.14 github.com/mattn/go-runewidth v0.0.9 // indirect github.com/miekg/dns v1.1.41 @@ -48,9 +47,6 @@ require ( golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4 golang.org/x/sys v0.0.0-20220111092808-5a964db01320 // indirect golang.org/x/text v0.3.7 - gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect - gopkg.in/yaml.v2 v2.2.8 // indirect - gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 // indirect ) replace ( diff --git a/go.sum b/go.sum index 339422b..1725314 100644 --- a/go.sum +++ b/go.sum @@ -24,7 +24,6 @@ github.com/andybalholm/cascadia v1.1.0 h1:BuuO6sSfQNFRu1LppgbD25Hr2vLYW25JvxHs5z github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y= github.com/antlr/antlr4 v0.0.0-20201029161626-9a95f0cc3d7c h1:j/C2kxPfyE0d87/ggAjIsCV5Cdkqmjb+O0W8W+1J+IY= github.com/antlr/antlr4 v0.0.0-20201029161626-9a95f0cc3d7c/go.mod h1:T7PbCXFs94rrTttyxjbyT5+/1V8T2TYDejxUfHJjw1Y= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/cronokirby/saferith v0.31.0 h1:TIlhldetKLeGAb19bZvWiuwQEzfzwSPthDEyJ9Ah8xs= github.com/cronokirby/saferith v0.31.0/go.mod h1:QKJhjoqUtBsXCAVEjw38mFqoi7DebT7kthcD7UzbnoA= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -64,12 +63,6 @@ github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+ github.com/jaytaylor/html2text v0.0.0-20200412013138-3577fbdbcff7 h1:g0fAGBisHaEQ0TRq1iBvemFRf+8AEWEmBESSiWB3Vsc= github.com/jaytaylor/html2text v0.0.0-20200412013138-3577fbdbcff7/go.mod h1:CVKlgaMiht+LXvHG173ujK6JUhZXKb2u/BQtjPDIvyk= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= @@ -163,12 +156,9 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 h1:tQIYjPdBoyREyB9XMu+nnTclpTYkz2zFM+lzLJFO4gQ= -gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/pkg/smtp/user.go b/pkg/smtp/user.go index abefee7..4699085 100644 --- a/pkg/smtp/user.go +++ b/pkg/smtp/user.go @@ -321,16 +321,16 @@ func (su *smtpUser) Send(returnPath string, to []string, messageReader io.Reader startTime := time.Now() for isSending && time.Since(startTime) < 90*time.Second { - log.Debug("Message is still in send queue, waiting for a bit") + log.Warn("Message is still in send queue, waiting for a bit") time.Sleep(15 * time.Second) isSending, wasSent = su.backend.sendRecorder.isSendingOrSent(su.client(), sendRecorderMessageHash) } if isSending { - log.Debug("Message is still in send queue, returning error to prevent client from adding it to the sent folder prematurely") + log.Warn("Message is still in send queue, returning error to prevent client from adding it to the sent folder prematurely") return errors.New("original message is still being sent") } if wasSent { - log.Debug("Message was already sent") + log.Warn("Message was already sent") return nil } diff --git a/pkg/store/ulimit.go b/pkg/store/ulimit.go index 3765773..cbe3461 100644 --- a/pkg/store/ulimit.go +++ b/pkg/store/ulimit.go @@ -15,33 +15,36 @@ // You should have received a copy of the GNU General Public License // along with Proton Mail Bridge. If not, see . +//go:build !windows +// +build !windows + package store import ( - "fmt" - "os" - "os/exec" "runtime" - "strconv" - "strings" + "syscall" ) -func uLimit() int { - if runtime.GOOS != "darwin" && runtime.GOOS != "linux" { - return 0 - } - out, err := exec.Command("bash", "-c", "ulimit -n").Output() +func getCurrentFDLimit() (int, error) { + var limits syscall.Rlimit + err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &limits) if err != nil { - log.Print(err) - return 0 + return 0, err } - outStr := strings.Trim(string(out), " \n") - num, err := strconv.Atoi(outStr) - if err != nil { - log.Print(err) - return 0 + return int(limits.Cur), nil +} + +func countOpenedFDs(limit int) int { + openedFDs := 0 + + for i := 0; i < limit; i++ { + _, _, err := syscall.Syscall(syscall.SYS_FCNTL, uintptr(i), uintptr(syscall.F_GETFL), 0) + if err == 0 { + openedFDs++ + } } - return num + + return openedFDs } func isFdCloseToULimit() bool { @@ -49,16 +52,18 @@ func isFdCloseToULimit() bool { return false } - pid := fmt.Sprint(os.Getpid()) - out, err := exec.Command("lsof", "-p", pid).Output() //nolint:gosec + limit, err := getCurrentFDLimit() if err != nil { - log.Warn("isFdCloseToULimit: ", err) + log.WithError(err).Error("Cannot get current FD limit") return false } - lines := strings.Split(string(out), "\n") - fd := len(lines) - 1 - ulimit := uLimit() - log.Info("File descriptor check: num goroutines ", runtime.NumGoroutine(), " fd ", fd, " ulimit ", ulimit) - return fd >= int(0.95*float64(ulimit)) + openedFDs := countOpenedFDs(limit) + + log. + WithField("noGoroutines", runtime.NumCgoCall()). + WithField("noFDs", openedFDs). + WithField("limitFD", limit). + Info("File descriptor check") + return openedFDs >= int(0.95*float64(limit)) }