Skip to content

[ISSUE #1367]🚀Client Supports request code SetMessageRequestMode (401) #1395

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

Merged
merged 1 commit into from
Nov 28, 2024

Conversation

mxsm
Copy link
Owner

@mxsm mxsm commented Nov 28, 2024

Which Issue(s) This PR Fixes(Closes)

Fixes #1367

Brief Description

How Did You Test This Change?

Summary by CodeRabbit

Release Notes

  • New Features

    • Introduced DefaultMQAdminExt and DefaultMQAdminExtImpl for asynchronous management of RocketMQ brokers.
    • Added functionality to set message request modes for topics and consumer groups.
  • Enhancements

    • Increased visibility of several structs and modules, allowing broader access for integration and usage.
    • Improved error handling for MQClientError to provide more context.
  • Documentation

    • Updated module visibility in rocketmq-tools to enhance accessibility.

Copy link
Contributor

coderabbitai bot commented Nov 28, 2024

Walkthrough

This pull request introduces multiple changes across various files in the RocketMQ client and tools. Key modifications include altering the visibility of several structs and modules from pub(crate) to pub, enhancing their accessibility. Additionally, a new method for setting message request modes is added to the MQClientAPIImpl. New modules and structs for asynchronous management of RocketMQ brokers are introduced in the rocketmq-tools directory, along with updates to the ToolsError enum for better error handling.

Changes

File Path Change Summary
rocketmq-client/src/consumer/consumer_impl/pull_request_ext.rs Changed visibility of PullResultExt struct and its fields from pub(crate) to pub.
rocketmq-client/src/consumer/mq_consumer_inner.rs Changed visibility of MQConsumerInnerImpl struct from pub(crate) to pub.
rocketmq-client/src/implementation/mq_client_api_impl.rs Added method set_message_request_mode to MQClientAPIImpl for configuring message request modes.
rocketmq-client/src/lib.rs Changed visibility of factory module from private to public.
rocketmq-client/src/producer/producer_impl/mq_producer_inner.rs Changed visibility of MQProducerInnerImpl struct from pub(crate) to pub.
rocketmq-tools/Cargo.toml Added dependencies rocketmq-client-rust and lazy_static, and updated trait-variant declaration format.
rocketmq-tools/src/admin.rs Changed visibility of existing modules to public and added new public modules default_mq_admin_ext and default_mq_admin_ext_impl.
rocketmq-tools/src/admin/default_mq_admin_ext.rs Introduced DefaultMQAdminExt struct with multiple asynchronous methods for managing RocketMQ brokers.
rocketmq-tools/src/admin/default_mq_admin_ext_impl.rs Introduced DefaultMQAdminExtImpl struct with numerous asynchronous methods for message queue administration.
rocketmq-tools/src/lib.rs Changed visibility of admin and tools_error modules from private to public.
rocketmq-tools/src/tools_error.rs Updated MQClientError variant in ToolsError enum to include associated error type for enhanced error context.

Assessment against linked issues

Objective Addressed Explanation
Support for request code SetMessageRequestMode (1367)

Possibly related issues

Possibly related PRs

Suggested labels

feature, approved, auto merge, AI review first

Suggested reviewers

  • SpaceXCN
  • TeslaRustor

🐰 In the meadow, changes bloom,
Structs and modules make more room.
With requests set and errors clear,
RocketMQ's future is bright and near!
Hopping forward, let’s embrace the cheer! 🌼


Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

@rocketmq-rust-bot
Copy link
Collaborator

🔊@mxsm 🚀Thanks for your contribution 🎉. CodeRabbit(AI) will review your code first 🔥

@rocketmq-rust-robot rocketmq-rust-robot added this to the v0.4.0 milestone Nov 28, 2024
@rocketmq-rust-robot rocketmq-rust-robot added the feature🚀 Suggest an idea for this project. label Nov 28, 2024
Copy link

codecov bot commented Nov 28, 2024

Codecov Report

Attention: Patch coverage is 0% with 999 lines in your changes missing coverage. Please review.

Project coverage is 21.29%. Comparing base (9c17b8f) to head (1952eda).
Report is 1 commits behind head on main.

Files with missing lines Patch % Lines
...ketmq-tools/src/admin/default_mq_admin_ext_impl.rs 0.00% 490 Missing ⚠️
rocketmq-tools/src/admin/default_mq_admin_ext.rs 0.00% 473 Missing ⚠️
...mq-client/src/implementation/mq_client_api_impl.rs 0.00% 36 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main    #1395      +/-   ##
==========================================
- Coverage   21.67%   21.29%   -0.39%     
==========================================
  Files         440      442       +2     
  Lines       55661    56660     +999     
==========================================
  Hits        12065    12065              
- Misses      43596    44595     +999     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

@rocketmq-rust-bot rocketmq-rust-bot merged commit 89ca7d8 into main Nov 28, 2024
21 of 24 checks passed
@rocketmq-rust-bot rocketmq-rust-bot added approved PR has approved and removed ready to review waiting-review waiting review this PR labels Nov 28, 2024
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 3

🧹 Outside diff range and nitpick comments (16)
rocketmq-tools/src/lib.rs (1)

19-20: Consider adding module-level documentation.

Since these modules are now part of the public API, they should be properly documented to help users understand their purpose and usage.

Add module documentation like this:

+/// Admin module provides administrative functionality for RocketMQ operations.
 pub mod admin;
+/// Error types specific to RocketMQ tools operations.
 pub mod tools_error;
rocketmq-tools/src/admin.rs (1)

18-19: LGTM! New modules for enhanced admin functionality.

The addition of default_mq_admin_ext and default_mq_admin_ext_impl modules aligns with the PR objective of implementing SetMessageRequestMode support and follows Rust's module organization practices.

Consider adding module-level documentation (//! comments) to describe the purpose and relationship between these modules, especially how they relate to SetMessageRequestMode functionality.

rocketmq-client/src/consumer/consumer_impl/pull_request_ext.rs (1)

19-23: Add documentation for the struct and its fields.

Consider adding rustdoc comments to document the purpose of the struct and its fields, especially since this is now a public API.

+/// Extends the pull result with additional metadata for message processing
 pub struct PullResultExt {
+    /// The original pull result
     pub pull_result: PullResult,
+    /// ID of the suggested broker for subsequent operations
     pub suggest_which_broker_id: u64,
+    /// Optional binary payload of the message
     pub message_binary: Option<bytes::Bytes>,
+    /// Optional difference in offset
     pub offset_delta: Option<i64>,
 }
rocketmq-client/src/lib.rs (1)

30-30: Document the public API change.

Since this change exposes a previously internal module, please ensure:

  1. The module and its public items are properly documented
  2. The change is noted in the changelog
  3. If this is a stable release, consider the impact on semantic versioning
rocketmq-tools/src/tools_error.rs (1)

21-22: LGTM! Good improvements to error handling.

The enhancement of MQClientError variant with proper error propagation and detailed error messages is a good improvement. This change:

  • Provides better error context by including the underlying client error
  • Follows Rust error handling best practices with #[from] attribute
  • Supports the new SetMessageRequestMode functionality with proper error propagation

Consider adding a Display implementation for better error formatting in logs:

impl std::fmt::Display for ToolsError {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        write!(f, "RocketMQ tools error: {}", std::error::Error::to_string(self))
    }
}
rocketmq-client/src/producer/producer_impl/mq_producer_inner.rs (2)

Line range hint 71-75: Replace unreachable! with proper error handling

The get_check_listener method assumes default_mqproducer_impl_inner is never None, but the field is Option<T>. This could lead to runtime panics.

Consider this safer approach:

-    pub fn get_check_listener(&self) -> Arc<Box<dyn TransactionListener>> {
+    pub fn get_check_listener(&self) -> Option<Arc<Box<dyn TransactionListener>>> {
         if let Some(default_mqproducer_impl_inner) = &self.default_mqproducer_impl_inner {
-            return default_mqproducer_impl_inner.get_check_listener();
+            Some(default_mqproducer_impl_inner.get_check_listener())
+        } else {
+            None
         }
-        unreachable!("default_mqproducer_impl_inner is None")
     }

Line range hint 54-106: Implement consistent error handling across methods

The methods handle the None case of default_mqproducer_impl_inner inconsistently:

  • Some return default values (empty HashSet, false)
  • Some silently do nothing
  • One panics with unreachable!

Consider implementing consistent error handling:

  1. Return Result or Option from all methods to make error cases explicit
  2. Document the behavior when default_mqproducer_impl_inner is None
  3. Add builder pattern to ensure default_mqproducer_impl_inner is properly initialized

Example refactor:

impl MQProducerInnerImpl {
    pub fn get_publish_topic_list(&self) -> Option<HashSet<CheetahString>> {
        self.default_mqproducer_impl_inner
            .as_ref()
            .map(|impl_inner| impl_inner.get_publish_topic_list())
    }

    // Apply similar pattern to other methods
}
rocketmq-client/src/consumer/mq_consumer_inner.rs (2)

Line range hint 126-136: Replace panic conditions with proper error handling

The current implementation panics in all methods when default_mqpush_consumer_impl is None. This could lead to runtime crashes and provides no recovery path. Consider returning Result instead.

Here's an example refactor for the first two methods:

-    pub(crate) async fn pop_message(&mut self, pop_request: PopRequest) {
+    pub(crate) async fn pop_message(&mut self, pop_request: PopRequest) -> Result<()> {
         if let Some(ref default_mqpush_consumer_impl) = self.default_mqpush_consumer_impl {
             if let Some(mut default_mqpush_consumer_impl) = default_mqpush_consumer_impl.upgrade() {
-                default_mqpush_consumer_impl.pop_message(pop_request).await;
+                return default_mqpush_consumer_impl.pop_message(pop_request).await;
             }
         }
+        Err(RocketMQError::ConsumerError("default_mqpush_consumer_impl is None".into()))
     }

-    pub(crate) async fn pull_message(&mut self, pull_request: PullRequest) {
+    pub(crate) async fn pull_message(&mut self, pull_request: PullRequest) -> Result<()> {
         if let Some(ref default_mqpush_consumer_impl) = self.default_mqpush_consumer_impl {
             if let Some(mut default_mqpush_consumer_impl) = default_mqpush_consumer_impl.upgrade() {
-                default_mqpush_consumer_impl
+                return default_mqpush_consumer_impl
                     .pull_message(pull_request)
                     .await;
             }
         }
+        Err(RocketMQError::ConsumerError("default_mqpush_consumer_impl is None".into()))
     }

Similar changes should be applied to all other methods that currently panic.

Also applies to: 137-145


108-111: Add comprehensive documentation for MQConsumerInnerImpl

The struct lacks critical documentation about:

  1. Lifecycle and ownership model
  2. Valid states and when None is acceptable for default_mqpush_consumer_impl
  3. Memory management requirements for WeakArcMut

Add documentation like this:

+/// Implements the inner consumer functionality with weak references to avoid memory leaks.
+///
+/// # Lifecycle
+/// Describe the lifecycle of this struct and when default_mqpush_consumer_impl can be None
+///
+/// # Memory Management
+/// Explain the WeakArcMut usage and ownership model
+///
+/// # Examples
+/// ```
+/// // Add usage examples
+/// ```
 pub struct MQConsumerInnerImpl {
     pub(crate) default_mqpush_consumer_impl: Option<WeakArcMut<DefaultMQPushConsumerImpl>>,
 }
rocketmq-client/src/implementation/mq_client_api_impl.rs (2)

1212-1247: Add documentation and tests for the new method.

The implementation looks good, but it needs documentation comments explaining the purpose, parameters, and return value. Additionally, test coverage is missing for this new functionality.

Would you like me to help with:

  1. Generating documentation comments for the method?
  2. Creating unit tests to cover the new functionality?
🧰 Tools
🪛 GitHub Check: codecov/patch

[warning] 1212-1247: rocketmq-client/src/implementation/mq_client_api_impl.rs#L1212-L1247
Added lines #L1212 - L1247 were not covered by tests


1217-1218: Add input validation for pop_share_queue_num.

Consider adding validation for pop_share_queue_num to ensure it's within acceptable bounds.

    pub async fn set_message_request_mode(
        &mut self,
        broker_addr: &CheetahString,
        topic: &CheetahString,
        consumer_group: &CheetahString,
        mode: MessageRequestMode,
        pop_share_queue_num: i32,
        timeout_millis: u64,
    ) -> Result<()> {
+       if pop_share_queue_num < 0 {
+           return Err(MQClientErr(
+               -1,
+               "pop_share_queue_num must be non-negative".to_string(),
+           ));
+       }
        let body = SetMessageRequestModeRequestBody {
rocketmq-tools/src/admin/default_mq_admin_ext.rs (2)

56-57: Review unnecessary #[allow] attributes.

The attributes #[allow(unused_variables)] and #[allow(unused_mut)] may be unnecessary if variables will be used in future implementations. Consider removing them to let the compiler warn about any truly unused variables, which can help catch potential issues.


59-688: Consider implementing or stubbing the methods.

All methods in the MQAdminExt implementation currently contain todo!() placeholders. Implementing these methods or providing meaningful stubs will enhance code functionality and facilitate testing.

Would you like assistance in outlining or implementing any of these methods? I can help by providing initial implementations or setting up scaffolding for future development.

🧰 Tools
🪛 GitHub Check: codecov/patch

[warning] 60-61: rocketmq-tools/src/admin/default_mq_admin_ext.rs#L60-L61
Added lines #L60 - L61 were not covered by tests


[warning] 64-65: rocketmq-tools/src/admin/default_mq_admin_ext.rs#L64-L65
Added lines #L64 - L65 were not covered by tests


[warning] 68-73: rocketmq-tools/src/admin/default_mq_admin_ext.rs#L68-L73
Added lines #L68 - L73 were not covered by tests


[warning] 76-83: rocketmq-tools/src/admin/default_mq_admin_ext.rs#L76-L83
Added lines #L76 - L83 were not covered by tests


[warning] 86-91: rocketmq-tools/src/admin/default_mq_admin_ext.rs#L86-L91
Added lines #L86 - L91 were not covered by tests


[warning] 94-98: rocketmq-tools/src/admin/default_mq_admin_ext.rs#L94-L98
Added lines #L94 - L98 were not covered by tests


[warning] 101-106: rocketmq-tools/src/admin/default_mq_admin_ext.rs#L101-L106
Added lines #L101 - L106 were not covered by tests


[warning] 109-114: rocketmq-tools/src/admin/default_mq_admin_ext.rs#L109-L114
Added lines #L109 - L114 were not covered by tests


[warning] 117-122: rocketmq-tools/src/admin/default_mq_admin_ext.rs#L117-L122
Added lines #L117 - L122 were not covered by tests


[warning] 125-130: rocketmq-tools/src/admin/default_mq_admin_ext.rs#L125-L130
Added lines #L125 - L130 were not covered by tests


[warning] 133-139: rocketmq-tools/src/admin/default_mq_admin_ext.rs#L133-L139
Added lines #L133 - L139 were not covered by tests


[warning] 142-146: rocketmq-tools/src/admin/default_mq_admin_ext.rs#L142-L146
Added lines #L142 - L146 were not covered by tests


[warning] 149-154: rocketmq-tools/src/admin/default_mq_admin_ext.rs#L149-L154
Added lines #L149 - L154 were not covered by tests


[warning] 157-162: rocketmq-tools/src/admin/default_mq_admin_ext.rs#L157-L162
Added lines #L157 - L162 were not covered by tests


[warning] 165-170: rocketmq-tools/src/admin/default_mq_admin_ext.rs#L165-L170
Added lines #L165 - L170 were not covered by tests


[warning] 173-178: rocketmq-tools/src/admin/default_mq_admin_ext.rs#L173-L178
Added lines #L173 - L178 were not covered by tests


[warning] 181-185: rocketmq-tools/src/admin/default_mq_admin_ext.rs#L181-L185
Added lines #L181 - L185 were not covered by tests


[warning] 188-189: rocketmq-tools/src/admin/default_mq_admin_ext.rs#L188-L189
Added lines #L188 - L189 were not covered by tests


[warning] 192-196: rocketmq-tools/src/admin/default_mq_admin_ext.rs#L192-L196
Added lines #L192 - L196 were not covered by tests


[warning] 199-203: rocketmq-tools/src/admin/default_mq_admin_ext.rs#L199-L203
Added lines #L199 - L203 were not covered by tests


[warning] 206-214: rocketmq-tools/src/admin/default_mq_admin_ext.rs#L206-L214
Added lines #L206 - L214 were not covered by tests


[warning] 217-218: rocketmq-tools/src/admin/default_mq_admin_ext.rs#L217-L218
Added lines #L217 - L218 were not covered by tests


[warning] 221-225: rocketmq-tools/src/admin/default_mq_admin_ext.rs#L221-L225
Added lines #L221 - L225 were not covered by tests


[warning] 228-233: rocketmq-tools/src/admin/default_mq_admin_ext.rs#L228-L233
Added lines #L228 - L233 were not covered by tests


[warning] 236-241: rocketmq-tools/src/admin/default_mq_admin_ext.rs#L236-L241
Added lines #L236 - L241 were not covered by tests


[warning] 244-245: rocketmq-tools/src/admin/default_mq_admin_ext.rs#L244-L245
Added lines #L244 - L245 were not covered by tests


[warning] 248-253: rocketmq-tools/src/admin/default_mq_admin_ext.rs#L248-L253
Added lines #L248 - L253 were not covered by tests


[warning] 256-261: rocketmq-tools/src/admin/default_mq_admin_ext.rs#L256-L261
Added lines #L256 - L261 were not covered by tests


[warning] 264-270: rocketmq-tools/src/admin/default_mq_admin_ext.rs#L264-L270
Added lines #L264 - L270 were not covered by tests

rocketmq-tools/src/admin/default_mq_admin_ext_impl.rs (3)

557-557: Remove unnecessary mut in variable declaration

The variable mq_client_api declared on line 557 does not need to be mutable, as it is not modified after initialization. Declaring it as immutable enhances code clarity.

Apply this diff to remove the unnecessary mut:

-let mut mq_client_api = ...
+let mq_client_api = ...

79-79: Simplify the rpc_hook field type

The rpc_hook field is defined as Option<Arc<Box<dyn RPCHook>>>, which introduces unnecessary nesting of smart pointers (Arc<Box<...>>). You can simplify it to Option<Arc<dyn RPCHook>>, reducing complexity and improving readability.

Apply this diff to simplify the field's type:

-    rpc_hook: Option<Arc<Box<dyn RPCHook>>>,
+    rpc_hook: Option<Arc<dyn RPCHook>>,

Ensure that any code using rpc_hook is updated accordingly.


53-72: Simplify the initialization of SYSTEM_GROUP_SET

The initialization of SYSTEM_GROUP_SET can be simplified using an array and the collect method, improving readability and conciseness.

Apply this diff to simplify the code:

 lazy_static! {
     static ref SYSTEM_GROUP_SET: HashSet<CheetahString> = {
-        let mut set = HashSet::new();
-        set.insert(CheetahString::from(mix_all::DEFAULT_CONSUMER_GROUP));
-        set.insert(CheetahString::from(mix_all::DEFAULT_PRODUCER_GROUP));
-        set.insert(CheetahString::from(mix_all::TOOLS_CONSUMER_GROUP));
-        set.insert(CheetahString::from(mix_all::SCHEDULE_CONSUMER_GROUP));
-        set.insert(CheetahString::from(mix_all::FILTERSRV_CONSUMER_GROUP));
-        set.insert(CheetahString::from(mix_all::MONITOR_CONSUMER_GROUP));
-        set.insert(CheetahString::from(mix_all::CLIENT_INNER_PRODUCER_GROUP));
-        set.insert(CheetahString::from(mix_all::SELF_TEST_PRODUCER_GROUP));
-        set.insert(CheetahString::from(mix_all::SELF_TEST_CONSUMER_GROUP));
-        set.insert(CheetahString::from(mix_all::ONS_HTTP_PROXY_GROUP));
-        set.insert(CheetahString::from(mix_all::CID_ONSAPI_PERMISSION_GROUP));
-        set.insert(CheetahString::from(mix_all::CID_ONSAPI_OWNER_GROUP));
-        set.insert(CheetahString::from(mix_all::CID_ONSAPI_PULL_GROUP));
-        set.insert(CheetahString::from(mix_all::CID_SYS_RMQ_TRANS));
-        set
+        [
+            mix_all::DEFAULT_CONSUMER_GROUP,
+            mix_all::DEFAULT_PRODUCER_GROUP,
+            mix_all::TOOLS_CONSUMER_GROUP,
+            mix_all::SCHEDULE_CONSUMER_GROUP,
+            mix_all::FILTERSRV_CONSUMER_GROUP,
+            mix_all::MONITOR_CONSUMER_GROUP,
+            mix_all::CLIENT_INNER_PRODUCER_GROUP,
+            mix_all::SELF_TEST_PRODUCER_GROUP,
+            mix_all::SELF_TEST_CONSUMER_GROUP,
+            mix_all::ONS_HTTP_PROXY_GROUP,
+            mix_all::CID_ONSAPI_PERMISSION_GROUP,
+            mix_all::CID_ONSAPI_OWNER_GROUP,
+            mix_all::CID_ONSAPI_PULL_GROUP,
+            mix_all::CID_SYS_RMQ_TRANS,
+        ]
+        .iter()
+        .map(|s| CheetahString::from(*s))
+        .collect()
     };
 }
📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between 9c17b8f and 1952eda.

⛔ Files ignored due to path filters (1)
  • Cargo.lock is excluded by !**/*.lock
📒 Files selected for processing (11)
  • rocketmq-client/src/consumer/consumer_impl/pull_request_ext.rs (1 hunks)
  • rocketmq-client/src/consumer/mq_consumer_inner.rs (1 hunks)
  • rocketmq-client/src/implementation/mq_client_api_impl.rs (4 hunks)
  • rocketmq-client/src/lib.rs (1 hunks)
  • rocketmq-client/src/producer/producer_impl/mq_producer_inner.rs (1 hunks)
  • rocketmq-tools/Cargo.toml (1 hunks)
  • rocketmq-tools/src/admin.rs (1 hunks)
  • rocketmq-tools/src/admin/default_mq_admin_ext.rs (1 hunks)
  • rocketmq-tools/src/admin/default_mq_admin_ext_impl.rs (1 hunks)
  • rocketmq-tools/src/lib.rs (1 hunks)
  • rocketmq-tools/src/tools_error.rs (1 hunks)
🧰 Additional context used
🪛 GitHub Check: codecov/patch
rocketmq-client/src/implementation/mq_client_api_impl.rs

[warning] 1212-1247: rocketmq-client/src/implementation/mq_client_api_impl.rs#L1212-L1247
Added lines #L1212 - L1247 were not covered by tests

rocketmq-tools/src/admin/default_mq_admin_ext.rs

[warning] 60-61: rocketmq-tools/src/admin/default_mq_admin_ext.rs#L60-L61
Added lines #L60 - L61 were not covered by tests


[warning] 64-65: rocketmq-tools/src/admin/default_mq_admin_ext.rs#L64-L65
Added lines #L64 - L65 were not covered by tests


[warning] 68-73: rocketmq-tools/src/admin/default_mq_admin_ext.rs#L68-L73
Added lines #L68 - L73 were not covered by tests


[warning] 76-83: rocketmq-tools/src/admin/default_mq_admin_ext.rs#L76-L83
Added lines #L76 - L83 were not covered by tests


[warning] 86-91: rocketmq-tools/src/admin/default_mq_admin_ext.rs#L86-L91
Added lines #L86 - L91 were not covered by tests


[warning] 94-98: rocketmq-tools/src/admin/default_mq_admin_ext.rs#L94-L98
Added lines #L94 - L98 were not covered by tests


[warning] 101-106: rocketmq-tools/src/admin/default_mq_admin_ext.rs#L101-L106
Added lines #L101 - L106 were not covered by tests


[warning] 109-114: rocketmq-tools/src/admin/default_mq_admin_ext.rs#L109-L114
Added lines #L109 - L114 were not covered by tests


[warning] 117-122: rocketmq-tools/src/admin/default_mq_admin_ext.rs#L117-L122
Added lines #L117 - L122 were not covered by tests


[warning] 125-130: rocketmq-tools/src/admin/default_mq_admin_ext.rs#L125-L130
Added lines #L125 - L130 were not covered by tests


[warning] 133-139: rocketmq-tools/src/admin/default_mq_admin_ext.rs#L133-L139
Added lines #L133 - L139 were not covered by tests


[warning] 142-146: rocketmq-tools/src/admin/default_mq_admin_ext.rs#L142-L146
Added lines #L142 - L146 were not covered by tests


[warning] 149-154: rocketmq-tools/src/admin/default_mq_admin_ext.rs#L149-L154
Added lines #L149 - L154 were not covered by tests


[warning] 157-162: rocketmq-tools/src/admin/default_mq_admin_ext.rs#L157-L162
Added lines #L157 - L162 were not covered by tests


[warning] 165-170: rocketmq-tools/src/admin/default_mq_admin_ext.rs#L165-L170
Added lines #L165 - L170 were not covered by tests


[warning] 173-178: rocketmq-tools/src/admin/default_mq_admin_ext.rs#L173-L178
Added lines #L173 - L178 were not covered by tests


[warning] 181-185: rocketmq-tools/src/admin/default_mq_admin_ext.rs#L181-L185
Added lines #L181 - L185 were not covered by tests


[warning] 188-189: rocketmq-tools/src/admin/default_mq_admin_ext.rs#L188-L189
Added lines #L188 - L189 were not covered by tests


[warning] 192-196: rocketmq-tools/src/admin/default_mq_admin_ext.rs#L192-L196
Added lines #L192 - L196 were not covered by tests


[warning] 199-203: rocketmq-tools/src/admin/default_mq_admin_ext.rs#L199-L203
Added lines #L199 - L203 were not covered by tests


[warning] 206-214: rocketmq-tools/src/admin/default_mq_admin_ext.rs#L206-L214
Added lines #L206 - L214 were not covered by tests


[warning] 217-218: rocketmq-tools/src/admin/default_mq_admin_ext.rs#L217-L218
Added lines #L217 - L218 were not covered by tests


[warning] 221-225: rocketmq-tools/src/admin/default_mq_admin_ext.rs#L221-L225
Added lines #L221 - L225 were not covered by tests


[warning] 228-233: rocketmq-tools/src/admin/default_mq_admin_ext.rs#L228-L233
Added lines #L228 - L233 were not covered by tests


[warning] 236-241: rocketmq-tools/src/admin/default_mq_admin_ext.rs#L236-L241
Added lines #L236 - L241 were not covered by tests


[warning] 244-245: rocketmq-tools/src/admin/default_mq_admin_ext.rs#L244-L245
Added lines #L244 - L245 were not covered by tests


[warning] 248-253: rocketmq-tools/src/admin/default_mq_admin_ext.rs#L248-L253
Added lines #L248 - L253 were not covered by tests


[warning] 256-261: rocketmq-tools/src/admin/default_mq_admin_ext.rs#L256-L261
Added lines #L256 - L261 were not covered by tests


[warning] 264-270: rocketmq-tools/src/admin/default_mq_admin_ext.rs#L264-L270
Added lines #L264 - L270 were not covered by tests

🔇 Additional comments (10)
rocketmq-tools/Cargo.toml (3)

24-24: LGTM! Improved dependency declaration format

The updated format for trait-variant follows a more consistent style using the table format.


18-18: Verify rocketmq-client-rust version compatibility

The addition of rocketmq-client-rust aligns with the PR objective to implement SetMessageRequestMode support.

✅ Verification successful

Let me gather more information about the workspace dependencies.


✓ Dependency version is properly configured in workspace

The rocketmq-client-rust dependency is correctly defined in the workspace with version 0.4.0 and properly referenced using workspace inheritance in rocketmq-tools/Cargo.toml. The dependency configuration aligns with other workspace members and follows consistent versioning.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify workspace dependency versions are compatible
# Check workspace Cargo.toml for version specifications
cat Cargo.toml | rg -A 5 '^\[workspace\]'

Length of output: 149


Script:

#!/bin/bash
# Check workspace dependencies section in root Cargo.toml
cat Cargo.toml | rg -A 20 '^\[workspace\.dependencies\]'

# Check if rocketmq-client-rust is defined in workspace
fd -t f "Cargo.toml" | xargs rg "rocketmq-client-rust"

Length of output: 1474


26-26: Verify the necessity of lazy_static

Please ensure that lazy_static is actually needed for the SetMessageRequestMode implementation.

rocketmq-tools/src/lib.rs (1)

19-20: Verify the necessity and impact of exposing these modules.

Making these modules public represents a significant API change. While this aligns with the broader effort to support SetMessageRequestMode, we should ensure this increased visibility is intentional and necessary.

Let's verify the usage of these modules across the codebase:

✅ Verification successful

The previous results show internal usage patterns within the rocketmq-tools crate and related crates. Let's verify if these modules are actually needed as public APIs by checking their dependencies and implementations.


Making these modules public is necessary and correctly aligned with the codebase architecture.

The verification shows that:

  1. The admin module contains essential public interfaces (MQAdminExt trait) and implementations (DefaultMQAdminExt) that are core to RocketMQ's administration functionality
  2. The tools_error module defines the error types used throughout the tools crate, which is necessary for proper error handling in public APIs
  3. The changes align with the PR's goal of supporting SetMessageRequestMode, as this functionality is implemented in the admin module (see set_message_request_mode method)

The public visibility is intentional and required as:

  • The admin module provides the core administration API interface
  • The error types need to be public for proper error handling in consuming code
  • The implementation follows Rust's typical crate architecture patterns
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Check for current usage patterns of admin and tools_error modules
# to understand the impact of making them public

echo "Checking admin module usage patterns:"
rg --type rust -B 2 -A 2 "use.*admin" 

echo "\nChecking tools_error module usage patterns:"
rg --type rust -B 2 -A 2 "use.*tools_error"

# Check if these modules are already being accessed from external crates
echo "\nChecking for potential external usage attempts:"
rg --type rust "rocketmq_tools::(admin|tools_error)"

Length of output: 15600


Script:

#!/bin/bash
# Let's check for external crate dependencies and usages
echo "Checking Cargo.toml files for rocketmq-tools dependencies:"
rg --type toml "rocketmq-tools.*version" 

echo "\nChecking for potential public API usage of these modules:"
# Look for struct/trait implementations in admin module
ast-grep --pattern 'pub struct $_ {
  $$$
}'  rocketmq-tools/src/admin/*.rs

echo "\nChecking for trait implementations:"
ast-grep --pattern 'pub trait $_ {
  $$$
}'  rocketmq-tools/src/admin/*.rs

# Check tools_error module structure
echo "\nChecking tools_error module structure:"
fd tools_error.rs$ --exec cat {}

Length of output: 48271

rocketmq-tools/src/admin.rs (1)

17-17: Verify the impact of increased module visibility.

The visibility change from pub(crate) to pub for common, mq_admin_ext, and mq_admin_ext_async modules makes them part of the public API. Ensure this aligns with the project's API stability guarantees.

Also applies to: 20-21

✅ Verification successful

Module visibility change appears to be intentional and well-structured

The visibility changes align with the crate's public-facing nature, as evidenced by:

  • The crate is published on crates.io with a clear description as a tools implementation
  • The modules are properly re-exported through the public API in lib.rs
  • The crate follows a clean hierarchical structure with proper module organization

The visibility changes from pub(crate) to pub are appropriate for a public tools library and follow Rust's module visibility best practices.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Check if these modules are already being used outside the crate
# or referenced in documentation/examples

# Check for any external usage of these modules
rg -l "use.*rocketmq_tools::(common|mq_admin_ext|mq_admin_ext_async)" --type rust

# Check if modules are documented in README or examples
fd -e md -e rs -p "README|examples" --exec rg -l "rocketmq_tools::(common|mq_admin_ext|mq_admin_ext_async)"

Length of output: 193


Script:

#!/bin/bash
# Let's try a different approach to analyze the module visibility impact

# 1. Check the current structure and visibility of these modules
rg -A 5 "^pub mod (common|mq_admin_ext|mq_admin_ext_async)" --type rust

# 2. Check if there are any integration tests or examples that might use these modules
fd -e rs -p "tests|examples" 

# 3. Look for any documentation mentioning these modules
fd -e md . --exec rg -l "(common|mq_admin_ext|mq_admin_ext_async)"

# 4. Check for any potential cross-crate dependencies in Cargo.toml files
fd Cargo.toml --exec rg -l "rocketmq-tools"

Length of output: 1464


Script:

#!/bin/bash
# Let's analyze the actual usage and dependencies of these modules

# 1. Check how these modules are used within the crate
rg -B2 -A2 "use (crate|super)::(common|mq_admin_ext|mq_admin_ext_async)" rocketmq-tools/

# 2. Check the content of Cargo.toml to understand if this is a public-facing crate
cat rocketmq-tools/Cargo.toml

# 3. Look for any references to these modules in integration tests
fd -e rs -p "tests" rocketmq-tools/

# 4. Check if these modules are re-exported in lib.rs
cat rocketmq-tools/src/lib.rs

Length of output: 1881

rocketmq-client/src/consumer/consumer_impl/pull_request_ext.rs (1)

19-23: Visibility changes look appropriate.

The change from pub(crate) to pub visibility aligns with the need to support the SetMessageRequestMode feature. Let's verify that this struct is actually needed by other crates.

rocketmq-client/src/lib.rs (1)

30-30: Verify if the factory module needs to be public.

Making the factory module public expands the API surface and could be a breaking change. Let's verify if this change is necessary for implementing SetMessageRequestMode support.

✅ Verification successful

Based on the analysis of the shell script outputs, I can now generate the final response:

Making the factory module public is necessary for the client implementation.

The factory module contains the critical MQClientInstance type which is a fundamental component used across the client's public APIs:

  • Used in consumer implementations:

    • LocalFileOffsetStore, RemoteBrokerOffsetStore for offset management
    • PullAPIWrapper, PullMessageService for message pulling
    • RebalanceService, RebalancePushImpl for consumer rebalancing
  • Used in producer implementations:

    • DefaultMQProducerImpl for message production
    • DefaultServiceDetector and DefaultResolver for service discovery

Making the factory module public is required as these components are part of the public API contract and need access to the MQClientInstance type for proper functionality.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Check if the factory module contains SetMessageRequestMode implementation
# and verify if it's referenced from other public modules

# Check for SetMessageRequestMode implementation in factory module
rg -A 5 "SetMessageRequestMode|401" "rocketmq-client/src/factory/"

# Check for factory module usage in public modules
ast-grep --pattern 'use $$$factory$$$'

Length of output: 107


Script:

#!/bin/bash
# Let's try a broader search to understand the factory module's usage

# Check the content of the factory module
fd "^factory$" --type d --exec ls -R {}

# Check for any references to factory across the codebase
rg -l "factory" --type rust

# Look for imports or uses of factory module
rg "use (crate|super)::factory" --type rust

# Check if factory is used in any public interfaces
ast-grep --pattern 'pub fn $$$factory$$$'
ast-grep --pattern 'pub struct $$$factory$$$'

Length of output: 3163


Script:

#!/bin/bash
# Let's examine the MQClientInstance usage and its relationship with public APIs

# Check the content of mq_client_instance.rs
cat rocketmq-client/src/factory/mq_client_instance.rs

# Check if MQClientInstance is used in any public interfaces in producer/consumer
rg -B 2 -A 2 "MQClientInstance" "rocketmq-client/src/producer/" "rocketmq-client/src/consumer/"

# Check if factory module is used in any public functions or methods
rg -B 2 -A 2 "pub (fn|struct|trait)" "rocketmq-client/src/producer/" "rocketmq-client/src/consumer/" | rg -B 2 -A 2 "factory"

Length of output: 64653

rocketmq-tools/src/tools_error.rs (1)

21-22: Verify error handling at call sites

Let's ensure the enhanced error handling is properly utilized across the codebase.

✅ Verification successful

Let me try another search pattern to verify the error handling implementation.


Based on the search results, I can now generate the final response:

Error handling implementation is properly propagated

The error handling implementation is correct and properly propagated:

  1. The ToolsError enum correctly wraps MQClientError using #[from] derive macro, enabling automatic conversion
  2. The client code in rocketmq-tools/src/admin/default_mq_admin_ext_impl.rs properly maps client errors to ToolsError
  3. The error type is consistently used through the tools crate via the Result<T, ToolsError> type alias
  4. No instances of unwrapped MQClientError usage were found in the tools crate
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Check usage of MQClientError in the codebase

# Find all potential error handling sites
echo "Checking error handling patterns..."
rg -A 2 "MQClientError" 

# Check for potential missing error propagation
echo "Checking for potential missing error propagation..."
rg "-> Result<.+, ToolsError>" -A 5 | rg "MQClientError"

# Look for direct usage of client errors that should be wrapped
echo "Checking for unwrapped client errors..."
ast-grep --pattern 'Result<$_, rocketmq_client_rust::error::MQClientError>'

Length of output: 38202


Script:

#!/bin/bash
# Search for Result types with ToolsError in the codebase
rg "Result<.*,\s*ToolsError>" -A 3

# Search for any direct usage of MQClientError without wrapping
rg "MQClientError::" -B 2 -A 2

# Check implementation of functions returning ToolsError
ast-grep --pattern 'fn $_($$$) -> Result<$_, ToolsError> {
  $$$
}'

Length of output: 51815

rocketmq-client/src/producer/producer_impl/mq_producer_inner.rs (1)

49-49: Consider the implications of exposing this implementation struct

Making MQProducerInnerImpl public while keeping its field pub(crate) creates mixed visibility that could lead to confusion. Consider one of these approaches:

  1. Keep the struct pub(crate) if it's meant to be an internal implementation detail
  2. If public visibility is required:
    • Document the public API and its stability guarantees
    • Consider making the field private and providing appropriate public methods
    • Add rustdoc comments explaining the intended usage

Let's verify if this struct is used outside the crate:

✅ Verification successful

Let me gather more context about the usage pattern and visibility requirements.


Let me try a different approach to understand the module structure and usage.


Based on the gathered information, I can now generate the final response:

Making MQProducerInnerImpl public is necessary for the client factory pattern

The visibility change is justified because:

  • MQProducerInnerImpl is used in mq_client_instance.rs for producer registration and selection
  • It's part of the client factory pattern where producers need to be managed by the client instance
  • The struct is already well-encapsulated with pub(crate) fields and provides a controlled public API

The change aligns with the codebase's architecture where the client instance needs to manage producer instances through a public interface.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Search for external usage of MQProducerInnerImpl
rg "MQProducerInnerImpl" --type rust

Length of output: 1028


Script:

#!/bin/bash
# Check the trait implementation and usage
ast-grep --pattern 'impl $_ for MQProducerInnerImpl { $$$ }'

# Check if this is used in any public API
ast-grep --pattern 'pub fn $_($$$) -> $$$MQProducerInnerImpl$$$'

# Check the module structure
rg "mod|pub use" rocketmq-client/src/producer/mod.rs

Length of output: 260


Script:

#!/bin/bash
# Find the producer module file
fd "mod.rs|lib.rs" rocketmq-client/src/

# Check how MQProducerInnerImpl is used in the crate's public API
rg "pub (use|mod|struct|fn)" rocketmq-client/src/producer/ --type rust

# Look for trait implementations
rg "impl.*MQProducerInnerImpl" -A 5 --type rust

Length of output: 27749

rocketmq-client/src/consumer/mq_consumer_inner.rs (1)

108-111: Consider the implications of making MQConsumerInnerImpl public

Making this struct public exposes internal implementation details and could make future refactoring more difficult. The use of WeakArcMut suggests complex memory management that external users might not handle correctly.

Consider the following alternatives:

  1. Keep the struct pub(crate) and expose only necessary functionality through a public interface
  2. If public access is required, document the memory management requirements and usage patterns

Let's verify if this struct is actually needed outside the crate:

Comment on lines +462 to +468
async fn get_cluster_list(&self, topic: String) -> crate::Result<HashSet<CheetahString>> {
todo!()
}

async fn get_topic_cluster_list(&self, topic: String) -> crate::Result<HashSet<CheetahString>> {
todo!()
}
Copy link
Contributor

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

⚠️ Potential issue

Maintain consistent parameter types.

In the methods get_cluster_list and get_topic_cluster_list, the topic parameter is of type String, whereas similar methods use CheetahString. To maintain consistency across the API, consider changing the parameter type to CheetahString.

Suggested changes:

- async fn get_cluster_list(&self, topic: String) -> crate::Result<HashSet<CheetahString>> {
+ async fn get_cluster_list(&self, topic: CheetahString) -> crate::Result<HashSet<CheetahString>> {

- async fn get_topic_cluster_list(&self, topic: String) -> crate::Result<HashSet<CheetahString>> {
+ async fn get_topic_cluster_list(&self, topic: CheetahString) -> crate::Result<HashSet<CheetahString>> {
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
async fn get_cluster_list(&self, topic: String) -> crate::Result<HashSet<CheetahString>> {
todo!()
}
async fn get_topic_cluster_list(&self, topic: String) -> crate::Result<HashSet<CheetahString>> {
todo!()
}
async fn get_cluster_list(&self, topic: CheetahString) -> crate::Result<HashSet<CheetahString>> {
todo!()
}
async fn get_topic_cluster_list(&self, topic: CheetahString) -> crate::Result<HashSet<CheetahString>> {
todo!()
}

Comment on lines +264 to +271
async fn put_kv_config(
&self,
namespace: CheetahString,
key: CheetahString,
value: CheetahString,
) {
todo!()
}
Copy link
Contributor

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

⚠️ Potential issue

Ensure consistent return types for methods.

The method put_kv_config does not return a crate::Result<()>, unlike other methods which return a result type for error handling. For consistency and proper error handling, consider changing the method signature to return crate::Result<()>.

Suggested change:

 async fn put_kv_config(
     &self,
     namespace: CheetahString,
     key: CheetahString,
     value: CheetahString,
- ) {
+ ) -> crate::Result<()> {
     todo!()
+    Ok(())
 }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
async fn put_kv_config(
&self,
namespace: CheetahString,
key: CheetahString,
value: CheetahString,
) {
todo!()
}
async fn put_kv_config(
&self,
namespace: CheetahString,
key: CheetahString,
value: CheetahString,
) -> crate::Result<()> {
todo!()
Ok(())
}
🧰 Tools
🪛 GitHub Check: codecov/patch

[warning] 264-270: rocketmq-tools/src/admin/default_mq_admin_ext.rs#L264-L270
Added lines #L264 - L270 were not covered by tests

Comment on lines +557 to +561
let mut mq_client_api = self
.client_instance
.as_ref()
.unwrap()
.get_mq_client_api_impl();
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue

Handle potential None value when accessing client_instance

In lines 557-561, the code calls unwrap() on self.client_instance, which may panic if client_instance is None. To prevent potential runtime errors, it's advisable to handle the None case explicitly.

Consider modifying the code to handle the None case:

 let mq_client_api = match self.client_instance.as_ref() {
     Some(client_instance) => client_instance.get_mq_client_api_impl(),
     None => {
+        return Err(crate::tools_error::ToolsError::ClientInstanceUnavailable);
     }
 };

Ensure that you define the ClientInstanceUnavailable variant in ToolsError to handle this error case.

Committable suggestion skipped: line range outside the PR's diff.

@mxsm mxsm deleted the feature-1367 branch November 28, 2024 14:35
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
AI review first Ai review pr first approved PR has approved auto merge feature🚀 Suggest an idea for this project.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[Feature🚀] Client Supports request code SetMessageRequestMode (401)
4 participants