From d8ee7dffc3a05ab2b4ec12a21637a9f5240660cf Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 13 Nov 2015 09:55:42 -0800 Subject: [PATCH] improves memory usage of add License: MIT Signed-off-by: Jeromy --- core/coreunix/add.go | 2 +- merkledag/merkledag.go | 13 +++++++++++-- merkledag/utils/utils.go | 6 ++++++ 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/core/coreunix/add.go b/core/coreunix/add.go index 412ae19c2..376554758 100644 --- a/core/coreunix/add.go +++ b/core/coreunix/add.go @@ -317,7 +317,7 @@ func (params *Adder) addDir(dir files.File) (*merkledag.Node, error) { name := gopath.Base(file.FileName()) - if err := tree.AddNodeLink(name, node); err != nil { + if err := tree.AddNodeLinkClean(name, node); err != nil { return nil, err } } diff --git a/merkledag/merkledag.go b/merkledag/merkledag.go index a6c6633f0..b84327dfd 100644 --- a/merkledag/merkledag.go +++ b/merkledag/merkledag.go @@ -20,6 +20,7 @@ type DAGService interface { AddRecursive(*Node) error Get(context.Context, key.Key) (*Node, error) Remove(*Node) error + RemoveRecursive(*Node) error // GetDAG returns, in order, all the single leve child // nodes of the passed in node. @@ -107,10 +108,10 @@ func (n *dagService) Get(ctx context.Context, k key.Key) (*Node, error) { } // Remove deletes the given node and all of its children from the BlockService -func (n *dagService) Remove(nd *Node) error { +func (n *dagService) RemoveRecursive(nd *Node) error { for _, l := range nd.Links { if l.Node != nil { - n.Remove(l.Node) + n.RemoveRecursive(l.Node) } } k, err := nd.Key() @@ -120,6 +121,14 @@ func (n *dagService) Remove(nd *Node) error { return n.Blocks.DeleteBlock(k) } +func (n *dagService) Remove(nd *Node) error { + k, err := nd.Key() + if err != nil { + return err + } + return n.Blocks.DeleteBlock(k) +} + // FetchGraph fetches all nodes that are children of the given node func FetchGraph(ctx context.Context, root *Node, serv DAGService) error { return EnumerateChildrenAsync(ctx, serv, root, key.NewKeySet()) diff --git a/merkledag/utils/utils.go b/merkledag/utils/utils.go index b8dde47e7..35730f48d 100644 --- a/merkledag/utils/utils.go +++ b/merkledag/utils/utils.go @@ -40,6 +40,8 @@ func addLink(ctx context.Context, ds dag.DAGService, root *dag.Node, childname s return nil, err } + _ = ds.Remove(root) + // ensure no link with that name already exists _ = root.RemoveNodeLink(childname) // ignore error, only option is ErrNotFound @@ -83,6 +85,8 @@ func insertNodeAtPath(ctx context.Context, ds dag.DAGService, root *dag.Node, pa return nil, err } + _ = ds.Remove(root) + _ = root.RemoveNodeLink(path[0]) err = root.AddNodeLinkClean(path[0], ndprime) if err != nil { @@ -133,6 +137,8 @@ func rmLink(ctx context.Context, ds dag.DAGService, root *dag.Node, path []strin return nil, err } + _ = ds.Remove(root) + _ = root.RemoveNodeLink(path[0]) err = root.AddNodeLinkClean(path[0], nnode) if err != nil {