17
17
#![ allow( unused_variables) ]
18
18
19
19
use std:: collections:: VecDeque ;
20
+ use std:: net:: SocketAddr ;
20
21
use std:: sync:: atomic:: AtomicBool ;
21
22
use std:: sync:: atomic:: AtomicI32 ;
22
23
use std:: sync:: atomic:: Ordering ;
@@ -32,6 +33,8 @@ use rocketmq_common::common::pop_ack_constants::PopAckConstants;
32
33
use rocketmq_common:: utils:: data_converter:: DataConverter ;
33
34
use rocketmq_common:: TimeUtils :: get_current_millis;
34
35
use rocketmq_rust:: ArcMut ;
36
+ use rocketmq_store:: base:: message_status_enum:: PutMessageStatus ;
37
+ use rocketmq_store:: log_file:: MessageStore ;
35
38
use rocketmq_store:: pop:: batch_ack_msg:: BatchAckMsg ;
36
39
use rocketmq_store:: pop:: pop_check_point:: PopCheckPoint ;
37
40
use rocketmq_store:: pop:: AckMessage ;
@@ -41,9 +44,11 @@ use tracing::error;
41
44
use tracing:: info;
42
45
use tracing:: warn;
43
46
47
+ use crate :: failover:: escape_bridge:: EscapeBridge ;
48
+ use crate :: processor:: pop_message_processor:: PopMessageProcessor ;
44
49
use crate :: processor:: pop_message_processor:: QueueLockManager ;
45
50
46
- pub ( crate ) struct PopBufferMergeService {
51
+ pub ( crate ) struct PopBufferMergeService < MS > {
47
52
buffer : DashMap < CheetahString /* mergeKey */ , PopCheckPointWrapper > ,
48
53
commit_offsets :
49
54
DashMap < CheetahString /* topic@cid@queueId */ , QueueWithTime < PopCheckPointWrapper > > ,
@@ -61,13 +66,17 @@ pub(crate) struct PopBufferMergeService {
61
66
master : AtomicBool ,
62
67
broker_config : Arc < BrokerConfig > ,
63
68
shutdown : Arc < Notify > ,
69
+ store_host : SocketAddr ,
70
+ escape_bridge : ArcMut < EscapeBridge < MS > > ,
64
71
}
65
72
66
- impl PopBufferMergeService {
73
+ impl < MS > PopBufferMergeService < MS > {
67
74
pub fn new (
68
75
revive_topic : CheetahString ,
69
76
queue_lock_manager : QueueLockManager ,
70
77
broker_config : Arc < BrokerConfig > ,
78
+ store_host : SocketAddr ,
79
+ escape_bridge : ArcMut < EscapeBridge < MS > > ,
71
80
) -> Self {
72
81
let interval = 5 ;
73
82
Self {
@@ -87,11 +96,13 @@ impl PopBufferMergeService {
87
96
master : AtomicBool :: new ( false ) ,
88
97
broker_config,
89
98
shutdown : Arc :: new ( Notify :: new ( ) ) ,
99
+ store_host,
100
+ escape_bridge,
90
101
}
91
102
}
92
103
}
93
104
94
- impl PopBufferMergeService {
105
+ impl < MS : MessageStore > PopBufferMergeService < MS > {
95
106
pub fn add_ack ( & mut self , revive_qid : i32 , ack_msg : & dyn AckMessage ) -> bool {
96
107
if !self . broker_config . enable_pop_buffer_merge {
97
108
return false ;
@@ -237,7 +248,7 @@ impl PopBufferMergeService {
237
248
self . master . load ( Ordering :: Acquire )
238
249
}
239
250
240
- fn scan ( & mut self ) {
251
+ async fn scan ( & mut self ) {
241
252
let start_time = Instant :: now ( ) ;
242
253
let mut count = 0 ;
243
254
let mut count_ck = 0 ;
@@ -275,13 +286,13 @@ impl PopBufferMergeService {
275
286
//nothing to do
276
287
} else if point_wrapper. is_just_offset ( ) {
277
288
if point_wrapper. get_revive_queue_offset ( ) < 0 {
278
- self . put_ck_to_store ( point_wrapper, false ) ;
289
+ self . put_ck_to_store ( point_wrapper, false ) . await ;
279
290
count_ck += 1 ;
280
291
}
281
292
} else if remove_ck {
282
293
if point_wrapper. get_revive_queue_offset ( ) < 0 {
283
294
{
284
- self . put_ck_to_store ( point_wrapper, false ) ;
295
+ self . put_ck_to_store ( point_wrapper, false ) . await ;
285
296
}
286
297
count_ck += 1 ;
287
298
}
@@ -312,7 +323,7 @@ impl PopBufferMergeService {
312
323
self . batch_ack_index_list . clear ( ) ;
313
324
}
314
325
} else if point_wrapper. get_revive_queue_offset ( ) < 0 {
315
- self . put_ck_to_store ( point_wrapper, false ) ;
326
+ self . put_ck_to_store ( point_wrapper, false ) . await ;
316
327
count_ck += 1 ;
317
328
}
318
329
}
@@ -377,7 +388,7 @@ impl PopBufferMergeService {
377
388
this. commit_offsets. clear( ) ;
378
389
return ;
379
390
}
380
- this. mut_from_ref( ) . scan( ) ;
391
+ this. mut_from_ref( ) . scan( ) . await ;
381
392
if this. scan_times % this. count_of_second30 == 0 {
382
393
this. scan_garbage( ) ;
383
394
}
@@ -395,7 +406,7 @@ impl PopBufferMergeService {
395
406
return ;
396
407
}
397
408
while !this. buffer . is_empty ( ) || this. get_offset_total_size ( ) > 0 {
398
- this. mut_from_ref ( ) . scan ( ) ;
409
+ this. mut_from_ref ( ) . scan ( ) . await ;
399
410
}
400
411
} ) ;
401
412
}
@@ -410,9 +421,41 @@ impl PopBufferMergeService {
410
421
unimplemented ! ( )
411
422
}
412
423
413
- fn put_ck_to_store ( & self , point_wrapper : & PopCheckPointWrapper , flag : bool ) {
414
- // Implement the logic to put checkpoint to store
415
- unimplemented ! ( )
424
+ async fn put_ck_to_store ( & self , point_wrapper : & PopCheckPointWrapper , flag : bool ) {
425
+ if point_wrapper. get_revive_queue_offset ( ) >= 0 {
426
+ return ;
427
+ }
428
+ let msg_inner = PopMessageProcessor :: < MS > :: build_ck_msg (
429
+ self . store_host ,
430
+ point_wrapper. get_ck ( ) ,
431
+ point_wrapper. revive_queue_id ,
432
+ self . revive_topic . clone ( ) ,
433
+ ) ;
434
+ let put_message_result = self
435
+ . escape_bridge
436
+ . mut_from_ref ( )
437
+ . put_message_to_specific_queue ( msg_inner)
438
+ . await ;
439
+ match put_message_result. put_message_status ( ) {
440
+ PutMessageStatus :: PutOk
441
+ | PutMessageStatus :: FlushDiskTimeout
442
+ | PutMessageStatus :: FlushSlaveTimeout
443
+ | PutMessageStatus :: SlaveNotAvailable => {
444
+ return ;
445
+ }
446
+ _ => { }
447
+ }
448
+ point_wrapper. set_ck_stored ( true ) ;
449
+ if put_message_result. remote_put ( ) {
450
+ point_wrapper. set_revive_queue_offset ( 0 ) ;
451
+ } else {
452
+ point_wrapper. set_revive_queue_offset (
453
+ put_message_result
454
+ . append_message_result ( )
455
+ . unwrap ( )
456
+ . logics_offset ,
457
+ ) ;
458
+ }
416
459
}
417
460
418
461
fn put_batch_ack_to_store (
0 commit comments