@@ -11,16 +11,29 @@ use crate::registry::WalRegistry;
11
11
12
12
pub ( crate ) type NotifyCheckpointer = mpsc:: Sender < NamespaceName > ;
13
13
14
- type LibsqlCheckpointer < IO , S > = Checkpointer < WalRegistry < IO , S > > ;
14
+ pub enum CheckpointMessage {
15
+ /// notify that a namespace may be checkpointable
16
+ Namespace ( NamespaceName ) ,
17
+ /// shutdown initiated
18
+ Shutdown ,
19
+ }
20
+
21
+ impl From < NamespaceName > for CheckpointMessage {
22
+ fn from ( value : NamespaceName ) -> Self {
23
+ Self :: Namespace ( value)
24
+ }
25
+ }
26
+
27
+ pub type LibsqlCheckpointer < IO , S > = Checkpointer < WalRegistry < IO , S > > ;
15
28
16
29
impl < IO , S > LibsqlCheckpointer < IO , S >
17
30
where
18
31
IO : Io ,
19
32
S : Sync + Send + ' static ,
20
33
{
21
34
pub fn new (
22
- registry : WalRegistry < IO , S > ,
23
- notifier : mpsc:: Receiver < NamespaceName > ,
35
+ registry : Arc < WalRegistry < IO , S > > ,
36
+ notifier : mpsc:: Receiver < CheckpointMessage > ,
24
37
max_checkpointing_conccurency : usize ,
25
38
) -> Self {
26
39
Self :: new_with_performer ( registry, notifier, max_checkpointing_conccurency)
@@ -70,7 +83,7 @@ pub struct Checkpointer<P> {
70
83
checkpointing : HashSet < NamespaceName > ,
71
84
/// the checkpointer is notifier whenever there is a change to a namespage that could trigger a
72
85
/// checkpoint
73
- recv : mpsc:: Receiver < NamespaceName > ,
86
+ recv : mpsc:: Receiver < CheckpointMessage > ,
74
87
max_checkpointing_conccurency : usize ,
75
88
shutting_down : bool ,
76
89
join_set : JoinSet < ( NamespaceName , crate :: error:: Result < ( ) > ) > ,
@@ -84,12 +97,12 @@ where
84
97
P : PerformCheckpoint + Send + Sync + ' static ,
85
98
{
86
99
fn new_with_performer (
87
- perform_checkpoint : P ,
88
- notifier : mpsc:: Receiver < NamespaceName > ,
100
+ perform_checkpoint : Arc < P > ,
101
+ notifier : mpsc:: Receiver < CheckpointMessage > ,
89
102
max_checkpointing_conccurency : usize ,
90
103
) -> Self {
91
104
Self {
92
- perform_checkpoint : Arc :: new ( perform_checkpoint ) ,
105
+ perform_checkpoint,
93
106
scheduled : Default :: default ( ) ,
94
107
checkpointing : Default :: default ( ) ,
95
108
recv : notifier,
@@ -141,10 +154,10 @@ where
141
154
}
142
155
notified = self . recv. recv( ) , if !self . shutting_down => {
143
156
match notified {
144
- Some ( namespace) => {
157
+ Some ( CheckpointMessage :: Namespace ( namespace) ) => {
145
158
self . scheduled. insert( namespace) ;
146
159
}
147
- None => {
160
+ None | Some ( CheckpointMessage :: Shutdown ) => {
148
161
self . shutting_down = true ;
149
162
}
150
163
}
@@ -201,10 +214,11 @@ mod test {
201
214
}
202
215
203
216
let ( sender, receiver) = mpsc:: channel ( 8 ) ;
204
- let mut checkpointer = Checkpointer :: new_with_performer ( TestPerformCheckoint , receiver, 5 ) ;
217
+ let mut checkpointer =
218
+ Checkpointer :: new_with_performer ( TestPerformCheckoint . into ( ) , receiver, 5 ) ;
205
219
let ns = NamespaceName :: from ( "test" ) ;
206
220
207
- sender. send ( ns. clone ( ) ) . await . unwrap ( ) ;
221
+ sender. send ( ns. clone ( ) . into ( ) ) . await . unwrap ( ) ;
208
222
209
223
checkpointer. step ( ) . await ;
210
224
@@ -233,10 +247,11 @@ mod test {
233
247
}
234
248
235
249
let ( sender, receiver) = mpsc:: channel ( 8 ) ;
236
- let mut checkpointer = Checkpointer :: new_with_performer ( TestPerformCheckoint , receiver, 5 ) ;
250
+ let mut checkpointer =
251
+ Checkpointer :: new_with_performer ( TestPerformCheckoint . into ( ) , receiver, 5 ) ;
237
252
let ns = NamespaceName :: from ( "test" ) ;
238
253
239
- sender. send ( ns. clone ( ) ) . await . unwrap ( ) ;
254
+ sender. send ( ns. clone ( ) . into ( ) ) . await . unwrap ( ) ;
240
255
241
256
checkpointer. step ( ) . await ;
242
257
assert_eq ! ( checkpointer. errors, 0 ) ;
@@ -264,7 +279,8 @@ mod test {
264
279
}
265
280
266
281
let ( sender, receiver) = mpsc:: channel ( 8 ) ;
267
- let mut checkpointer = Checkpointer :: new_with_performer ( TestPerformCheckoint , receiver, 5 ) ;
282
+ let mut checkpointer =
283
+ Checkpointer :: new_with_performer ( TestPerformCheckoint . into ( ) , receiver, 5 ) ;
268
284
269
285
drop ( sender) ;
270
286
@@ -290,7 +306,8 @@ mod test {
290
306
}
291
307
292
308
let ( sender, receiver) = mpsc:: channel ( 8 ) ;
293
- let mut checkpointer = Checkpointer :: new_with_performer ( TestPerformCheckoint , receiver, 5 ) ;
309
+ let mut checkpointer =
310
+ Checkpointer :: new_with_performer ( TestPerformCheckoint . into ( ) , receiver, 5 ) ;
294
311
295
312
drop ( sender) ;
296
313
@@ -323,12 +340,13 @@ mod test {
323
340
}
324
341
325
342
let ( sender, receiver) = mpsc:: channel ( 8 ) ;
326
- let mut checkpointer = Checkpointer :: new_with_performer ( TestPerformCheckoint , receiver, 5 ) ;
343
+ let mut checkpointer =
344
+ Checkpointer :: new_with_performer ( TestPerformCheckoint . into ( ) , receiver, 5 ) ;
327
345
328
346
let ns: NamespaceName = "test" . into ( ) ;
329
347
330
- sender. send ( ns. clone ( ) ) . await . unwrap ( ) ;
331
- sender. send ( ns. clone ( ) ) . await . unwrap ( ) ;
348
+ sender. send ( ns. clone ( ) . into ( ) ) . await . unwrap ( ) ;
349
+ sender. send ( ns. clone ( ) . into ( ) ) . await . unwrap ( ) ;
332
350
333
351
checkpointer. step ( ) . await ;
334
352
@@ -355,13 +373,14 @@ mod test {
355
373
}
356
374
357
375
let ( sender, receiver) = mpsc:: channel ( 8 ) ;
358
- let mut checkpointer = Checkpointer :: new_with_performer ( TestPerformCheckoint , receiver, 5 ) ;
376
+ let mut checkpointer =
377
+ Checkpointer :: new_with_performer ( TestPerformCheckoint . into ( ) , receiver, 5 ) ;
359
378
360
379
let ns1: NamespaceName = "test1" . into ( ) ;
361
380
let ns2: NamespaceName = "test2" . into ( ) ;
362
381
363
- sender. send ( ns1. clone ( ) ) . await . unwrap ( ) ;
364
- sender. send ( ns2. clone ( ) ) . await . unwrap ( ) ;
382
+ sender. send ( ns1. clone ( ) . into ( ) ) . await . unwrap ( ) ;
383
+ sender. send ( ns2. clone ( ) . into ( ) ) . await . unwrap ( ) ;
365
384
366
385
checkpointer. step ( ) . await ;
367
386
@@ -390,15 +409,16 @@ mod test {
390
409
}
391
410
392
411
let ( sender, receiver) = mpsc:: channel ( 8 ) ;
393
- let mut checkpointer = Checkpointer :: new_with_performer ( TestPerformCheckoint , receiver, 2 ) ;
412
+ let mut checkpointer =
413
+ Checkpointer :: new_with_performer ( TestPerformCheckoint . into ( ) , receiver, 2 ) ;
394
414
395
415
let ns1: NamespaceName = "test1" . into ( ) ;
396
416
let ns2: NamespaceName = "test2" . into ( ) ;
397
417
let ns3: NamespaceName = "test3" . into ( ) ;
398
418
399
- sender. send ( ns1. clone ( ) ) . await . unwrap ( ) ;
400
- sender. send ( ns2. clone ( ) ) . await . unwrap ( ) ;
401
- sender. send ( ns3. clone ( ) ) . await . unwrap ( ) ;
419
+ sender. send ( ns1. clone ( ) . into ( ) ) . await . unwrap ( ) ;
420
+ sender. send ( ns2. clone ( ) . into ( ) ) . await . unwrap ( ) ;
421
+ sender. send ( ns3. clone ( ) . into ( ) ) . await . unwrap ( ) ;
402
422
403
423
checkpointer. step ( ) . await ;
404
424
checkpointer. step ( ) . await ;
0 commit comments