Skip to content
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
fix: traverser should skip over identity CIDs
  • Loading branch information
rvagg committed Sep 19, 2023
commit dd7e70e4efbc6c207b4eacbc2538c76488763af7
19 changes: 19 additions & 0 deletions ipldutil/traverser.go
Original file line number Diff line number Diff line change
@@ -1,17 +1,20 @@
package ipldutil

import (
"bytes"
"context"
"errors"
"io"
"sync"

"github.com/ipfs/go-cid"
dagpb "github.com/ipld/go-codec-dagpb"
"github.com/ipld/go-ipld-prime"
cidlink "github.com/ipld/go-ipld-prime/linking/cid"
"github.com/ipld/go-ipld-prime/node/basicnode"
"github.com/ipld/go-ipld-prime/traversal"
"github.com/ipld/go-ipld-prime/traversal/selector"
"github.com/multiformats/go-multihash"

"github.com/filecoin-project/boost-graphsync/panics"
)
Expand Down Expand Up @@ -165,7 +168,23 @@ func (t *traverser) NBlocksTraversed() int {
return t.blocksCount
}

func asIdentity(c cid.Cid) (digest []byte, ok bool, err error) {
dmh, err := multihash.Decode(c.Hash())
if err != nil {
return nil, false, err
}
ok = dmh.Code == multihash.IDENTITY
digest = dmh.Digest
return digest, ok, nil
}

func (t *traverser) loader(lnkCtx ipld.LinkContext, lnk ipld.Link) (io.Reader, error) {
if digest, ok, err := asIdentity(lnk.(cidlink.Link).Cid); ok {
return io.NopCloser(bytes.NewReader(digest)), nil
} else if err != nil {
return nil, err
}

// A StorageReadOpener call came in; update the state and release the lock.
// We can't simply unlock the mutex inside the <-t.responses case,
// as then we'd deadlock with the other side trying to send.
Expand Down