Fix volume CreatedAt being altered on initialization

The CreatedAt date was determined from the volume's `_data`
directory (`/var/lib/docker/volumes/<volumename>/_data`).
However, when initializing a volume, this directory is updated,
causing the date to change.

Instead of using the `_data` directory, use its parent directory,
which is not updated afterwards, and should reflect the time that
the volume was created.

Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
Signed-off-by: Paweł Gronowski <pawel.gronowski@docker.com>
(cherry picked from commit 01fd23b625)
Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
This commit is contained in:
Sebastiaan van Stijn 2018-11-26 16:23:23 +01:00
parent a166d959a0
commit fe097e018c
No known key found for this signature in database
GPG key ID: 76698F39D527CE8C
3 changed files with 18 additions and 2 deletions

View file

@ -3,6 +3,7 @@ package volume
import (
"context"
"net/http"
"os"
"path/filepath"
"strings"
"testing"
@ -104,6 +105,21 @@ func TestVolumesInspect(t *testing.T) {
createdAt, err := time.Parse(time.RFC3339, strings.TrimSpace(inspected.CreatedAt))
assert.NilError(t, err)
assert.Check(t, createdAt.Unix()-now.Unix() < 60, "CreatedAt (%s) exceeds creation time (%s) 60s", createdAt, now)
// update atime and mtime for the "_data" directory (which would happen during volume initialization)
modifiedAt := time.Now().Local().Add(5 * time.Hour)
err = os.Chtimes(inspected.Mountpoint, modifiedAt, modifiedAt)
assert.NilError(t, err)
inspected, err = client.VolumeInspect(ctx, vol.Name)
assert.NilError(t, err)
createdAt2, err := time.Parse(time.RFC3339, strings.TrimSpace(inspected.CreatedAt))
assert.NilError(t, err)
// Check that CreatedAt didn't change after updating atime and mtime of the "_data" directory
// Related issue: #38274
assert.Equal(t, createdAt, createdAt2)
}
// TestVolumesInvalidJSON tests that POST endpoints that expect a body return

View file

@ -164,7 +164,7 @@ func (v *localVolume) unmount() error {
}
func (v *localVolume) CreatedAt() (time.Time, error) {
fileInfo, err := os.Stat(v.path)
fileInfo, err := os.Stat(v.rootPath)
if err != nil {
return time.Time{}, err
}

View file

@ -44,7 +44,7 @@ func (v *localVolume) postMount() error {
}
func (v *localVolume) CreatedAt() (time.Time, error) {
fileInfo, err := os.Stat(v.path)
fileInfo, err := os.Stat(v.rootPath)
if err != nil {
return time.Time{}, err
}