14
14
* See the License for the specific language governing permissions and
15
15
* limitations under the License.
16
16
*/
17
+ use std:: net:: SocketAddr ;
17
18
use std:: sync:: Arc ;
18
19
20
+ use bytes:: Bytes ;
21
+ use bytes:: BytesMut ;
19
22
use rocketmq_common:: common:: broker:: broker_config:: BrokerConfig ;
20
23
use rocketmq_common:: common:: mix_all:: MASTER_ID ;
24
+ use rocketmq_common:: common:: sys_flag:: pull_sys_flag:: PullSysFlag ;
21
25
use rocketmq_remoting:: code:: response_code:: RemotingSysResponseCode ;
22
26
use rocketmq_remoting:: code:: response_code:: ResponseCode ;
23
27
use rocketmq_remoting:: net:: channel:: Channel ;
24
28
use rocketmq_remoting:: protocol:: header:: pull_message_request_header:: PullMessageRequestHeader ;
25
29
use rocketmq_remoting:: protocol:: header:: pull_message_response_header:: PullMessageResponseHeader ;
26
30
use rocketmq_remoting:: protocol:: heartbeat:: subscription_data:: SubscriptionData ;
27
31
use rocketmq_remoting:: protocol:: remoting_command:: RemotingCommand ;
32
+ use rocketmq_remoting:: protocol:: request_source:: RequestSource ;
28
33
use rocketmq_remoting:: protocol:: static_topic:: topic_queue_mapping_context:: TopicQueueMappingContext ;
29
34
use rocketmq_remoting:: protocol:: subscription:: subscription_group_config:: SubscriptionGroupConfig ;
30
35
use rocketmq_remoting:: protocol:: NamespaceUtil ;
@@ -36,25 +41,42 @@ use rocketmq_store::stats::stats_type::StatsType;
36
41
use tracing:: debug;
37
42
use tracing:: info;
38
43
44
+ use crate :: client:: manager:: consumer_manager:: ConsumerManager ;
39
45
use crate :: mqtrace:: consume_message_context:: ConsumeMessageContext ;
40
46
use crate :: mqtrace:: consume_message_hook:: ConsumeMessageHook ;
47
+ use crate :: offset:: manager:: broadcast_offset_manager:: BroadcastOffsetManager ;
48
+ use crate :: offset:: manager:: consumer_offset_manager:: ConsumerOffsetManager ;
49
+ use crate :: processor:: pull_message_processor:: is_broadcast;
50
+ use crate :: processor:: pull_message_processor:: rewrite_response_for_static_topic;
41
51
use crate :: processor:: pull_message_result_handler:: PullMessageResultHandler ;
42
52
use crate :: topic:: manager:: topic_config_manager:: TopicConfigManager ;
43
53
44
54
pub struct DefaultPullMessageResultHandler {
45
55
topic_config_manager : Arc < TopicConfigManager > ,
56
+ consumer_offset_manager : Arc < ConsumerOffsetManager > ,
57
+ consumer_manager : Arc < ConsumerManager > ,
58
+ broadcast_offset_manager : Arc < BroadcastOffsetManager > ,
59
+ broker_stats_manager : Arc < BrokerStatsManager > ,
46
60
broker_config : Arc < BrokerConfig > ,
47
61
consume_message_hook_list : Arc < Vec < Box < dyn ConsumeMessageHook > > > ,
48
62
}
49
63
50
64
impl DefaultPullMessageResultHandler {
51
65
pub fn new (
52
66
topic_config_manager : Arc < TopicConfigManager > ,
67
+ consumer_offset_manager : Arc < ConsumerOffsetManager > ,
68
+ consumer_manager : Arc < ConsumerManager > ,
69
+ broadcast_offset_manager : Arc < BroadcastOffsetManager > ,
70
+ broker_stats_manager : Arc < BrokerStatsManager > ,
53
71
broker_config : Arc < BrokerConfig > ,
54
72
consume_message_hook_list : Arc < Vec < Box < dyn ConsumeMessageHook > > > ,
55
73
) -> Self {
56
74
Self {
57
75
topic_config_manager,
76
+ consumer_offset_manager,
77
+ consumer_manager,
78
+ broadcast_offset_manager,
79
+ broker_stats_manager,
58
80
broker_config,
59
81
consume_message_hook_list,
60
82
}
@@ -74,7 +96,7 @@ impl PullMessageResultHandler for DefaultPullMessageResultHandler {
74
96
broker_allow_suspend : bool ,
75
97
message_filter : Box < dyn MessageFilter > ,
76
98
mut response : RemotingCommand ,
77
- mapping_context : TopicQueueMappingContext ,
99
+ mut mapping_context : TopicQueueMappingContext ,
78
100
begin_time_mills : u64 ,
79
101
) -> Option < RemotingCommand > {
80
102
let client_address = channel. remote_address ( ) . to_string ( ) ;
@@ -90,28 +112,95 @@ impl PullMessageResultHandler for DefaultPullMessageResultHandler {
90
112
& mut response,
91
113
client_address. as_str ( ) ,
92
114
) ;
115
+ let code = From :: from ( response. code ( ) ) ;
93
116
self . execute_consume_message_hook_before (
94
117
& request,
95
118
& request_header,
96
119
& get_message_result,
97
120
broker_allow_suspend,
98
- From :: from ( response . code ( ) ) ,
121
+ code,
99
122
) ;
100
- /* let response_header = response.read_custom_header_mut::<PullMessageResponseHeader>();
101
- let rewrite_result = PullMessageProcessor:: rewrite_response_for_static_topic(
123
+ let response_header = response. read_custom_header_mut :: < PullMessageResponseHeader > ( ) ;
124
+ let rewrite_result = rewrite_response_for_static_topic (
102
125
& request_header,
103
126
response_header. unwrap ( ) ,
104
127
& mut mapping_context,
105
- ResponseCode::from(response. code()) ,
128
+ code,
106
129
) ;
107
130
if rewrite_result. is_some ( ) {
108
131
return rewrite_result;
109
- }*/
110
- None
132
+ }
133
+ self . update_broadcast_pulled_offset (
134
+ request_header. topic . as_str ( ) ,
135
+ request_header. consumer_group . as_str ( ) ,
136
+ request_header. queue_id . unwrap ( ) ,
137
+ & request_header,
138
+ & channel,
139
+ Some ( & response) ,
140
+ get_message_result. next_begin_offset ( ) ,
141
+ ) ;
142
+ self . try_commit_offset (
143
+ broker_allow_suspend,
144
+ & request_header,
145
+ get_message_result. next_begin_offset ( ) ,
146
+ channel. remote_address ( ) ,
147
+ ) ;
148
+
149
+ match code {
150
+ ResponseCode :: Success => {
151
+ self . broker_stats_manager . inc_group_get_nums (
152
+ request_header. consumer_group . as_str ( ) ,
153
+ request_header. topic . as_str ( ) ,
154
+ get_message_result. message_count ( ) ,
155
+ ) ;
156
+ self . broker_stats_manager . inc_group_get_size (
157
+ request_header. consumer_group . as_str ( ) ,
158
+ request_header. topic . as_str ( ) ,
159
+ get_message_result. buffer_total_size ( ) ,
160
+ ) ;
161
+ self . broker_stats_manager . inc_broker_get_nums (
162
+ request_header. topic . as_str ( ) ,
163
+ get_message_result. message_count ( ) ,
164
+ ) ;
165
+ if self . broker_config . transfer_msg_by_heap {
166
+ let body = self . read_get_message_result (
167
+ & get_message_result,
168
+ request_header. consumer_group . as_str ( ) ,
169
+ request_header. topic . as_str ( ) ,
170
+ request_header. queue_id . unwrap ( ) ,
171
+ ) ;
172
+ return Some ( response. set_body ( body) ) ;
173
+ } /*else {
174
+ None
175
+ }*/
176
+ None
177
+ }
178
+ ResponseCode :: PullNotFound => Some ( response) ,
179
+ ResponseCode :: PullOffsetMoved => Some ( response) ,
180
+ ResponseCode :: PullRetryImmediately => Some ( response) ,
181
+ _ => None ,
182
+ }
111
183
}
112
184
}
113
185
114
186
impl DefaultPullMessageResultHandler {
187
+ fn read_get_message_result (
188
+ & self ,
189
+ get_message_result : & GetMessageResult ,
190
+ _group : & str ,
191
+ _topic : & str ,
192
+ _queue_id : i32 ,
193
+ ) -> Option < Bytes > {
194
+ let mut bytes_mut =
195
+ BytesMut :: with_capacity ( get_message_result. buffer_total_size ( ) as usize ) ;
196
+ for msg in get_message_result. message_mapped_list ( ) {
197
+ let data = & msg. mapped_file . as_ref ( ) . unwrap ( ) . get_mapped_file ( )
198
+ [ msg. start_offset as usize ..( msg. start_offset + msg. size as u64 ) as usize ] ;
199
+ bytes_mut. extend_from_slice ( data) ;
200
+ }
201
+ Some ( bytes_mut. freeze ( ) )
202
+ }
203
+
115
204
fn execute_consume_message_hook_before (
116
205
& self ,
117
206
request : & RemotingCommand ,
@@ -306,4 +395,86 @@ impl DefaultPullMessageResultHandler {
306
395
}
307
396
response. set_command_custom_header_ref ( response_header)
308
397
}
398
+
399
+ fn try_commit_offset (
400
+ & self ,
401
+ broker_allow_suspend : bool ,
402
+ request_header : & PullMessageRequestHeader ,
403
+ next_offset : i64 ,
404
+ client_address : SocketAddr ,
405
+ ) {
406
+ self . consumer_offset_manager . commit_pull_offset (
407
+ client_address,
408
+ request_header. consumer_group . as_str ( ) ,
409
+ request_header. topic . as_str ( ) ,
410
+ request_header. queue_id . unwrap ( ) ,
411
+ next_offset,
412
+ ) ;
413
+
414
+ let mut store_offset_enable = broker_allow_suspend;
415
+ let has_commit_offset_flag =
416
+ PullSysFlag :: has_commit_offset_flag ( request_header. sys_flag as u32 ) ;
417
+ store_offset_enable = store_offset_enable && has_commit_offset_flag;
418
+ if store_offset_enable {
419
+ self . consumer_offset_manager . commit_offset (
420
+ client_address,
421
+ request_header. consumer_group . as_str ( ) ,
422
+ request_header. topic . as_str ( ) ,
423
+ request_header. queue_id . unwrap ( ) ,
424
+ request_header. commit_offset ,
425
+ ) ;
426
+ }
427
+ }
428
+
429
+ fn update_broadcast_pulled_offset (
430
+ & self ,
431
+ topic : & str ,
432
+ group : & str ,
433
+ queue_id : i32 ,
434
+ request_header : & PullMessageRequestHeader ,
435
+ channel : & Channel ,
436
+ response : Option < & RemotingCommand > ,
437
+ next_begin_offset : i64 ,
438
+ ) {
439
+ if response. is_none ( ) || !self . broker_config . enable_broadcast_offset_store {
440
+ return ;
441
+ }
442
+ let proxy_pull_broadcast =
443
+ request_header. request_source == Some ( RequestSource :: ProxyForBroadcast . get_value ( ) ) ;
444
+ let consumer_group_info = self . consumer_manager . get_consumer_group_info ( group) ;
445
+
446
+ if is_broadcast ( proxy_pull_broadcast, consumer_group_info. as_ref ( ) ) {
447
+ let mut offset = request_header. queue_offset ;
448
+ if let Some ( response) = response {
449
+ if ResponseCode :: from ( response. code ( ) ) == ResponseCode :: PullOffsetMoved {
450
+ offset = next_begin_offset;
451
+ }
452
+ }
453
+
454
+ let client_id = if proxy_pull_broadcast {
455
+ request_header
456
+ . proxy_forward_client_id
457
+ . clone ( )
458
+ . unwrap_or_default ( )
459
+ } else if let Some ( ref consumer_group_info) = consumer_group_info {
460
+ if let Some ( ref client_channel_info) =
461
+ consumer_group_info. find_channel_by_channel ( channel)
462
+ {
463
+ client_channel_info. client_id ( ) . clone ( )
464
+ } else {
465
+ return ;
466
+ }
467
+ } else {
468
+ return ;
469
+ } ;
470
+ self . broadcast_offset_manager . update_offset (
471
+ topic,
472
+ group,
473
+ queue_id,
474
+ offset,
475
+ client_id. as_str ( ) ,
476
+ proxy_pull_broadcast,
477
+ ) ;
478
+ }
479
+ }
309
480
}
0 commit comments