@@ -234,24 +234,30 @@ impl TableSnapshotProvider for TableSnapshotProviderImpl {
234
234
}
235
235
}
236
236
237
- /// Snapshot builder
238
- #[ async_trait]
239
- trait SnapshotBuilder {
240
- async fn build ( & self ) -> Result < Option < Snapshot > > ;
241
- }
242
-
243
- /// Storage based snapshot builder
237
+ /// Snapshot recoverer
238
+ ///
239
+ /// Usually, it will recover the snapshot from storage(like disk, oss, etc).
240
+ // TODO: remove `LogStore` and related operations, it should be called directly but not in the
241
+ // `SnapshotReoverer`.
244
242
#[ derive( Debug , Clone ) ]
245
- struct StorageSnapshotBuilder < LogStore , SnapshotStore > {
243
+ struct SnapshotRecoverer < LogStore , SnapshotStore > {
246
244
log_store : LogStore ,
247
245
snapshot_store : SnapshotStore ,
248
246
}
249
247
250
- impl < LogStore , SnapshotStore > StorageSnapshotBuilder < LogStore , SnapshotStore >
248
+ impl < LogStore , SnapshotStore > SnapshotRecoverer < LogStore , SnapshotStore >
251
249
where
252
250
LogStore : MetaUpdateLogStore + Send + Sync ,
253
251
SnapshotStore : MetaUpdateSnapshotStore + Send + Sync ,
254
252
{
253
+ async fn recover ( & self ) -> Result < Option < Snapshot > > {
254
+ // Load the current snapshot first.
255
+ match self . snapshot_store . load ( ) . await ? {
256
+ Some ( v) => Ok ( Some ( self . create_latest_snapshot_with_prev ( v) . await ?) ) ,
257
+ None => self . create_latest_snapshot_without_prev ( ) . await ,
258
+ }
259
+ }
260
+
255
261
async fn create_latest_snapshot_with_prev ( & self , prev_snapshot : Snapshot ) -> Result < Snapshot > {
256
262
let log_start_boundary = ReadBoundary :: Excluded ( prev_snapshot. end_seq ) ;
257
263
let mut reader = self . log_store . scan ( log_start_boundary) . await ?;
@@ -279,37 +285,34 @@ where
279
285
280
286
let mut latest_seq = SequenceNumber :: MIN ;
281
287
let mut manifest_data_builder = TableManifestDataBuilder :: default ( ) ;
288
+ let mut has_logs = false ;
282
289
while let Some ( ( seq, update) ) = reader. next_update ( ) . await ? {
283
290
latest_seq = seq;
284
291
manifest_data_builder
285
292
. apply_update ( update)
286
293
. context ( ApplyUpdate ) ?;
294
+ has_logs = true ;
287
295
}
288
296
289
- Ok ( Some ( Snapshot {
290
- end_seq : latest_seq,
291
- data : manifest_data_builder. build ( ) ,
292
- } ) )
293
- }
294
- }
295
-
296
- #[ async_trait]
297
- impl < LogStore , SnapshotStore > SnapshotBuilder for StorageSnapshotBuilder < LogStore , SnapshotStore >
298
- where
299
- LogStore : MetaUpdateLogStore + Send + Sync ,
300
- SnapshotStore : MetaUpdateSnapshotStore + Send + Sync ,
301
- {
302
- async fn build ( & self ) -> Result < Option < Snapshot > > {
303
- // Load the current snapshot first.
304
- match self . snapshot_store . load ( ) . await ? {
305
- Some ( v) => Ok ( Some ( self . create_latest_snapshot_with_prev ( v) . await ?) ) ,
306
- None => self . create_latest_snapshot_without_prev ( ) . await ,
297
+ if has_logs {
298
+ Ok ( Some ( Snapshot {
299
+ end_seq : latest_seq,
300
+ data : manifest_data_builder. build ( ) ,
301
+ } ) )
302
+ } else {
303
+ Ok ( None )
307
304
}
308
305
}
309
306
}
310
- /// Memory based snapshot builder
307
+
308
+ /// Snapshot creator
309
+ ///
310
+ /// Usually, it will get snapshot from memory, and store them to storage(like
311
+ /// disk, oss, etc).
312
+ // TODO: remove `LogStore` and related operations, it should be called directly but not in the
313
+ // `Snapshotter`.
311
314
#[ derive( Debug , Clone ) ]
312
- struct MemorySnapshotBuilder < LogStore , SnapshotStore > {
315
+ struct Snapshotter < LogStore , SnapshotStore > {
313
316
log_store : LogStore ,
314
317
snapshot_store : SnapshotStore ,
315
318
end_seq : SequenceNumber ,
@@ -318,14 +321,13 @@ struct MemorySnapshotBuilder<LogStore, SnapshotStore> {
318
321
table_id : TableId ,
319
322
}
320
323
321
- #[ async_trait]
322
- impl < LogStore , SnapshotStore > SnapshotBuilder for MemorySnapshotBuilder < LogStore , SnapshotStore >
324
+ impl < LogStore , SnapshotStore > Snapshotter < LogStore , SnapshotStore >
323
325
where
324
326
LogStore : MetaUpdateLogStore + Send + Sync ,
325
327
SnapshotStore : MetaUpdateSnapshotStore + Send + Sync ,
326
328
{
327
329
/// Create a latest snapshot of the current logs.
328
- async fn build ( & self ) -> Result < Option < Snapshot > > {
330
+ async fn snapshot ( & self ) -> Result < Option < Snapshot > > {
329
331
// Get snapshot data from memory.
330
332
let table_snapshot_opt = self
331
333
. snapshot_data_provider
@@ -454,17 +456,15 @@ impl ManifestImpl {
454
456
let snapshot_store =
455
457
ObjectStoreBasedSnapshotStore :: new ( space_id, table_id, self . store . clone ( ) ) ;
456
458
let end_seq = self . wal_manager . sequence_num ( location) . await . unwrap ( ) ;
457
- let memory_snapshot_builder = MemorySnapshotBuilder {
459
+ let snapshotter = Snapshotter {
458
460
log_store,
459
461
snapshot_store,
460
462
end_seq,
461
463
snapshot_data_provider : self . snap_data_provider . clone ( ) ,
462
464
space_id,
463
465
table_id,
464
466
} ;
465
- let snapshotter = Snapshotter {
466
- snapshot_builder : memory_snapshot_builder,
467
- } ;
467
+
468
468
let snapshot = snapshotter. snapshot ( ) . await ?. map ( |v| {
469
469
self . decrease_num_updates ( ) ;
470
470
v
@@ -524,14 +524,11 @@ impl Manifest for ManifestImpl {
524
524
load_req. table_id ,
525
525
self . store . clone ( ) ,
526
526
) ;
527
- let storage_snapshot_builder = StorageSnapshotBuilder {
527
+ let reoverer = SnapshotRecoverer {
528
528
log_store,
529
529
snapshot_store,
530
530
} ;
531
- let snapshotter = Snapshotter {
532
- snapshot_builder : storage_snapshot_builder,
533
- } ;
534
- let snapshot = snapshotter. snapshot ( ) . await ?;
531
+ let snapshot = reoverer. recover ( ) . await ?;
535
532
536
533
Ok ( snapshot. and_then ( |v| v. data ) )
537
534
}
@@ -708,11 +705,6 @@ impl MetaUpdateLogStore for WalBasedLogStore {
708
705
}
709
706
}
710
707
711
- #[ derive( Debug , Clone ) ]
712
- struct Snapshotter < Builder > {
713
- snapshot_builder : Builder ,
714
- }
715
-
716
708
/// The snapshot for the current logs.
717
709
#[ derive( Debug , Clone , PartialEq ) ]
718
710
struct Snapshot {
@@ -791,18 +783,6 @@ impl From<Snapshot> for manifest_pb::Snapshot {
791
783
}
792
784
}
793
785
794
- impl < Builder > Snapshotter < Builder >
795
- where
796
- Builder : SnapshotBuilder + Send + Sync ,
797
- {
798
- /// Do snapshot for the current logs including:
799
- /// - saving the snapshot.
800
- /// - deleting the expired logs.
801
- pub async fn snapshot ( & self ) -> Result < Option < Snapshot > > {
802
- self . snapshot_builder . build ( ) . await
803
- }
804
- }
805
-
806
786
#[ cfg( test) ]
807
787
mod tests {
808
788
use std:: { path:: PathBuf , sync:: Arc , vec} ;
@@ -1529,32 +1509,26 @@ mod tests {
1529
1509
table_id : TableId ,
1530
1510
) -> Option < Snapshot > {
1531
1511
let end_seq = log_store. next_seq ( ) - 1 ;
1532
- let memory_builder = MemorySnapshotBuilder {
1512
+ let snapshotter = Snapshotter {
1533
1513
log_store : log_store. clone ( ) ,
1534
1514
snapshot_store : snapshot_store. clone ( ) ,
1535
1515
end_seq,
1536
1516
snapshot_data_provider : snapshot_provider,
1537
1517
space_id : 0 ,
1538
1518
table_id,
1539
1519
} ;
1540
- let snapshotter = Snapshotter {
1541
- snapshot_builder : memory_builder,
1542
- } ;
1543
1520
snapshotter. snapshot ( ) . await . unwrap ( )
1544
1521
}
1545
1522
1546
1523
async fn recover_snapshot (
1547
1524
log_store : & MemLogStore ,
1548
1525
snapshot_store : & MemSnapshotStore ,
1549
1526
) -> Option < Snapshot > {
1550
- let storage_builder = StorageSnapshotBuilder {
1527
+ let recoverer = SnapshotRecoverer {
1551
1528
log_store : log_store. clone ( ) ,
1552
1529
snapshot_store : snapshot_store. clone ( ) ,
1553
1530
} ;
1554
- let snapshotter = Snapshotter {
1555
- snapshot_builder : storage_builder,
1556
- } ;
1557
- snapshotter. snapshot ( ) . await . unwrap ( )
1531
+ recoverer. recover ( ) . await . unwrap ( )
1558
1532
}
1559
1533
1560
1534
#[ test]
0 commit comments