adder: pin the right node
License: MIT Signed-off-by: Łukasz Magiera <magik6k@gmail.com>
Łukasz Magiera committed
Mar 11, 2019 at 16:57 UTC
152829d1fa7b38f375cc206a3a6a52fbee5f3853
1 file changed
+16
-10
core/coreunix/add.go
+16
-10
@@ -128,8 +128,8 @@ func (adder *Adder) add(reader io.Reader) (ipld.Node, error) {
128
return balanced.Layout(db)
129
}
130
131
-// RootNode returns the root node of the Added.
132
-func (adder *Adder) RootNode() (ipld.Node, error) {
131
+// RootNode returns the mfs root node
132
+func (adder *Adder) curRootNode() (ipld.Node, error) {
133
// for memoizing
134
if adder.root != nil {
135
return adder.root, nil
@@ -160,18 +160,14 @@ func (adder *Adder) RootNode() (ipld.Node, error) {
160
161
// Recursively pins the root node of Adder and
162
// writes the pin state to the backing datastore.
163
-func (adder *Adder) PinRoot() error {
164
- root, err := adder.RootNode()
165
- if err != nil {
166
- return err
167
- }
163
+func (adder *Adder) PinRoot(root ipld.Node) error {
164
if !adder.Pin {
165
return nil
166
}
167
168
rnk := root.Cid()
169
174
- err = adder.dagService.Add(adder.ctx, root)
170
+ err := adder.dagService.Add(adder.ctx, root)
171
if err != nil {
172
return err
173
}
@@ -274,6 +270,7 @@ func (adder *Adder) AddAllAndPin(file files.Node) (ipld.Node, error) {
270
return nil, err
271
}
272
273
+ // get root
274
mr, err := adder.mfsRoot()
275
if err != nil {
276
return nil, err
@@ -287,6 +284,8 @@ func (adder *Adder) AddAllAndPin(file files.Node) (ipld.Node, error) {
284
return nil, err
285
}
286
287
+ // if adding a file without wrapping, swap the root to it (when adding a
288
+ // directory, mfs root is the directory)
289
_, dir := file.(files.Directory)
290
var name string
291
if !adder.Wrap && !dir {
@@ -317,6 +316,7 @@ func (adder *Adder) AddAllAndPin(file files.Node) (ipld.Node, error) {
316
return nil, err
317
}
318
319
+ // when adding wrapped directory, manually wrap here
320
if adder.Wrap && dir {
321
name = nd.Cid().String()
322
@@ -335,6 +335,7 @@ func (adder *Adder) AddAllAndPin(file files.Node) (ipld.Node, error) {
335
}
336
}
337
338
+ // output directory events
339
err = adder.outputDirs(name, root)
340
if err != nil {
341
return nil, err
@@ -343,7 +344,7 @@ func (adder *Adder) AddAllAndPin(file files.Node) (ipld.Node, error) {
344
if !adder.Pin {
345
return nd, nil
346
}
346
- return nd, adder.PinRoot()
347
+ return nd, adder.PinRoot(nd)
348
}
349
350
func (adder *Adder) addFileNode(path string, file files.Node, toplevel bool) error {
@@ -452,7 +453,12 @@ func (adder *Adder) addDir(path string, dir files.Directory, toplevel bool) erro
453
454
func (adder *Adder) maybePauseForGC() error {
455
if adder.unlocker != nil && adder.gcLocker.GCRequested() {
455
- err := adder.PinRoot()
456
+ rn, err := adder.curRootNode()
457
+ if err != nil {
458
+ return err
459
+ }
460
+
461
+ err = adder.PinRoot(rn)
462
if err != nil {
463
return err
464
}