aboutsummaryrefslogtreecommitdiffstats
path: root/include/sys/vdev_initialize.h
diff options
context:
space:
mode:
authorGeorge Wilson <[email protected]>2018-12-19 09:20:39 -0700
committerBrian Behlendorf <[email protected]>2019-01-07 11:03:08 -0800
commitc10d37dd9f5d56e19330add732f1a713250d24f7 (patch)
treea43f6b7c1592612fe4277bcaf5d99c02543523b8 /include/sys/vdev_initialize.h
parent619f09769393d4e0cbaa5f662362138e1c699159 (diff)
zfs initialize performance enhancements
PROBLEM ======== When invoking "zpool initialize" on a pool the command will create a thread to initialize each disk. Unfortunately, it does this serially across many transaction groups which can result in commands taking a long time to return to the user and may appear hung. The same thing is true when trying to suspend/cancel the operation. SOLUTION ========= This change refactors the way we invoke the initialize interface to ensure we can start or stop the intialization in just a few transaction groups. When stopping or cancelling a vdev initialization perform it in two phases. First signal each vdev initialization thread that it should exit, then after all threads have been signaled wait for them to exit. On a pool with 40 leaf vdevs this reduces the vdev initialize stop/cancel time from ~10 minutes to under a second. The reason for this is spa_vdev_initialize() no longer needs to wait on multiple full TXGs per leaf vdev being stopped. This commit additionally adds some missing checks for the passed "initialize_vdevs" input nvlist. The contents of the user provided input "initialize_vdevs" nvlist must be validated to ensure all values are uint64s. This is done in zfs_ioc_pool_initialize() in order to keep all of these checks in a single location. Updated the innvl and outnvl comments to match the formatting used for all other new sytle ioctls. Reviewed by: Matt Ahrens <[email protected]> Reviewed-by: loli10K <[email protected]> Reviewed-by: Tim Chase <[email protected]> Signed-off-by: Brian Behlendorf <[email protected]> Signed-off-by: George Wilson <[email protected]> Closes #8230
Diffstat (limited to 'include/sys/vdev_initialize.h')
-rw-r--r--include/sys/vdev_initialize.h5
1 files changed, 4 insertions, 1 deletions
diff --git a/include/sys/vdev_initialize.h b/include/sys/vdev_initialize.h
index db4b0572c..319fb9bc0 100644
--- a/include/sys/vdev_initialize.h
+++ b/include/sys/vdev_initialize.h
@@ -26,15 +26,18 @@
#ifndef _SYS_VDEV_INITIALIZE_H
#define _SYS_VDEV_INITIALIZE_H
+#include <sys/spa.h>
+
#ifdef __cplusplus
extern "C" {
#endif
extern void vdev_initialize(vdev_t *vd);
extern void vdev_initialize_stop(vdev_t *vd,
- vdev_initializing_state_t tgt_state);
+ vdev_initializing_state_t tgt_state, list_t *vd_list);
extern void vdev_initialize_stop_all(vdev_t *vd,
vdev_initializing_state_t tgt_state);
+extern void vdev_initialize_stop_wait(spa_t *spa, list_t *vd_list);
extern void vdev_initialize_restart(vdev_t *vd);
extern void vdev_xlate(vdev_t *vd, const range_seg_t *logical_rs,
range_seg_t *physical_rs);