Explorar el Código

Fix naivediffdriver timestamp precision bug

Signed-off-by: Tonis Tiigi <tonistiigi@gmail.com>
Tonis Tiigi hace 9 años
padre
commit
d1a83059f7
Se han modificado 1 ficheros con 7 adiciones y 0 borrados
  1. 7 0
      daemon/graphdriver/fsdiff.go

+ 7 - 0
daemon/graphdriver/fsdiff.go

@@ -44,6 +44,7 @@ func NewNaiveDiffDriver(driver ProtoDriver, uidMaps, gidMaps []idtools.IDMap) Dr
 // Diff produces an archive of the changes between the specified
 // Diff produces an archive of the changes between the specified
 // layer and its parent layer which may be "".
 // layer and its parent layer which may be "".
 func (gdw *NaiveDiffDriver) Diff(id, parent string) (arch archive.Archive, err error) {
 func (gdw *NaiveDiffDriver) Diff(id, parent string) (arch archive.Archive, err error) {
+	startTime := time.Now()
 	driver := gdw.ProtoDriver
 	driver := gdw.ProtoDriver
 
 
 	layerFs, err := driver.Get(id, "")
 	layerFs, err := driver.Get(id, "")
@@ -88,6 +89,12 @@ func (gdw *NaiveDiffDriver) Diff(id, parent string) (arch archive.Archive, err e
 	return ioutils.NewReadCloserWrapper(archive, func() error {
 	return ioutils.NewReadCloserWrapper(archive, func() error {
 		err := archive.Close()
 		err := archive.Close()
 		driver.Put(id)
 		driver.Put(id)
+
+		// NaiveDiffDriver compares file metadata with parent layers. Parent layers
+		// are extracted from tar's with full second precision on modified time.
+		// We need this hack here to make sure calls within same second receive
+		// correct result.
+		time.Sleep(startTime.Truncate(time.Second).Add(time.Second).Sub(time.Now()))
 		return err
 		return err
 	}), nil
 	}), nil
 }
 }