From 22972138f2ecfb33d9df9d17d05e4a48c79d0351 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Duffeck?= Date: Thu, 11 Mar 2021 14:41:48 +0100 Subject: [PATCH 1/3] Add unit tests for updating Etags --- .../utils/decomposedfs/node/node_test.go | 36 +++++++++++++++++++ .../utils/decomposedfs/tree/tree_test.go | 17 +++++++++ 2 files changed, 53 insertions(+) diff --git a/pkg/storage/utils/decomposedfs/node/node_test.go b/pkg/storage/utils/decomposedfs/node/node_test.go index 13565a2543..fce395e475 100644 --- a/pkg/storage/utils/decomposedfs/node/node_test.go +++ b/pkg/storage/utils/decomposedfs/node/node_test.go @@ -19,6 +19,8 @@ package node_test import ( + "time" + userpb "github.com/cs3org/go-cs3apis/cs3/identity/user/v1beta1" "github.com/cs3org/reva/pkg/storage/utils/decomposedfs/node" helpers "github.com/cs3org/reva/pkg/storage/utils/decomposedfs/testhelpers" @@ -147,4 +149,38 @@ var _ = Describe("Node", func() { Expect(child.Blobsize).To(Equal(int64(1234))) }) }) + + Describe("AsResourceInfo", func() { + var ( + n *node.Node + ) + + BeforeEach(func() { + var err error + n, err = env.Lookup.NodeFromPath(env.Ctx, "dir1/file1") + Expect(err).ToNot(HaveOccurred()) + }) + + Describe("the Etag field", func() { + It("is set", func() { + ri, err := n.AsResourceInfo(env.Ctx, node.OwnerPermissions, []string{}) + Expect(err).ToNot(HaveOccurred()) + Expect(len(ri.Etag)).To(Equal(34)) + }) + + It("changes when the tmtime is set", func() { + ri, err := n.AsResourceInfo(env.Ctx, node.OwnerPermissions, []string{}) + Expect(err).ToNot(HaveOccurred()) + Expect(len(ri.Etag)).To(Equal(34)) + before := ri.Etag + + Expect(n.SetTMTime(time.Now().UTC())).To(Succeed()) + + ri, err = n.AsResourceInfo(env.Ctx, node.OwnerPermissions, []string{}) + Expect(err).ToNot(HaveOccurred()) + Expect(len(ri.Etag)).To(Equal(34)) + Expect(ri.Etag).ToNot(Equal(before)) + }) + }) + }) }) diff --git a/pkg/storage/utils/decomposedfs/tree/tree_test.go b/pkg/storage/utils/decomposedfs/tree/tree_test.go index eae66faea6..af4f810eac 100644 --- a/pkg/storage/utils/decomposedfs/tree/tree_test.go +++ b/pkg/storage/utils/decomposedfs/tree/tree_test.go @@ -208,6 +208,23 @@ var _ = Describe("Tree", func() { Expect(err).ToNot(HaveOccurred()) }) + Describe("with TreeTimeAccounting enabled", func() { + It("sets the tmtime of the parent", func() { + file, err := env.CreateTestFile("file1", "", 1, dir.ID) + Expect(err).ToNot(HaveOccurred()) + + riBefore, err := dir.AsResourceInfo(env.Ctx, node.OwnerPermissions, []string{}) + Expect(err).ToNot(HaveOccurred()) + + err = env.Tree.Propagate(env.Ctx, file) + Expect(err).ToNot(HaveOccurred()) + + riAfter, err := dir.AsResourceInfo(env.Ctx, node.OwnerPermissions, []string{}) + Expect(err).ToNot(HaveOccurred()) + Expect(riAfter.Etag).ToNot(Equal(riBefore.Etag)) + }) + }) + Describe("with TreeSizeAccounting enabled", func() { It("calculates the size", func() { file, err := env.CreateTestFile("file1", "", 1, dir.ID) From a2ceaaf374ae1fc9572b00d1f8e647d09c9e8b67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Duffeck?= Date: Wed, 17 Mar 2021 15:43:49 +0100 Subject: [PATCH 2/3] Fix etag only changing every second --- pkg/storage/fs/owncloud/owncloud_unix.go | 2 +- pkg/storage/fs/owncloud/owncloud_windows.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/storage/fs/owncloud/owncloud_unix.go b/pkg/storage/fs/owncloud/owncloud_unix.go index 2f058eb276..52e0088836 100755 --- a/pkg/storage/fs/owncloud/owncloud_unix.go +++ b/pkg/storage/fs/owncloud/owncloud_unix.go @@ -43,7 +43,7 @@ import ( func calcEtag(ctx context.Context, fi os.FileInfo) string { log := appctx.GetLogger(ctx) h := md5.New() - err := binary.Write(h, binary.BigEndian, fi.ModTime().Unix()) + err := binary.Write(h, binary.BigEndian, fi.ModTime().UnixNano()) if err != nil { log.Error().Err(err).Msg("error writing mtime") } diff --git a/pkg/storage/fs/owncloud/owncloud_windows.go b/pkg/storage/fs/owncloud/owncloud_windows.go index 1ad8d3f2df..29b93dc72c 100644 --- a/pkg/storage/fs/owncloud/owncloud_windows.go +++ b/pkg/storage/fs/owncloud/owncloud_windows.go @@ -40,7 +40,7 @@ import ( func calcEtag(ctx context.Context, fi os.FileInfo) string { log := appctx.GetLogger(ctx) h := md5.New() - err := binary.Write(h, binary.BigEndian, fi.ModTime().Unix()) + err := binary.Write(h, binary.BigEndian, fi.ModTime().UnixNano()) if err != nil { log.Error().Err(err).Msg("error writing mtime") } From 17798cb154715367e5f6a4a1d1fd84561b4ba61f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Duffeck?= Date: Mon, 22 Mar 2021 13:17:19 +0100 Subject: [PATCH 3/3] Add changelog --- changelog/unreleased/fix-etag-changing-only-every-second.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 changelog/unreleased/fix-etag-changing-only-every-second.md diff --git a/changelog/unreleased/fix-etag-changing-only-every-second.md b/changelog/unreleased/fix-etag-changing-only-every-second.md new file mode 100644 index 0000000000..7513c57741 --- /dev/null +++ b/changelog/unreleased/fix-etag-changing-only-every-second.md @@ -0,0 +1,6 @@ +Bugfix: Fix etag changing only once a second + +We fixed a problem with the owncloud storage driver only considering +the mtime with a second resolution for the etag calculation. + +https://github.com/cs3org/reva/pull/1576 \ No newline at end of file