@cryptotaxi247 / kubo / commits / 97ac9c4e4

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