[ISSUE #10446] Support batch deletion of topics and subscription groups in broker#10448
Conversation
There was a problem hiding this comment.
Pull request overview
Note
Copilot was unable to run its full agentic suite in this review.
Adds broker/admin support for batch deletion of topics and subscription groups via new remoting request codes and request bodies, plus client APIs and broker-side handling.
Changes:
- Introduce new request bodies and request codes for batch-delete operations.
- Implement broker processor logic to delete topic/group lists (including dedup + optional cleanup behaviors).
- Add persistence helpers for batch config deletion and tests covering the new admin paths.
Reviewed changes
Copilot reviewed 8 out of 8 changed files in this pull request and generated 5 comments.
Show a summary per file
| File | Description |
|---|---|
| remoting/src/main/java/org/apache/rocketmq/remoting/protocol/body/DeleteTopicListRequestBody.java | Adds request body for batch topic deletion. |
| remoting/src/main/java/org/apache/rocketmq/remoting/protocol/body/DeleteSubscriptionGroupListRequestBody.java | Adds request body for batch subscription-group deletion (with cleanOffset flag). |
| remoting/src/main/java/org/apache/rocketmq/remoting/protocol/RequestCode.java | Adds new request codes for batch delete operations. |
| client/src/main/java/org/apache/rocketmq/client/impl/MQClientAPIImpl.java | Adds client APIs to invoke the new batch delete broker requests. |
| broker/src/test/java/org/apache/rocketmq/broker/processor/AdminBrokerProcessorTest.java | Adds unit tests for batch deletion request handling and persistence behavior. |
| broker/src/main/java/org/apache/rocketmq/broker/topic/TopicConfigManager.java | Adds batch topic-config deletion with single persist/update. |
| broker/src/main/java/org/apache/rocketmq/broker/subscription/SubscriptionGroupManager.java | Adds batch subscription-group deletion with single persist/update. |
| broker/src/main/java/org/apache/rocketmq/broker/processor/AdminBrokerProcessor.java | Routes new request codes and implements batch delete handlers; refactors pop retry topic collection. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
oss-sentinel-ai
left a comment
There was a problem hiding this comment.
Review by github-manager-bot
Summary
This PR addresses two related performance issues in AdminBrokerProcessor:
- Removes
synchronizedfromdeleteTopicsincetopicConfigTableis already aConcurrentHashMap - Adds batch deletion APIs (
DELETE_TOPIC_IN_BROKER_LISTandDELETE_SUBSCRIPTIONGROUP_LIST) to reduce network round-trips
Findings
- [Good] AdminBrokerProcessor.java:769 — Removed
synchronizedfromdeleteTopic. The underlyingtopicConfigTableis aConcurrentHashMap, so per-keyremoveis atomic. This eliminates unnecessary serialization of concurrent admin delete requests. - [Good] AdminBrokerProcessor.java — Added
deleteTopicList()anddeleteSubscriptionGroupList()handlers following the existing*_LISTconvention (consistent withUPDATE_AND_CREATE_TOPIC_LIST). - [Good] DeleteTopicListRequestBody.java / DeleteSubscriptionGroupListRequestBody.java — Clean request body classes extending
RemotingSerializable, following existing patterns. - [Good] MQClientAPIImpl.java:2202-2220 / 2281-2301 — Client-side batch deletion methods properly implemented with timeout handling.
- [Good] RequestCode.java — Added
DELETE_TOPIC_IN_BROKER_LISTandDELETE_SUBSCRIPTIONGROUP_LISTrequest codes. - [Good] TopicConfigManager.java / SubscriptionGroupManager.java — Added
deleteTopicList()anddeleteSubscriptionGroupList()batch methods. - [Good] AdminBrokerProcessorTest.java — Comprehensive test coverage including:
- Empty list validation (returns INVALID_PARAMETER)
- System topic rejection in batch
- Happy path with multiple topics
- Duplicate handling in batch
- Batch persist verification
Analysis
The implementation is well-structured:
- Backward compatibility: Existing single-item deletion APIs remain unchanged
- Consistent patterns: Follows the
*_LISTconvention established byCreateTopicListRequestBody - Proper validation: Empty lists and system topics are rejected
- Test coverage: Edge cases are well covered
Suggestions
- Consider adding a maximum batch size limit to prevent excessive memory usage or long-running operations.
- The batch persist test verifies deduplication — good attention to edge cases.
Verdict
✅ Approved — Well-designed performance optimization with proper validation and comprehensive test coverage.
Automated review by github-manager-bot
b3e851d to
75ae0ef
Compare
75ae0ef to
53cda76
Compare
53cda76 to
6bebee2
Compare
…n groups in broker - Add DELETE_TOPIC_IN_BROKER_LIST and DELETE_SUBSCRIPTIONGROUP_LIST request codes with corresponding RequestBody types - Implement deleteTopicList / deleteSubscriptionGroupList in AdminBrokerProcessor with deduplication and one-shot persist - Add deleteTopicConfigList / deleteSubscriptionGroupConfigList in TopicConfigManager / SubscriptionGroupManager (single persist per batch) - Add MQClientAPIImpl#deleteTopicInBrokerList / deleteSubscriptionGroupList client APIs - Cover changes with unit tests in AdminBrokerProcessorTest
6bebee2 to
2ac8039
Compare
Which Issue(s) This PR Fixes
Fixes #10446
Brief Description
Adds two new batch admin APIs to
AdminBrokerProcessorwhose names follow the existing*_LISTconvention (e.g.UPDATE_AND_CREATE_TOPIC_LIST,UPDATE_AND_CREATE_SUBSCRIPTIONGROUP_LIST):DELETE_TOPIC_IN_BROKER_LISTDELETE_SUBSCRIPTIONGROUP_LISTBulk metadata cleanup (e.g. tenant decommissioning, retention purge, cluster migration) currently requires N round-trips to delete N items and triggers N
persist()calls on the broker config files. These new APIs allow doing the same in 1 RPC + 1 persist + 1messageStore.deleteTopics(Set)call.Changes
RequestCode: addDELETE_TOPIC_IN_BROKER_LISTandDELETE_SUBSCRIPTIONGROUP_LIST.DeleteTopicListRequestBody { List<String> topicList }DeleteSubscriptionGroupListRequestBody { List<String> groupNameList; boolean cleanOffset }TopicConfigManager#deleteTopicConfigList(List<String>)andSubscriptionGroupManager#deleteSubscriptionGroupConfigList(List<String>): aggregatepersist()once per batch.AdminBrokerProcessor:collectPopRetryTopics(...)shared helper used by both single and batch paths.deleteTopicList(...)anddeleteSubscriptionGroupList(...)(bothsynchronized, consistent with existing single APIs) with input dedup (preserving order), system-topic / blank validation, one-shot persist, and one-shotmessageStore.deleteTopics(...)call.MQClientAPIImpl: adddeleteTopicInBrokerList(...)anddeleteSubscriptionGroupList(...)client helpers; both use an explicit null check (instead ofassert) so callers get a deterministicMQClientException(SYSTEM_ERROR, ...)wheninvokeSyncreturns null.Compatibility
DELETE_TOPIC_IN_BROKER/DELETE_SUBSCRIPTIONGROUPrequest codes and methods are unchanged; existing clients are not affected.*_LISTrequest codes are additive; older brokers will fall through togetUnknownCmdResponse, so older clients/brokers continue to work as today.How Did You Test This Change?
New unit tests added in
AdminBrokerProcessorTest:testDeleteTopicListInBroker— covers empty input, system-topic rejection, and the success path.testDeleteTopicListBatchPersist— verifies that:deleteTopicConfigListis invoked once (sopersist()runs once for the whole batch),deleteTopicConfigis not called on the batch path,messageStore.deleteTopics(...)is invoked once with the batched set,testDeleteSubscriptionGroupList— covers empty input and the success path withcleanOffset=true.Local verification: