Browse code

Avoid parallel layer downloads in load command

Signed-off-by: Doug MacEachern <dougm@vmware.com>

Doug MacEachern authored on 2015/02/19 11:45:39
Showing 1 changed files
... ...
@@ -104,6 +104,20 @@ func (s *TagStore) recursiveLoad(eng *engine.Engine, address, tmpImageDir string
104 104
 			log.Debugf("Error validating ID: %s", err)
105 105
 			return err
106 106
 		}
107
+
108
+		// ensure no two downloads of the same layer happen at the same time
109
+		if c, err := s.poolAdd("pull", "layer:"+img.ID); err != nil {
110
+			if c != nil {
111
+				log.Debugf("Image (id: %s) load is already running, waiting: %v", img.ID, err)
112
+				<-c
113
+				return nil
114
+			}
115
+
116
+			return err
117
+		}
118
+
119
+		defer s.poolRemove("pull", "layer:"+img.ID)
120
+
107 121
 		if img.Parent != "" {
108 122
 			if !s.graph.Exists(img.Parent) {
109 123
 				if err := s.recursiveLoad(eng, img.Parent, tmpImageDir); err != nil {