@cryptotaxi247 / kubo / commits / 006b68b55

WIP: getting closer to being able to write in ipns dirs

Jeromy committed Sep 26, 2014 at 00:09 UTC 006b68b558c0de83db2c5519caae4a4cfc3a46ea
4 files changed +71 -14
fuse/ipns/ipns_unix.go
+17 -5
@@ -296,23 +296,35 @@ func (n *Node) Flush(req *fuse.FlushRequest, intr fs.Intr) fuse.Error {
296 // This operation holds everything in memory,
297 // should be changed to stream the block creation/storage
298 // but for now, since the buf is all in memory anyways...
299 - nnode, err := imp.NewDagFromReader(n.dataBuf)
299 + err := imp.NewDagInNode(n.dataBuf, n.Nd)
300 if err != nil {
301 log.Error("ipns Flush error: %s", err)
302 // return fuse.EVERYBAD
303 return fuse.ENODATA
304 }
305
306 - err = n.Ipfs.DAG.AddRecursive(nnode)
306 + var root *Node
307 + if n.nsRoot != nil {
308 + root = n.nsRoot
309 + } else {
310 + root = n
311 + }
312 +
313 + err = root.Nd.Update()
314 + if err != nil {
315 + log.Error("ipns dag tree update failed: %s", err)
316 + return fuse.ENODATA
317 + }
318 +
319 + err = n.Ipfs.DAG.AddRecursive(root.Nd)
320 if err != nil {
321 log.Critical("ipns Dag Add Error: %s", err)
322 }
323
311 - n.Nd = nnode
324 n.changed = false
325 n.dataBuf = nil
326
315 - ndkey, err := nnode.Key()
327 + ndkey, err := root.Nd.Key()
328 if err != nil {
329 log.Error("getKey error: %s", err)
330 // return fuse.ETHISREALLYSUCKS
@@ -320,7 +332,7 @@ func (n *Node) Flush(req *fuse.FlushRequest, intr fs.Intr) fuse.Error {
332 }
333 log.Debug("Publishing changes!")
334
323 - err = n.Ipfs.Publisher.Publish(n.key, ndkey)
335 + err = n.Ipfs.Publisher.Publish(root.key, ndkey)
336 if err != nil {
337 log.Error("ipns Publish Failed: %s", err)
338 }
importer/importer.go
+22 -1
@@ -14,13 +14,15 @@ var BlockSizeLimit = int64(1048576) // 1 MB
14 // ErrSizeLimitExceeded signals that a block is larger than BlockSizeLimit.
15 var ErrSizeLimitExceeded = fmt.Errorf("object size limit exceeded")
16
17 +var DefaultSplitter = &SizeSplitter{1024 * 512}
18 +
19 // todo: incremental construction with an ipfs node. dumping constructed
20 // objects into the datastore, to avoid buffering all in memory
21
22 // NewDagFromReader constructs a Merkle DAG from the given io.Reader.
23 // size required for block construction.
24 func NewDagFromReader(r io.Reader) (*dag.Node, error) {
23 - return NewDagFromReaderWithSplitter(r, &SizeSplitter{1024 * 512})
25 + return NewDagFromReaderWithSplitter(r, DefaultSplitter)
26 }
27
28 func NewDagFromReaderWithSplitter(r io.Reader, spl BlockSplitter) (*dag.Node, error) {
@@ -58,3 +60,22 @@ func NewDagFromFile(fpath string) (*dag.Node, error) {
60
61 return NewDagFromReader(f)
62 }
63 +
64 +// TODO: this needs a better name
65 +func NewDagInNode(r io.Reader, n *dag.Node) error {
66 + n.Links = nil
67 +
68 + blkChan := DefaultSplitter.Split(r)
69 + first := <-blkChan
70 + n.Data = first
71 +
72 + for blk := range blkChan {
73 + child := &dag.Node{Data: dag.WrapData(blk)}
74 + err := n.AddNodeLink("", child)
75 + if err != nil {
76 + return err
77 + }
78 + }
79 +
80 + return nil
81 +}
merkledag/merkledag.go
+31 -7
@@ -12,7 +12,7 @@ import (
12 u "github.com/jbenet/go-ipfs/util"
13 )
14
15 -var log = logging.MustGetLogger("commands")
15 +var log = logging.MustGetLogger("merkledag")
16
17 // NodeMap maps u.Keys to Nodes.
18 // We cannot use []byte/Multihash for keys :(
@@ -96,6 +96,31 @@ func (n *Node) Key() (u.Key, error) {
96 return u.Key(h), err
97 }
98
99 +// Recursively update all hash links and size values in the tree
100 +func (n *Node) Update() error {
101 + log.Debug("node update")
102 + for _, l := range n.Links {
103 + if l.Node != nil {
104 + err := l.Node.Update()
105 + if err != nil {
106 + return err
107 + }
108 + nhash, err := l.Node.Multihash()
109 + if err != nil {
110 + return err
111 + }
112 + l.Hash = nhash
113 + size, err := l.Node.Size()
114 + if err != nil {
115 + return err
116 + }
117 + l.Size = size
118 + }
119 + }
120 + _, err := n.Encoded(true)
121 + return err
122 +}
123 +
124 // DAGService is an IPFS Merkle DAG service.
125 // - the root is virtual (like a forest)
126 // - stores nodes' data in a BlockService
@@ -134,12 +159,11 @@ func (n *DAGService) AddRecursive(nd *Node) error {
159 }
160
161 for _, link := range nd.Links {
137 - if link.Node == nil {
138 - panic("Why does this node have a nil link?\n")
139 - }
140 - err := n.AddRecursive(link.Node)
141 - if err != nil {
142 - return err
162 + if link.Node != nil {
163 + err := n.AddRecursive(link.Node)
164 + if err != nil {
165 + return err
166 + }
167 }
168 }
169
routing/dht/routing.go
+1 -1
@@ -18,7 +18,7 @@ import (
18 // PutValue adds value corresponding to given Key.
19 // This is the top level "Store" operation of the DHT
20 func (dht *IpfsDHT) PutValue(ctx context.Context, key u.Key, value []byte) error {
21 - log.Debug("[%s] PutValue %v %v", dht.self.ID.Pretty(), key, value)
21 + log.Debug("[%s] PutValue %v %v", dht.self.ID.Pretty(), key.Pretty(), value)
22 err := dht.putLocal(key, value)
23 if err != nil {
24 return err