update error handling in ipns
Jeromy committed
Oct 8, 2014 at 17:29 UTC
15a470100380d313730fdab83ed833b791163406
1 file changed
+18
-10
fuse/ipns/ipns_unix.go
+18
-10
@@ -216,7 +216,10 @@ func (s *Node) loadData() error {
216
// Attr returns the attributes of a given node.
217
func (s *Node) Attr() fuse.Attr {
218
if s.cached == nil {
219
- s.loadData()
219
+ err := s.loadData()
220
+ if err != nil {
221
+ log.Error("Error loading PBData for file: '%s'", s.name)
222
+ }
223
}
224
switch s.cached.GetType() {
225
case ft.PBData_Directory:
@@ -259,6 +262,7 @@ func (n *Node) makeChild(name string, node *mdag.Node) *Node {
262
parent: n,
263
}
264
265
+ // Always ensure that each child knows where the root is
266
if n.nsRoot == nil {
267
child.nsRoot = n
268
} else {
@@ -305,7 +309,9 @@ func (s *Node) ReadAll(intr fs.Intr) ([]byte, fuse.Error) {
309
310
func (n *Node) Write(req *fuse.WriteRequest, resp *fuse.WriteResponse, intr fs.Intr) fuse.Error {
311
log.Debug("ipns: Node Write [%s]: flags = %s, offset = %d, size = %d", n.name, req.Flags.String(), req.Offset, len(req.Data))
312
+
313
if n.dagMod == nil {
314
+ // Create a DagModifier to allow us to change the existing dag node
315
dmod, err := dt.NewDagModifier(n.Nd, n.Ipfs.DAG, imp.DefaultSplitter)
316
if err != nil {
317
log.Error("Error creating dag modifier: %s", err)
@@ -324,6 +330,7 @@ func (n *Node) Write(req *fuse.WriteRequest, resp *fuse.WriteResponse, intr fs.I
330
func (n *Node) Flush(req *fuse.FlushRequest, intr fs.Intr) fuse.Error {
331
log.Debug("Got flush request [%s]!", n.name)
332
333
+ // If a write has happened
334
if n.dagMod != nil {
335
newNode, err := n.dagMod.GetNode()
336
if err != nil {
@@ -364,6 +371,7 @@ func (n *Node) Flush(req *fuse.FlushRequest, intr fs.Intr) fuse.Error {
371
return nil
372
}
373
374
+// Signal that a node in this tree was changed so the root can republish
375
func (n *Node) wasChanged() {
376
root := n.nsRoot
377
if root == nil {
@@ -375,6 +383,8 @@ func (n *Node) wasChanged() {
383
384
func (n *Node) republishRoot() error {
385
log.Debug("Republish root")
386
+
387
+ // We should already be the root, this is just a sanity check
388
var root *Node
389
if n.nsRoot != nil {
390
root = n.nsRoot
@@ -392,7 +402,6 @@ func (n *Node) republishRoot() error {
402
ndkey, err := root.Nd.Key()
403
if err != nil {
404
log.Error("getKey error: %s", err)
395
- // return fuse.ETHISREALLYSUCKS
405
return err
406
}
407
log.Debug("Publishing changes!")
@@ -432,8 +441,7 @@ func (n *Node) Mkdir(req *fuse.MkdirRequest, intr fs.Intr) (fs.Node, fuse.Error)
441
err := n.parent.update(n.name, nnode)
442
if err != nil {
443
log.Critical("Error updating node: %s", err)
435
- // Can we panic, please?
436
- return nil, fuse.ENODATA
444
+ return nil, err
445
}
446
}
447
n.Nd = nnode
@@ -473,14 +481,14 @@ func (n *Node) Create(req *fuse.CreateRequest, resp *fuse.CreateResponse, intr f
481
err := nnode.AddNodeLink(req.Name, nd)
482
if err != nil {
483
log.Error("Error adding child to node: %s", err)
476
- return nil, nil, fuse.ENOENT
484
+ return nil, nil, err
485
}
486
if n.parent != nil {
487
err := n.parent.update(n.name, nnode)
488
if err != nil {
489
log.Critical("Error updating node: %s", err)
490
// Can we panic, please?
483
- return nil, nil, fuse.ENODATA
491
+ return nil, nil, err
492
}
493
}
494
n.Nd = nnode
@@ -502,8 +510,7 @@ func (n *Node) Remove(req *fuse.RemoveRequest, intr fs.Intr) fuse.Error {
510
err := n.parent.update(n.name, nnode)
511
if err != nil {
512
log.Critical("Error updating node: %s", err)
505
- // Can we panic, please?
506
- return fuse.ENODATA
513
+ return err
514
}
515
}
516
n.Nd = nnode
@@ -530,15 +537,16 @@ func (n *Node) Rename(req *fuse.RenameRequest, newDir fs.Node, intr fs.Intr) fus
537
err := newDir.Nd.AddNodeLink(req.NewName, mdn)
538
if err != nil {
539
log.Error("Error adding node to new dir on rename: %s", err)
533
- return fuse.ENOENT
540
+ return err
541
}
542
default:
543
log.Critical("Unknown node type for rename target dir!")
537
- return fuse.ENOENT
544
+ return err
545
}
546
return nil
547
}
548
549
+// Updates the child of this node, specified by name to the given newnode
550
func (n *Node) update(name string, newnode *mdag.Node) error {
551
log.Debug("update '%s' in '%s'", name, n.name)
552
nnode := n.Nd.Copy()