seaweedfs/weed/mount/inode_to_path.go

120 lines
2.1 KiB
Go
Raw Normal View History

2022-02-12 09:54:16 +00:00
package mount
import (
"github.com/chrislusf/seaweedfs/weed/glog"
"github.com/chrislusf/seaweedfs/weed/util"
"sync"
)
type InodeToPath struct {
sync.RWMutex
nextInodeId uint64
2022-02-13 13:49:29 +00:00
inode2path map[uint64]*InodeEntry
2022-02-12 09:54:16 +00:00
path2inode map[util.FullPath]uint64
}
2022-02-13 13:49:29 +00:00
type InodeEntry struct {
util.FullPath
nlookup uint64
}
2022-02-12 09:54:16 +00:00
func NewInodeToPath() *InodeToPath {
return &InodeToPath{
2022-02-13 13:49:29 +00:00
inode2path: make(map[uint64]*InodeEntry),
2022-02-12 09:54:16 +00:00
path2inode: make(map[util.FullPath]uint64),
nextInodeId: 2, // the root inode id is 1
}
}
2022-02-13 13:49:29 +00:00
func (i *InodeToPath) Lookup(path util.FullPath) uint64 {
2022-02-12 09:54:16 +00:00
if path == "/" {
return 1
}
i.Lock()
defer i.Unlock()
inode, found := i.path2inode[path]
if !found {
inode = i.nextInodeId
i.nextInodeId++
i.path2inode[path] = inode
2022-02-13 13:49:29 +00:00
i.inode2path[inode] = &InodeEntry{path, 1}
} else {
i.inode2path[inode].nlookup++
}
return inode
}
func (i *InodeToPath) GetInode(path util.FullPath) uint64 {
if path == "/" {
return 1
}
i.Lock()
defer i.Unlock()
inode, found := i.path2inode[path]
if !found {
glog.Fatalf("GetInode unknown inode %d", inode)
2022-02-12 09:54:16 +00:00
}
return inode
}
func (i *InodeToPath) GetPath(inode uint64) util.FullPath {
if inode == 1 {
return "/"
}
i.RLock()
defer i.RUnlock()
path, found := i.inode2path[inode]
if !found {
2022-02-13 13:49:29 +00:00
glog.Fatalf("not found inode %d", inode)
2022-02-12 09:54:16 +00:00
}
2022-02-13 13:49:29 +00:00
return path.FullPath
2022-02-12 09:54:16 +00:00
}
func (i *InodeToPath) HasPath(path util.FullPath) bool {
if path == "/" {
return true
}
i.RLock()
defer i.RUnlock()
_, found := i.path2inode[path]
return found
}
2022-02-13 06:21:30 +00:00
func (i *InodeToPath) HasInode(inode uint64) bool {
if inode == 1 {
return true
}
i.RLock()
defer i.RUnlock()
_, found := i.inode2path[inode]
return found
}
2022-02-13 11:09:24 +00:00
func (i *InodeToPath) RemovePath(path util.FullPath) {
if path == "/" {
return
}
i.Lock()
defer i.Unlock()
inode, found := i.path2inode[path]
if found {
delete(i.path2inode, path)
delete(i.inode2path, inode)
}
}
2022-02-13 13:49:29 +00:00
func (i *InodeToPath) Forget(inode, nlookup uint64) {
2022-02-13 11:31:47 +00:00
if inode == 1 {
return
}
2022-02-13 13:49:29 +00:00
i.Lock()
defer i.Unlock()
2022-02-13 11:31:47 +00:00
path, found := i.inode2path[inode]
if found {
2022-02-13 13:49:29 +00:00
path.nlookup -= nlookup
if path.nlookup <= 0 {
delete(i.path2inode, path.FullPath)
delete(i.inode2path, inode)
}
2022-02-13 11:31:47 +00:00
}
}