From 8d1ca91bc98ba252ba96e651d51334bf47e161c6 Mon Sep 17 00:00:00 2001 From: Aaron Jacobs Date: Tue, 17 Mar 2015 14:22:44 +1100 Subject: [PATCH] AttributeCachingTest.StatRenumberMtimeStat_ViaFileDescriptor --- samples/cachingfs/caching_fs_test.go | 65 ++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/samples/cachingfs/caching_fs_test.go b/samples/cachingfs/caching_fs_test.go index 9a412ad..5bc4457 100644 --- a/samples/cachingfs/caching_fs_test.go +++ b/samples/cachingfs/caching_fs_test.go @@ -115,6 +115,37 @@ func (t *cachingFSTest) statAll() (foo, dir, bar os.FileInfo) { return } +func (t *cachingFSTest) openFiles() (foo, dir, bar *os.File) { + var err error + + foo, err = os.Open(path.Join(t.dir, "foo")) + AssertEq(nil, err) + + dir, err = os.Open(path.Join(t.dir, "dir")) + AssertEq(nil, err) + + bar, err = os.Open(path.Join(t.dir, "bar")) + AssertEq(nil, err) + + return +} + +func (t *cachingFSTest) statFiles( + f, g, h *os.File) (foo, dir, bar os.FileInfo) { + var err error + + foo, err = f.Stat() + AssertEq(nil, err) + + dir, err = g.Stat() + AssertEq(nil, err) + + bar, err = h.Stat() + AssertEq(nil, err) + + return +} + func getInodeID(fi os.FileInfo) uint64 { return fi.Sys().(*syscall.Stat_t).Ino } @@ -448,3 +479,37 @@ func (t *AttributeCachingTest) StatRenumberMtimeStat() { ExpectThat(dirAfter.ModTime(), timeutil.TimeEq(newMtime)) ExpectThat(barAfter.ModTime(), timeutil.TimeEq(newMtime)) } + +func (t *AttributeCachingTest) StatRenumberMtimeStat_ViaFileDescriptor() { + newMtime := t.initialMtime.Add(time.Second) + + // Open everything, fixing a particular inode number for each. + foo, dir, bar := t.openFiles() + + fooBefore, dirBefore, barBefore := t.statFiles(foo, dir, bar) + t.fs.RenumberInodes() + t.fs.SetMtime(newMtime) + fooAfter, dirAfter, barAfter := t.statFiles(foo, dir, bar) + + // We should still see the old cached mtime with the old inode ID. + ExpectEq(getInodeID(fooBefore), getInodeID(fooAfter)) + ExpectEq(getInodeID(dirBefore), getInodeID(dirAfter)) + ExpectEq(getInodeID(barBefore), getInodeID(barAfter)) + + ExpectThat(fooAfter.ModTime(), timeutil.TimeEq(fooBefore.ModTime())) + ExpectThat(dirAfter.ModTime(), timeutil.TimeEq(dirBefore.ModTime())) + ExpectThat(barAfter.ModTime(), timeutil.TimeEq(barBefore.ModTime())) + + // After waiting for the attribute cache to expire, we should see the fresh + // mtime, still with the old inode ID. + time.Sleep(2 * t.getattrTimeout) + fooAfter, dirAfter, barAfter = t.statAll() + + ExpectEq(getInodeID(fooBefore), getInodeID(fooAfter)) + ExpectEq(getInodeID(dirBefore), getInodeID(dirAfter)) + ExpectEq(getInodeID(barBefore), getInodeID(barAfter)) + + ExpectThat(fooAfter.ModTime(), timeutil.TimeEq(newMtime)) + ExpectThat(dirAfter.ModTime(), timeutil.TimeEq(newMtime)) + ExpectThat(barAfter.ModTime(), timeutil.TimeEq(newMtime)) +}