@@ -3058,10 +3058,9 @@ mod test {
3058
3058
let tds = TestDownstairsSet :: small ( false ) . await ?;
3059
3059
let opts = tds. opts ( ) ;
3060
3060
3061
- let guest = Arc :: new ( Guest :: new ( None ) ) ;
3062
- let gc = guest. clone ( ) ;
3061
+ let ( guest, io) = Guest :: new ( None ) ;
3063
3062
3064
- let _join_handle = up_main ( opts, 1 , None , gc , None ) ?;
3063
+ let _join_handle = up_main ( opts, 1 , None , io , None ) ?;
3065
3064
3066
3065
guest. activate ( ) . await ?;
3067
3066
guest. query_work_queue ( ) . await ?;
@@ -3093,6 +3092,70 @@ mod test {
3093
3092
Ok ( ( ) )
3094
3093
}
3095
3094
3095
+ /// Drop the guest right away and confirm that the worker thread stops
3096
+ #[ tokio:: test]
3097
+ async fn integration_test_guest_drop_early ( ) -> Result < ( ) > {
3098
+ // Spin off three downstairs, build our Crucible struct.
3099
+ let tds = TestDownstairsSet :: small ( false ) . await ?;
3100
+ let opts = tds. opts ( ) ;
3101
+
3102
+ let ( guest, io) = Guest :: new ( None ) ;
3103
+
3104
+ let join_handle = up_main ( opts, 1 , None , io, None ) ?;
3105
+
3106
+ drop ( guest) ;
3107
+
3108
+ let r = join_handle. await ;
3109
+ assert ! ( r. is_ok( ) ) ;
3110
+ Ok ( ( ) )
3111
+ }
3112
+
3113
+ /// Same as `integration_test_guest_downstairs`, but dropping the Guest at
3114
+ /// the end and confirming that the worker thread stops
3115
+ #[ tokio:: test]
3116
+ async fn integration_test_guest_drop ( ) -> Result < ( ) > {
3117
+ const BLOCK_SIZE : usize = 512 ;
3118
+ // Spin off three downstairs, build our Crucible struct.
3119
+ let tds = TestDownstairsSet :: small ( false ) . await ?;
3120
+ let opts = tds. opts ( ) ;
3121
+
3122
+ let ( guest, io) = Guest :: new ( None ) ;
3123
+
3124
+ let join_handle = up_main ( opts, 1 , None , io, None ) ?;
3125
+
3126
+ guest. activate ( ) . await ?;
3127
+ guest. query_work_queue ( ) . await ?;
3128
+
3129
+ // Verify contents are zero on init
3130
+ let mut buffer = Buffer :: new ( 10 , BLOCK_SIZE ) ;
3131
+ guest
3132
+ . read ( Block :: new ( 0 , BLOCK_SIZE . trailing_zeros ( ) ) , & mut buffer)
3133
+ . await ?;
3134
+
3135
+ assert_eq ! ( vec![ 0x00_u8 ; BLOCK_SIZE * 10 ] , buffer. to_vec( ) ) ;
3136
+
3137
+ // Write data in
3138
+ guest
3139
+ . write (
3140
+ Block :: new ( 0 , BLOCK_SIZE . trailing_zeros ( ) ) ,
3141
+ Bytes :: from ( vec ! [ 0x55 ; BLOCK_SIZE * 10 ] ) ,
3142
+ )
3143
+ . await ?;
3144
+
3145
+ // Read parent, verify contents
3146
+ let mut buffer = Buffer :: new ( 10 , BLOCK_SIZE ) ;
3147
+ guest
3148
+ . read ( Block :: new ( 0 , BLOCK_SIZE . trailing_zeros ( ) ) , & mut buffer)
3149
+ . await ?;
3150
+
3151
+ assert_eq ! ( vec![ 0x55_u8 ; BLOCK_SIZE * 10 ] , buffer. to_vec( ) ) ;
3152
+ drop ( guest) ;
3153
+
3154
+ let r = join_handle. await ;
3155
+ assert ! ( r. is_ok( ) ) ;
3156
+ Ok ( ( ) )
3157
+ }
3158
+
3096
3159
#[ tokio:: test]
3097
3160
async fn integration_test_guest_zero_length_io ( ) -> Result < ( ) > {
3098
3161
// Test the guest layer with a write and read of zero length
@@ -3102,10 +3165,9 @@ mod test {
3102
3165
let tds = TestDownstairsSet :: small ( false ) . await ?;
3103
3166
let opts = tds. opts ( ) ;
3104
3167
3105
- let guest = Arc :: new ( Guest :: new ( None ) ) ;
3106
- let gc = guest. clone ( ) ;
3168
+ let ( guest, io) = Guest :: new ( None ) ;
3107
3169
3108
- let _join_handle = up_main ( opts, 1 , None , gc , None ) ?;
3170
+ let _join_handle = up_main ( opts, 1 , None , io , None ) ?;
3109
3171
3110
3172
guest. activate ( ) . await ?;
3111
3173
guest. query_work_queue ( ) . await ?;
@@ -3138,9 +3200,8 @@ mod test {
3138
3200
let opts = tds. opts ( ) ;
3139
3201
3140
3202
let log = csl ( ) ;
3141
- let guest = Arc :: new ( Guest :: new ( Some ( log. clone ( ) ) ) ) ;
3142
- let gc = guest. clone ( ) ;
3143
- let _jh = up_main ( opts, 1 , None , gc, None ) ?;
3203
+ let ( guest, io) = Guest :: new ( Some ( log. clone ( ) ) ) ;
3204
+ let _jh = up_main ( opts, 1 , None , io, None ) ?;
3144
3205
3145
3206
guest. activate ( ) . await ?;
3146
3207
@@ -3212,11 +3273,10 @@ mod test {
3212
3273
let tds = TestDownstairsSet :: small ( true ) . await ?;
3213
3274
let opts = tds. opts ( ) ;
3214
3275
3215
- let guest = Arc :: new ( Guest :: new ( None ) ) ;
3216
- let gc = guest. clone ( ) ;
3276
+ let ( guest, io) = Guest :: new ( None ) ;
3217
3277
3218
3278
// Read-only Upstairs should return errors if writes are attempted.
3219
- let _join_handle = up_main ( opts, 1 , None , gc , None ) ?;
3279
+ let _join_handle = up_main ( opts, 1 , None , io , None ) ?;
3220
3280
3221
3281
guest. activate ( ) . await ?;
3222
3282
@@ -3246,9 +3306,8 @@ mod test {
3246
3306
let opts = tds. opts ( ) ;
3247
3307
3248
3308
let log = csl ( ) ;
3249
- let guest = Arc :: new ( Guest :: new ( Some ( log. clone ( ) ) ) ) ;
3250
- let gc = guest. clone ( ) ;
3251
- let _jh = up_main ( opts, 1 , None , gc, None ) ?;
3309
+ let ( guest, io) = Guest :: new ( Some ( log. clone ( ) ) ) ;
3310
+ let _jh = up_main ( opts, 1 , None , io, None ) ?;
3252
3311
3253
3312
guest. activate ( ) . await ?;
3254
3313
@@ -3293,10 +3352,9 @@ mod test {
3293
3352
let tds = TestDownstairsSet :: small ( false ) . await ?;
3294
3353
let opts = tds. opts ( ) ;
3295
3354
3296
- let guest = Arc :: new ( Guest :: new ( None ) ) ;
3297
- let gc = guest. clone ( ) ;
3355
+ let ( guest, io) = Guest :: new ( None ) ;
3298
3356
3299
- let _join_handle = up_main ( opts, 1 , None , gc , None ) ?;
3357
+ let _join_handle = up_main ( opts, 1 , None , io , None ) ?;
3300
3358
3301
3359
guest. activate ( ) . await ?;
3302
3360
guest. query_work_queue ( ) . await ?;
@@ -3366,10 +3424,9 @@ mod test {
3366
3424
let tds = TestDownstairsSet :: small ( false ) . await ?;
3367
3425
let opts = tds. opts ( ) ;
3368
3426
3369
- let guest = Arc :: new ( Guest :: new ( None ) ) ;
3370
- let gc = guest. clone ( ) ;
3427
+ let ( guest, io) = Guest :: new ( None ) ;
3371
3428
3372
- let _join_handle = up_main ( opts, 1 , None , gc , None ) ?;
3429
+ let _join_handle = up_main ( opts, 1 , None , io , None ) ?;
3373
3430
3374
3431
guest. activate ( ) . await ?;
3375
3432
guest. query_work_queue ( ) . await ?;
@@ -3424,10 +3481,9 @@ mod test {
3424
3481
let tds = TestDownstairsSet :: small ( false ) . await ?;
3425
3482
let opts = tds. opts ( ) ;
3426
3483
3427
- let guest = Arc :: new ( Guest :: new ( None ) ) ;
3428
- let gc = guest. clone ( ) ;
3484
+ let ( guest, io) = Guest :: new ( None ) ;
3429
3485
3430
- let _join_handle = up_main ( opts, 1 , None , gc , None ) ?;
3486
+ let _join_handle = up_main ( opts, 1 , None , io , None ) ?;
3431
3487
3432
3488
guest. activate ( ) . await ?;
3433
3489
guest. query_work_queue ( ) . await ?;
@@ -3483,10 +3539,9 @@ mod test {
3483
3539
let tds = TestDownstairsSet :: small ( false ) . await ?;
3484
3540
let opts = tds. opts ( ) ;
3485
3541
3486
- let guest = Arc :: new ( Guest :: new ( None ) ) ;
3487
- let gc = guest. clone ( ) ;
3542
+ let ( guest, io) = Guest :: new ( None ) ;
3488
3543
3489
- let _join_handle = up_main ( opts, 1 , None , gc , None ) ?;
3544
+ let _join_handle = up_main ( opts, 1 , None , io , None ) ?;
3490
3545
3491
3546
guest. activate ( ) . await ?;
3492
3547
guest. query_work_queue ( ) . await ?;
@@ -3537,10 +3592,9 @@ mod test {
3537
3592
let tds = TestDownstairsSet :: small ( false ) . await ?;
3538
3593
let opts = tds. opts ( ) ;
3539
3594
3540
- let guest = Arc :: new ( Guest :: new ( None ) ) ;
3541
- let gc = guest. clone ( ) ;
3595
+ let ( guest, io) = Guest :: new ( None ) ;
3542
3596
3543
- let _join_handle = up_main ( opts, 1 , None , gc , None ) ?;
3597
+ let _join_handle = up_main ( opts, 1 , None , io , None ) ?;
3544
3598
3545
3599
guest. activate ( ) . await ?;
3546
3600
guest. query_work_queue ( ) . await ?;
@@ -3591,10 +3645,9 @@ mod test {
3591
3645
let tds = TestDownstairsSet :: small ( false ) . await ?;
3592
3646
let opts = tds. opts ( ) ;
3593
3647
3594
- let guest = Arc :: new ( Guest :: new ( None ) ) ;
3595
- let gc = guest. clone ( ) ;
3648
+ let ( guest, io) = Guest :: new ( None ) ;
3596
3649
3597
- let _join_handle = up_main ( opts, 1 , None , gc , None ) ?;
3650
+ let _join_handle = up_main ( opts, 1 , None , io , None ) ?;
3598
3651
3599
3652
guest. activate ( ) . await ?;
3600
3653
guest. query_work_queue ( ) . await ?;
@@ -3643,10 +3696,9 @@ mod test {
3643
3696
let tds = TestDownstairsSet :: small ( false ) . await . unwrap ( ) ;
3644
3697
let opts = tds. opts ( ) ;
3645
3698
3646
- let guest = Arc :: new ( Guest :: new ( None ) ) ;
3647
- let gc = guest. clone ( ) ;
3699
+ let ( guest, io) = Guest :: new ( None ) ;
3648
3700
3649
- let _join_handle = up_main ( opts, 1 , None , gc , None ) . unwrap ( ) ;
3701
+ let _join_handle = up_main ( opts, 1 , None , io , None ) . unwrap ( ) ;
3650
3702
3651
3703
guest. activate ( ) . await . unwrap ( ) ;
3652
3704
@@ -3679,10 +3731,9 @@ mod test {
3679
3731
let tds = TestDownstairsSet :: small ( false ) . await . unwrap ( ) ;
3680
3732
let opts = tds. opts ( ) ;
3681
3733
3682
- let guest = Arc :: new ( Guest :: new ( None ) ) ;
3683
- let gc = guest. clone ( ) ;
3734
+ let ( guest, io) = Guest :: new ( None ) ;
3684
3735
3685
- let _join_handle = up_main ( opts, 1 , None , gc , None ) . unwrap ( ) ;
3736
+ let _join_handle = up_main ( opts, 1 , None , io , None ) . unwrap ( ) ;
3686
3737
3687
3738
guest. activate ( ) . await . unwrap ( ) ;
3688
3739
0 commit comments