Skip to content

Commit 247f269

Browse files
mayastor-borsdsavitskiy
andcommitted
Merge #1725
1725: feat(lvs): adding support for pool grow and related tests r=dsavitskiy a=dsavitskiy * Pool grow API support added to LVS. * Additional pool stats added. * Added support for MD reservation hint. * Related CLI subcommand added. 'pool list' subcommand extended to print additional pool info. * Related tests added. * For testing purposes, a non-safe support for resizing malloc bdev added. * To simplify adding new pool and replica parameters, LVS inner create-related APIs refactored to accept parameters via PoolArgs and ReplicaArgs instead of function arguments. * Added a example tool (lvs-eval) that creates an LVS with the given parameters and prints it internal configuration (allocated clusters, extent pages, etc.) Co-authored-by: Dmitry Savitskiy <[email protected]>
2 parents 1c537b7 + 438effd commit 247f269

34 files changed

+1642
-157
lines changed

Cargo.lock

Lines changed: 101 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

io-engine-tests/src/bdev.rs

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,26 @@
11
use super::compose::rpc::v1::{
2-
bdev::{Bdev, ListBdevOptions},
2+
bdev::{Bdev, CreateBdevRequest, ListBdevOptions},
33
SharedRpcHandle,
44
Status,
55
};
66

7-
pub async fn list_bdevs(rpc: &SharedRpcHandle) -> Result<Vec<Bdev>, Status> {
7+
/// Creates a bdev.
8+
pub async fn create_bdev(
9+
rpc: SharedRpcHandle,
10+
uri: &str,
11+
) -> Result<Bdev, Status> {
12+
rpc.lock()
13+
.await
14+
.bdev
15+
.create(CreateBdevRequest {
16+
uri: uri.to_string(),
17+
})
18+
.await
19+
.map(|r| r.into_inner().bdev.unwrap())
20+
}
21+
22+
/// Lists bdevs.
23+
pub async fn list_bdevs(rpc: SharedRpcHandle) -> Result<Vec<Bdev>, Status> {
824
rpc.lock()
925
.await
1026
.bdev
@@ -14,3 +30,14 @@ pub async fn list_bdevs(rpc: &SharedRpcHandle) -> Result<Vec<Bdev>, Status> {
1430
.await
1531
.map(|r| r.into_inner().bdevs)
1632
}
33+
34+
/// Finds a bdev by its name.
35+
pub async fn find_bdev_by_name(
36+
rpc: SharedRpcHandle,
37+
name: &str,
38+
) -> Option<Bdev> {
39+
match list_bdevs(rpc).await {
40+
Err(_) => None,
41+
Ok(nn) => nn.into_iter().find(|p| p.name == name),
42+
}
43+
}

io-engine-tests/src/compose/mod.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,8 +78,15 @@ impl<'a> MayastorTest<'a> {
7878
}
7979

8080
pub fn new(args: MayastorCliArgs) -> MayastorTest<'static> {
81+
Self::new_ex(args, None)
82+
}
83+
84+
pub fn new_ex(
85+
args: MayastorCliArgs,
86+
log_level: Option<&str>,
87+
) -> MayastorTest<'static> {
8188
let (tx, rx) = bounded(1);
82-
mayastor_test_init_ex(args.log_format.unwrap_or_default());
89+
mayastor_test_init_ex(args.log_format.unwrap_or_default(), log_level);
8390
let thdl = std::thread::Builder::new()
8491
.name("mayastor_master".into())
8592
.spawn(move || {

io-engine-tests/src/lib.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -130,10 +130,10 @@ macro_rules! test_init {
130130
}
131131

132132
pub fn mayastor_test_init() {
133-
mayastor_test_init_ex(LogFormat::default());
133+
mayastor_test_init_ex(LogFormat::default(), None);
134134
}
135135

136-
pub fn mayastor_test_init_ex(log_format: LogFormat) {
136+
pub fn mayastor_test_init_ex(log_format: LogFormat, log_level: Option<&str>) {
137137
fn binary_present(name: &str) -> Result<bool, std::env::VarError> {
138138
std::env::var("PATH").map(|paths| {
139139
paths
@@ -151,7 +151,11 @@ pub fn mayastor_test_init_ex(log_format: LogFormat) {
151151
}
152152
});
153153

154-
logger::init_ex("info,io_engine=DEBUG", log_format, None);
154+
logger::init_ex(
155+
log_level.unwrap_or("info,io_engine=DEBUG"),
156+
log_format,
157+
None,
158+
);
155159

156160
io_engine::CPS_INIT!();
157161
}

io-engine-tests/src/pool.rs

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
pub use super::compose::rpc::v1::pool::Pool;
22
use super::{
33
compose::rpc::v1::{
4-
pool::{CreatePoolRequest, ListPoolOptions},
4+
pool::{CreatePoolRequest, GrowPoolRequest, ListPoolOptions},
55
replica::{ListReplicaOptions, Replica},
66
SharedRpcHandle,
77
Status,
@@ -190,6 +190,7 @@ impl PoolBuilderRpc {
190190
.with_malloc_blk_size(bdev_name, size_mb, blk_size);
191191
self
192192
}
193+
193194
pub async fn create(&mut self) -> Result<Pool, Status> {
194195
self.rpc()
195196
.lock()
@@ -201,11 +202,28 @@ impl PoolBuilderRpc {
201202
pooltype: 0,
202203
disks: vec![self.bdev.as_ref().unwrap().clone()],
203204
cluster_size: None,
205+
md_args: None,
204206
})
205207
.await
206208
.map(|r| r.into_inner())
207209
}
208210

211+
pub async fn grow(&mut self) -> Result<(Pool, Pool), Status> {
212+
self.rpc()
213+
.lock()
214+
.await
215+
.pool
216+
.grow_pool(GrowPoolRequest {
217+
name: self.name(),
218+
uuid: Some(self.uuid()),
219+
})
220+
.await
221+
.map(|r| {
222+
let t = r.into_inner();
223+
(t.previous_pool.unwrap(), t.current_pool.unwrap())
224+
})
225+
}
226+
209227
pub async fn get_pool(&self) -> Result<Pool, Status> {
210228
let uuid = self.uuid();
211229
list_pools(self.rpc())
@@ -263,6 +281,7 @@ impl PoolBuilderLocal {
263281
uuid: Some(self.uuid()),
264282
disks: vec![self.bdev.as_ref().unwrap().clone()],
265283
cluster_size: None,
284+
md_args: None,
266285
backend: Default::default(),
267286
})
268287
.await?;

io-engine/Cargo.toml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,10 @@ path = "src/bin/jsonrpc.rs"
4242
name = "casperf"
4343
path = "src/bin/casperf.rs"
4444

45+
[[example]]
46+
name = "lvs-eval"
47+
path = "examples/lvs-eval/main.rs"
48+
4549
[dependencies]
4650
ansi_term = "0.12.1"
4751
async-channel = "1.9.0"
@@ -125,4 +129,5 @@ version = "1.4.1"
125129
assert_matches = "1.5.0"
126130
io-engine-tests = { path = "../io-engine-tests" }
127131
libnvme-rs = { path = "../libnvme-rs", version = "0.1.0" }
132+
prettytable-rs = "0.10.0"
128133
run_script = "0.10.1"

0 commit comments

Comments
 (0)