dedup keys in GetMany
Otherwise, GetMany on the children of a node with duplicate links may fail License: MIT Signed-off-by: Steven Allen <steven@stebalien.com>
Steven Allen committed
Mar 28, 2018 at 13:41 UTC
97ac9c4e4f345c1bbd32f22c66984dcc06639408
1 file changed
+13
merkledag/merkledag.go
+13
@@ -201,7 +201,20 @@ func (n *dagService) GetMany(ctx context.Context, keys []*cid.Cid) <-chan *ipld.
201
return getNodesFromBG(ctx, n.Blocks, keys)
202
}
203
204
+func dedupKeys(keys []*cid.Cid) []*cid.Cid {
205
+ set := cid.NewSet()
206
+ for _, c := range keys {
207
+ set.Add(c)
208
+ }
209
+ if set.Len() == len(keys) {
210
+ return keys
211
+ }
212
+ return set.Keys()
213
+}
214
+
215
func getNodesFromBG(ctx context.Context, bs bserv.BlockGetter, keys []*cid.Cid) <-chan *ipld.NodeOption {
216
+ keys = dedupKeys(keys)
217
+
218
out := make(chan *ipld.NodeOption, len(keys))
219
blocks := bs.GetBlocks(ctx, keys)
220
var count int