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)
| ... | ... |
@@ -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 |