Skip to content

[fix][broker] Prevent backlog quota cursor updates during topic close#25914

Open
Denovo1998 wants to merge 1 commit into
apache:masterfrom
Denovo1998:backlog_quota_cursor_updates_during_topic_close
Open

[fix][broker] Prevent backlog quota cursor updates during topic close#25914
Denovo1998 wants to merge 1 commit into
apache:masterfrom
Denovo1998:backlog_quota_cursor_updates_during_topic_close

Conversation

@Denovo1998
Copy link
Copy Markdown
Contributor

@Denovo1998 Denovo1998 commented Jun 1, 2026

Follow-up to #25684

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

  • 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:

./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:

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

@Denovo1998
Copy link
Copy Markdown
Contributor Author

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.

1 participant