Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 6 additions & 6 deletions internal/fs/inode/dir.go
Original file line number Diff line number Diff line change
Expand Up @@ -265,7 +265,7 @@ type dirInode struct {
// (via kernel) the directory listing from the filesystem.
// Specially used when kernelListCacheTTL > 0 that means kernel list-cache is
// enabled.
prevDirListingTimeStamp time.Time
prevDirListingTimeStamp atomic.Int64
Comment thread
vedantdas-source marked this conversation as resolved.

metadataCacheTtlSecs int64

Expand Down Expand Up @@ -634,7 +634,6 @@ func (d *dirInode) CancelCurrDirPrefetcher() {
if d.prefetcher != nil {
d.prefetcher.Cancel()
}
return
}

// UpdateSize is a no-op for implicit directories. These directories are not
Expand Down Expand Up @@ -1105,7 +1104,7 @@ func (d *dirInode) ReadEntryCores(ctx context.Context, tok string) (cores map[Na
return
}

d.prevDirListingTimeStamp = d.cacheClock.Now()
d.prevDirListingTimeStamp.Store(d.cacheClock.Now().UnixNano())
Comment thread
vedantdas-source marked this conversation as resolved.
Outdated
return
}

Expand Down Expand Up @@ -1508,11 +1507,12 @@ func (d *dirInode) LocalFileEntries(localFileInodes map[Name]Inode) (localEntrie
func (d *dirInode) ShouldInvalidateKernelListCache(ttl time.Duration) bool {
// prevDirListingTimeStamp.IsZero() true means listing has not happened yet, and we should
// invalidate for clean start.
if d.prevDirListingTimeStamp.IsZero() {
prevNS := d.prevDirListingTimeStamp.Load()
if prevNS == 0 {
return true
}

cachedDuration := d.cacheClock.Now().Sub(d.prevDirListingTimeStamp)
cachedDuration := time.Duration(d.cacheClock.Now().UnixNano() - prevNS)
return cachedDuration >= ttl
Comment thread
vedantdas-source marked this conversation as resolved.
Outdated
}

Expand Down Expand Up @@ -1571,7 +1571,7 @@ func (d *dirInode) RenameFolder(ctx context.Context, folderName string, destinat

func (d *dirInode) InvalidateKernelListCache() {
// Set prevDirListingTimeStamp to Zero time so that cache is invalidated.
d.prevDirListingTimeStamp = time.Time{}
d.prevDirListingTimeStamp.Store(0)
}

func (d *dirInode) isBucketHierarchical() bool {
Expand Down
42 changes: 21 additions & 21 deletions internal/fs/inode/dir_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -933,13 +933,13 @@ func (t *DirTest) TestReadDescendants_NonEmpty() {
func (t *DirTest) TestReadEntries_Empty() {
d := t.in.(*dirInode)
require.NotNil(t.T(), d)
require.True(t.T(), d.prevDirListingTimeStamp.IsZero())
require.True(t.T(), d.prevDirListingTimeStamp.Load() == 0)
entries, err := t.readAllEntries()

require.NoError(t.T(), err)
assert.ElementsMatch(t.T(), []fuseutil.Dirent{}, entries)
// Make sure prevDirListingTimeStamp is initialized.
require.False(t.T(), d.prevDirListingTimeStamp.IsZero())
require.False(t.T(), d.prevDirListingTimeStamp.Load() == 0)
}

func (t *DirTest) TestReadEntries_NonEmpty_ImplicitDirsDisabled() {
Expand All @@ -966,7 +966,7 @@ func (t *DirTest) TestReadEntries_NonEmpty_ImplicitDirsDisabled() {
// Nil prevDirListingTimeStamp
d := t.in.(*dirInode)
require.NotNil(t.T(), d)
require.True(t.T(), d.prevDirListingTimeStamp.IsZero())
require.True(t.T(), d.prevDirListingTimeStamp.Load() == 0)

// Read entries.
entries, err := t.readAllEntries()
Expand Down Expand Up @@ -1003,7 +1003,7 @@ func (t *DirTest) TestReadEntries_NonEmpty_ImplicitDirsDisabled() {
}

// Make sure prevDirListingTimeStamp is initialized.
require.False(t.T(), d.prevDirListingTimeStamp.IsZero())
require.False(t.T(), d.prevDirListingTimeStamp.Load() == 0)
}

func (t *DirTest) TestReadEntries_NonEmpty_ImplicitDirsEnabled() {
Expand Down Expand Up @@ -1033,7 +1033,7 @@ func (t *DirTest) TestReadEntries_NonEmpty_ImplicitDirsEnabled() {
// Nil prevDirListingTimeStamp
d := t.in.(*dirInode)
require.NotNil(t.T(), d)
require.True(t.T(), d.prevDirListingTimeStamp.IsZero())
require.True(t.T(), d.prevDirListingTimeStamp.Load() == 0)

// Read entries.
entries, err := t.readAllEntries()
Expand Down Expand Up @@ -1077,7 +1077,7 @@ func (t *DirTest) TestReadEntries_NonEmpty_ImplicitDirsEnabled() {
}

// Make sure prevDirListingTimeStamp is initialized.
require.False(t.T(), d.prevDirListingTimeStamp.IsZero())
require.False(t.T(), d.prevDirListingTimeStamp.Load() == 0)
}

func (t *DirTest) TestReadEntries_TypeCaching() {
Expand All @@ -1097,7 +1097,7 @@ func (t *DirTest) TestReadEntries_TypeCaching() {
// Nil prevDirListingTimeStamp
d := t.in.(*dirInode)
require.NotNil(t.T(), d)
require.True(t.T(), d.prevDirListingTimeStamp.IsZero())
require.True(t.T(), d.prevDirListingTimeStamp.Load() == 0)

// Read the directory, priming the type cache.
_, err = t.readAllEntries()
Expand Down Expand Up @@ -1136,21 +1136,21 @@ func (t *DirTest) TestReadEntries_TypeCaching() {
assert.Equal(t.T(), dirObjName, result.MinObject.Name)

// Make sure prevDirListingTimeStamp is initialized.
require.False(t.T(), d.prevDirListingTimeStamp.IsZero())
require.False(t.T(), d.prevDirListingTimeStamp.Load() == 0)
}

func (t *DirTest) TestReadEntryCores_Empty() {
d := t.in.(*dirInode)
require.NotNil(t.T(), d)
require.True(t.T(), d.prevDirListingTimeStamp.IsZero())
require.True(t.T(), d.prevDirListingTimeStamp.Load() == 0)

cores, unsupportedPaths, err := t.readAllEntryCores()

require.NoError(t.T(), err)
assert.Equal(t.T(), 0, len(cores))
assert.Equal(t.T(), 0, len(unsupportedPaths))
// Make sure prevDirListingTimeStamp is initialized.
require.False(t.T(), d.prevDirListingTimeStamp.IsZero())
require.False(t.T(), d.prevDirListingTimeStamp.Load() == 0)
}

func (t *DirTest) TestReadEntryCores_NonEmpty_ImplicitDirsDisabled() {
Expand Down Expand Up @@ -1184,7 +1184,7 @@ func (t *DirTest) TestReadEntryCores_NonEmpty_ImplicitDirsDisabled() {
// Nil prevDirListingTimeStamp
d := t.in.(*dirInode)
require.NotNil(t.T(), d)
require.True(t.T(), d.prevDirListingTimeStamp.IsZero())
require.True(t.T(), d.prevDirListingTimeStamp.Load() == 0)

// Read cores.
cores, _, _, err = t.in.ReadEntryCores(t.ctx, "")
Expand All @@ -1196,7 +1196,7 @@ func (t *DirTest) TestReadEntryCores_NonEmpty_ImplicitDirsDisabled() {
t.validateCore(cores, "file", false, metadata.RegularFileType, testFileName)
t.validateCore(cores, "symlink", false, metadata.SymlinkType, symlinkName)
// Make sure prevDirListingTimeStamp is initialized.
require.False(t.T(), d.prevDirListingTimeStamp.IsZero())
require.False(t.T(), d.prevDirListingTimeStamp.Load() == 0)
}

func (t *DirTest) TestReadEntryCores_NonEmpty_ImplicitDirsEnabled() {
Expand Down Expand Up @@ -1238,7 +1238,7 @@ func (t *DirTest) TestReadEntryCores_NonEmpty_ImplicitDirsEnabled() {
// Nil prevDirListingTimeStamp
d := t.in.(*dirInode)
require.NotNil(t.T(), d)
require.True(t.T(), d.prevDirListingTimeStamp.IsZero())
require.True(t.T(), d.prevDirListingTimeStamp.Load() == 0)
Comment thread
vedantdas-source marked this conversation as resolved.
Outdated

// Read cores.
cores, unsupportedPaths, err = t.readAllEntryCores()
Expand All @@ -1253,7 +1253,7 @@ func (t *DirTest) TestReadEntryCores_NonEmpty_ImplicitDirsEnabled() {
t.validateCore(cores, "symlink", false, metadata.SymlinkType, symlinkName)
assert.ElementsMatch(t.T(), []string{dirInodeName + "../", dirInodeName + "/"}, unsupportedPaths)
// Make sure prevDirListingTimeStamp is initialized.
require.False(t.T(), d.prevDirListingTimeStamp.IsZero())
require.False(t.T(), d.prevDirListingTimeStamp.Load() == 0)
Comment thread
vedantdas-source marked this conversation as resolved.
Outdated
}

func (t *DirTest) TestCreateChildFile_DoesntExist() {
Expand Down Expand Up @@ -2023,7 +2023,7 @@ func (t *DirTest) TestLocalFileEntriesWithUnlinkedLocalChildFiles() {

func (t *DirTest) Test_ShouldInvalidateKernelListCache_ListingNotHappenedYet() {
d := t.in.(*dirInode)
d.prevDirListingTimeStamp = time.Time{}
d.prevDirListingTimeStamp.Store(0)

// Irrespective of the ttl value, this should always return true.
shouldInvalidate := t.in.ShouldInvalidateKernelListCache(util.MaxTimeDuration)
Expand All @@ -2033,7 +2033,7 @@ func (t *DirTest) Test_ShouldInvalidateKernelListCache_ListingNotHappenedYet() {

func (t *DirTest) Test_ShouldInvalidateKernelListCache_WithinTtl() {
d := t.in.(*dirInode)
d.prevDirListingTimeStamp = d.cacheClock.Now()
d.prevDirListingTimeStamp.Store(d.cacheClock.Now().UnixNano())
ttl := time.Second * 10
t.clock.AdvanceTime(ttl / 2)

Expand All @@ -2044,7 +2044,7 @@ func (t *DirTest) Test_ShouldInvalidateKernelListCache_WithinTtl() {

func (t *DirTest) Test_ShouldInvalidateKernelListCache_ExpiredTtl() {
d := t.in.(*dirInode)
d.prevDirListingTimeStamp = d.cacheClock.Now()
d.prevDirListingTimeStamp.Store(d.cacheClock.Now().UnixNano())
ttl := 10 * time.Second
t.clock.AdvanceTime(ttl + time.Second)

Expand All @@ -2055,7 +2055,7 @@ func (t *DirTest) Test_ShouldInvalidateKernelListCache_ExpiredTtl() {

func (t *DirTest) Test_ShouldInvalidateKernelListCache_ZeroTtl() {
d := t.in.(*dirInode)
d.prevDirListingTimeStamp = d.cacheClock.Now()
d.prevDirListingTimeStamp.Store(d.cacheClock.Now().UnixNano())
ttl := time.Duration(0)

shouldInvalidate := t.in.ShouldInvalidateKernelListCache(ttl)
Expand All @@ -2065,12 +2065,12 @@ func (t *DirTest) Test_ShouldInvalidateKernelListCache_ZeroTtl() {

func (t *DirTest) Test_InvalidateKernelListCache() {
d := t.in.(*dirInode)
d.prevDirListingTimeStamp = d.cacheClock.Now()
assert.False(t.T(), d.prevDirListingTimeStamp.IsZero())
d.prevDirListingTimeStamp.Store(d.cacheClock.Now().UnixNano())
assert.False(t.T(), d.prevDirListingTimeStamp.Load() == 0)

t.in.InvalidateKernelListCache()

assert.True(t.T(), d.prevDirListingTimeStamp.IsZero())
assert.True(t.T(), d.prevDirListingTimeStamp.Load() == 0)
}

func (t *DirTest) Test_ReadObjectsUnlocked() {
Expand Down
Loading