1
1
use crate :: streaming:: common:: test_setup:: TestSetup ;
2
2
use bytes:: Bytes ;
3
3
use iggy:: bytes_serializable:: BytesSerializable ;
4
+ use iggy:: confirmation:: Confirmation ;
4
5
use iggy:: models:: messages:: { MessageState , PolledMessage } ;
5
6
use iggy:: utils:: byte_size:: IggyByteSize ;
6
7
use iggy:: utils:: expiry:: IggyExpiry ;
@@ -11,7 +12,9 @@ use server::streaming::segments::segment;
11
12
use server:: streaming:: segments:: segment:: { INDEX_EXTENSION , LOG_EXTENSION } ;
12
13
use std:: sync:: atomic:: AtomicU64 ;
13
14
use std:: sync:: Arc ;
15
+ use std:: time:: Duration ;
14
16
use tokio:: fs;
17
+ use tokio:: time:: sleep;
15
18
16
19
#[ tokio:: test]
17
20
async fn should_persist_segment ( ) {
@@ -35,7 +38,8 @@ async fn should_persist_segment() {
35
38
Arc :: new ( AtomicU64 :: new ( 0 ) ) ,
36
39
Arc :: new ( AtomicU64 :: new ( 0 ) ) ,
37
40
Arc :: new ( AtomicU64 :: new ( 0 ) ) ,
38
- ) ;
41
+ )
42
+ . await ;
39
43
40
44
setup
41
45
. create_partition_directory ( stream_id, topic_id, partition_id)
@@ -73,7 +77,8 @@ async fn should_load_existing_segment_from_disk() {
73
77
Arc :: new ( AtomicU64 :: new ( 0 ) ) ,
74
78
Arc :: new ( AtomicU64 :: new ( 0 ) ) ,
75
79
Arc :: new ( AtomicU64 :: new ( 0 ) ) ,
76
- ) ;
80
+ )
81
+ . await ;
77
82
setup
78
83
. create_partition_directory ( stream_id, topic_id, partition_id)
79
84
. await ;
@@ -100,7 +105,8 @@ async fn should_load_existing_segment_from_disk() {
100
105
Arc :: new ( AtomicU64 :: new ( 0 ) ) ,
101
106
Arc :: new ( AtomicU64 :: new ( 0 ) ) ,
102
107
Arc :: new ( AtomicU64 :: new ( 0 ) ) ,
103
- ) ;
108
+ )
109
+ . await ;
104
110
loaded_segment. load ( ) . await . unwrap ( ) ;
105
111
let loaded_messages = loaded_segment. get_messages ( 0 , 10 ) . await . unwrap ( ) ;
106
112
@@ -137,7 +143,91 @@ async fn should_persist_and_load_segment_with_messages() {
137
143
Arc :: new ( AtomicU64 :: new ( 0 ) ) ,
138
144
Arc :: new ( AtomicU64 :: new ( 0 ) ) ,
139
145
Arc :: new ( AtomicU64 :: new ( 0 ) ) ,
140
- ) ;
146
+ )
147
+ . await ;
148
+
149
+ setup
150
+ . create_partition_directory ( stream_id, topic_id, partition_id)
151
+ . await ;
152
+ segment. persist ( ) . await . unwrap ( ) ;
153
+ assert_persisted_segment (
154
+ & setup
155
+ . config
156
+ . get_partition_path ( stream_id, topic_id, partition_id) ,
157
+ start_offset,
158
+ )
159
+ . await ;
160
+ let messages_count = 10 ;
161
+ let mut messages = Vec :: new ( ) ;
162
+ let mut batch_size = IggyByteSize :: default ( ) ;
163
+ for i in 0 ..messages_count {
164
+ let message = create_message ( i, "test" , IggyTimestamp :: now ( ) ) ;
165
+
166
+ let retained_message = Arc :: new ( RetainedMessage {
167
+ id : message. id ,
168
+ offset : message. offset ,
169
+ timestamp : message. timestamp ,
170
+ checksum : message. checksum ,
171
+ message_state : message. state ,
172
+ headers : message. headers . map ( |headers| headers. to_bytes ( ) ) ,
173
+ payload : message. payload . clone ( ) ,
174
+ } ) ;
175
+ batch_size += retained_message. get_size_bytes ( ) ;
176
+ messages. push ( retained_message) ;
177
+ }
178
+
179
+ segment
180
+ . append_batch ( batch_size, messages_count as u32 , & messages)
181
+ . await
182
+ . unwrap ( ) ;
183
+ segment. persist_messages ( None ) . await . unwrap ( ) ;
184
+ let mut loaded_segment = segment:: Segment :: create (
185
+ stream_id,
186
+ topic_id,
187
+ partition_id,
188
+ start_offset,
189
+ setup. config . clone ( ) ,
190
+ setup. storage . clone ( ) ,
191
+ IggyExpiry :: NeverExpire ,
192
+ Arc :: new ( AtomicU64 :: new ( 0 ) ) ,
193
+ Arc :: new ( AtomicU64 :: new ( 0 ) ) ,
194
+ Arc :: new ( AtomicU64 :: new ( 0 ) ) ,
195
+ Arc :: new ( AtomicU64 :: new ( 0 ) ) ,
196
+ Arc :: new ( AtomicU64 :: new ( 0 ) ) ,
197
+ Arc :: new ( AtomicU64 :: new ( 0 ) ) ,
198
+ )
199
+ . await ;
200
+ loaded_segment. load ( ) . await . unwrap ( ) ;
201
+ let messages = loaded_segment
202
+ . get_messages ( 0 , messages_count as u32 )
203
+ . await
204
+ . unwrap ( ) ;
205
+ assert_eq ! ( messages. len( ) , messages_count as usize ) ;
206
+ }
207
+
208
+ #[ tokio:: test]
209
+ async fn should_persist_and_load_segment_with_messages_with_nowait_confirmation ( ) {
210
+ let setup = TestSetup :: init ( ) . await ;
211
+ let stream_id = 1 ;
212
+ let topic_id = 2 ;
213
+ let partition_id = 3 ;
214
+ let start_offset = 0 ;
215
+ let mut segment = segment:: Segment :: create (
216
+ stream_id,
217
+ topic_id,
218
+ partition_id,
219
+ start_offset,
220
+ setup. config . clone ( ) ,
221
+ setup. storage . clone ( ) ,
222
+ IggyExpiry :: NeverExpire ,
223
+ Arc :: new ( AtomicU64 :: new ( 0 ) ) ,
224
+ Arc :: new ( AtomicU64 :: new ( 0 ) ) ,
225
+ Arc :: new ( AtomicU64 :: new ( 0 ) ) ,
226
+ Arc :: new ( AtomicU64 :: new ( 0 ) ) ,
227
+ Arc :: new ( AtomicU64 :: new ( 0 ) ) ,
228
+ Arc :: new ( AtomicU64 :: new ( 0 ) ) ,
229
+ )
230
+ . await ;
141
231
142
232
setup
143
233
. create_partition_directory ( stream_id, topic_id, partition_id)
@@ -173,7 +263,11 @@ async fn should_persist_and_load_segment_with_messages() {
173
263
. append_batch ( batch_size, messages_count as u32 , & messages)
174
264
. await
175
265
. unwrap ( ) ;
176
- segment. persist_messages ( ) . await . unwrap ( ) ;
266
+ segment
267
+ . persist_messages ( Some ( Confirmation :: Nowait ) )
268
+ . await
269
+ . unwrap ( ) ;
270
+ sleep ( Duration :: from_millis ( 200 ) ) . await ;
177
271
let mut loaded_segment = segment:: Segment :: create (
178
272
stream_id,
179
273
topic_id,
@@ -188,7 +282,8 @@ async fn should_persist_and_load_segment_with_messages() {
188
282
Arc :: new ( AtomicU64 :: new ( 0 ) ) ,
189
283
Arc :: new ( AtomicU64 :: new ( 0 ) ) ,
190
284
Arc :: new ( AtomicU64 :: new ( 0 ) ) ,
191
- ) ;
285
+ )
286
+ . await ;
192
287
loaded_segment. load ( ) . await . unwrap ( ) ;
193
288
let messages = loaded_segment
194
289
. get_messages ( 0 , messages_count as u32 )
@@ -220,7 +315,8 @@ async fn given_all_expired_messages_segment_should_be_expired() {
220
315
Arc :: new ( AtomicU64 :: new ( 0 ) ) ,
221
316
Arc :: new ( AtomicU64 :: new ( 0 ) ) ,
222
317
Arc :: new ( AtomicU64 :: new ( 0 ) ) ,
223
- ) ;
318
+ )
319
+ . await ;
224
320
225
321
setup
226
322
. create_partition_directory ( stream_id, topic_id, partition_id)
@@ -258,7 +354,7 @@ async fn given_all_expired_messages_segment_should_be_expired() {
258
354
. append_batch ( batch_size, messages_count as u32 , & messages)
259
355
. await
260
356
. unwrap ( ) ;
261
- segment. persist_messages ( ) . await . unwrap ( ) ;
357
+ segment. persist_messages ( None ) . await . unwrap ( ) ;
262
358
263
359
segment. is_closed = true ;
264
360
let is_expired = segment. is_expired ( now) . await ;
@@ -288,7 +384,8 @@ async fn given_at_least_one_not_expired_message_segment_should_not_be_expired()
288
384
Arc :: new ( AtomicU64 :: new ( 0 ) ) ,
289
385
Arc :: new ( AtomicU64 :: new ( 0 ) ) ,
290
386
Arc :: new ( AtomicU64 :: new ( 0 ) ) ,
291
- ) ;
387
+ )
388
+ . await ;
292
389
293
390
setup
294
391
. create_partition_directory ( stream_id, topic_id, partition_id)
@@ -343,7 +440,7 @@ async fn given_at_least_one_not_expired_message_segment_should_not_be_expired()
343
440
. append_batch ( not_expired_message_size, 1 , & not_expired_messages)
344
441
. await
345
442
. unwrap ( ) ;
346
- segment. persist_messages ( ) . await . unwrap ( ) ;
443
+ segment. persist_messages ( None ) . await . unwrap ( ) ;
347
444
348
445
let is_expired = segment. is_expired ( now) . await ;
349
446
assert ! ( !is_expired) ;
0 commit comments