Skip to content

Commit d5be896

Browse files
committed
blockservice: optimize getBlocks filter by not rescanning the already valid leading elements
We would scan the valid leading elements twice.
1 parent c7f33e6 commit d5be896

File tree

1 file changed

+7
-6
lines changed

1 file changed

+7
-6
lines changed

blockservice/blockservice.go

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -321,18 +321,19 @@ func getBlocks(ctx context.Context, ks []cid.Cid, blockservice BlockService, fet
321321

322322
allowlist := grabAllowlistFromBlockservice(blockservice)
323323

324-
allValid := true
325-
for _, c := range ks {
324+
var lastAllValidIndex int
325+
var c cid.Cid
326+
for lastAllValidIndex, c = range ks {
326327
if err := verifcid.ValidateCid(allowlist, c); err != nil {
327-
allValid = false
328328
break
329329
}
330330
}
331331

332-
if !allValid {
332+
if lastAllValidIndex != len(ks) {
333333
// can't shift in place because we don't want to clobber callers.
334-
ks2 := make([]cid.Cid, 0, len(ks))
335-
for _, c := range ks {
334+
ks2 := make([]cid.Cid, lastAllValidIndex, len(ks))
335+
copy(ks2, ks[:lastAllValidIndex]) // fast path for already filtered elements
336+
for _, c := range ks[lastAllValidIndex:] { // don't rescan already scanned elements
336337
// hash security
337338
if err := verifcid.ValidateCid(allowlist, c); err == nil {
338339
ks2 = append(ks2, c)

0 commit comments

Comments
 (0)