@@ -291,6 +291,7 @@ impl MetaStoreInner {
291291
292292 Err ( e) => {
293293 tracing:: error!( "meta store restore failed: {}" , e) ;
294+
294295 return Err ( Error :: from ( e) ) ;
295296 }
296297 }
@@ -399,7 +400,58 @@ impl MetaStore {
399400 wal_manager : MetaStoreWalManager ,
400401 ) -> Result < Self > {
401402 let ( changes_tx, mut changes_rx) = mpsc:: channel ( 256 ) ;
402- let inner = Arc :: new ( MetaStoreInner :: new ( base_path, conn, wal_manager, config) . await ?) ;
403+
404+ let destroy_on_error = config. destroy_on_error ;
405+
406+ let inner = match MetaStoreInner :: new ( base_path, conn, wal_manager, config. clone ( ) ) . await {
407+ Ok ( inner) => inner,
408+ Err ( e) => {
409+ if destroy_on_error {
410+ let db_path = base_path. join ( "metastore" ) ;
411+
412+ tracing:: info!(
413+ "meta store set to destroy on restore error, removing metastore db path folder ({:?})" , db_path
414+ ) ;
415+
416+ if let Err ( e) = std:: fs:: remove_dir_all ( & db_path) {
417+ tracing:: error!( "failed to remove base path({:?}): {}" , & db_path, e) ;
418+ }
419+
420+ if let Err ( e) = std:: fs:: create_dir_all ( & db_path) {
421+ tracing:: error!(
422+ "failed to create meta store base path: {:?} with {}" ,
423+ & db_path,
424+ e
425+ ) ;
426+ }
427+
428+ if let Err ( e) = std:: fs:: File :: create ( db_path. join ( "data" ) ) {
429+ tracing:: error!(
430+ "failed to create `data` file in {:?} with: {}" ,
431+ & db_path,
432+ e
433+ ) ;
434+ }
435+
436+ let ( maker, wal) =
437+ metastore_connection_maker ( config. bottomless . clone ( ) , base_path) . await ?;
438+
439+ let conn = maker ( ) ?;
440+
441+ tracing:: info!( "recreating metastore and restoring with fresh data" ) ;
442+
443+ let inner = MetaStoreInner :: new ( base_path, conn, wal, config) . await ?;
444+
445+ tracing:: info!( "metastore destroy on error successful" ) ;
446+
447+ inner
448+ } else {
449+ return Err ( e) ;
450+ }
451+ }
452+ } ;
453+
454+ let inner = Arc :: new ( inner) ;
403455
404456 tokio:: spawn ( {
405457 let inner = inner. clone ( ) ;
0 commit comments