Denovo1998 opened a new pull request, #25914:
URL: https://github.com/apache/pulsar/pull/25914

   <!--
   ### Contribution Checklist
   
     - PR title format should be *[type][component] summary*. The valid 
`[type]` and `[component]`/scope
       prefixes are enforced by CI (see 
`.github/workflows/ci-semantic-pull-request.yml`); for details,
       see *[Guideline - Pulsar PR Naming 
Convention](https://pulsar.apache.org/contribute/develop-semantic-title/)*.
   
     - Fill out the template below to describe the changes contributed by the 
pull request. That will give reviewers the context they need to do the review.
   
     - The **Motivation** and **Modifications** sections are required: explain 
*why* (the problem/context)
       and *what/how* (the change). A title alone, or a description that only 
restates the title, is not enough.
   
     - Each pull request should address only one issue, not mix up code from 
multiple issues.
   
     - Each commit in the pull request has a meaningful commit message
   
     - For the local build/test/PR workflow see `CONTRIBUTING.md`, and for 
coding conventions see
       `CODING.md`. If you use an AI coding assistant, see `AGENTS.md`.
   
     - Once all items of the checklist are addressed, remove the above text and 
this checklist, leaving only the filled out template below.
   -->
   
   Follow-up to #25684
   
   <!-- Details of when a PIP is required and how the PIP process work, please 
see: https://github.com/apache/pulsar/blob/master/pip/README.md -->
   
   ### Motivation
   
   `BacklogQuotaManager` already skips backlog quota handling when a topic is 
fenced or closing/deleting. However, the previous guard only checked the topic 
state when entering `handleExceededBacklogQuota`.
   
   If a topic starts closing after that initial check but before the eviction 
path mutates the slowest cursor, backlog quota eviction can still call 
`skipEntries` or `markDelete` while the close/delete path is tearing down the 
same topic. This follow-up hardens that race without changing the existing 
fenced-topic behavior from #25684.
   
   ### Modifications
   
   - Recheck `PersistentTopic#isClosingOrDeleting()` immediately before direct 
cursor mutations in backlog quota eviction.
   - Stop size-based eviction before `ManagedCursor#skipEntries` if the topic 
starts closing.
   - Stop non-precise time-based eviction before `ManagedCursor#markDelete` if 
the topic starts closing.
   - Clarify the existing fenced/closing skip comment so transient fenced 
topics are not described as entries being discarded.
   - Add a no-op `@VisibleForTesting` hook to coordinate deterministic race 
reproduction without changing production behavior.
   - Add real broker/topic race tests that close a topic after the initial 
backlog quota guard but before cursor mutation, and verify the cursor 
mark-delete position does not move.
   
   ### Verifying this change
   
   - [x] Make sure that the change passes the CI checks.
   
   This change added tests and can be verified as follows:
   
   - Added 
`BacklogQuotaManagerTest.testSizeBacklogEvictionRaceWithTopicCloseDoesNotSkipEntries`
   - Added 
`BacklogQuotaManagerTest.testTimeBacklogEvictionRaceWithTopicCloseDoesNotMarkDelete`
   
   Verified locally with:
   
   ```bash
   ./gradlew :pulsar-broker:test --tests 
"org.apache.pulsar.broker.service.BacklogQuotaManagerTest.testSizeBacklogEvictionRaceWithTopicCloseDoesNotSkipEntries"
 --tests 
"org.apache.pulsar.broker.service.BacklogQuotaManagerTest.testTimeBacklogEvictionRaceWithTopicCloseDoesNotMarkDelete"
   ./gradlew :pulsar-broker:test --tests 
"org.apache.pulsar.broker.service.BacklogQuotaManagerTest"
   ./gradlew :pulsar-broker:spotlessCheck :pulsar-broker:checkstyleMain 
:pulsar-broker:checkstyleTest
   git diff --check
   
   ### Does this pull request potentially affect one of the following parts:
   
   <!-- DO NOT REMOVE THIS SECTION. CHECK THE PROPER BOX ONLY. -->
   
   *If the box was checked, please highlight the changes*
   
   - [ ] Dependencies (add or upgrade a dependency)
   - [ ] The public API
   - [ ] The schema
   - [ ] The default values of configurations
   - [ ] The threading model
   - [ ] The binary protocol
   - [ ] The REST endpoints
   - [ ] The admin CLI options
   - [ ] The metrics
   - [ ] Anything that affects deployment


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to