Unverified 提交 51607243 作者: Whyrusleeping 提交者: GitHub

Merge pull request #5170 from schomatis/feat/mfs/root-val-as-dir

mfs: make `Root` value a `Directory`
...@@ -71,7 +71,7 @@ func NewGC(n *core.IpfsNode) (*GC, error) { ...@@ -71,7 +71,7 @@ func NewGC(n *core.IpfsNode) (*GC, error) {
} }
func BestEffortRoots(filesRoot *mfs.Root) ([]*cid.Cid, error) { func BestEffortRoots(filesRoot *mfs.Root) ([]*cid.Cid, error) {
rootDag, err := filesRoot.GetValue().GetNode() rootDag, err := filesRoot.GetDirectory().GetNode()
if err != nil { if err != nil {
return nil, err return nil, err
} }
......
...@@ -145,7 +145,7 @@ func (adder *Adder) RootNode() (ipld.Node, error) { ...@@ -145,7 +145,7 @@ func (adder *Adder) RootNode() (ipld.Node, error) {
if err != nil { if err != nil {
return nil, err return nil, err
} }
root, err := mr.GetValue().GetNode() root, err := mr.GetDirectory().GetNode()
if err != nil { if err != nil {
return nil, err return nil, err
} }
...@@ -200,7 +200,8 @@ func (adder *Adder) Finalize() (ipld.Node, error) { ...@@ -200,7 +200,8 @@ func (adder *Adder) Finalize() (ipld.Node, error) {
if err != nil { if err != nil {
return nil, err return nil, err
} }
root := mr.GetValue() var root mfs.FSNode
root = mr.GetDirectory()
err = root.Flush() err = root.Flush()
if err != nil { if err != nil {
...@@ -225,10 +226,7 @@ func (adder *Adder) Finalize() (ipld.Node, error) { ...@@ -225,10 +226,7 @@ func (adder *Adder) Finalize() (ipld.Node, error) {
return nil, err return nil, err
} }
dir, ok := mr.GetValue().(*mfs.Directory) dir := mr.GetDirectory()
if !ok {
return nil, fmt.Errorf("root is not a directory")
}
root, err = dir.Child(name) root, err = dir.Child(name)
if err != nil { if err != nil {
......
...@@ -118,14 +118,7 @@ func loadRoot(ctx context.Context, rt *keyRoot, ipfs *core.IpfsNode, name string ...@@ -118,14 +118,7 @@ func loadRoot(ctx context.Context, rt *keyRoot, ipfs *core.IpfsNode, name string
rt.root = root rt.root = root
switch val := root.GetValue().(type) { return &Directory{dir: root.GetDirectory()}, nil
case *mfs.Directory:
return &Directory{dir: val}, nil
case *mfs.File:
return &FileNode{fi: val}, nil
default:
return nil, errors.New("unrecognized type")
}
} }
type keyRoot struct { type keyRoot struct {
......
...@@ -213,7 +213,7 @@ func TestBasic(t *testing.T) { ...@@ -213,7 +213,7 @@ func TestBasic(t *testing.T) {
defer cancel() defer cancel()
ds, rt := setupRoot(ctx, t) ds, rt := setupRoot(ctx, t)
rootdir := rt.GetValue().(*Directory) rootdir := rt.GetDirectory()
// test making a basic dir // test making a basic dir
_, err := rootdir.Mkdir("a") _, err := rootdir.Mkdir("a")
...@@ -243,7 +243,7 @@ func TestMkdir(t *testing.T) { ...@@ -243,7 +243,7 @@ func TestMkdir(t *testing.T) {
defer cancel() defer cancel()
_, rt := setupRoot(ctx, t) _, rt := setupRoot(ctx, t)
rootdir := rt.GetValue().(*Directory) rootdir := rt.GetDirectory()
dirsToMake := []string{"a", "B", "foo", "bar", "cats", "fish"} dirsToMake := []string{"a", "B", "foo", "bar", "cats", "fish"}
sort.Strings(dirsToMake) // sort for easy comparing later sort.Strings(dirsToMake) // sort for easy comparing later
...@@ -281,7 +281,7 @@ func TestDirectoryLoadFromDag(t *testing.T) { ...@@ -281,7 +281,7 @@ func TestDirectoryLoadFromDag(t *testing.T) {
defer cancel() defer cancel()
ds, rt := setupRoot(ctx, t) ds, rt := setupRoot(ctx, t)
rootdir := rt.GetValue().(*Directory) rootdir := rt.GetDirectory()
nd := getRandFile(t, ds, 1000) nd := getRandFile(t, ds, 1000)
err := ds.Add(ctx, nd) err := ds.Add(ctx, nd)
...@@ -373,7 +373,7 @@ func TestMfsFile(t *testing.T) { ...@@ -373,7 +373,7 @@ func TestMfsFile(t *testing.T) {
defer cancel() defer cancel()
ds, rt := setupRoot(ctx, t) ds, rt := setupRoot(ctx, t)
rootdir := rt.GetValue().(*Directory) rootdir := rt.GetDirectory()
fisize := 1000 fisize := 1000
nd := getRandFile(t, ds, 1000) nd := getRandFile(t, ds, 1000)
...@@ -686,7 +686,7 @@ func actorReadFile(d *Directory) error { ...@@ -686,7 +686,7 @@ func actorReadFile(d *Directory) error {
} }
func testActor(rt *Root, iterations int, errs chan error) { func testActor(rt *Root, iterations int, errs chan error) {
d := rt.GetValue().(*Directory) d := rt.GetDirectory()
for i := 0; i < iterations; i++ { for i := 0; i < iterations; i++ {
switch rand.Intn(5) { switch rand.Intn(5) {
case 0: case 0:
...@@ -763,7 +763,7 @@ func TestConcurrentWriteAndFlush(t *testing.T) { ...@@ -763,7 +763,7 @@ func TestConcurrentWriteAndFlush(t *testing.T) {
defer cancel() defer cancel()
ds, rt := setupRoot(ctx, t) ds, rt := setupRoot(ctx, t)
d := mkdirP(t, rt.GetValue().(*Directory), "foo/bar/baz") d := mkdirP(t, rt.GetDirectory(), "foo/bar/baz")
fn := fileNodeFromReader(t, ds, bytes.NewBuffer(nil)) fn := fileNodeFromReader(t, ds, bytes.NewBuffer(nil))
err := d.AddChild("file", fn) err := d.AddChild("file", fn)
if err != nil { if err != nil {
...@@ -786,7 +786,7 @@ func TestConcurrentWriteAndFlush(t *testing.T) { ...@@ -786,7 +786,7 @@ func TestConcurrentWriteAndFlush(t *testing.T) {
}() }()
for i := 0; i < nloops; i++ { for i := 0; i < nloops; i++ {
_, err := rt.GetValue().GetNode() _, err := rt.GetDirectory().GetNode()
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
...@@ -800,7 +800,7 @@ func TestFlushing(t *testing.T) { ...@@ -800,7 +800,7 @@ func TestFlushing(t *testing.T) {
defer cancel() defer cancel()
_, rt := setupRoot(ctx, t) _, rt := setupRoot(ctx, t)
dir := rt.GetValue().(*Directory) dir := rt.GetDirectory()
c := mkdirP(t, dir, "a/b/c") c := mkdirP(t, dir, "a/b/c")
d := mkdirP(t, dir, "a/b/d") d := mkdirP(t, dir, "a/b/d")
e := mkdirP(t, dir, "a/b/e") e := mkdirP(t, dir, "a/b/e")
...@@ -901,7 +901,7 @@ func TestConcurrentReads(t *testing.T) { ...@@ -901,7 +901,7 @@ func TestConcurrentReads(t *testing.T) {
ds, rt := setupRoot(ctx, t) ds, rt := setupRoot(ctx, t)
rootdir := rt.GetValue().(*Directory) rootdir := rt.GetDirectory()
path := "a/b/c" path := "a/b/c"
d := mkdirP(t, rootdir, path) d := mkdirP(t, rootdir, path)
...@@ -976,7 +976,7 @@ func TestConcurrentWrites(t *testing.T) { ...@@ -976,7 +976,7 @@ func TestConcurrentWrites(t *testing.T) {
ds, rt := setupRoot(ctx, t) ds, rt := setupRoot(ctx, t)
rootdir := rt.GetValue().(*Directory) rootdir := rt.GetDirectory()
path := "a/b/c" path := "a/b/c"
d := mkdirP(t, rootdir, path) d := mkdirP(t, rootdir, path)
...@@ -1011,7 +1011,7 @@ func TestFileDescriptors(t *testing.T) { ...@@ -1011,7 +1011,7 @@ func TestFileDescriptors(t *testing.T) {
defer cancel() defer cancel()
ds, rt := setupRoot(ctx, t) ds, rt := setupRoot(ctx, t)
dir := rt.GetValue().(*Directory) dir := rt.GetDirectory()
nd := dag.NodeWithData(ft.FilePBData(nil, 0)) nd := dag.NodeWithData(ft.FilePBData(nil, 0))
fi, err := NewFile("test", nd, dir, ds) fi, err := NewFile("test", nd, dir, ds)
......
package mfs package mfs
import ( import (
"errors"
"fmt" "fmt"
"os" "os"
gopath "path" gopath "path"
...@@ -129,7 +128,7 @@ func Mkdir(r *Root, pth string, opts MkdirOpts) error { ...@@ -129,7 +128,7 @@ func Mkdir(r *Root, pth string, opts MkdirOpts) error {
return fmt.Errorf("cannot create directory '/': Already exists") return fmt.Errorf("cannot create directory '/': Already exists")
} }
cur := r.GetValue().(*Directory) cur := r.GetDirectory()
for i, d := range parts[:len(parts)-1] { for i, d := range parts[:len(parts)-1] {
fsn, err := cur.Child(d) fsn, err := cur.Child(d)
if err == os.ErrNotExist && opts.Mkparents { if err == os.ErrNotExist && opts.Mkparents {
...@@ -172,12 +171,11 @@ func Mkdir(r *Root, pth string, opts MkdirOpts) error { ...@@ -172,12 +171,11 @@ func Mkdir(r *Root, pth string, opts MkdirOpts) error {
return nil return nil
} }
// Lookup extracts the root directory and performs a lookup under it.
// TODO: Now that the root is always a directory, can this function
// be collapsed with `DirLookup`? Or at least be made a method of `Root`?
func Lookup(r *Root, path string) (FSNode, error) { func Lookup(r *Root, path string) (FSNode, error) {
dir, ok := r.GetValue().(*Directory) dir := r.GetDirectory()
if !ok {
log.Errorf("root not a dir: %#v", r.GetValue())
return nil, errors.New("root was not a directory")
}
return DirLookup(dir, path) return DirLookup(dir, path)
} }
......
...@@ -50,17 +50,11 @@ type FSNode interface { ...@@ -50,17 +50,11 @@ type FSNode interface {
// Root represents the root of a filesystem tree. // Root represents the root of a filesystem tree.
type Root struct { type Root struct {
// node is the merkledag root.
node *dag.ProtoNode
// val represents the node. It can either be a File or a Directory. // Root directory of the MFS layout.
val FSNode dir *Directory
repub *Republisher repub *Republisher
dserv ipld.DAGService
Type string
} }
// PubFunc is the function used by the `publish()` method. // PubFunc is the function used by the `publish()` method.
...@@ -77,9 +71,7 @@ func NewRoot(parent context.Context, ds ipld.DAGService, node *dag.ProtoNode, pf ...@@ -77,9 +71,7 @@ func NewRoot(parent context.Context, ds ipld.DAGService, node *dag.ProtoNode, pf
} }
root := &Root{ root := &Root{
node: node,
repub: repub, repub: repub,
dserv: ds,
} }
pbn, err := ft.FromBytes(node.Data()) pbn, err := ft.FromBytes(node.Data())
...@@ -90,33 +82,29 @@ func NewRoot(parent context.Context, ds ipld.DAGService, node *dag.ProtoNode, pf ...@@ -90,33 +82,29 @@ func NewRoot(parent context.Context, ds ipld.DAGService, node *dag.ProtoNode, pf
switch pbn.GetType() { switch pbn.GetType() {
case ft.TDirectory, ft.THAMTShard: case ft.TDirectory, ft.THAMTShard:
rval, err := NewDirectory(parent, node.String(), node, root, ds) newDir, err := NewDirectory(parent, node.String(), node, root, ds)
if err != nil { if err != nil {
return nil, err return nil, err
} }
root.val = rval root.dir = newDir
case ft.TFile, ft.TMetadata, ft.TRaw: case ft.TFile, ft.TMetadata, ft.TRaw:
fi, err := NewFile(node.String(), node, root, ds) return nil, fmt.Errorf("root can't be a file (unixfs type: %s)", pbn.GetType())
if err != nil {
return nil, err
}
root.val = fi
default: default:
return nil, fmt.Errorf("unrecognized unixfs type: %s", pbn.GetType()) return nil, fmt.Errorf("unrecognized unixfs type: %s", pbn.GetType())
} }
return root, nil return root, nil
} }
// GetValue returns the value of Root. // GetDirectory returns the root directory.
func (kr *Root) GetValue() FSNode { func (kr *Root) GetDirectory() *Directory {
return kr.val return kr.dir
} }
// Flush signals that an update has occurred since the last publish, // Flush signals that an update has occurred since the last publish,
// and updates the Root republisher. // and updates the Root republisher.
func (kr *Root) Flush() error { func (kr *Root) Flush() error {
nd, err := kr.GetValue().GetNode() nd, err := kr.GetDirectory().GetNode()
if err != nil { if err != nil {
return err return err
} }
...@@ -136,10 +124,7 @@ func (kr *Root) Flush() error { ...@@ -136,10 +124,7 @@ func (kr *Root) Flush() error {
// A better implemented mfs system (one that does smarter internal caching and // A better implemented mfs system (one that does smarter internal caching and
// refcounting) shouldnt need this method. // refcounting) shouldnt need this method.
func (kr *Root) FlushMemFree(ctx context.Context) error { func (kr *Root) FlushMemFree(ctx context.Context) error {
dir, ok := kr.GetValue().(*Directory) dir := kr.GetDirectory()
if !ok {
return fmt.Errorf("invalid mfs structure, root should be a directory")
}
if err := dir.Flush(); err != nil { if err := dir.Flush(); err != nil {
return err return err
...@@ -160,7 +145,7 @@ func (kr *Root) FlushMemFree(ctx context.Context) error { ...@@ -160,7 +145,7 @@ func (kr *Root) FlushMemFree(ctx context.Context) error {
// closeChild implements the childCloser interface, and signals to the publisher that // closeChild implements the childCloser interface, and signals to the publisher that
// there are changes ready to be published. // there are changes ready to be published.
func (kr *Root) closeChild(name string, nd ipld.Node, sync bool) error { func (kr *Root) closeChild(name string, nd ipld.Node, sync bool) error {
err := kr.dserv.Add(context.TODO(), nd) err := kr.GetDirectory().dserv.Add(context.TODO(), nd)
if err != nil { if err != nil {
return err return err
} }
...@@ -172,7 +157,7 @@ func (kr *Root) closeChild(name string, nd ipld.Node, sync bool) error { ...@@ -172,7 +157,7 @@ func (kr *Root) closeChild(name string, nd ipld.Node, sync bool) error {
} }
func (kr *Root) Close() error { func (kr *Root) Close() error {
nd, err := kr.GetValue().GetNode() nd, err := kr.GetDirectory().GetNode()
if err != nil { if err != nil {
return err return err
} }
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论