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