From 359f8aca29bf0e7fca757fa73e1d5565ed2d16f7 Mon Sep 17 00:00:00 2001 From: unclejack Date: Tue, 13 May 2014 15:23:56 +0300 Subject: [PATCH] process directories in parallel in ChangesDirs This commit lowers the total time spent in ChangesDirs to half during a commit. Docker-DCO-1.1-Signed-off-by: Cristian Staretu (github: unclejack) --- archive/changes.go | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/archive/changes.go b/archive/changes.go index 723e4a7425..88cea0f709 100644 --- a/archive/changes.go +++ b/archive/changes.go @@ -3,15 +3,16 @@ package archive import ( "bytes" "fmt" - "github.com/dotcloud/docker/pkg/system" - "github.com/dotcloud/docker/utils" - "github.com/dotcloud/docker/vendor/src/code.google.com/p/go/src/pkg/archive/tar" "io" "os" "path/filepath" "strings" "syscall" "time" + + "github.com/dotcloud/docker/pkg/system" + "github.com/dotcloud/docker/utils" + "github.com/dotcloud/docker/vendor/src/code.google.com/p/go/src/pkg/archive/tar" ) type ChangeType int @@ -293,13 +294,23 @@ func collectFileInfo(sourceDir string) (*FileInfo, error) { // Compare two directories and generate an array of Change objects describing the changes func ChangesDirs(newDir, oldDir string) ([]Change, error) { - oldRoot, err := collectFileInfo(oldDir) - if err != nil { - return nil, err - } - newRoot, err := collectFileInfo(newDir) - if err != nil { - return nil, err + var ( + oldRoot, newRoot *FileInfo + err1, err2 error + errs = make(chan error, 2) + ) + go func() { + oldRoot, err1 = collectFileInfo(oldDir) + errs <- err1 + }() + go func() { + newRoot, err2 = collectFileInfo(newDir) + errs <- err2 + }() + for i := 0; i < 2; i++ { + if err := <-errs; err != nil { + return nil, err + } } return newRoot.Changes(oldRoot), nil