@cryptotaxi247 / kubo / commits / 16e42f82b

fixed ipns file persistence bug

Jeromy committed Oct 4, 2014 at 22:42 UTC 16e42f82b06d229b905352e5033b9bf54161455d
3 files changed +74 -20
core/mock.go
+11 -2
@@ -7,6 +7,7 @@ import (
7 ci "github.com/jbenet/go-ipfs/crypto"
8 mdag "github.com/jbenet/go-ipfs/merkledag"
9 nsys "github.com/jbenet/go-ipfs/namesys"
10 + path "github.com/jbenet/go-ipfs/path"
11 "github.com/jbenet/go-ipfs/peer"
12 mdht "github.com/jbenet/go-ipfs/routing/mock"
13 )
@@ -29,6 +30,7 @@ func NewMockNode() (*IpfsNode, error) {
30
31 // Routing
32 dht := mdht.NewMockRouter(nd.Identity, nd.Datastore)
33 + nd.Routing = dht
34
35 // Bitswap
36 //??
@@ -38,9 +40,16 @@ func NewMockNode() (*IpfsNode, error) {
40 return nil, err
41 }
42
41 - dserv := &mdag.DAGService{bserv}
43 + nd.DAG = &mdag.DAGService{bserv}
44
45 // Namespace resolver
44 - nd.Namesys = nsys.NewMasterResolver(dht, dserv)
46 + nd.Namesys = nsys.NewMasterResolver(dht, nd.DAG)
47 +
48 + // Publisher
49 + nd.Publisher = nsys.NewPublisher(nd.DAG, dht)
50 +
51 + // Path resolver
52 + nd.Resolver = &path.Resolver{nd.DAG}
53 +
54 return nd, nil
55 }
fuse/ipns/ipns_test.go
+57 -16
@@ -6,6 +6,7 @@ import (
6 "io/ioutil"
7 "os"
8 "testing"
9 + "time"
10
11 fstest "github.com/jbenet/go-ipfs/Godeps/_workspace/src/bazil.org/fuse/fs/fstestutil"
12 "github.com/jbenet/go-ipfs/core"
@@ -17,13 +18,40 @@ func randBytes(size int) []byte {
18 return b
19 }
20
20 -func TestIpnsBasicIO(t *testing.T) {
21 - localnode, err := core.NewMockNode()
21 +func writeFile(t *testing.T, size int, path string) ([]byte, error) {
22 + data := randBytes(size)
23 + fi, err := os.Create(path)
24 + if err != nil {
25 + t.Fatal(err)
26 + }
27 +
28 + n, err := fi.Write(data)
29 + if err != nil {
30 + t.Fatal(err)
31 + }
32 +
33 + if n != len(data) {
34 + t.Fatal("Didnt write proper amount!")
35 + }
36 +
37 + err = fi.Close()
38 if err != nil {
39 t.Fatal(err)
40 }
41
26 - fs, err := NewIpns(localnode, "")
42 + return data, nil
43 +}
44 +
45 +func setupIpnsTest(t *testing.T, node *core.IpfsNode) (*core.IpfsNode, *fstest.Mount) {
46 + var err error
47 + if node == nil {
48 + node, err = core.NewMockNode()
49 + if err != nil {
50 + t.Fatal(err)
51 + }
52 + }
53 +
54 + fs, err := NewIpns(node, "")
55 if err != nil {
56 t.Fatal(err)
57 }
@@ -31,40 +59,53 @@ func TestIpnsBasicIO(t *testing.T) {
59 if err != nil {
60 t.Fatal(err)
61 }
62 +
63 + return node, mnt
64 +}
65 +
66 +func TestIpnsBasicIO(t *testing.T) {
67 + _, mnt := setupIpnsTest(t, nil)
68 defer mnt.Close()
69
36 - data := randBytes(12345)
37 - fi, err := os.Create(mnt.Dir + "/local/testfile")
70 + fname := mnt.Dir + "/local/testfile"
71 + data, err := writeFile(t, 12345, fname)
72 if err != nil {
73 t.Fatal(err)
74 }
75
42 - n, err := fi.Write(data)
76 + rbuf, err := ioutil.ReadFile(fname)
77 if err != nil {
78 t.Fatal(err)
79 }
80
47 - if n != len(data) {
48 - t.Fatal("Didnt write proper amount!")
81 + if !bytes.Equal(rbuf, data) {
82 + t.Fatal("Incorrect Read!")
83 }
84 +}
85
51 - fi.Close()
52 -
53 - //TODO: maybe wait for the publish to happen? or not, should test both cases
86 +func TestFilePersistence(t *testing.T) {
87 + node, mnt := setupIpnsTest(t, nil)
88
55 - fi, err = os.Open(mnt.Dir + "/local/testfile")
89 + fname := "/local/atestfile"
90 + data, err := writeFile(t, 127, mnt.Dir+fname)
91 if err != nil {
92 t.Fatal(err)
93 }
94
60 - rbuf, err := ioutil.ReadAll(fi)
95 + // Wait for publish: TODO: make publish happen faster in tests
96 + time.Sleep(time.Millisecond * 40)
97 +
98 + mnt.Close()
99 +
100 + node, mnt = setupIpnsTest(t, node)
101 + defer mnt.Close()
102 +
103 + rbuf, err := ioutil.ReadFile(mnt.Dir + fname)
104 if err != nil {
105 t.Fatal(err)
106 }
64 - fi.Close()
107
108 if !bytes.Equal(rbuf, data) {
67 - t.Fatal("Incorrect Read!")
109 + t.Fatalf("File data changed between mounts! sizes differ: %d != %d", len(data), len(rbuf))
110 }
69 -
111 }
fuse/ipns/ipns_unix.go
+6 -2
@@ -70,7 +70,7 @@ func CreateRoot(n *core.IpfsNode, keys []ci.PrivKey, ipfsroot string) (*Root, er
70 nd := new(Node)
71 nd.Ipfs = n
72 nd.key = k
73 - nd.repub = NewRepublisher(nd, time.Millisecond*10, time.Second)
73 + nd.repub = NewRepublisher(nd, time.Millisecond*5, time.Millisecond*500)
74
75 go nd.repub.Run()
76
@@ -249,6 +249,7 @@ func (n *Node) makeChild(name string, node *mdag.Node) *Node {
249 Nd: node,
250 name: name,
251 nsRoot: n.nsRoot,
252 + parent: n,
253 }
254
255 if n.nsRoot == nil {
@@ -322,11 +323,13 @@ func (n *Node) Flush(req *fuse.FlushRequest, intr fs.Intr) fuse.Error {
323 // folder, bad things would happen.
324 buf := bytes.NewReader(n.writerBuf.Bytes())
325 newNode, err := imp.NewDagFromReader(buf)
326 + log.Debug("flush: new data = %v", newNode.Data)
327 if err != nil {
328 log.Critical("error creating dag from writerBuf: %s", err)
329 return err
330 }
331 if n.parent != nil {
332 + log.Debug("updating self in parent!")
333 err := n.parent.update(n.name, newNode)
334 if err != nil {
335 log.Critical("error in updating ipns dag tree: %s", err)
@@ -529,6 +532,7 @@ func (n *Node) Rename(req *fuse.RenameRequest, newDir fs.Node, intr fs.Intr) fus
532 }
533
534 func (n *Node) update(name string, newnode *mdag.Node) error {
535 + log.Debug("update '%s' in '%s'", name, n.name)
536 nnode := n.Nd.Copy()
537 err := nnode.RemoveNodeLink(name)
538 if err != nil {
@@ -537,7 +541,7 @@ func (n *Node) update(name string, newnode *mdag.Node) error {
541 nnode.AddNodeLink(name, newnode)
542
543 if n.parent != nil {
540 - err := n.parent.update(n.name, newnode)
544 + err := n.parent.update(n.name, nnode)
545 if err != nil {
546 return err
547 }