@@ -44,7 +44,7 @@ pub use object_storage::{ObjectStorage, ObjectStorageProvider};
4444pub use s3:: { S3Config , S3 } ;
4545pub use store_metadata:: StorageMetadata ;
4646
47- use self :: store_metadata:: { put_staging_metadata, startup_check , EnvChange } ;
47+ use self :: store_metadata:: { put_staging_metadata, EnvChange } ;
4848
4949/// local sync interval to move data.records to /tmp dir of that stream.
5050/// 60 sec is a reasonable value.
@@ -124,7 +124,15 @@ impl ObjectStoreFormat {
124124}
125125
126126pub async fn resolve_parseable_metadata ( ) -> Result < ( ) , ObjectStorageError > {
127- let check = startup_check ( ) . await ?;
127+ let staging_metadata = store_metadata:: get_staging_metadata ( ) ?;
128+ let storage = CONFIG . storage ( ) . get_object_store ( ) ;
129+ let remote_metadata = storage. get_metadata ( ) . await ?;
130+
131+ let check = store_metadata:: check_metadata_conflict (
132+ staging_metadata. as_ref ( ) ,
133+ remote_metadata. as_ref ( ) ,
134+ ) ;
135+
128136 const MISMATCH : & str = "Could not start the server because metadata file found in staging directory does not match one in the storage" ;
129137 let err: Option < & str > = match check {
130138 EnvChange :: None => None ,
@@ -134,11 +142,15 @@ pub async fn resolve_parseable_metadata() -> Result<(), ObjectStorageError> {
134142 Some ( "Could not start the server because metadata not found in storage" )
135143 }
136144 EnvChange :: NewStaging => {
137- Some ( "Could not start the server becuase metadata not found in staging" )
145+ put_staging_metadata ( remote_metadata. as_ref ( ) . expect ( "remote metadata exists" ) ) ?;
146+
147+ // allow new staging directories
148+ return Ok ( ( ) ) ;
138149 }
139150 EnvChange :: CreateBoth => {
140- create_staging_metadata ( ) ?;
141- create_remote_metadata ( ) . await ?;
151+ let metadata = StorageMetadata :: new ( ) ;
152+ create_remote_metadata ( & metadata) . await ?;
153+ create_staging_metadata ( & metadata) ?;
142154 None
143155 }
144156 } ;
@@ -156,15 +168,14 @@ pub async fn resolve_parseable_metadata() -> Result<(), ObjectStorageError> {
156168 }
157169}
158170
159- async fn create_remote_metadata ( ) -> Result < ( ) , ObjectStorageError > {
171+ async fn create_remote_metadata ( metadata : & StorageMetadata ) -> Result < ( ) , ObjectStorageError > {
160172 let client = CONFIG . storage ( ) . get_object_store ( ) ;
161- client. put_metadata ( & StorageMetadata :: new ( ) ) . await
173+ client. put_metadata ( metadata ) . await
162174}
163175
164- fn create_staging_metadata ( ) -> std:: io:: Result < ( ) > {
176+ fn create_staging_metadata ( metadata : & StorageMetadata ) -> std:: io:: Result < ( ) > {
165177 create_dir_all ( CONFIG . staging_dir ( ) ) ?;
166- let metadata = StorageMetadata :: new ( ) ;
167- put_staging_metadata ( & metadata)
178+ put_staging_metadata ( metadata)
168179}
169180
170181lazy_static ! {
0 commit comments