Better inode allocation

This commit is contained in:
Alex Yatskov 2015-05-16 16:50:15 +09:00
parent 7b8911cdd0
commit 8876f44fc8
2 changed files with 20 additions and 14 deletions

View File

@ -30,6 +30,7 @@ import (
type database struct { type database struct {
base string base string
vers []*version vers []*version
inodeCnt uint64
} }
func newDatabase(dir string) (*database, error) { func newDatabase(dir string) (*database, error) {
@ -75,7 +76,7 @@ func (this *database) versions(dirs []string) ([]*version, error) {
var parent *version var parent *version
for _, dir := range dirs { for _, dir := range dirs {
ver, err := newVersion(dir, parent) ver, err := newVersion(dir, this, parent)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -111,3 +112,8 @@ func (this *database) scan(dir string) ([]string, error) {
return dirs, nil return dirs, nil
} }
func (this *database) AllocInode() uint64 {
this.inodeCnt++
return this.inodeCnt
}

View File

@ -40,10 +40,14 @@ type version struct {
timestamp time.Time timestamp time.Time
meta *versionMetadata meta *versionMetadata
root *versionedDir root *versionedDir
inodeCnt uint64 inodeAloc InodeAllocator
} }
func newVersion(base string, parent *version) (*version, error) { type InodeAllocator interface {
AllocInode() uint64
}
func newVersion(base string, allocator InodeAllocator, parent *version) (*version, error) {
re, err := regexp.Compile(`/vfs_([0-9a-f])$`) re, err := regexp.Compile(`/vfs_([0-9a-f])$`)
if err != nil { if err != nil {
return nil, err return nil, err
@ -62,7 +66,8 @@ func newVersion(base string, parent *version) (*version, error) {
ver := &version{ ver := &version{
base: base, base: base,
parent: parent, parent: parent,
timestamp: time.Unix(timeval, 0)} timestamp: time.Unix(timeval, 0),
inodeAloc: allocator}
ver.meta, err = newVersionMetadata(ver.metadataPath()) ver.meta, err = newVersionMetadata(ver.metadataPath())
if err != nil { if err != nil {
@ -124,14 +129,14 @@ func (this *version) buildVerDir(dir *versionedDir) error {
for name, node := range nodes { for name, node := range nodes {
if node.info.IsDir() { if node.info.IsDir() {
subDir := newVersionedDir(node, this.allocInode()) subDir := newVersionedDir(node, this.inodeAloc.AllocInode())
if err := this.buildVerDir(subDir); err != nil { if err := this.buildVerDir(subDir); err != nil {
return err return err
} }
dir.dirs[name] = subDir dir.dirs[name] = subDir
} else { } else {
dir.files[name] = newVersionedFile(node, this.allocInode()) dir.files[name] = newVersionedFile(node, this.inodeAloc.AllocInode())
} }
} }
@ -146,7 +151,7 @@ func (this *version) resolve() error {
this.root = newVersionedDir( this.root = newVersionedDir(
this.newVersionedNode("/", node), this.newVersionedNode("/", node),
this.allocInode()) this.inodeAloc.AllocInode())
return this.buildVerDir(this.root) return this.buildVerDir(this.root)
} }
@ -160,11 +165,6 @@ func (this *version) rebasePath(paths ...string) string {
return filepath.Join(combined...) return filepath.Join(combined...)
} }
func (this *version) allocInode() uint64 {
this.inodeCnt++
return this.inodeCnt
}
func (this *version) Root() (fs.Node, error) { func (this *version) Root() (fs.Node, error) {
return this.root, nil return this.root, nil
} }