14
14
* See the License for the specific language governing permissions and
15
15
* limitations under the License.
16
16
*/
17
- use std:: sync:: Arc ;
17
+ use std:: { collections :: HashMap , sync:: Arc } ;
18
18
19
19
use bytes:: BytesMut ;
20
20
use rocketmq_common:: {
21
21
common:: {
22
- message:: { message_batch:: MessageExtBatch , message_single:: MessageExtBrokerInner } ,
22
+ attribute:: cq_type:: CQType ,
23
+ config:: TopicConfig ,
24
+ message:: {
25
+ message_batch:: MessageExtBatch , message_single:: MessageExtBrokerInner , MessageConst ,
26
+ } ,
23
27
sys_flag:: message_sys_flag:: MessageSysFlag ,
24
28
} ,
25
- utils:: message_utils,
29
+ utils:: { message_utils, queue_type_utils :: QueueTypeUtils } ,
26
30
} ;
27
31
28
32
use crate :: {
@@ -31,7 +35,10 @@ use crate::{
31
35
put_message_context:: PutMessageContext ,
32
36
} ,
33
37
config:: message_store_config:: MessageStoreConfig ,
34
- log_file:: commit_log:: { CommitLog , CRC32_RESERVED_LEN } ,
38
+ log_file:: {
39
+ commit_log:: { CommitLog , CRC32_RESERVED_LEN } ,
40
+ mapped_file:: default_impl_refactor:: LocalMappedFile ,
41
+ } ,
35
42
} ;
36
43
37
44
/// Write messages callback interface
@@ -50,9 +57,9 @@ pub trait AppendMessageCallback {
50
57
///
51
58
/// The number of bytes written
52
59
fn do_append (
53
- & mut self ,
60
+ & self ,
54
61
file_from_offset : i64 ,
55
- file_wrote_position : i64 ,
62
+ mapped_file : & LocalMappedFile ,
56
63
max_blank : i32 ,
57
64
msg : & mut MessageExtBrokerInner ,
58
65
put_message_context : & PutMessageContext ,
@@ -85,29 +92,58 @@ pub trait AppendMessageCallback {
85
92
const END_FILE_MIN_BLANK_LENGTH : i32 = 4 + 4 ;
86
93
87
94
pub ( crate ) struct DefaultAppendMessageCallback {
88
- pub msg_store_item_memory : bytes:: BytesMut ,
89
- pub crc32_reserved_length : i32 ,
90
- pub message_store_config : Arc < MessageStoreConfig > ,
95
+ msg_store_item_memory : bytes:: BytesMut ,
96
+ crc32_reserved_length : i32 ,
97
+ message_store_config : Arc < MessageStoreConfig > ,
98
+ topic_config_table : Arc < parking_lot:: Mutex < HashMap < String , TopicConfig > > > ,
91
99
}
92
100
93
101
impl DefaultAppendMessageCallback {
94
- pub fn new ( message_store_config : Arc < MessageStoreConfig > ) -> Self {
102
+ pub fn new (
103
+ message_store_config : Arc < MessageStoreConfig > ,
104
+ topic_config_table : Arc < parking_lot:: Mutex < HashMap < String , TopicConfig > > > ,
105
+ ) -> Self {
95
106
Self {
96
107
msg_store_item_memory : bytes:: BytesMut :: with_capacity (
97
108
END_FILE_MIN_BLANK_LENGTH as usize ,
98
109
) ,
99
110
crc32_reserved_length : CRC32_RESERVED_LEN ,
100
111
message_store_config,
112
+ topic_config_table,
101
113
}
102
114
}
103
115
}
104
116
117
+ impl DefaultAppendMessageCallback {
118
+ fn get_message_num ( & self , msg_inner : & MessageExtBrokerInner ) -> i16 {
119
+ let mut message_num = 1i16 ;
120
+ let cq_type = self . get_cq_type ( msg_inner) ;
121
+ if MessageSysFlag :: check ( msg_inner. sys_flag ( ) , MessageSysFlag :: INNER_BATCH_FLAG )
122
+ || CQType :: BatchCQ == cq_type
123
+ {
124
+ if let Some ( key) = msg_inner. property ( MessageConst :: PROPERTY_INNER_NUM ) {
125
+ message_num = key. parse :: < i16 > ( ) . unwrap_or ( 1 ) ;
126
+ }
127
+ }
128
+ message_num
129
+ }
130
+
131
+ fn get_cq_type ( & self , msg_inner : & MessageExtBrokerInner ) -> CQType {
132
+ let topic_config = self
133
+ . topic_config_table
134
+ . lock ( )
135
+ . get ( msg_inner. message_ext_inner . topic ( ) )
136
+ . cloned ( ) ;
137
+ QueueTypeUtils :: get_cq_type ( & topic_config)
138
+ }
139
+ }
140
+
105
141
#[ allow( unused_variables) ]
106
142
impl AppendMessageCallback for DefaultAppendMessageCallback {
107
143
fn do_append (
108
- & mut self ,
144
+ & self ,
109
145
file_from_offset : i64 ,
110
- file_wrote_position : i64 ,
146
+ mapped_file : & LocalMappedFile ,
111
147
max_blank : i32 ,
112
148
msg_inner : & mut MessageExtBrokerInner ,
113
149
put_message_context : & PutMessageContext ,
@@ -122,14 +158,14 @@ impl AppendMessageCallback for DefaultAppendMessageCallback {
122
158
}
123
159
124
160
let msg_len = i32:: from_le_bytes ( pre_encode_buffer[ 0 ..4 ] . try_into ( ) . unwrap ( ) ) ;
125
- let wrote_offset = file_from_offset + file_wrote_position ;
161
+ let wrote_offset = file_from_offset + mapped_file . wrote_position ( ) as i64 ;
126
162
127
163
let msg_id =
128
164
message_utils:: build_message_id ( msg_inner. message_ext_inner . store_host , wrote_offset) ;
129
165
130
166
let mut queue_offset = msg_inner. queue_offset ( ) ;
131
167
//let message_num = CommitLog::get_message_num(msg_inner);
132
- let message_num = 1 ;
168
+ let message_num = self . get_message_num ( msg_inner ) ;
133
169
match MessageSysFlag :: get_transaction_value ( msg_inner. sys_flag ( ) ) {
134
170
MessageSysFlag :: TRANSACTION_PREPARED_TYPE
135
171
| MessageSysFlag :: TRANSACTION_ROLLBACK_TYPE => queue_offset = 0 ,
0 commit comments