From b031df541c5ba13bc3b17227ee93a84a99f864fb Mon Sep 17 00:00:00 2001 From: kumakichi Date: Thu, 30 Jul 2020 22:18:59 +0800 Subject: [PATCH 1/3] fix: EMFILE error on macOS Catalina --- goprocess/gp.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/goprocess/gp.go b/goprocess/gp.go index 083226a7..49db3d43 100644 --- a/goprocess/gp.go +++ b/goprocess/gp.go @@ -35,10 +35,13 @@ func FindAll() []P { var wg sync.WaitGroup wg.Add(len(pss)) found := make(chan P) + limitCh := make(chan struct{}, 10) for _, pr := range pss { + limitCh <- struct{}{} pr := pr go func() { + defer func() { <-limitCh }() defer wg.Done() path, version, agent, ok, err := isGo(pr) From bedf1d036633ec5a7e425cb6c11850c8ab92d3c1 Mon Sep 17 00:00:00 2001 From: kumakichi Date: Tue, 4 Aug 2020 23:01:29 +0800 Subject: [PATCH 2/3] Add test for EMFILE error --- goprocess/gp.go | 3 ++- goprocess/gp_test.go | 34 +++++++++++++++++++++++++++++++++- 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/goprocess/gp.go b/goprocess/gp.go index 49db3d43..aa88e150 100644 --- a/goprocess/gp.go +++ b/goprocess/gp.go @@ -27,6 +27,7 @@ type P struct { // FindAll returns all the Go processes currently running on this host. func FindAll() []P { + const concurrencyProcesses = 10 // limit the maximum number of concurrent reading process tasks pss, err := ps.Processes() if err != nil { return nil @@ -35,7 +36,7 @@ func FindAll() []P { var wg sync.WaitGroup wg.Add(len(pss)) found := make(chan P) - limitCh := make(chan struct{}, 10) + limitCh := make(chan struct{}, concurrencyProcesses) for _, pr := range pss { limitCh <- struct{}{} diff --git a/goprocess/gp_test.go b/goprocess/gp_test.go index 7fb1b157..3fd35301 100644 --- a/goprocess/gp_test.go +++ b/goprocess/gp_test.go @@ -1,9 +1,41 @@ package goprocess -import "testing" +import ( + "os" + "sync" + "syscall" + "testing" + + "github.com/keybase/go-ps" +) func BenchmarkFindAll(b *testing.B) { for ii := 0; ii < b.N; ii++ { _ = FindAll() } } + +func TestEMFILE(t *testing.T) { + pss, err := ps.Processes() + if err != nil { + t.Fatal(err) + } + + var wg sync.WaitGroup + wg.Add(len(pss)) + + for _, pr := range pss { + pr := pr + go func() { + defer wg.Done() + _, _, _, _, err := isGo(pr) + if err != nil { + if e, ok := err.(*os.PathError); ok && e.Err == syscall.EMFILE { + t.Errorf("pid:%d got EMFILE error", pr.Pid()) + } + } + }() + } + + wg.Wait() +} From 1205df8eaa68f999dabe765667f04e6cbdd89976 Mon Sep 17 00:00:00 2001 From: kumakichi Date: Wed, 5 Aug 2020 09:01:02 +0800 Subject: [PATCH 3/3] Drop test for EMFILE --- goprocess/gp_test.go | 34 +--------------------------------- 1 file changed, 1 insertion(+), 33 deletions(-) diff --git a/goprocess/gp_test.go b/goprocess/gp_test.go index 3fd35301..7fb1b157 100644 --- a/goprocess/gp_test.go +++ b/goprocess/gp_test.go @@ -1,41 +1,9 @@ package goprocess -import ( - "os" - "sync" - "syscall" - "testing" - - "github.com/keybase/go-ps" -) +import "testing" func BenchmarkFindAll(b *testing.B) { for ii := 0; ii < b.N; ii++ { _ = FindAll() } } - -func TestEMFILE(t *testing.T) { - pss, err := ps.Processes() - if err != nil { - t.Fatal(err) - } - - var wg sync.WaitGroup - wg.Add(len(pss)) - - for _, pr := range pss { - pr := pr - go func() { - defer wg.Done() - _, _, _, _, err := isGo(pr) - if err != nil { - if e, ok := err.(*os.PathError); ok && e.Err == syscall.EMFILE { - t.Errorf("pid:%d got EMFILE error", pr.Pid()) - } - } - }() - } - - wg.Wait() -}