From f796871304a6ea81896b3b87001464161b49d562 Mon Sep 17 00:00:00 2001 From: "Tim St. Clair" Date: Fri, 20 May 2016 16:29:49 -0700 Subject: [PATCH] Cap the maximum parallel exec commands for getting disk usage --- fs/fs.go | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/fs/fs.go b/fs/fs.go index 75e3abd4..dafc7bf7 100644 --- a/fs/fs.go +++ b/fs/fs.go @@ -44,6 +44,26 @@ const ( LabelRktImages = "rkt-images" ) +// The maximum number of `du` tasks that can be running at once. +const maxConsecutiveDus = 20 + +// A pool for restricting the number of consecutive `du` tasks running. +var duPool = make(chan struct{}, maxConsecutiveDus) + +func init() { + for i := 0; i < maxConsecutiveDus; i++ { + releaseDuToken() + } +} + +func claimDuToken() { + <-duPool +} + +func releaseDuToken() { + duPool <- struct{}{} +} + type partition struct { mountpoint string major uint @@ -391,6 +411,8 @@ func (self *RealFsInfo) GetDirUsage(dir string, timeout time.Duration) (uint64, if dir == "" { return 0, fmt.Errorf("invalid directory") } + claimDuToken() + defer releaseDuToken() cmd := exec.Command("nice", "-n", "19", "du", "-s", dir) stdoutp, err := cmd.StdoutPipe() if err != nil {