@cryptotaxi247 / kubo / commits / 8f97786e4

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 +}