@@ -24,6 +24,8 @@ use rocketmq_common::common::message::message_batch::MessageExtBatch;
24
24
use rocketmq_common:: common:: message:: message_single:: MessageExtBrokerInner ;
25
25
use rocketmq_common:: common:: sys_flag:: message_sys_flag:: MessageSysFlag ;
26
26
use rocketmq_common:: utils:: message_utils;
27
+ use rocketmq_common:: MessageUtils :: build_batch_message_id;
28
+ use rocketmq_common:: TimeUtils :: get_current_millis;
27
29
28
30
use crate :: base:: message_result:: AppendMessageResult ;
29
31
use crate :: base:: message_status_enum:: AppendMessageStatus ;
@@ -65,7 +67,8 @@ pub trait AppendMessageCallback {
65
67
mapped_file : & MF ,
66
68
max_blank : i32 ,
67
69
msg : & mut MessageExtBatch ,
68
- put_message_context : & PutMessageContext ,
70
+ put_message_context : & mut PutMessageContext ,
71
+ enabled_append_prop_crc : bool ,
69
72
) -> AppendMessageResult ;
70
73
}
71
74
@@ -179,9 +182,93 @@ impl AppendMessageCallback for DefaultAppendMessageCallback {
179
182
file_from_offset : i64 ,
180
183
mapped_file : & MF ,
181
184
max_blank : i32 ,
182
- msg : & mut MessageExtBatch ,
183
- put_message_context : & PutMessageContext ,
185
+ msg_batch : & mut MessageExtBatch ,
186
+ put_message_context : & mut PutMessageContext ,
187
+ enabled_append_prop_crc : bool ,
184
188
) -> AppendMessageResult {
185
- todo ! ( )
189
+ let wrote_offset = file_from_offset + mapped_file. get_wrote_position ( ) as i64 ;
190
+ let queue_offset = msg_batch. message_ext_broker_inner . queue_offset ( ) ;
191
+ let begin_queue_offset = queue_offset;
192
+
193
+ let begin_time_mills = get_current_millis ( ) ;
194
+
195
+ // Assuming get_encoded_buff returns Option<ByteBuffer>
196
+ let mut pre_encode_buffer = msg_batch. encoded_buff . take ( ) . unwrap ( ) ;
197
+ let sys_flag = msg_batch. message_ext_broker_inner . sys_flag ( ) ;
198
+ let born_host_length = if sys_flag & MessageSysFlag :: BORNHOST_V6_FLAG == 0 {
199
+ 4 + 4
200
+ } else {
201
+ 16 + 4
202
+ } ;
203
+ let store_host_length = if sys_flag & MessageSysFlag :: STOREHOSTADDRESS_V6_FLAG == 0 {
204
+ 4 + 4
205
+ } else {
206
+ 16 + 4
207
+ } ;
208
+ let mut total_msg_len = 0 ;
209
+ let mut msg_num = 0 ;
210
+ let mut msg_pos = 0 ;
211
+ let mut index = 0 ;
212
+ while total_msg_len < pre_encode_buffer. len ( ) as i32 {
213
+ let msg_len = i32:: from_be_bytes (
214
+ pre_encode_buffer[ total_msg_len as usize ..( total_msg_len + 4 ) as usize ]
215
+ . try_into ( )
216
+ . unwrap ( ) ,
217
+ ) ;
218
+ total_msg_len += msg_len;
219
+ if total_msg_len + END_FILE_MIN_BLANK_LENGTH > max_blank {
220
+ let mut bytes = BytesMut :: with_capacity ( END_FILE_MIN_BLANK_LENGTH as usize ) ;
221
+ bytes. put_i32 ( max_blank) ;
222
+ bytes. put_i32 ( BLANK_MAGIC_CODE ) ;
223
+ mapped_file. append_message_bytes ( & bytes. freeze ( ) ) ;
224
+ return AppendMessageResult {
225
+ status : AppendMessageStatus :: EndOfFile ,
226
+ wrote_offset,
227
+ wrote_bytes : max_blank,
228
+ msg_id : "" . to_string ( ) ,
229
+ store_timestamp : msg_batch. message_ext_broker_inner . store_timestamp ( ) ,
230
+ logics_offset : begin_queue_offset,
231
+ ..Default :: default ( )
232
+ } ;
233
+ }
234
+ let mut pos = msg_pos + 20 ;
235
+ pre_encode_buffer[ pos..( pos + 8 ) ] . copy_from_slice ( & queue_offset. to_be_bytes ( ) ) ;
236
+ pos += 8 ;
237
+ let phy_pos = wrote_offset + total_msg_len as i64 - msg_len as i64 ;
238
+ pre_encode_buffer[ pos..( pos + 8 ) ] . copy_from_slice ( & phy_pos. to_be_bytes ( ) ) ;
239
+ pos += 8 + 4 + 8 + born_host_length;
240
+ pre_encode_buffer[ pos..( pos + 8 ) ] . copy_from_slice (
241
+ & msg_batch
242
+ . message_ext_broker_inner
243
+ . store_timestamp ( )
244
+ . to_be_bytes ( ) ,
245
+ ) ;
246
+ if enabled_append_prop_crc {
247
+ let _check_size = msg_len - self . crc32_reserved_length ;
248
+ }
249
+ put_message_context. get_phy_pos_mut ( ) [ index] = phy_pos;
250
+ msg_num += 1 ;
251
+ msg_pos += msg_len as usize ;
252
+ index += 1 ;
253
+ }
254
+
255
+ let bytes = pre_encode_buffer. freeze ( ) ;
256
+ mapped_file. append_message_bytes ( & bytes) ;
257
+ let msg_id = build_batch_message_id (
258
+ msg_batch. message_ext_broker_inner . store_host ( ) ,
259
+ store_host_length,
260
+ put_message_context. get_batch_size ( ) as usize ,
261
+ put_message_context. get_phy_pos ( ) ,
262
+ ) ;
263
+ AppendMessageResult {
264
+ status : AppendMessageStatus :: PutOk ,
265
+ wrote_offset,
266
+ wrote_bytes : total_msg_len,
267
+ msg_id,
268
+ store_timestamp : msg_batch. message_ext_broker_inner . store_timestamp ( ) ,
269
+ logics_offset : begin_queue_offset,
270
+ msg_num,
271
+ ..Default :: default ( )
272
+ }
186
273
}
187
274
}
0 commit comments