@@ -39,6 +39,7 @@ use rocketmq_store::base::message_status_enum::PutMessageStatus;
39
39
use rocketmq_store:: config:: broker_role:: BrokerRole ;
40
40
use rocketmq_store:: config:: message_store_config:: MessageStoreConfig ;
41
41
use rocketmq_store:: log_file:: MessageStore ;
42
+ use tracing:: warn;
42
43
43
44
use crate :: transaction:: operation_result:: OperationResult ;
44
45
use crate :: transaction:: queue:: transactional_message_util:: TransactionalMessageUtil ;
84
85
. decode_command_custom_header :: < EndTransactionRequestHeader > ( )
85
86
. expect ( "EndTransactionRequestHeader decode failed" ) ;
86
87
if BrokerRole :: Slave == self . message_store_config . broker_role {
88
+ warn ! ( "Message store is slave mode, so end transaction is forbidden. " ) ;
87
89
return Some ( RemotingCommand :: create_response_command_with_code (
88
90
ResponseCode :: SlaveNotAvailable ,
89
91
) ) ;
@@ -110,35 +112,36 @@ where
110
112
111
113
let result = if MessageSysFlag :: TRANSACTION_COMMIT_TYPE == request_header. commit_or_rollback
112
114
{
113
- let from_transaction_check = request_header. from_transaction_check ;
114
- let commit_or_rollback = request_header. commit_or_rollback ;
115
- let params = (
116
- request_header. producer_group . to_string ( ) ,
117
- request_header. tran_state_table_offset as i64 ,
118
- request_header. commit_log_offset as i64 ,
119
- ) ;
120
115
let result = self
121
116
. transactional_message_service
122
- . commit_message ( request_header) ;
117
+ . commit_message ( & request_header) ;
123
118
if result. response_code == ResponseCode :: Success {
124
119
if self . reject_commit_or_rollback (
125
- from_transaction_check,
120
+ request_header . from_transaction_check ,
126
121
result. prepare_message . as_ref ( ) . unwrap ( ) ,
127
122
) {
123
+ warn ! (
124
+ "Message commit fail [producer end]. currentTimeMillis - bornTime > \
125
+ checkImmunityTime, msgId={},commitLogOffset={}, wait check",
126
+ request_header. msg_id, request_header. commit_log_offset
127
+ ) ;
128
128
return Some ( RemotingCommand :: create_response_command_with_code (
129
129
ResponseCode :: IllegalOperation ,
130
130
) ) ;
131
131
}
132
- let res = self . check_prepare_message ( result. prepare_message . as_ref ( ) , & params) ;
132
+ let res =
133
+ self . check_prepare_message ( result. prepare_message . as_ref ( ) , & request_header) ;
133
134
if ResponseCode :: from ( res. code ( ) ) != ResponseCode :: Success {
134
135
let mut msg_inner =
135
136
end_message_transaction ( result. prepare_message . as_ref ( ) . unwrap ( ) ) ;
136
137
msg_inner. message_ext_inner . sys_flag = MessageSysFlag :: reset_transaction_value (
137
138
msg_inner. message_ext_inner . sys_flag ,
138
- commit_or_rollback,
139
+ request_header . commit_or_rollback ,
139
140
) ;
140
- msg_inner. message_ext_inner . queue_offset = params. 1 ;
141
- msg_inner. message_ext_inner . prepared_transaction_offset = params. 2 ;
141
+ msg_inner. message_ext_inner . queue_offset =
142
+ request_header. tran_state_table_offset as i64 ;
143
+ msg_inner. message_ext_inner . prepared_transaction_offset =
144
+ request_header. commit_log_offset as i64 ;
142
145
msg_inner. message_ext_inner . store_timestamp =
143
146
result. prepare_message . as_ref ( ) . unwrap ( ) . store_timestamp ;
144
147
MessageAccessor :: clear_property (
@@ -159,25 +162,25 @@ where
159
162
OperationResult :: default ( )
160
163
}
161
164
} else if MessageSysFlag :: TRANSACTION_ROLLBACK_TYPE == request_header. commit_or_rollback {
162
- let from_transaction_check = request_header. from_transaction_check ;
163
- let params = (
164
- request_header. producer_group . to_string ( ) ,
165
- request_header. tran_state_table_offset as i64 ,
166
- request_header. commit_log_offset as i64 ,
167
- ) ;
168
165
let result = self
169
166
. transactional_message_service
170
- . rollback_message ( request_header) ;
167
+ . rollback_message ( & request_header) ;
171
168
if result. response_code == ResponseCode :: Success {
172
169
if self . reject_commit_or_rollback (
173
- from_transaction_check,
170
+ request_header . from_transaction_check ,
174
171
result. prepare_message . as_ref ( ) . unwrap ( ) ,
175
172
) {
173
+ warn ! (
174
+ "Message commit fail [producer end]. currentTimeMillis - bornTime > \
175
+ checkImmunityTime, msgId={},commitLogOffset={}, wait check",
176
+ request_header. msg_id, request_header. commit_log_offset
177
+ ) ;
176
178
return Some ( RemotingCommand :: create_response_command_with_code (
177
179
ResponseCode :: IllegalOperation ,
178
180
) ) ;
179
181
}
180
- let res = self . check_prepare_message ( result. prepare_message . as_ref ( ) , & params) ;
182
+ let res =
183
+ self . check_prepare_message ( result. prepare_message . as_ref ( ) , & request_header) ;
181
184
if ResponseCode :: from ( res. code ( ) ) == ResponseCode :: Success {
182
185
let _ = self
183
186
. transactional_message_service
@@ -223,7 +226,8 @@ where
223
226
fn check_prepare_message (
224
227
& self ,
225
228
message_ext : Option < & MessageExt > ,
226
- params : & ( String , i64 , i64 ) ,
229
+ // params: &(String, i64, i64),
230
+ request_header : & EndTransactionRequestHeader ,
227
231
) -> RemotingCommand {
228
232
let mut command = RemotingCommand :: create_response_command ( ) ;
229
233
if let Some ( message_ext) = message_ext {
@@ -236,17 +240,17 @@ where
236
240
return command;
237
241
}
238
242
let pgroup = pgroup_read. unwrap ( ) ;
239
- if pgroup != params . 0 {
243
+ if pgroup != request_header . producer_group . as_str ( ) {
240
244
command. set_code_mut ( ResponseCode :: SystemError ) ;
241
245
command. set_remark_mut ( "The producer group wrong" ) ;
242
246
return command;
243
247
}
244
- if message_ext. queue_offset != params . 1 {
248
+ if message_ext. queue_offset != request_header . tran_state_table_offset as i64 {
245
249
command. set_code_mut ( ResponseCode :: SystemError ) ;
246
250
command. set_remark_mut ( "The transaction state table offset wrong" ) ;
247
251
return command;
248
252
}
249
- if message_ext. commit_log_offset != params . 2 {
253
+ if message_ext. commit_log_offset != request_header . commit_log_offset as i64 {
250
254
command. set_code_mut ( ResponseCode :: SystemError ) ;
251
255
command. set_remark_mut ( "The commit log offset wrong" ) ;
252
256
return command;
@@ -372,10 +376,11 @@ fn end_message_transaction(msg_ext: &MessageExt) -> MessageExtBrokerInner {
372
376
} else {
373
377
TopicFilterType :: SingleTag
374
378
} ;
375
- let tags_code_value = MessageExtBrokerInner :: tags_string2tags_code (
376
- & topic_filter_type,
377
- msg_ext. get_tags ( ) . as_ref ( ) . unwrap ( ) ,
378
- ) ;
379
+ let tags_code_value = if let Some ( tags) = msg_ext. get_tags ( ) {
380
+ MessageExtBrokerInner :: tags_string2tags_code ( & topic_filter_type, tags. as_str ( ) )
381
+ } else {
382
+ 0
383
+ } ;
379
384
msg_inner. tags_code = tags_code_value;
380
385
MessageAccessor :: set_properties ( & mut msg_inner, msg_ext. get_properties ( ) . clone ( ) ) ;
381
386
msg_inner. properties_string =
@@ -384,3 +389,90 @@ fn end_message_transaction(msg_ext: &MessageExt) -> MessageExtBrokerInner {
384
389
MessageAccessor :: clear_property ( & mut msg_inner, MessageConst :: PROPERTY_REAL_QUEUE_ID ) ;
385
390
msg_inner
386
391
}
392
+
393
+ #[ cfg( test) ]
394
+ mod tests {
395
+ use super :: * ;
396
+
397
+ #[ test]
398
+ fn end_message_transaction_with_valid_message ( ) {
399
+ let msg_ext = MessageExt :: default ( ) ;
400
+ let msg_inner = end_message_transaction ( & msg_ext) ;
401
+ assert_eq ! (
402
+ msg_inner. get_topic( ) ,
403
+ & msg_ext
404
+ . get_user_property( & CheetahString :: from_static_str(
405
+ MessageConst :: PROPERTY_REAL_TOPIC
406
+ ) )
407
+ . unwrap_or_default( )
408
+ ) ;
409
+ assert_eq ! (
410
+ msg_inner. message_ext_inner. queue_id,
411
+ msg_ext
412
+ . get_user_property( & CheetahString :: from_static_str(
413
+ MessageConst :: PROPERTY_REAL_QUEUE_ID
414
+ ) )
415
+ . unwrap_or_default( )
416
+ . parse:: <i32 >( )
417
+ . unwrap_or_default( )
418
+ ) ;
419
+ assert_eq ! ( msg_inner. get_body( ) , msg_ext. get_body( ) ) ;
420
+ assert_eq ! ( msg_inner. get_flag( ) , msg_ext. get_flag( ) ) ;
421
+ assert_eq ! (
422
+ msg_inner. message_ext_inner. born_timestamp,
423
+ msg_ext. born_timestamp
424
+ ) ;
425
+ assert_eq ! ( msg_inner. message_ext_inner. born_host, msg_ext. born_host) ;
426
+ assert_eq ! ( msg_inner. message_ext_inner. store_host, msg_ext. store_host) ;
427
+ assert_eq ! (
428
+ msg_inner. message_ext_inner. reconsume_times,
429
+ msg_ext. reconsume_times
430
+ ) ;
431
+ assert ! ( msg_inner. is_wait_store_msg_ok( ) ) ;
432
+ /* assert_eq!(
433
+ msg_inner.get_transaction_id(),
434
+ &msg_ext
435
+ .get_user_property(&CheetahString::from_static_str(
436
+ MessageConst::PROPERTY_UNIQ_CLIENT_MESSAGE_ID_KEYIDX
437
+ ))
438
+ .unwrap_or_default()
439
+ );*/
440
+ assert_eq ! ( msg_inner. message_ext_inner. sys_flag, msg_ext. sys_flag) ;
441
+ /* assert_eq!(
442
+ msg_inner.tags_code,
443
+ MessageExtBrokerInner::tags_string2tags_code(
444
+ &TopicFilterType::SingleTag,
445
+ msg_ext.get_tags().as_ref().unwrap()
446
+ )
447
+ );*/
448
+ assert_eq ! ( msg_inner. get_properties( ) , msg_ext. get_properties( ) ) ;
449
+ assert_eq ! (
450
+ msg_inner. properties_string,
451
+ message_decoder:: message_properties_to_string( msg_ext. get_properties( ) )
452
+ ) ;
453
+ }
454
+
455
+ #[ test]
456
+ fn end_message_transaction_with_empty_body ( ) {
457
+ let mut msg_ext = MessageExt :: default ( ) ;
458
+ //msg_ext.set_body(None);
459
+ let msg_inner = end_message_transaction ( & msg_ext) ;
460
+ assert ! ( !msg_inner. get_body( ) . is_some_and( |b| b. is_empty( ) ) ) ;
461
+ }
462
+
463
+ #[ test]
464
+ fn end_message_transaction_with_missing_properties ( ) {
465
+ let mut msg_ext = MessageExt :: default ( ) ;
466
+ msg_ext. put_property (
467
+ CheetahString :: from_static_str ( MessageConst :: PROPERTY_REAL_TOPIC ) ,
468
+ CheetahString :: empty ( ) ,
469
+ ) ;
470
+ msg_ext. put_property (
471
+ CheetahString :: from_static_str ( MessageConst :: PROPERTY_REAL_QUEUE_ID ) ,
472
+ CheetahString :: empty ( ) ,
473
+ ) ;
474
+ let msg_inner = end_message_transaction ( & msg_ext) ;
475
+ assert ! ( msg_inner. get_topic( ) . is_empty( ) ) ;
476
+ assert_eq ! ( msg_inner. message_ext_inner. queue_id, 0 ) ;
477
+ }
478
+ }
0 commit comments