Skip to content

Commit 259aeb4

Browse files
committed
integrate the HAMT into mfs
License: MIT Signed-off-by: Jeromy <[email protected]>
1 parent bbc1baa commit 259aeb4

File tree

7 files changed

+226
-48
lines changed

7 files changed

+226
-48
lines changed

assets/assets.go

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,12 +54,21 @@ func addAssetList(nd *core.IpfsNode, l []string) (*key.Key, error) {
5454

5555
fname := filepath.Base(p)
5656
k := key.B58KeyDecode(s)
57-
if err := dirb.AddChild(nd.Context(), fname, k); err != nil {
57+
node, err := nd.DAG.Get(nd.Context(), k)
58+
if err != nil {
59+
return nil, err
60+
}
61+
62+
if err := dirb.AddChild(nd.Context(), fname, node); err != nil {
5863
return nil, fmt.Errorf("assets: could not add '%s' as a child: %s", fname, err)
5964
}
6065
}
6166

62-
dir := dirb.GetNode()
67+
dir, err := dirb.GetNode()
68+
if err != nil {
69+
return nil, err
70+
}
71+
6372
dkey, err := nd.DAG.Add(dir)
6473
if err != nil {
6574
return nil, fmt.Errorf("assets: DAG.Add(dir) failed: %s", err)

core/commands/files/files.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -342,7 +342,13 @@ Examples:
342342
case *mfs.Directory:
343343
if !long {
344344
var output []mfs.NodeListing
345-
for _, name := range fsn.ListNames() {
345+
names, err := fsn.ListNames()
346+
if err != nil {
347+
res.SetError(err, cmds.ErrNormal)
348+
return
349+
}
350+
351+
for _, name := range names {
346352
output = append(output, mfs.NodeListing{
347353
Name: name,
348354
})

core/coreunix/add.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -220,7 +220,12 @@ func (adder *Adder) outputDirs(path string, fsn mfs.FSNode) error {
220220
case *mfs.File:
221221
return nil
222222
case *mfs.Directory:
223-
for _, name := range fsn.ListNames() {
223+
names, err := fsn.ListNames()
224+
if err != nil {
225+
return err
226+
}
227+
228+
for _, name := range names {
224229
child, err := fsn.Child(name)
225230
if err != nil {
226231
return err

mfs/dir.go

Lines changed: 66 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313

1414
dag "github.com/ipfs/go-ipfs/merkledag"
1515
ft "github.com/ipfs/go-ipfs/unixfs"
16+
uio "github.com/ipfs/go-ipfs/unixfs/io"
1617
ufspb "github.com/ipfs/go-ipfs/unixfs/pb"
1718
)
1819

@@ -28,25 +29,31 @@ type Directory struct {
2829
files map[string]*File
2930

3031
lock sync.Mutex
31-
node *dag.Node
3232
ctx context.Context
3333

34+
dirbuilder *uio.Directory
35+
3436
modTime time.Time
3537

3638
name string
3739
}
3840

39-
func NewDirectory(ctx context.Context, name string, node *dag.Node, parent childCloser, dserv dag.DAGService) *Directory {
40-
return &Directory{
41-
dserv: dserv,
42-
ctx: ctx,
43-
name: name,
44-
node: node,
45-
parent: parent,
46-
childDirs: make(map[string]*Directory),
47-
files: make(map[string]*File),
48-
modTime: time.Now(),
41+
func NewDirectory(ctx context.Context, name string, node *dag.Node, parent childCloser, dserv dag.DAGService) (*Directory, error) {
42+
db, err := uio.NewDirectoryFromNode(dserv, node)
43+
if err != nil {
44+
return nil, err
4945
}
46+
47+
return &Directory{
48+
dserv: dserv,
49+
ctx: ctx,
50+
name: name,
51+
dirbuilder: db,
52+
parent: parent,
53+
childDirs: make(map[string]*Directory),
54+
files: make(map[string]*File),
55+
modTime: time.Now(),
56+
}, nil
5057
}
5158

5259
// closeChild updates the child by the given name to the dag node 'nd'
@@ -80,21 +87,21 @@ func (d *Directory) closeChildUpdate(name string, nd *dag.Node, sync bool) (*dag
8087
}
8188

8289
func (d *Directory) flushCurrentNode() (*dag.Node, error) {
83-
_, err := d.dserv.Add(d.node)
90+
nd, err := d.dirbuilder.GetNode()
8491
if err != nil {
8592
return nil, err
8693
}
8794

88-
return d.node.Copy(), nil
95+
_, err = d.dserv.Add(nd)
96+
if err != nil {
97+
return nil, err
98+
}
99+
100+
return nd.Copy(), nil
89101
}
90102

91103
func (d *Directory) updateChild(name string, nd *dag.Node) error {
92-
err := d.node.RemoveNodeLink(name)
93-
if err != nil && err != dag.ErrNotFound {
94-
return err
95-
}
96-
97-
err = d.node.AddNodeLinkClean(name, nd)
104+
err := d.dirbuilder.AddChild(d.ctx, name, nd)
98105
if err != nil {
99106
return err
100107
}
@@ -128,7 +135,11 @@ func (d *Directory) cacheNode(name string, nd *dag.Node) (FSNode, error) {
128135

129136
switch i.GetType() {
130137
case ufspb.Data_Directory:
131-
ndir := NewDirectory(d.ctx, name, nd, d, d.dserv)
138+
ndir, err := NewDirectory(d.ctx, name, nd, d, d.dserv)
139+
if err != nil {
140+
return nil, err
141+
}
142+
132143
d.childDirs[name] = ndir
133144
return ndir, nil
134145
case ufspb.Data_File, ufspb.Data_Raw, ufspb.Data_Symlink:
@@ -162,13 +173,12 @@ func (d *Directory) Uncache(name string) {
162173
// childFromDag searches through this directories dag node for a child link
163174
// with the given name
164175
func (d *Directory) childFromDag(name string) (*dag.Node, error) {
165-
for _, lnk := range d.node.Links {
166-
if lnk.Name == name {
167-
return lnk.GetNode(d.ctx, d.dserv)
168-
}
176+
nd, err := d.dirbuilder.Find(d.ctx, name)
177+
if err != nil {
178+
return nil, err
169179
}
170180

171-
return nil, os.ErrNotExist
181+
return nd.Copy(), nil
172182
}
173183

174184
// childUnsync returns the child under this directory by the given name
@@ -194,7 +204,7 @@ type NodeListing struct {
194204
Hash string
195205
}
196206

197-
func (d *Directory) ListNames() []string {
207+
func (d *Directory) ListNames() ([]string, error) {
198208
d.lock.Lock()
199209
defer d.lock.Unlock()
200210

@@ -206,7 +216,12 @@ func (d *Directory) ListNames() []string {
206216
names[n] = struct{}{}
207217
}
208218

209-
for _, l := range d.node.Links {
219+
links, err := d.dirbuilder.Links()
220+
if err != nil {
221+
return nil, err
222+
}
223+
224+
for _, l := range links {
210225
names[l.Name] = struct{}{}
211226
}
212227

@@ -216,15 +231,21 @@ func (d *Directory) ListNames() []string {
216231
}
217232
sort.Strings(out)
218233

219-
return out
234+
return out, nil
220235
}
221236

222237
func (d *Directory) List() ([]NodeListing, error) {
223238
d.lock.Lock()
224239
defer d.lock.Unlock()
225240

226241
var out []NodeListing
227-
for _, l := range d.node.Links {
242+
243+
links, err := d.dirbuilder.Links()
244+
if err != nil {
245+
return nil, err
246+
}
247+
248+
for _, l := range links {
228249
child := NodeListing{}
229250
child.Name = l.Name
230251

@@ -275,20 +296,23 @@ func (d *Directory) Mkdir(name string) (*Directory, error) {
275296
}
276297
}
277298

278-
ndir := new(dag.Node)
279-
ndir.SetData(ft.FolderPBData())
299+
ndir := ft.EmptyDirNode()
280300

281301
_, err = d.dserv.Add(ndir)
282302
if err != nil {
283303
return nil, err
284304
}
285305

286-
err = d.node.AddNodeLinkClean(name, ndir)
306+
err = d.dirbuilder.AddChild(d.ctx, name, ndir)
307+
if err != nil {
308+
return nil, err
309+
}
310+
311+
dirobj, err := NewDirectory(d.ctx, name, ndir, d, d.dserv)
287312
if err != nil {
288313
return nil, err
289314
}
290315

291-
dirobj := NewDirectory(d.ctx, name, ndir, d, d.dserv)
292316
d.childDirs[name] = dirobj
293317
return dirobj, nil
294318
}
@@ -300,12 +324,7 @@ func (d *Directory) Unlink(name string) error {
300324
delete(d.childDirs, name)
301325
delete(d.files, name)
302326

303-
err := d.node.RemoveNodeLink(name)
304-
if err != nil {
305-
return err
306-
}
307-
308-
_, err = d.dserv.Add(d.node)
327+
err := d.dirbuilder.RemoveChild(d.ctx, name)
309328
if err != nil {
310329
return err
311330
}
@@ -340,7 +359,7 @@ func (d *Directory) AddChild(name string, nd *dag.Node) error {
340359
return err
341360
}
342361

343-
err = d.node.AddNodeLinkClean(name, nd)
362+
err = d.dirbuilder.AddChild(d.ctx, name, nd)
344363
if err != nil {
345364
return err
346365
}
@@ -396,10 +415,15 @@ func (d *Directory) GetNode() (*dag.Node, error) {
396415
return nil, err
397416
}
398417

399-
_, err = d.dserv.Add(d.node)
418+
nd, err := d.dirbuilder.GetNode()
419+
if err != nil {
420+
return nil, err
421+
}
422+
423+
_, err = d.dserv.Add(nd)
400424
if err != nil {
401425
return nil, err
402426
}
403427

404-
return d.node.Copy(), nil
428+
return nd, err
405429
}

0 commit comments

Comments
 (0)