@@ -16,14 +16,33 @@ use std::pin::Pin;
16
16
17
17
pub mod common;
18
18
19
- static DISKNAME1 : & str = "/tmp/disk1.img" ;
20
- static DISKNAME2 : & str = "/tmp/disk2.img" ;
19
+ static TESTDIR : & str = "/tmp/io-engine-tests" ;
20
+ static DISKNAME1 : & str = "/tmp/io-engine-tests/disk1.img" ;
21
+ static DISKNAME2 : & str = "/tmp/io-engine-tests/disk2.img" ;
22
+ static DISKNAME3 : & str = "/tmp/io-engine-tests/disk3.img" ;
21
23
22
24
#[ tokio:: test]
23
25
async fn lvs_pool_test ( ) {
24
- common:: delete_file ( & [ DISKNAME1 . into ( ) , DISKNAME2 . into ( ) ] ) ;
26
+ // Create directory for placing test disk files
27
+ // todo: Create this from some common place and use for all other tests too.
28
+ let _ = std:: process:: Command :: new ( "mkdir" )
29
+ . args ( [ "-p" ] )
30
+ . args ( [ TESTDIR ] )
31
+ . output ( )
32
+ . expect ( "failed to execute mkdir" ) ;
33
+
34
+ common:: delete_file ( & [
35
+ DISKNAME1 . into ( ) ,
36
+ DISKNAME2 . into ( ) ,
37
+ DISKNAME3 . into ( ) ,
38
+ ] ) ;
25
39
common:: truncate_file ( DISKNAME1 , 128 * 1024 ) ;
26
40
common:: truncate_file ( DISKNAME2 , 128 * 1024 ) ;
41
+ common:: truncate_file ( DISKNAME3 , 128 * 1024 ) ;
42
+
43
+ //setup disk3 via loop device using a sector size of 4096.
44
+ let ldev = common:: setup_loopdev_file ( DISKNAME3 , Some ( 4096 ) ) ;
45
+
27
46
let args = MayastorCliArgs {
28
47
reactor_mask : "0x3" . into ( ) ,
29
48
..Default :: default ( )
@@ -32,15 +51,17 @@ async fn lvs_pool_test() {
32
51
33
52
// should fail to import a pool that does not exist on disk
34
53
ms. spawn ( async {
35
- assert ! ( Lvs :: import( "tpool" , "aio:///tmp/disk1.img" ) . await . is_err( ) )
54
+ assert ! ( Lvs :: import( "tpool" , format!( "aio://{DISKNAME1}" ) . as_str( ) )
55
+ . await
56
+ . is_err( ) )
36
57
} )
37
58
. await ;
38
59
39
60
// should succeed to create a pool we can not import
40
61
ms. spawn ( async {
41
62
Lvs :: create_or_import ( PoolArgs {
42
63
name : "tpool" . into ( ) ,
43
- disks : vec ! [ "aio:///tmp/disk1.img" . into ( ) ] ,
64
+ disks : vec ! [ format! ( "aio://{DISKNAME1}" ) ] ,
44
65
uuid : None ,
45
66
cluster_size : None ,
46
67
backend : PoolBackend :: Lvs ,
@@ -55,16 +76,23 @@ async fn lvs_pool_test() {
55
76
// have an idempotent snafu, we dont crash and
56
77
// burn
57
78
ms. spawn ( async {
58
- assert ! ( Lvs :: create( "tpool" , "aio:///tmp/disk1.img" , None , None )
59
- . await
60
- . is_err( ) )
79
+ assert ! ( Lvs :: create(
80
+ "tpool" ,
81
+ format!( "aio://{DISKNAME1}" ) . as_str( ) ,
82
+ None ,
83
+ None
84
+ )
85
+ . await
86
+ . is_err( ) )
61
87
} )
62
88
. await ;
63
89
64
90
// should fail to import the pool that is already imported
65
91
// similar to above, we use the import directly
66
92
ms. spawn ( async {
67
- assert ! ( Lvs :: import( "tpool" , "aio:///tmp/disk1.img" ) . await . is_err( ) )
93
+ assert ! ( Lvs :: import( "tpool" , format!( "aio://{DISKNAME1}" ) . as_str( ) )
94
+ . await
95
+ . is_err( ) )
68
96
} )
69
97
. await ;
70
98
@@ -75,7 +103,7 @@ async fn lvs_pool_test() {
75
103
assert_eq ! ( pool. name( ) , "tpool" ) ;
76
104
assert_eq ! ( pool. used( ) , 0 ) ;
77
105
dbg ! ( pool. uuid( ) ) ;
78
- assert_eq ! ( pool. base_bdev( ) . name( ) , "/tmp/disk1.img" ) ;
106
+ assert_eq ! ( pool. base_bdev( ) . name( ) , DISKNAME1 ) ;
79
107
} )
80
108
. await ;
81
109
@@ -90,9 +118,13 @@ async fn lvs_pool_test() {
90
118
// import and export implicitly destroy the base_bdev, for
91
119
// testing import and create we
92
120
// sometimes create the base_bdev manually
93
- bdev_create ( "aio:///tmp/disk1.img" ) . await . unwrap ( ) ;
121
+ bdev_create ( format ! ( "aio://{DISKNAME1}" ) . as_str ( ) )
122
+ . await
123
+ . unwrap ( ) ;
94
124
95
- assert ! ( Lvs :: import( "tpool" , "aio:///tmp/disk1.img" ) . await . is_ok( ) ) ;
125
+ assert ! ( Lvs :: import( "tpool" , format!( "aio://{DISKNAME1}" ) . as_str( ) )
126
+ . await
127
+ . is_ok( ) ) ;
96
128
97
129
let pool = Lvs :: lookup ( "tpool" ) . unwrap ( ) ;
98
130
assert_eq ! ( pool. uuid( ) , uuid) ;
@@ -107,13 +139,22 @@ async fn lvs_pool_test() {
107
139
let uuid = pool. uuid ( ) ;
108
140
pool. destroy ( ) . await . unwrap ( ) ;
109
141
110
- bdev_create ( "aio:///tmp/disk1.img" ) . await . unwrap ( ) ;
111
- assert ! ( Lvs :: import( "tpool" , "aio:///tmp/disk1.img" ) . await . is_err( ) ) ;
142
+ bdev_create ( format ! ( "aio://{DISKNAME1}" ) . as_str ( ) )
143
+ . await
144
+ . unwrap ( ) ;
145
+ assert ! ( Lvs :: import( "tpool" , format!( "aio://{DISKNAME1}" ) . as_str( ) )
146
+ . await
147
+ . is_err( ) ) ;
112
148
113
149
assert_eq ! ( Lvs :: iter( ) . count( ) , 0 ) ;
114
- assert ! ( Lvs :: create( "tpool" , "aio:///tmp/disk1.img" , None , None )
115
- . await
116
- . is_ok( ) ) ;
150
+ assert ! ( Lvs :: create(
151
+ "tpool" ,
152
+ format!( "aio://{DISKNAME1}" ) . as_str( ) ,
153
+ None ,
154
+ None
155
+ )
156
+ . await
157
+ . is_ok( ) ) ;
117
158
118
159
let pool = Lvs :: lookup ( "tpool" ) . unwrap ( ) ;
119
160
assert_ne ! ( uuid, pool. uuid( ) ) ;
@@ -181,7 +222,7 @@ async fn lvs_pool_test() {
181
222
pool. export ( ) . await . unwrap ( ) ;
182
223
let pool = Lvs :: create_or_import ( PoolArgs {
183
224
name : "tpool" . to_string ( ) ,
184
- disks : vec ! [ "aio:///tmp/disk1.img" . to_string ( ) ] ,
225
+ disks : vec ! [ format! ( "aio://{DISKNAME1}" ) ] ,
185
226
uuid : None ,
186
227
cluster_size : None ,
187
228
backend : PoolBackend :: Lvs ,
@@ -297,8 +338,12 @@ async fn lvs_pool_test() {
297
338
// import the pool all shares should be there, but also validate
298
339
// the share that not shared to be -- not shared
299
340
ms. spawn ( async {
300
- bdev_create ( "aio:///tmp/disk1.img" ) . await . unwrap ( ) ;
301
- let pool = Lvs :: import ( "tpool" , "aio:///tmp/disk1.img" ) . await . unwrap ( ) ;
341
+ bdev_create ( format ! ( "aio://{DISKNAME1}" ) . as_str ( ) )
342
+ . await
343
+ . unwrap ( ) ;
344
+ let pool = Lvs :: import ( "tpool" , format ! ( "aio://{DISKNAME1}" ) . as_str ( ) )
345
+ . await
346
+ . unwrap ( ) ;
302
347
303
348
for l in pool. lvols ( ) . unwrap ( ) {
304
349
if l. name ( ) == "notshared" {
@@ -321,7 +366,7 @@ async fn lvs_pool_test() {
321
366
322
367
let pool = Lvs :: create_or_import ( PoolArgs {
323
368
name : "tpool" . into ( ) ,
324
- disks : vec ! [ "aio:///tmp/disk1.img" . into ( ) ] ,
369
+ disks : vec ! [ format! ( "aio://{DISKNAME1}" ) ] ,
325
370
uuid : None ,
326
371
cluster_size : None ,
327
372
backend : PoolBackend :: Lvs ,
@@ -336,6 +381,60 @@ async fn lvs_pool_test() {
336
381
} )
337
382
. await ;
338
383
384
+ let pool_dev_aio = ldev. clone ( ) ;
385
+ // should succeed to create an aio bdev pool on a loop blockdev of 4096
386
+ // bytes sector size.
387
+ ms. spawn ( async move {
388
+ Lvs :: create_or_import ( PoolArgs {
389
+ name : "tpool_4k_aio" . into ( ) ,
390
+ disks : vec ! [ format!( "aio://{pool_dev_aio}" ) ] ,
391
+ uuid : None ,
392
+ cluster_size : None ,
393
+ backend : PoolBackend :: Lvs ,
394
+ } )
395
+ . await
396
+ . unwrap ( ) ;
397
+ } )
398
+ . await ;
399
+
400
+ // should be able to find our new LVS created on loopdev, and subsequently
401
+ // destroy it.
402
+ ms. spawn ( async {
403
+ let pool = Lvs :: lookup ( "tpool_4k_aio" ) . unwrap ( ) ;
404
+ assert_eq ! ( pool. name( ) , "tpool_4k_aio" ) ;
405
+ assert_eq ! ( pool. used( ) , 0 ) ;
406
+ dbg ! ( pool. uuid( ) ) ;
407
+ pool. destroy ( ) . await . unwrap ( ) ;
408
+ } )
409
+ . await ;
410
+
411
+ let pool_dev_uring = ldev. clone ( ) ;
412
+ // should succeed to create an uring pool on a loop blockdev of 4096 bytes
413
+ // sector size.
414
+ ms. spawn ( async move {
415
+ Lvs :: create_or_import ( PoolArgs {
416
+ name : "tpool_4k_uring" . into ( ) ,
417
+ disks : vec ! [ format!( "uring://{pool_dev_uring}" ) ] ,
418
+ uuid : None ,
419
+ cluster_size : None ,
420
+ backend : PoolBackend :: Lvs ,
421
+ } )
422
+ . await
423
+ . unwrap ( ) ;
424
+ } )
425
+ . await ;
426
+
427
+ // should be able to find our new LVS created on loopdev, and subsequently
428
+ // destroy it.
429
+ ms. spawn ( async {
430
+ let pool = Lvs :: lookup ( "tpool_4k_uring" ) . unwrap ( ) ;
431
+ assert_eq ! ( pool. name( ) , "tpool_4k_uring" ) ;
432
+ assert_eq ! ( pool. used( ) , 0 ) ;
433
+ dbg ! ( pool. uuid( ) ) ;
434
+ pool. destroy ( ) . await . unwrap ( ) ;
435
+ } )
436
+ . await ;
437
+
339
438
// validate the expected state of mayastor
340
439
ms. spawn ( async {
341
440
// no shares left except for the discovery controller
@@ -352,7 +451,7 @@ async fn lvs_pool_test() {
352
451
// importing a pool with the wrong name should fail
353
452
Lvs :: create_or_import ( PoolArgs {
354
453
name : "jpool" . into ( ) ,
355
- disks : vec ! [ "aio:///tmp/disk1.img" . into ( ) ] ,
454
+ disks : vec ! [ format! ( "aio://{DISKNAME1}" ) ] ,
356
455
uuid : None ,
357
456
cluster_size : None ,
358
457
backend : PoolBackend :: Lvs ,
@@ -369,7 +468,7 @@ async fn lvs_pool_test() {
369
468
ms. spawn ( async {
370
469
let pool = Lvs :: create_or_import ( PoolArgs {
371
470
name : "tpool2" . into ( ) ,
372
- disks : vec ! [ "/tmp/disk2.img" . into ( ) ] ,
471
+ disks : vec ! [ format! ( "aio://{DISKNAME2}" ) ] ,
373
472
uuid : None ,
374
473
cluster_size : None ,
375
474
backend : PoolBackend :: Lvs ,
@@ -381,4 +480,6 @@ async fn lvs_pool_test() {
381
480
. await ;
382
481
383
482
common:: delete_file ( & [ DISKNAME2 . into ( ) ] ) ;
483
+ common:: detach_loopdev ( ldev. as_str ( ) ) ;
484
+ common:: delete_file ( & [ DISKNAME3 . into ( ) ] ) ;
384
485
}
0 commit comments