@@ -291,6 +291,7 @@ impl MetaStoreInner {
291
291
292
292
Err ( e) => {
293
293
tracing:: error!( "meta store restore failed: {}" , e) ;
294
+
294
295
return Err ( Error :: from ( e) ) ;
295
296
}
296
297
}
@@ -399,7 +400,58 @@ impl MetaStore {
399
400
wal_manager : MetaStoreWalManager ,
400
401
) -> Result < Self > {
401
402
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) ;
403
455
404
456
tokio:: spawn ( {
405
457
let inner = inner. clone ( ) ;
0 commit comments