svn commit: r339151 - stable/11/sys/cddl/contrib/opensolaris/uts/common/fs/zfs
Alexander Motin
mav at FreeBSD.org
Wed Oct 3 15:34:51 UTC 2018
Author: mav
Date: Wed Oct 3 15:34:49 2018
New Revision: 339151
URL: https://svnweb.freebsd.org/changeset/base/339151
Log:
MFC r337970: 9738 Fix third block copy allocations, broken at 9112.
Use METASLAB_WEIGHT_CLAIM weight to allocate tertiary blocks.
Previous use of METASLAB_WEIGHT_SECONDARY for that caused errors
later on metaslab_activate_allocator() call, leading to massive
load of unneeded metaslabs and write freezes.
Reviewed by: Paul Dagnelie <pcd at delphix.com>
Modified:
stable/11/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/metaslab.c
Directory Properties:
stable/11/ (props changed)
Modified: stable/11/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/metaslab.c
==============================================================================
--- stable/11/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/metaslab.c Wed Oct 3 15:33:20 2018 (r339150)
+++ stable/11/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/metaslab.c Wed Oct 3 15:34:49 2018 (r339151)
@@ -3094,7 +3094,6 @@ metaslab_group_alloc_normal(metaslab_group_t *mg, zio_
metaslab_t *msp = NULL;
uint64_t offset = -1ULL;
uint64_t activation_weight;
- boolean_t tertiary = B_FALSE;
activation_weight = METASLAB_WEIGHT_PRIMARY;
for (int i = 0; i < d; i++) {
@@ -3103,7 +3102,7 @@ metaslab_group_alloc_normal(metaslab_group_t *mg, zio_
activation_weight = METASLAB_WEIGHT_SECONDARY;
} else if (activation_weight == METASLAB_WEIGHT_SECONDARY &&
DVA_GET_VDEV(&dva[i]) == mg->mg_vd->vdev_id) {
- tertiary = B_TRUE;
+ activation_weight = METASLAB_WEIGHT_CLAIM;
break;
}
}
@@ -3112,10 +3111,8 @@ metaslab_group_alloc_normal(metaslab_group_t *mg, zio_
* If we don't have enough metaslabs active to fill the entire array, we
* just use the 0th slot.
*/
- if (mg->mg_ms_ready < mg->mg_allocators * 2) {
- tertiary = B_FALSE;
+ if (mg->mg_ms_ready < mg->mg_allocators * 3)
allocator = 0;
- }
ASSERT3U(mg->mg_vd->vdev_ms_count, >=, 2);
@@ -3141,7 +3138,7 @@ metaslab_group_alloc_normal(metaslab_group_t *mg, zio_
msp = mg->mg_primaries[allocator];
was_active = B_TRUE;
} else if (activation_weight == METASLAB_WEIGHT_SECONDARY &&
- mg->mg_secondaries[allocator] != NULL && !tertiary) {
+ mg->mg_secondaries[allocator] != NULL) {
msp = mg->mg_secondaries[allocator];
was_active = B_TRUE;
} else {
@@ -3184,7 +3181,8 @@ metaslab_group_alloc_normal(metaslab_group_t *mg, zio_
continue;
}
- if (msp->ms_weight & METASLAB_WEIGHT_CLAIM) {
+ if (msp->ms_weight & METASLAB_WEIGHT_CLAIM &&
+ activation_weight != METASLAB_WEIGHT_CLAIM) {
metaslab_passivate(msp, msp->ms_weight &
~METASLAB_WEIGHT_CLAIM);
mutex_exit(&msp->ms_lock);
More information about the svn-src-all
mailing list