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
}