rocketmq_remoting/code/
request_code.rs

1/*
2 * Licensed to the Apache Software Foundation (ASF) under one or more
3 * contributor license agreements.  See the NOTICE file distributed with
4 * this work for additional information regarding copyright ownership.
5 * The ASF licenses this file to You under the Apache License, Version 2.0
6 * (the "License"); you may not use this file except in compliance with
7 * the License.  You may obtain a copy of the License at
8 *
9 *     http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18/// Macro to define RequestCode enum with automatic conversion implementations.
19/// This reduces code duplication and makes it easier to maintain.
20macro_rules! define_request_code {
21    (
22        $(#[$enum_meta:meta])*
23        pub enum $enum_name:ident {
24            $(
25                $(#[$variant_meta:meta])*
26                $variant:ident = $value:expr
27            ),* $(,)?
28        }
29    ) => {
30        $(#[$enum_meta])*
31        #[repr(i32)]
32        pub enum $enum_name {
33            $(
34                $(#[$variant_meta])*
35                $variant = $value,
36            )*
37        }
38
39        impl From<$enum_name> for i32 {
40            #[inline]
41            fn from(value: $enum_name) -> Self {
42                value as i32
43            }
44        }
45
46        impl From<i32> for $enum_name {
47            #[inline]
48            fn from(value: i32) -> Self {
49                match value {
50                    $($value => $enum_name::$variant,)*
51                    _ => $enum_name::Unknown,
52                }
53            }
54        }
55
56        impl $enum_name {
57            /// Convert to i32 value
58            #[inline]
59            pub const fn to_i32(self) -> i32 {
60                self as i32
61            }
62
63            /// Check if the request code is unknown
64            #[inline]
65            pub const fn is_unknown(&self) -> bool {
66                matches!(self, Self::Unknown)
67            }
68        }
69    };
70}
71
72define_request_code! {
73    #[derive(Debug, Eq, PartialEq, Clone, Copy, Hash)]
74    pub enum RequestCode {
75        SendMessage = 10,
76        PullMessage = 11,
77        QueryMessage = 12,
78        QueryBrokerOffset = 13, // Not used in Java
79        QueryConsumerOffset = 14,
80        UpdateConsumerOffset = 15,
81        UpdateAndCreateTopic = 17,
82        UpdateAndCreateTopicList = 18,
83        GetAllTopicConfig = 21,
84        GetTopicConfigList = 22, // Not used in Java
85        GetTopicNameList = 23,   // Not used in Java
86        UpdateBrokerConfig = 25,
87        GetBrokerConfig = 26,
88        TriggerDeleteFiles = 27, // Not used in Java
89        GetBrokerRuntimeInfo = 28,
90        SearchOffsetByTimestamp = 29,
91        GetMaxOffset = 30,
92        GetMinOffset = 31,
93        GetEarliestMsgStoreTime = 32,
94        ViewMessageById = 33,
95        HeartBeat = 34,
96        UnregisterClient = 35,
97        ConsumerSendMsgBack = 36,
98        EndTransaction = 37,
99        GetConsumerListByGroup = 38,
100        CheckTransactionState = 39,
101        NotifyConsumerIdsChanged = 40,
102        LockBatchMq = 41,
103        UnlockBatchMq = 42,
104        GetAllConsumerOffset = 43,
105        GetAllDelayOffset = 45,
106        CheckClientConfig = 46,
107        GetClientConfig = 47, // Not used in Java
108        UpdateAndCreateAclConfig = 50,
109        DeleteAclConfig = 51,
110        GetBrokerClusterAclInfo = 52,
111        UpdateGlobalWhiteAddrsConfig = 53,
112        GetBrokerClusterAclConfig = 54, // Deprecated
113        GetTimerCheckPoint = 60,
114        GetTimerMetrics = 61,
115
116        PopMessage = 200050,
117        AckMessage = 200051,
118        BatchAckMessage = 200151,
119        PeekMessage = 200052,
120        ChangeMessageInvisibleTime = 200053,
121        Notification = 200054,
122        PollingInfo = 200055,
123
124        PutKvConfig = 100,
125        GetKvConfig = 101,
126        DeleteKvConfig = 102,
127        RegisterBroker = 103,
128        UnregisterBroker = 104,
129        GetRouteinfoByTopic = 105,
130        GetBrokerClusterInfo = 106,
131        UpdateAndCreateSubscriptionGroup = 200,
132        GetAllSubscriptionGroupConfig = 201,
133        GetTopicStatsInfo = 202,
134        GetConsumerConnectionList = 203,
135        GetProducerConnectionList = 204,
136        WipeWritePermOfBroker = 205,
137        GetAllTopicListFromNameserver = 206,
138        DeleteSubscriptionGroup = 207,
139        GetConsumeStats = 208,
140
141        SuspendConsumer = 209,               // Not used in Java
142        ResumeConsumer = 210,                // Not used in Java
143        ResetConsumerOffsetInConsumer = 211, // Not used in Java
144        ResetConsumerOffsetInBroker = 212,   // Not used in Java
145        AdjustConsumerThreadPool = 213,      // Not used in Java
146        WhoConsumeTheMessage = 214,          // Not used in Java
147
148        DeleteTopicInBroker = 215,
149        DeleteTopicInNamesrv = 216,
150        RegisterTopicInNamesrv = 217,
151        GetKvlistByNamespace = 219,
152        ResetConsumerClientOffset = 220,
153        GetConsumerStatusFromClient = 221,
154        InvokeBrokerToResetOffset = 222,
155        InvokeBrokerToGetConsumerStatus = 223,
156
157        QueryTopicConsumeByWho = 300,
158        GetTopicsByCluster = 224,
159        QueryTopicsByConsumer = 343,
160        QuerySubscriptionByConsumer = 345,
161
162        RegisterFilterServer = 301,       // Not used in Java
163        RegisterMessageFilterClass = 302, // Not used in Java
164
165        QueryConsumeTimeSpan = 303,
166        GetSystemTopicListFromNs = 304,
167        GetSystemTopicListFromBroker = 305,
168        CleanExpiredConsumequeue = 306,
169        GetConsumerRunningInfo = 307,
170        QueryCorrectionOffset = 308,
171        ConsumeMessageDirectly = 309,
172        SendMessageV2 = 310,
173        GetUnitTopicList = 311,
174        GetHasUnitSubTopicList = 312,
175        GetHasUnitSubUnunitTopicList = 313,
176        CloneGroupOffset = 314,
177        ViewBrokerStatsData = 315,
178        CleanUnusedTopic = 316,
179        GetBrokerConsumeStats = 317,
180        UpdateNamesrvConfig = 318,
181        GetNamesrvConfig = 319,
182        SendBatchMessage = 320,
183        QueryConsumeQueue = 321,
184        QueryDataVersion = 322,
185        ResumeCheckHalfMessage = 323,
186        SendReplyMessage = 324,
187        SendReplyMessageV2 = 325,
188        PushReplyMessageToClient = 326,
189        AddWritePermOfBroker = 327,
190        GetTopicConfig = 351,
191        GetSubscriptionGroupConfig = 352,
192        UpdateAndGetGroupForbidden = 353,
193        LitePullMessage = 361,
194
195        QueryAssignment = 400,
196        SetMessageRequestMode = 401,
197        GetAllMessageRequestMode = 402,
198        UpdateAndCreateStaticTopic = 513,
199        GetBrokerMemberGroup = 901,
200        AddBroker = 902,
201        RemoveBroker = 903,
202        BrokerHeartbeat = 904,
203        NotifyMinBrokerIdChange = 905,
204        ExchangeBrokerHaInfo = 906,
205        GetBrokerHaStatus = 907,
206        ResetMasterFlushOffset = 908,
207        GetAllProducerInfo = 328,
208        DeleteExpiredCommitlog = 329,
209
210        UpdateColdDataFlowCtrConfig = 2001,
211        RemoveColdDataFlowCtrConfig = 2002,
212        GetColdDataFlowCtrInfo = 2003,
213        SetCommitlogReadMode = 2004,
214
215        // Controller codes
216        ControllerAlterSyncStateSet = 1001,
217        ControllerElectMaster = 1002,
218        ControllerRegisterBroker = 1003,
219        ControllerGetReplicaInfo = 1004,
220        ControllerGetMetadataInfo = 1005,
221        ControllerGetSyncStateData = 1006,
222        GetBrokerEpochCache = 1007,
223        NotifyBrokerRoleChanged = 1008,
224        UpdateControllerConfig = 1009,
225        GetControllerConfig = 1010,
226
227        CleanBrokerData = 1011,
228        ControllerGetNextBrokerId = 1012,
229        ControllerApplyBrokerId = 1013,
230        BrokerCloseChannelRequest = 1014,
231        CheckNotActiveBrokerRequest = 1015,
232        GetBrokerLiveInfoRequest = 1016,
233        GetSyncStateDataRequest = 1017,
234        RaftBrokerHeartBeatEventRequest = 1018,
235
236        // Auth codes
237        AuthCreateUser = 3001,
238        AuthUpdateUser = 3002,
239        AuthDeleteUser = 3003,
240        AuthGetUser = 3004,
241        AuthListUser = 3005,
242        AuthCreateAcl = 3006,
243        AuthUpdateAcl = 3007,
244        AuthDeleteAcl = 3008,
245        AuthGetAcl = 3009,
246        AuthListAcl = 3010,
247
248        Unknown = -9999999,
249    }
250}
251
252#[cfg(test)]
253mod tests {
254    use super::*;
255
256    #[test]
257    fn test_request_code_to_i32() {
258        assert_eq!(RequestCode::SendMessage.to_i32(), 10);
259        assert_eq!(RequestCode::PullMessage.to_i32(), 11);
260        assert_eq!(RequestCode::HeartBeat.to_i32(), 34);
261        assert_eq!(RequestCode::PopMessage.to_i32(), 200050);
262        assert_eq!(RequestCode::ControllerAlterSyncStateSet.to_i32(), 1001);
263        assert_eq!(RequestCode::AuthCreateUser.to_i32(), 3001);
264        assert_eq!(RequestCode::Unknown.to_i32(), -9999999);
265    }
266
267    #[test]
268    fn test_i32_to_request_code() {
269        assert_eq!(RequestCode::from(10), RequestCode::SendMessage);
270        assert_eq!(RequestCode::from(11), RequestCode::PullMessage);
271        assert_eq!(RequestCode::from(34), RequestCode::HeartBeat);
272        assert_eq!(RequestCode::from(200050), RequestCode::PopMessage);
273        assert_eq!(
274            RequestCode::from(1001),
275            RequestCode::ControllerAlterSyncStateSet
276        );
277        assert_eq!(RequestCode::from(3001), RequestCode::AuthCreateUser);
278        assert_eq!(RequestCode::from(-9999999), RequestCode::Unknown);
279    }
280
281    #[test]
282    fn test_unknown_code_conversion() {
283        // Any unknown i32 value should return Unknown
284        assert_eq!(RequestCode::from(99999), RequestCode::Unknown);
285        assert_eq!(RequestCode::from(-1), RequestCode::Unknown);
286        assert_eq!(RequestCode::from(0), RequestCode::Unknown);
287        assert_eq!(RequestCode::from(999), RequestCode::Unknown);
288    }
289
290    #[test]
291    fn test_is_unknown() {
292        assert!(RequestCode::Unknown.is_unknown());
293        assert!(!RequestCode::SendMessage.is_unknown());
294        assert!(!RequestCode::HeartBeat.is_unknown());
295        assert!(!RequestCode::PopMessage.is_unknown());
296
297        // Test with unknown code conversion
298        let unknown_code = RequestCode::from(12345);
299        assert!(unknown_code.is_unknown());
300    }
301
302    #[test]
303    fn test_request_code_from_trait() {
304        let code: i32 = RequestCode::SendMessage.into();
305        assert_eq!(code, 10);
306
307        let code: i32 = RequestCode::Unknown.into();
308        assert_eq!(code, -9999999);
309    }
310
311    #[test]
312    fn test_round_trip_conversion() {
313        // Test that converting to i32 and back gives the same value
314        let codes = vec![
315            RequestCode::SendMessage,
316            RequestCode::PullMessage,
317            RequestCode::QueryMessage,
318            RequestCode::HeartBeat,
319            RequestCode::PopMessage,
320            RequestCode::RegisterBroker,
321            RequestCode::ControllerElectMaster,
322            RequestCode::AuthCreateUser,
323            RequestCode::Unknown,
324        ];
325
326        for code in codes {
327            let i32_val = code.to_i32();
328            let converted_back = RequestCode::from(i32_val);
329            assert_eq!(code, converted_back, "Round trip failed for {:?}", code);
330        }
331    }
332
333    #[test]
334    fn test_derive_traits() {
335        // Test Debug
336        let code = RequestCode::SendMessage;
337        assert_eq!(format!("{:?}", code), "SendMessage");
338
339        // Test Clone and Copy
340        let code1 = RequestCode::HeartBeat;
341        let code2 = code1;
342        let code3 = code1;
343        assert_eq!(code1, code2);
344        assert_eq!(code1, code3);
345
346        // Test PartialEq and Eq
347        assert_eq!(RequestCode::SendMessage, RequestCode::SendMessage);
348        assert_ne!(RequestCode::SendMessage, RequestCode::PullMessage);
349
350        // Test Hash (by using in a HashSet)
351        use std::collections::HashSet;
352        let mut set = HashSet::new();
353        set.insert(RequestCode::SendMessage);
354        set.insert(RequestCode::SendMessage); // Duplicate
355        set.insert(RequestCode::PullMessage);
356        assert_eq!(set.len(), 2);
357    }
358
359    #[test]
360    fn test_special_codes() {
361        // Test Pop message range (200050-200055)
362        assert_eq!(RequestCode::from(200050), RequestCode::PopMessage);
363        assert_eq!(RequestCode::from(200051), RequestCode::AckMessage);
364        assert_eq!(RequestCode::from(200151), RequestCode::BatchAckMessage);
365        assert_eq!(RequestCode::from(200052), RequestCode::PeekMessage);
366        assert_eq!(
367            RequestCode::from(200053),
368            RequestCode::ChangeMessageInvisibleTime
369        );
370        assert_eq!(RequestCode::from(200054), RequestCode::Notification);
371        assert_eq!(RequestCode::from(200055), RequestCode::PollingInfo);
372
373        // Test Controller codes (1001-1018)
374        assert_eq!(
375            RequestCode::from(1001),
376            RequestCode::ControllerAlterSyncStateSet
377        );
378        assert_eq!(
379            RequestCode::from(1018),
380            RequestCode::RaftBrokerHeartBeatEventRequest
381        );
382
383        // Test Auth codes (3001-3010)
384        assert_eq!(RequestCode::from(3001), RequestCode::AuthCreateUser);
385        assert_eq!(RequestCode::from(3010), RequestCode::AuthListAcl);
386
387        // Test Cold data flow codes (2001-2004)
388        assert_eq!(
389            RequestCode::from(2001),
390            RequestCode::UpdateColdDataFlowCtrConfig
391        );
392        assert_eq!(RequestCode::from(2004), RequestCode::SetCommitlogReadMode);
393    }
394
395    #[test]
396    fn test_const_fn_to_i32() {
397        // Verify that to_i32 is const and can be used in const context
398        const CODE: i32 = RequestCode::SendMessage.to_i32();
399        assert_eq!(CODE, 10);
400    }
401
402    #[test]
403    fn test_repr_i32_size() {
404        // Verify that RequestCode has the same size as i32
405        use std::mem::size_of;
406        assert_eq!(size_of::<RequestCode>(), size_of::<i32>());
407    }
408}