Skip to content

Reject stale CQ callbacks after socket revival - #3412

Open
legionxiong wants to merge 1 commit into
apache:masterfrom
legionxiong:fix-rdma-stale-cq-callback
Open

Reject stale CQ callbacks after socket revival#3412
legionxiong wants to merge 1 commit into
apache:masterfrom
legionxiong:fix-rdma-stale-cq-callback

Conversation

@legionxiong

@legionxiong legionxiong commented Jul 27, 2026

Copy link
Copy Markdown
Contributor

What problem does this PR solve?

Issue Number: resolves #3410

Problem Summary:

An RDMA completion-queue callback may remain queued after its endpoint is
reset. If the main socket is later revived with a new CQ, the stale callback
can successfully acquire the revived socket and continue operating on the
endpoint's new generation.

This may cause the stale callback to access invalid or mismatched RDMA
resources in RdmaEndpoint::PollCq, potentially resulting in a crash.

What is changed and the side effects?

Changed:

  • Verify that the CQ socket passed to RdmaEndpoint::PollCq still matches the
    endpoint's current _cq_sid.
  • Return immediately when the callback belongs to an older CQ generation.
  • Add a regression test covering a stale callback running after the endpoint
    has switched to a new CQ.

Side effects:

  • Performance effects: One SocketId comparison is added to each PollCq
    invocation. The overhead is negligible.

  • Breaking backward compatibility: No.

A CQ callback can remain queued across Reset() and run after the main
socket has been revived with a different CQ. Verify that the callback's
CQ SocketId still matches the endpoint before accessing RDMA resources.
Add a regression test covering a stale callback from an older
generation.

Signed-off-by: Lijin Xiong <legion.xiong@gmail.com>
@legionxiong
legionxiong force-pushed the fix-rdma-stale-cq-callback branch from 831b4fc to 010a3e1 Compare July 27, 2026 05:29
@legionxiong legionxiong changed the title fix(rdma): reject stale CQ callbacks after socket revival Reject stale CQ callbacks after socket revival Jul 27, 2026
@wwbmmm
wwbmmm requested review from Copilot and yanglimingcn July 30, 2026 05:18

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR hardens RDMA completion-queue (CQ) polling against “stale” queued callbacks that can survive an endpoint Reset/Revive cycle and inadvertently operate on a new CQ/resource generation. It does so by validating that the CQ socket invoking RdmaEndpoint::PollCq is still the endpoint’s current CQ socket, and adds a regression test to prevent reintroducing the crash class described in #3410.

Changes:

  • Add a guard in RdmaEndpoint::PollCq to immediately return when the callback’s CQ socket ID does not match the endpoint’s current _cq_sid.
  • Add a unit test that exercises PollCq with a “stale” CQ socket to ensure it does not touch the new/current generation.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated no comments.

File Description
test/brpc_rdma_unittest.cpp Adds a regression test for stale CQ callbacks not polling a new generation.
src/brpc/rdma/rdma_endpoint.cpp Rejects PollCq execution when invoked by a non-current CQ socket (m->id() != ep->_cq_sid).

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[RDMA] stale PollCq callback can survive Reset/Revive and poll a new-generation CQ

2 participants