@@ -202,7 +202,7 @@ pub(crate) async fn wait_for_all_replacements(
202202 }
203203 } ,
204204 & std:: time:: Duration :: from_millis ( 50 ) ,
205- & std:: time:: Duration :: from_secs ( 180 ) ,
205+ & std:: time:: Duration :: from_secs ( 260 ) ,
206206 )
207207 . await
208208 . expect ( "all replacements finished" ) ;
@@ -480,7 +480,7 @@ mod region_replacement {
480480 }
481481 } ,
482482 & std:: time:: Duration :: from_millis ( 50 ) ,
483- & std:: time:: Duration :: from_secs ( 60 ) ,
483+ & std:: time:: Duration :: from_secs ( 260 ) ,
484484 )
485485 . await
486486 . expect ( "request transitioned to expected state" ) ;
@@ -1070,24 +1070,34 @@ async fn test_racing_replacements_for_soft_deleted_disk_volume(
10701070 activate_background_task ( & internal_client, "region_replacement_driver" )
10711071 . await ;
10721072
1073- assert ! ( match last_background_task. last {
1073+ let res = match last_background_task. last {
10741074 LastResult :: Completed ( last_result_completed) => {
10751075 match serde_json:: from_value :: < RegionReplacementDriverStatus > (
10761076 last_result_completed. details ,
10771077 ) {
10781078 Err ( e) => {
1079+ eprintln ! ( "Json not what we expected" ) ;
10791080 eprintln ! ( "{e}" ) ;
10801081 false
10811082 }
10821083
1083- Ok ( v) => !v. drive_invoked_ok. is_empty( ) ,
1084+ Ok ( v) => {
1085+ if !v. drive_invoked_ok . is_empty ( ) {
1086+ eprintln ! ( "v.drive_ok: {:?}" , v. drive_invoked_ok) ;
1087+ true
1088+ } else {
1089+ eprintln ! ( "v.drive_ok: {:?} empty" , v. drive_invoked_ok) ;
1090+ false
1091+ }
1092+ }
10841093 }
10851094 }
1086-
1087- _ => {
1095+ x => {
1096+ eprintln ! ( "Unexpected result here: {:?}" , x ) ;
10881097 false
10891098 }
1090- } ) ;
1099+ } ;
1100+ assert ! ( res) ;
10911101
10921102 // wait for the drive saga to complete here
10931103 wait_for_condition (
@@ -1484,20 +1494,33 @@ mod region_snapshot_replacement {
14841494
14851495 // Assert no volumes are referencing the snapshot address
14861496
1487- let volumes = self
1488- . datastore
1489- . find_volumes_referencing_socket_addr (
1490- & self . opctx ( ) ,
1491- self . snapshot_socket_addr ,
1492- )
1493- . await
1494- . unwrap ( ) ;
1497+ let mut counter = 1 ;
1498+ loop {
1499+ let volumes = self
1500+ . datastore
1501+ . find_volumes_referencing_socket_addr (
1502+ & self . opctx ( ) ,
1503+ self . snapshot_socket_addr ,
1504+ )
1505+ . await
1506+ . unwrap ( ) ;
14951507
1496- if !volumes. is_empty ( ) {
1497- eprintln ! ( "{:?}" , volumes) ;
1508+ if !volumes. is_empty ( ) {
1509+ eprintln ! (
1510+ "Volume should be gone, try {counter} {:?}" ,
1511+ volumes
1512+ ) ;
1513+ tokio:: time:: sleep ( std:: time:: Duration :: from_secs ( 5 ) ) . await ;
1514+ counter += 1 ;
1515+ if counter > 200 {
1516+ panic ! (
1517+ "Tried 200 times, and still this did not finish"
1518+ ) ;
1519+ }
1520+ } else {
1521+ break ;
1522+ }
14981523 }
1499-
1500- assert ! ( volumes. is_empty( ) ) ;
15011524 }
15021525
15031526 /// Assert no Crucible resources are leaked
@@ -1648,32 +1671,59 @@ mod region_snapshot_replacement {
16481671 match result {
16491672 InsertStepResult :: Inserted { .. } => { }
16501673
1651- _ => {
1652- assert ! (
1653- false ,
1654- "bad result from create_region_snapshot_replacement_step"
1674+ InsertStepResult :: AlreadyHandled { existing_step_id } => {
1675+ let region_snapshot_replace_request = self
1676+ . datastore
1677+ . get_region_snapshot_replacement_request_by_id (
1678+ & self . opctx ( ) ,
1679+ existing_step_id,
1680+ )
1681+ . await ;
1682+ eprintln ! (
1683+ "we were suppose to create this: {:?} but found it AlreadyHandled, then got {:?}" ,
1684+ self . replacement_request_id,
1685+ region_snapshot_replace_request
16551686 ) ;
1687+ panic ! ( "Something else created our replacement" ) ;
16561688 }
16571689 }
16581690 }
16591691
16601692 pub async fn assert_read_only_target_gone ( & self ) {
1661- let region_snapshot_replace_request = self
1662- . datastore
1663- . get_region_snapshot_replacement_request_by_id (
1664- & self . opctx ( ) ,
1665- self . replacement_request_id ,
1666- )
1667- . await
1668- . unwrap ( ) ;
1693+ eprintln ! (
1694+ "Starting, replace_request_id: {:?}" ,
1695+ self . replacement_request_id
1696+ ) ;
1697+ let mut i = 1 ;
1698+ loop {
1699+ let region_snapshot_replace_request = self
1700+ . datastore
1701+ . get_region_snapshot_replacement_request_by_id (
1702+ & self . opctx ( ) ,
1703+ self . replacement_request_id ,
1704+ )
1705+ . await
1706+ . unwrap ( ) ;
1707+ eprintln ! (
1708+ "In loop {i} with rs_replace_request: {:?}" ,
1709+ region_snapshot_replace_request
1710+ ) ;
16691711
1670- assert ! (
1671- self . datastore
1712+ let res = self
1713+ . datastore
16721714 . read_only_target_addr ( & region_snapshot_replace_request)
16731715 . await
1674- . unwrap( )
1675- . is_none( )
1676- ) ;
1716+ . unwrap ( ) ;
1717+
1718+ eprintln ! ( "In loop {i} target that should be gone: {:?}" , res) ;
1719+ if res. is_none ( ) {
1720+ // test pass, move on
1721+ break ;
1722+ }
1723+ eprintln ! ( "loop {i}, snapshot that should be gone: {:?}" , res) ;
1724+ tokio:: time:: sleep ( std:: time:: Duration :: from_secs ( 5 ) ) . await ;
1725+ i += 1 ;
1726+ }
16771727 }
16781728
16791729 pub async fn remove_disk_from_snapshot_rop ( & self ) {
0 commit comments