vfs: Add SetSys() methods to Node to allow caching stuff on a node

This commit is contained in:
Nick Craig-Wood 2020-05-01 18:30:06 +01:00
parent 7f8d74e903
commit cfcdc85b26
5 changed files with 31 additions and 2 deletions

View File

@ -32,6 +32,7 @@ type Dir struct {
entry fs.Directory
read time.Time // time directory entry last read
items map[string]Node // directory entries - can be empty but not nil
sys interface{} // user defined info to be attached here
}
func newDir(vfs *VFS, f fs.Fs, parent *Dir, fsDir fs.Directory) *Dir {
@ -92,7 +93,16 @@ func (d *Dir) Path() (name string) {
// Sys returns underlying data source (can be nil) - satisfies Node interface
func (d *Dir) Sys() interface{} {
return nil
d.mu.RLock()
defer d.mu.RUnlock()
return d.sys
}
// SetSys sets the underlying data source (can be nil) - satisfies Node interface
func (d *Dir) SetSys(x interface{}) {
d.mu.Lock()
d.sys = x
d.mu.Unlock()
}
// Inode returns the inode number - satisfies Node interface

View File

@ -54,6 +54,10 @@ func TestDirMethods(t *testing.T) {
// Sys
assert.Equal(t, nil, dir.Sys())
// SetSys
dir.SetSys(42)
assert.Equal(t, 42, dir.Sys())
// Inode
assert.NotEqual(t, uint64(0), dir.Inode())

View File

@ -52,6 +52,7 @@ type File struct {
pendingModTime time.Time // will be applied once o becomes available, i.e. after file was written
pendingRenameFun func(ctx context.Context) error // will be run/renamed after all writers close
appendMode bool // file was opened with O_APPEND
sys interface{} // user defined info to be attached here
muRW sync.Mutex // synchonize RWFileHandle.openPending(), RWFileHandle.close() and File.Remove
}
@ -130,7 +131,16 @@ func (f *File) osPath() string {
// Sys returns underlying data source (can be nil) - satisfies Node interface
func (f *File) Sys() interface{} {
return nil
f.mu.RLock()
defer f.mu.RUnlock()
return f.sys
}
// SetSys sets the underlying data source (can be nil) - satisfies Node interface
func (f *File) SetSys(x interface{}) {
f.mu.Lock()
f.sys = x
f.mu.Unlock()
}
// Inode returns the inode number - satisfies Node interface

View File

@ -58,6 +58,10 @@ func TestFileMethods(t *testing.T) {
// Sys
assert.Equal(t, nil, file.Sys())
// SetSys
file.SetSys(42)
assert.Equal(t, 42, file.Sys())
// Inode
assert.NotEqual(t, uint64(0), file.Inode())

View File

@ -54,6 +54,7 @@ type Node interface {
Open(flags int) (Handle, error)
Truncate(size int64) error
Path() string
SetSys(interface{})
}
// Check interfaces