From f43049507ba67b804978da0cb544bbfd87491dc6 Mon Sep 17 00:00:00 2001 From: Tonis Tiigi Date: Wed, 30 Mar 2016 16:16:37 -0700 Subject: [PATCH] Fix naivediffdriver timestamp precision bug Signed-off-by: Tonis Tiigi Upstream-commit: d1a83059f700ea7a15a4f17f4ed833f023ec3398 Component: engine --- components/engine/daemon/graphdriver/fsdiff.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/components/engine/daemon/graphdriver/fsdiff.go b/components/engine/daemon/graphdriver/fsdiff.go index 7d11da9260..6e26f7a7f8 100644 --- a/components/engine/daemon/graphdriver/fsdiff.go +++ b/components/engine/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 // layer and its parent layer which may be "". func (gdw *NaiveDiffDriver) Diff(id, parent string) (arch archive.Archive, err error) { + startTime := time.Now() driver := gdw.ProtoDriver 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 { err := archive.Close() 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 }), nil }