comments and optimize potential rebalances
License: MIT Signed-off-by: Jeromy <jeromyj@gmail.com>
Jeromy committed
Apr 1, 2017 at 10:04 UTC
8f97786e490698f6371356a2468d247904e949c7
2 files changed
+61
-6
merkledag/utils/diffenum.go
+20
-6
@@ -28,13 +28,24 @@ func DiffEnumerate(ctx context.Context, dserv node.NodeGetter, from, to *cid.Cid
28
29
sset := cid.NewSet()
30
for _, c := range diff {
31
- if c.a == nil {
32
- err := mdag.EnumerateChildrenAsync(ctx, mdag.GetLinksDirect(dserv), c.b, sset.Visit)
31
+ // Since we're already assuming we have everything in the 'from' graph,
32
+ // add all those cids to our 'already seen' set to avoid potentially
33
+ // enumerating them later
34
+ if c.bef != nil {
35
+ sset.Add(c.bef)
36
+ }
37
+ }
38
+ for _, c := range diff {
39
+ if c.bef == nil {
40
+ if sset.Has(c.aft) {
41
+ continue
42
+ }
43
+ err := mdag.EnumerateChildrenAsync(ctx, mdag.GetLinksDirect(dserv), c.aft, sset.Visit)
44
if err != nil {
45
return err
46
}
47
} else {
37
- err := DiffEnumerate(ctx, dserv, c.a, c.b)
48
+ err := DiffEnumerate(ctx, dserv, c.bef, c.aft)
49
if err != nil {
50
return err
51
}
@@ -45,9 +56,12 @@ func DiffEnumerate(ctx context.Context, dserv node.NodeGetter, from, to *cid.Cid
56
}
57
58
type diffpair struct {
48
- a, b *cid.Cid
59
+ bef, aft *cid.Cid
60
}
61
62
+// getLinkDiff returns a changset (minimum edit distance style) between nodes
63
+// 'a' and 'b'. Currently does not log deletions as our usecase doesnt call for
64
+// this.
65
func getLinkDiff(a, b node.Node) []diffpair {
66
have := make(map[string]*node.Link)
67
names := make(map[string]*node.Link)
@@ -65,11 +79,11 @@ func getLinkDiff(a, b node.Node) []diffpair {
79
80
match, ok := names[l.Name]
81
if !ok {
68
- out = append(out, diffpair{b: l.Cid})
82
+ out = append(out, diffpair{aft: l.Cid})
83
continue
84
}
85
72
- out = append(out, diffpair{a: match.Cid, b: l.Cid})
86
+ out = append(out, diffpair{bef: match.Cid, aft: l.Cid})
87
}
88
return out
89
}
merkledag/utils/diffenum_test.go
+41
@@ -70,6 +70,20 @@ var tg2 = map[string]ndesc{
70
"d": ndesc{},
71
}
72
73
+var tg3 = map[string]ndesc{
74
+ "a1": ndesc{
75
+ "foo": "b",
76
+ "bar": "c",
77
+ },
78
+ "b": ndesc{},
79
+ "a2": ndesc{
80
+ "foo": "b",
81
+ "bar": "d",
82
+ },
83
+ "c": ndesc{},
84
+ "d": ndesc{},
85
+}
86
+
87
func TestDiffEnumBasic(t *testing.T) {
88
ctx, cancel := context.WithCancel(context.Background())
89
defer cancel()
@@ -121,6 +135,7 @@ func assertCidList(a, b []*cid.Cid) error {
135
}
136
return nil
137
}
138
+
139
func TestDiffEnumFail(t *testing.T) {
140
ctx, cancel := context.WithCancel(context.Background())
141
defer cancel()
@@ -147,3 +162,29 @@ func TestDiffEnumFail(t *testing.T) {
162
}
163
164
}
165
+
166
+func TestDiffEnumRecurse(t *testing.T) {
167
+ ctx, cancel := context.WithCancel(context.Background())
168
+ defer cancel()
169
+ nds := mkGraph(tg3)
170
+
171
+ ds := mdtest.Mock()
172
+ lgds := &getLogger{ds: ds}
173
+
174
+ for _, s := range []string{"a1", "a2", "b", "c", "d"} {
175
+ _, err := ds.Add(nds[s])
176
+ if err != nil {
177
+ t.Fatal(err)
178
+ }
179
+ }
180
+
181
+ err := DiffEnumerate(ctx, lgds, nds["a1"].Cid(), nds["a2"].Cid())
182
+ if err != nil {
183
+ t.Fatal(err)
184
+ }
185
+
186
+ err = assertCidList(lgds.log, []*cid.Cid{nds["a1"].Cid(), nds["a2"].Cid(), nds["c"].Cid(), nds["d"].Cid()})
187
+ if err != nil {
188
+ t.Fatal(err)
189
+ }
190
+}