@@ -19,6 +19,12 @@ use api::v1::{ColumnSchema, Rows};
19
19
use common_recordbatch:: { RecordBatches , SendableRecordBatchStream } ;
20
20
use datatypes:: prelude:: ScalarVector ;
21
21
use datatypes:: vectors:: TimestampMillisecondVector ;
22
+ use futures:: TryStreamExt ;
23
+ use log_store:: kafka:: log_store:: KafkaLogStore ;
24
+ use rstest:: rstest;
25
+ use rstest_reuse:: { self , apply} ;
26
+ use store_api:: logstore:: provider:: Provider ;
27
+ use store_api:: logstore:: LogStore ;
22
28
use store_api:: region_engine:: RegionEngine ;
23
29
use store_api:: region_request:: {
24
30
RegionCompactRequest , RegionDeleteRequest , RegionFlushRequest , RegionRequest ,
@@ -30,8 +36,12 @@ use crate::config::MitoConfig;
30
36
use crate :: engine:: listener:: CompactionListener ;
31
37
use crate :: engine:: MitoEngine ;
32
38
use crate :: test_util:: {
33
- build_rows_for_key, column_metadata_to_column_schema, put_rows, CreateRequestBuilder , TestEnv ,
39
+ build_rows_for_key, column_metadata_to_column_schema, kafka_log_store_factory,
40
+ prepare_test_for_kafka_log_store, put_rows, single_kafka_log_store_factory,
41
+ CreateRequestBuilder , LogStoreFactory , TestEnv ,
34
42
} ;
43
+ use crate :: wal:: entry_reader:: decode_stream;
44
+ use crate :: wal:: raw_entry_reader:: flatten_stream;
35
45
36
46
async fn put_and_flush (
37
47
engine : & MitoEngine ,
@@ -105,6 +115,66 @@ async fn collect_stream_ts(stream: SendableRecordBatchStream) -> Vec<i64> {
105
115
res
106
116
}
107
117
118
+ #[ apply( single_kafka_log_store_factory) ]
119
+ async fn test_compaction_region_notification ( factory : Option < LogStoreFactory > ) {
120
+ common_telemetry:: init_default_ut_logging ( ) ;
121
+ let Some ( factory) = factory else {
122
+ return ;
123
+ } ;
124
+
125
+ let mut env =
126
+ TestEnv :: with_prefix ( "compaction_notification" ) . with_log_store_factory ( factory. clone ( ) ) ;
127
+ let engine = env. create_engine ( MitoConfig :: default ( ) ) . await ;
128
+ let topic = prepare_test_for_kafka_log_store ( & factory) . await ;
129
+ let region_id = RegionId :: new ( 1 , 1 ) ;
130
+ let request = CreateRequestBuilder :: new ( )
131
+ . kafka_topic ( topic. clone ( ) )
132
+ . insert_option ( "compaction.type" , "twcs" )
133
+ . insert_option ( "compaction.twcs.max_active_window_runs" , "1" )
134
+ . insert_option ( "compaction.twcs.max_inactive_window_runs" , "1" )
135
+ . build ( ) ;
136
+
137
+ let column_schemas = request
138
+ . column_metadatas
139
+ . iter ( )
140
+ . map ( column_metadata_to_column_schema)
141
+ . collect :: < Vec < _ > > ( ) ;
142
+ engine
143
+ . handle_request ( region_id, RegionRequest :: Create ( request) )
144
+ . await
145
+ . unwrap ( ) ;
146
+ // Flush 5 SSTs for compaction.
147
+ put_and_flush ( & engine, region_id, & column_schemas, 0 ..10 ) . await ;
148
+ put_and_flush ( & engine, region_id, & column_schemas, 10 ..20 ) . await ;
149
+ put_and_flush ( & engine, region_id, & column_schemas, 20 ..30 ) . await ;
150
+ delete_and_flush ( & engine, region_id, & column_schemas, 15 ..30 ) . await ;
151
+ put_and_flush ( & engine, region_id, & column_schemas, 15 ..25 ) . await ;
152
+
153
+ let result = engine
154
+ . handle_request (
155
+ region_id,
156
+ RegionRequest :: Compact ( RegionCompactRequest :: default ( ) ) ,
157
+ )
158
+ . await
159
+ . unwrap ( ) ;
160
+ assert_eq ! ( result. affected_rows, 0 ) ;
161
+
162
+ let topic = topic. unwrap ( ) ;
163
+ let log_store = env. log_store ( ) . unwrap ( ) . into_kafka_log_store ( ) ;
164
+ let provider = Provider :: kafka_provider ( topic) ;
165
+ let stream = log_store. read ( & provider, 0 , None ) . await . unwrap ( ) ;
166
+ let entries = decode_stream ( flatten_stream :: < KafkaLogStore > ( stream, provider. clone ( ) ) )
167
+ . try_collect :: < Vec < _ > > ( )
168
+ . await
169
+ . unwrap ( ) ;
170
+
171
+ let notifications = entries
172
+ . into_iter ( )
173
+ . filter ( |( _, entry) | matches ! ( entry. mutations[ 0 ] . op_type( ) , api:: v1:: OpType :: Notify ) )
174
+ . count ( ) ;
175
+ assert_eq ! ( notifications, 6 ) ;
176
+ }
177
+
108
178
#[ tokio:: test]
109
179
async fn test_compaction_region ( ) {
110
180
common_telemetry:: init_default_ut_logging ( ) ;
0 commit comments