Browse code

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 <cristian.staretu@gmail.com> (github: unclejack)

unclejack authored on 2014/05/13 21:23:56
Showing 1 changed files
... ...
@@ -3,15 +3,16 @@ package archive
3 3
 import (
4 4
 	"bytes"
5 5
 	"fmt"
6
-	"github.com/dotcloud/docker/pkg/system"
7
-	"github.com/dotcloud/docker/utils"
8
-	"github.com/dotcloud/docker/vendor/src/code.google.com/p/go/src/pkg/archive/tar"
9 6
 	"io"
10 7
 	"os"
11 8
 	"path/filepath"
12 9
 	"strings"
13 10
 	"syscall"
14 11
 	"time"
12
+
13
+	"github.com/dotcloud/docker/pkg/system"
14
+	"github.com/dotcloud/docker/utils"
15
+	"github.com/dotcloud/docker/vendor/src/code.google.com/p/go/src/pkg/archive/tar"
15 16
 )
16 17
 
17 18
 type ChangeType int
... ...
@@ -293,13 +294,23 @@ func collectFileInfo(sourceDir string) (*FileInfo, error) {
293 293
 
294 294
 // Compare two directories and generate an array of Change objects describing the changes
295 295
 func ChangesDirs(newDir, oldDir string) ([]Change, error) {
296
-	oldRoot, err := collectFileInfo(oldDir)
297
-	if err != nil {
298
-		return nil, err
299
-	}
300
-	newRoot, err := collectFileInfo(newDir)
301
-	if err != nil {
302
-		return nil, err
296
+	var (
297
+		oldRoot, newRoot *FileInfo
298
+		err1, err2       error
299
+		errs             = make(chan error, 2)
300
+	)
301
+	go func() {
302
+		oldRoot, err1 = collectFileInfo(oldDir)
303
+		errs <- err1
304
+	}()
305
+	go func() {
306
+		newRoot, err2 = collectFileInfo(newDir)
307
+		errs <- err2
308
+	}()
309
+	for i := 0; i < 2; i++ {
310
+		if err := <-errs; err != nil {
311
+			return nil, err
312
+		}
303 313
 	}
304 314
 
305 315
 	return newRoot.Changes(oldRoot), nil