AttributeCachingTest.StatRenumberMtimeStat_ViaFileDescriptor

geesefs-0-30-9
Aaron Jacobs 2015-03-17 14:22:44 +11:00
parent 0fe8ed1493
commit 8d1ca91bc9
1 changed files with 65 additions and 0 deletions

View File

@ -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))
}