11use mithril_common:: entities:: Snapshot ;
2- use mithril_common:: immutable_digester:: ImmutableDigester ;
32
43use chrono:: prelude:: * ;
54use cloud_storage:: bucket:: Entity ;
@@ -8,31 +7,24 @@ use cloud_storage::object_access_control::NewObjectAccessControl;
87use cloud_storage:: Client ;
98use flate2:: write:: GzEncoder ;
109use flate2:: Compression ;
11- use slog :: { error , info, Logger } ;
10+ use slog_scope :: info;
1211use std:: env;
1312use std:: fs:: File ;
1413use std:: io;
1514use std:: io:: { Seek , SeekFrom } ;
1615use std:: path:: Path ;
1716use thiserror:: Error ;
18- use tokio:: time:: { sleep, Duration } ;
1917use tokio_util:: codec:: BytesCodec ;
2018use tokio_util:: codec:: FramedRead ;
2119
2220/// Snapshotter
2321pub struct Snapshotter {
24- /// Interval between each snapshot, in seconds
25- interval : u32 ,
26-
2722 /// DB directory to snapshot
2823 db_directory : String ,
29-
30- /// The logger where the logs should be written
31- logger : Logger ,
3224}
3325
3426#[ derive( Error , Debug ) ]
35- enum SnapshotError {
27+ pub enum SnapshotError {
3628 #[ error( "Create archive error: " ) ]
3729 CreateArchiveError ( #[ from] io:: Error ) ,
3830
@@ -42,40 +34,13 @@ enum SnapshotError {
4234
4335impl Snapshotter {
4436 /// Snapshotter factory
45- pub fn new ( interval : u32 , db_directory : String , logger : Logger ) -> Self {
46- Self {
47- interval,
48- db_directory,
49- logger,
50- }
51- }
52-
53- /// Run snapshotter loop
54- pub async fn run ( & self ) {
55- info ! ( self . logger, "Starting Snapshotter" ) ;
56- loop {
57- info ! ( self . logger, "Snapshotting" ) ;
58-
59- let digester = ImmutableDigester :: new ( self . db_directory . clone ( ) , self . logger . clone ( ) ) ;
60- match digester. compute_digest ( ) {
61- Ok ( digest_result) => {
62- if let Err ( e) = self . snapshot ( digest_result. digest ) . await {
63- error ! ( self . logger, "{:?}" , e)
64- }
65- }
66- Err ( e) => {
67- error ! ( self . logger, "{:?}" , e)
68- }
69- } ;
70-
71- info ! ( self . logger, "Sleeping for {}" , self . interval) ;
72- sleep ( Duration :: from_millis ( self . interval . into ( ) ) ) . await ;
73- }
37+ pub fn new ( db_directory : String ) -> Self {
38+ Self { db_directory }
7439 }
7540
76- async fn snapshot ( & self , immutable_digest : String ) -> Result < ( ) , SnapshotError > {
41+ pub async fn snapshot ( & self , immutable_digest : String ) -> Result < ( ) , SnapshotError > {
7742 let archive_name = "testnet.tar.gz" ;
78- info ! ( self . logger , "snapshot hash: {}" , immutable_digest) ;
43+ info ! ( "snapshot hash: {}" , immutable_digest) ;
7944
8045 let size = self . create_archive ( archive_name) ?;
8146
@@ -93,11 +58,7 @@ impl Snapshotter {
9358 ) ] ,
9459 } ] ;
9560
96- info ! (
97- self . logger,
98- "snapshot: {}" ,
99- serde_json:: to_string( & snapshots) . unwrap( )
100- ) ;
61+ info ! ( "snapshot: {}" , serde_json:: to_string( & snapshots) . unwrap( ) ) ;
10162 serde_json:: to_writer ( & File :: create ( "snapshots.json" ) . unwrap ( ) , & snapshots) . unwrap ( ) ;
10263
10364 self . upload_file ( archive_name) . await ?;
@@ -113,7 +74,6 @@ impl Snapshotter {
11374 let mut tar = tar:: Builder :: new ( enc) ;
11475
11576 info ! (
116- self . logger,
11777 "compressing {} into {}" ,
11878 & self . db_directory,
11979 & path. to_str( ) . unwrap( )
@@ -142,7 +102,7 @@ impl Snapshotter {
142102 ) ) ;
143103 } ;
144104
145- info ! ( self . logger , "uploading {}" , filename) ;
105+ info ! ( "uploading {}" , filename) ;
146106 let client = Client :: default ( ) ;
147107 let file = tokio:: fs:: File :: open ( filename) . await . unwrap ( ) ;
148108 let stream = FramedRead :: new ( file, BytesCodec :: new ( ) ) ;
@@ -158,7 +118,7 @@ impl Snapshotter {
158118 . await
159119 . map_err ( |e| SnapshotError :: UploadFileError ( e. to_string ( ) ) ) ?;
160120
161- info ! ( self . logger , "uploaded {}" , filename) ;
121+ info ! ( "uploaded {}" , filename) ;
162122
163123 // ensure the uploaded file as public read access
164124 // when a file is uploaded to gcloud storage its permissions are overwritten so
@@ -169,8 +129,8 @@ impl Snapshotter {
169129 } ;
170130
171131 info ! (
172- self . logger ,
173- "updating acl for {}: {:?}" , filename, new_bucket_access_control
132+ "updating acl for {}: {:?}" ,
133+ filename, new_bucket_access_control
174134 ) ;
175135
176136 client
@@ -179,7 +139,7 @@ impl Snapshotter {
179139 . await
180140 . map_err ( |e| SnapshotError :: UploadFileError ( e. to_string ( ) ) ) ?;
181141
182- info ! ( self . logger , "updated acl for {} " , filename) ;
142+ info ! ( "updated acl for {} " , filename) ;
183143
184144 Ok ( ( ) )
185145 }
0 commit comments