From 9258b1d6fc6f2d0f66ea87200d7fa977bcb6452d Mon Sep 17 00:00:00 2001 From: Alex Yatskov Date: Tue, 16 Jun 2015 18:08:30 +0900 Subject: [PATCH] Some work on deleting --- database.go | 6 ++++++ dir.go | 33 ++++++++++++++++----------------- file.go | 5 +---- fs/ver_1/meta.json | 4 +--- fs/ver_2/meta.json | 4 +--- node.go | 28 +++++++++++++++++----------- version.go | 8 ++++++++ vfs.go | 4 ++++ 8 files changed, 54 insertions(+), 38 deletions(-) diff --git a/database.go b/database.go index e212044..0ece936 100644 --- a/database.go +++ b/database.go @@ -73,6 +73,12 @@ func (this *database) load(dir string) error { } func (this *database) save() error { + for _, ver := range this.vers { + if err := ver.finalize(); err != nil { + return err + } + } + return nil } diff --git a/dir.go b/dir.go index bbacb79..ff98241 100644 --- a/dir.go +++ b/dir.go @@ -44,16 +44,14 @@ type versionedDir struct { } func newVersionedDir(node *versionedNode, parent *versionedDir) *versionedDir { - return &versionedDir{ - dirs: make(map[string]*versionedDir), - files: make(map[string]*versionedFile), - node: node, - inode: allocInode(), - parent: parent} + dirs := make(map[string]*versionedDir) + files := make(map[string]*versionedFile) + + return &versionedDir{dirs, files, node, allocInode(), parent} } func (this *versionedDir) version() error { - if this.node.flags&NodeModified == NodeModified { + if this.node.versioned { return nil } @@ -69,7 +67,7 @@ func (this *versionedDir) version() error { return err } - node.flags |= NodeModified + node.versioned = true this.node = node return nil @@ -91,8 +89,8 @@ func (this *versionedDir) createDir(name string) (*versionedDir, error) { } dir := newVersionedDir(node, this) - this.dirs[name] = dir + return dir, nil } @@ -114,8 +112,8 @@ func (this *versionedDir) createFile(name string, flags int) (*versionedFile, er file := newVersionedFile(node, this) file.handle = handle - this.files[name] = file + return file, nil } @@ -163,17 +161,18 @@ func (this *versionedDir) Mkdir(ctx context.Context, req *fuse.MkdirRequest) (fs return this.createDir(req.Name) } -func (this *versionedDir) Remove(ctx context.Context, req *fuse.RemoveRequest) error { - var fullPath string +func (this *versionedDir) Remove(ctx context.Context, req *fuse.RemoveRequest) (err error) { if req.Dir { - fullPath = this.dirs[req.Name].node.rebasedPath() - delete(this.dirs, req.Name) + if err = this.dirs[req.Name].node.remove(); err == nil { + delete(this.dirs, req.Name) + } } else { - fullPath = this.files[req.Name].node.rebasedPath() - delete(this.files, req.Name) + if err = this.files[req.Name].node.remove(); err == nil { + delete(this.files, req.Name) + } } - return os.Remove(fullPath) + return } func (this *versionedDir) ReadDirAll(ctx context.Context) ([]fuse.Dirent, error) { diff --git a/file.go b/file.go index 71117b2..faacec4 100644 --- a/file.go +++ b/file.go @@ -42,10 +42,7 @@ type versionedFile struct { } func newVersionedFile(node *versionedNode, parent *versionedDir) *versionedFile { - return &versionedFile{ - node: node, - inode: allocInode(), - parent: parent} + return &versionedFile{node, allocInode(), parent, nil} } func (this *versionedFile) Open(ctx context.Context, req *fuse.OpenRequest, resp *fuse.OpenResponse) (fs.Handle, error) { diff --git a/fs/ver_1/meta.json b/fs/ver_1/meta.json index 681a0f4..dfaf6da 100644 --- a/fs/ver_1/meta.json +++ b/fs/ver_1/meta.json @@ -1,3 +1 @@ -{ - "deleted": ["/test_file_2"] -} +{"deleted":["/test_file_2"]} \ No newline at end of file diff --git a/fs/ver_2/meta.json b/fs/ver_2/meta.json index 4d90843..e6fbf89 100644 --- a/fs/ver_2/meta.json +++ b/fs/ver_2/meta.json @@ -1,3 +1 @@ -{ - "deleted": ["/test_dira"] -} +{"deleted":["/test_dira"]} \ No newline at end of file diff --git a/node.go b/node.go index ec1f16a..1cc9ceb 100644 --- a/node.go +++ b/node.go @@ -33,17 +33,12 @@ import ( // versionedNode // -const ( - NodeModified = 1 << iota - NodeDeleted -) - type versionedNode struct { - path string - info os.FileInfo - ver *version - parent *versionedNode - flags uint + path string + info os.FileInfo + ver *version + parent *versionedNode + versioned bool } type versionedNodeMap map[string]*versionedNode @@ -58,7 +53,18 @@ func newVersionedNode(path string, ver *version, parent *versionedNode) (*versio } func newVersionedNodeStat(path string, ver *version, parent *versionedNode, info os.FileInfo) *versionedNode { - return &versionedNode{path, info, ver, parent, 0} + return &versionedNode{path, info, ver, parent, false} +} + +func (this *versionedNode) remove() error { + if this.versioned { + if err := os.Remove(this.rebasedPath()); err != nil { + return err + } + } + + this.ver.removePath(this.path) + return nil } func (this *versionedNode) setAttr(req *fuse.SetattrRequest, resp *fuse.SetattrResponse) error { diff --git a/version.go b/version.go index 5129431..1c3d527 100644 --- a/version.go +++ b/version.go @@ -143,6 +143,14 @@ func (this *version) rebasePath(paths ...string) string { return filepath.Join(combined...) } +func (this *version) removePath(path string) { + this.meta.Deleted = append(this.meta.Deleted, path) +} + +func (this *version) finalize() error { + return this.meta.save() +} + func (this *version) dump(root *versionedDir, depth int) { indent := strings.Repeat("\t", depth) for name, dir := range root.dirs { diff --git a/vfs.go b/vfs.go index 3af9523..e94919b 100644 --- a/vfs.go +++ b/vfs.go @@ -70,4 +70,8 @@ func main() { if err := conn.MountError; err != nil { log.Fatal(err) } + + if err := db.save(); err != nil { + log.Fatal(err) + } }