Prechádzať zdrojové kódy

Avoid parallel layer downloads in load command

Signed-off-by: Doug MacEachern <dougm@vmware.com>
Doug MacEachern 10 rokov pred
rodič
commit
de35ef2ebe
1 zmenil súbory, kde vykonal 14 pridanie a 0 odobranie
  1. 14 0
      graph/load.go

+ 14 - 0
graph/load.go

@@ -104,6 +104,20 @@ func (s *TagStore) recursiveLoad(eng *engine.Engine, address, tmpImageDir string
 			log.Debugf("Error validating ID: %s", err)
 			return err
 		}
+
+		// ensure no two downloads of the same layer happen at the same time
+		if c, err := s.poolAdd("pull", "layer:"+img.ID); err != nil {
+			if c != nil {
+				log.Debugf("Image (id: %s) load is already running, waiting: %v", img.ID, err)
+				<-c
+				return nil
+			}
+
+			return err
+		}
+
+		defer s.poolRemove("pull", "layer:"+img.ID)
+
 		if img.Parent != "" {
 			if !s.graph.Exists(img.Parent) {
 				if err := s.recursiveLoad(eng, img.Parent, tmpImageDir); err != nil {