-
Notifications
You must be signed in to change notification settings - Fork 6
feat: add "getclosestpeers" support (IPIP-476) #124
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
i've pushed some changes (fixed router wiring, added tests, changelog) so would be good to have 👍 from @guillaumemichel or @hsanjuan
i also tested it locally as a demon and cli and works as expected (cli will work out of the box once we deploy this to delegated-ipfs.dev)
|
@lidel thank you, LGTM. |
guillaumemichel
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Two minor comments
GetClosestPeers endpoint was returning empty results or errors: 1. composableRouter.dht field was nil - the server never created a dht router, so GetClosestPeers always returned empty. Fixed by calling getCombinedRouting to create dhtRouters and passing it to the handler. 2. libp2pRouter type switch didn't handle bundledDHT (the default when SOMEGUY_DHT=accelerated), causing "cannot call GetClosestPeers on DHT implementation" error. Fixed by adding bundledDHT case that delegates to the active DHT (fullRT or standard). 3. dual.DHT case failed entirely when LAN lookup errored, even if WAN succeeded. Fixed to log LAN errors but continue with WAN results.
- add 10 test cases for GET /routing/v1/dht/closest/peers/{key}
- verify 20 peers returned with unique addresses (127.0.0.1-127.0.0.20)
- test JSON and NDJSON response formats
- test empty results, ErrNotFound, and invalid key handling
- test different key formats (CID, PeerID as CID)
- test Accept header handling (default, wildcard)
- verify response headers (Cache-Control, Content-Type, Vary, Last-Modified)
- add makePeerRecords helper to generate test fixtures
- use cid.Parse instead of cid.Decode for consistency with other CLI commands - remove TODO comment in cachedRouter.GetClosestPeers - clarify UsageText to specify DHT-closest peers - add private address filtering in sanitizeRouter.GetClosestPeers
add missing addrs to GetClosestPeers to ensure light clients do not have to do extra lookups after addrs expired in regular libp2p peerbook. - add addrQueryOriginClosestPeers constant for metrics tracking - make queryOrigin configurable in cacheFallbackIter - create applyPeerRecordCaching helper to abstract type conversions - update GetClosestPeers to apply caching via helper - add tests for cache hit and FindPeers fallback scenarios
LAN DHT contains private network peers that should not be exposed via public HTTP Routing API. This fix ensures only WAN DHT results are returned to external clients.
- add parseKey() helper that accepts CIDs and legacy peer ID formats - change default endpoint for CLI commands to delegated-ipfs.dev - keep cid.contact as default for daemon mode
- document new /routing/v1/peers/closest/{key} endpoint (IPIP-476)
- note CLI default endpoint change to delegated-ipfs.dev
- update dependency versions
42bd221 to
0dad3f7
Compare
…sabled fixes two issues with the GetClosestPeers endpoint: 1. endpoint returned HTTP 200 with empty results instead of actual DHT peers 2. when DHT disabled, returned HTTP 200 with empty results instead of error root cause: during rebase of PR #124 (commit 0dad3f7) when integrating with autoconf refactor (PR #123 / ec76365), the dhtRouters initialization was accidentally omitted from server.go. the autoconf PR renamed getCombinedRouting to combineRouters and changed its signature, but the rebase failed to preserve the dhtRouters creation line that existed in commit 42bd221. changes: - server.go:201-208: add explicit dhtRouters creation with caching and sanitization, similar to original 42bd221 implementation - server.go:232: wire dhtRouters to composableRouter.dht field - server.go:338: update combineRouters signature to accept host.Host parameter needed for GetClosestPeers peerstore lookups - server_routers.go:73-77: return routing.ErrNotSupported instead of empty iterator when DHT is nil, resulting in HTTP 500 instead of misleading HTTP 200 - server_test.go:16,20,24: update combineRouters test calls with new signature - server_dht_test.go:355-379: add test verifying HTTP 500 when DHT disabled
…sabled (#127) fixes two issues with the GetClosestPeers endpoint: 1. endpoint returned HTTP 200 with empty results instead of actual DHT peers 2. when DHT disabled, returned HTTP 200 with empty results instead of error root cause: during rebase of PR #124 (commit 0dad3f7) when integrating with autoconf refactor (PR #123 / ec76365), the dhtRouters initialization was accidentally omitted from server.go. the autoconf PR renamed getCombinedRouting to combineRouters and changed its signature, but the rebase failed to preserve the dhtRouters creation line that existed in commit 42bd221. changes: - server.go:201-208: add explicit dhtRouters creation with caching and sanitization, similar to original 42bd221 implementation - server.go:232: wire dhtRouters to composableRouter.dht field - server.go:338: update combineRouters signature to accept host.Host parameter needed for GetClosestPeers peerstore lookups - server_routers.go:73-77: return routing.ErrNotSupported instead of empty iterator when DHT is nil, resulting in HTTP 500 instead of misleading HTTP 200 - server_test.go:16,20,24: update combineRouters test calls with new signature - server_dht_test.go:355-379: add test verifying HTTP 500 when DHT disabled
TODO