Ronnie Sahlberg rsahlberg · review.whamcloud.com
Needs your action
2 new · 9 longstanding
69703
master
J –B ✓T ✗5R 0/2
LU-20690 ec: verify parity against data, allow p > k
reviewing Keguang Xu · Keguang Xu pinged you: “@rsahlberg@whamcloud.com @adilger@thelustrecollective.com: is stripe_idx < nsets * p for m”
pt_ecroraid10-like218_review_prioritypw_shepherd
4 unresolved
L +338 −193
50m
LU-20690 ec: verify parity against data, allow p > k
reviewing Keguang Xu · Keguang Xu pinged you: “@rsahlberg@whamcloud.com @adilger@thelustrecollective.com: is stripe_idx < nsets * p for m”
pt_ecroraid10-like218_review_prioritypw_shepherd
4 unresolved
L +338 −193
50m
Keguang Xu pinged you: “@rsahlberg@whamcloud.com @adilger@thelustrecollective.com: is stripe_idx < nsets * p for m”
blocked on the owner: enforced tests failed
awaiting review (CI not green yet)
| failed enforced test | platform | detail | |
|---|---|---|---|
| custom-1001 | RHEL 9.7 / x86_64 | ran 3 tests. 1 tests failed: sanity-ec. | session |
| review-dne-part-7 | RHEL 9.8 / x86_64 | ran 6 tests. 1 tests failed: sanity-ec. | session |
| review-dne-subtest-change | RHEL 9.7 / x86_64 | ran 3 tests. 1 tests failed: sanity-ec. | session |
| review-dne-zfs-part-7 | RHEL 9.8 / x86_64 | ran 6 tests. 1 tests failed: sanity-ec. | session |
| review-dne-zfs-subtest-change | RHEL 9.7 / x86_64 | ran 3 tests. 1 tests failed: sanity-ec. | session |
build #135173 SUCCESS · tests all Maloo sessions
no vote yet: Marc Vef, Andreas Dilger
patchsets:
PS1 10-15
PS2 10-15
PS3 10-26
PS4 11-02
1 ping waiting on you:
@you Keguang Xu lod_lov.c:2242 — @rsahlberg@whamcloud.com @adilger@thelustrecollective.com: is stripe_idx < nsets * p for multi-raidset parity from RR intentional? A short l
Gerrit AI review for Lustre
(defect) Can the MDS create a parity that this check then rejects?
With more than one raid set, lod_stripe_count_min() returns 0 for a parity, and lod_ost_alloc_rr() then reports success on a short allocation:
lod_ost_alloc_rr()
if (stripe_idx) rc = 0;
lod_ec_add_parities() /* may still be short, e.g. failure domains */
/* Still short; remember how many we got */
lod_comp->llc_stripe_count = stripe_idx;
stripe_idx < stripe_count_min (0) -> no -ENOSPC
lod_comp_prep_create() does not check the count afterwards, so the layout is stored with fewer than (n0 + n1) * p stripes. If the shortfall is a whole raid set, the count is still a multiple of p and passes lod_ec_parity_valid(). Before this patch such a layout went through open replay (LOV_MAGIC_DEFINED -> lod_qos_parse_config() -> lod_verify_striping()). Now the replay gets -EINVAL here, as do HSM release and xattr copies of the file.
Should RR fail a short EC parity the way lod_ost_alloc_qos() does ("we require the full stripe_count to avoid incomplete raid sets")? Otherwise this check is stricter than what the allocator guarantees.
Keguang Xu
Thanks for catching this. Full parity geometry is nsets * p (nsets = ec_raidset_count from the data stripe count and k). RR can finish with stripe_idx < nsets * p when nsets > 1: lod_stripe_count_min() is 0, so a short lod_ec_add_parities() still returns success and sets llc_stripe_count = stripe_idx. QoS instead requires stripe_idx == nsets * p. @rsahlberg@whamcloud.com @adilger@thelustrecollective.com: is stripe_idx < nsets * p for multi-raidset parity from RR intentional? A short layout (e.g. (nsets-1)*p) can break degraded read / EC recovery, leave some raid sets with no parity to rebuild from, and confuse resync/verify and mirror tools. QoS already refuses this. I think RR should match QoS (fail short EC parity) and the verifier should require count == nsets * p again — happy to follow up if you agree.
threads: 4 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Keguang Xu lod_lov.c:2242 — Thanks for catching this.
Gerrit AI review for Lustre
(defect) Can the MDS create a parity that this check then rejects?
With more than one raid set, lod_stripe_count_min() returns 0 for a parity, and lod_ost_alloc_rr() then reports success on a short allocation:
lod_ost_alloc_rr()
if (stripe_idx) rc = 0;
lod_ec_add_parities() /* may still be short, e.g. failure domains */
/* Still short; remember how many we got */
lod_comp->llc_stripe_count = stripe_idx;
stripe_idx < stripe_count_min (0) -> no -ENOSPC
lod_comp_prep_create() does not check the count afterwards, so the layout is stored with fewer than (n0 + n1) * p stripes. If the shortfall is a whole raid set, the count is still a multiple of p and passes lod_ec_parity_valid(). Before this patch such a layout went through open replay (LOV_MAGIC_DEFINED -> lod_qos_parse_config() -> lod_verify_striping()). Now the replay gets -EINVAL here, as do HSM release and xattr copies of the file.
Should RR fail a short EC parity the way lod_ost_alloc_qos() does ("we require the full stripe_count to avoid incomplete raid sets")? Otherwise this check is stricter than what the allocator guarantees.
Keguang Xu
Thanks for catching this. Full parity geometry is nsets * p (nsets = ec_raidset_count from the data stripe count and k). RR can finish with stripe_idx < nsets * p when nsets > 1: lod_stripe_count_min() is 0, so a short lod_ec_add_parities() still returns success and sets llc_stripe_count = stripe_idx. QoS instead requires stripe_idx == nsets * p. @rsahlberg@whamcloud.com @adilger@thelustrecollective.com: is stripe_idx < nsets * p for multi-raidset parity from RR intentional? A short layout (e.g. (nsets-1)*p) can break degraded read / EC recovery, leave some raid sets with no parity to rebuild from, and confuse resync/verify and mirror tools. QoS already refuses this. I think RR should match QoS (fail short EC parity) and the verifier should require count == nsets * p again — happy to follow up if you agree.
reply Gerrit AI review for Lustre lod_qos.c:1278 — (defect) Can the MDS still create an instantiated parity whose data component is not instantiated? If so, this check rejects a layout the MD
Gerrit AI review for Lustre
(defect) Can the MDS still create an instantiated parity whose data component is not instantiated? If so, this check rejects a layout the MDS wrote itself.
A mirror-targeted resync instantiates every component of the named mirror, whatever its extent:
lfs mirror copy -i <data> -o -1 f (or -o <parity>)
-> ll_file_resync() lil_mirror_id = parity mirror
-> lod_declare_update_rdonly() -> lod_prepare_resync_mirror()
-> lod_declare_instantiate_components() /* only needs lod_comp_find_linked() != NULL */
-> lod_comp_prep_create() /* sizes parity from data->llc_stripe_count */
lfs_mirror_copy() does not refuse a parity target, and lod_ec_check_data_usable() and lod_ec_add_parities() return early when data has no stripes allocated. With `-E 128M --ec 2+1 -E -1 -c 4 --ec 4+2` and less than 128M written, the parity of [128M, EOF) is stored INIT while its data component is not.
Before this patch that layout parsed fine, and lov_ea.c still skips such a pair (`!lsme_inited(data_entry)`). Now, once the object is reloaded (cache eviction or MDT restart), lod_parse_striping() returns -EINVAL. lod_declare_destroy() returns that error, so the file can no longer be unlinked, and resync and mirror split fail too.
Should an uninstantiated data peer be skipped here, the way the client does it? The other option is to refuse, in lod_declare_instantiate_components(), a parity whose data component is not instantiated and is not being instantiated in the same call.
reply Gerrit AI review for Lustre lod_qos.c:3960 — (minor) This comment doesn't seem to match lod_verify_ec_parity_comps(). That function skips parity components that are not instantiated (`!
Gerrit AI review for Lustre
(minor) This comment doesn't seem to match lod_verify_ec_parity_comps(). That function skips parity components that are not instantiated (`!lod_comp_inited(comp)` -> continue) and never looks at data components. lod_comp_prep_create() only runs on components that are being instantiated, so a layout from disk with a zero lcme_dstripe_count/lcme_cstripe_count still reaches this point unchecked. This test is still the only thing that keeps the `% 0` out of ec_split_stripes(). The old wording ("a layout loaded from disk does not pass through it again") was accurate. If the patch is refreshed, consider restoring it so the check below doesn't look redundant to the next reader.
reply Gerrit AI review for Lustre liblustreapi_layout.c:2833 — (minor) Now that layout_ec_verify() only rejects a zero or out-of-range data_stripe_count, Documentation/man3/llapi_layout_comp_add_parity_o
Gerrit AI review for Lustre
(minor) Now that layout_ec_verify() only rejects a zero or out-of-range data_stripe_count, Documentation/man3/llapi_layout_comp_add_parity_only.3 is out of date. It still says data_stripe_count is used for "bounding K+P", and lists EINVAL when the counts "did not fit data_stripe_count". If the patch is refreshed, consider updating both sentences to the new rule, where P may exceed the data stripe count.
tags: pt_ecro raid10-like 218_review_priority pw_shepherd
owner Keguang Xu · uploader Keguang Xu · PS4 uploaded 2d ago · NEW · open in Gerrit ↗
commit message
LU-20690 ec: verify parity against data, allow p > k With the RAID10-like parity layout the p parities of a raidset share one offset, so the parity of a component fits in its extent whatever p is. Remove the p <= k checks in lfs and llapi; k+p <= 256 and p <= 15 remain. Also drop the mirror-extend stripe_count < p guard in ec_check_data_comp() so --ec 2+3 works on a two-stripe target. An instantiated parity is checked against its data component in lod_verify_ec_parity_comps() after lod_use_defined_striping() / lod_parse_striping(), using lod_comp_find_linked() for the same pairing rule as the allocator (covers layout-change replay). Require a bidirectional link, matching k/p and stripe size, and parity stripe count ec_raidset_count() * p. lod_verify_striping() checks k/p and rejects an instantiated parity with stripe_count == 0 before DEFINED object init. Tests: sanity-ec 4a and 10 accept p > k, and 4b rejects k == 0 and k > 255. 8m covers mirror extend --ec 2+3 on a two-stripe target. 300 covers PFL -E 2M --ec 2+3 create/resync/verify, and 305 covers p > k multi-raidset create/resync/verify. llapi_layout_test test47 allows 3+4. Test-Parameters: testlist=sanity-ec ostcount=8 Signed-off-by: Keguang Xu <kxu@ddn.com> Assisted-by: Cursor:Composer llm_code_and_review_tools Change-Id: I3878502e8ff739cb5ed420ff359e2008376303e7
67651
master
J –B ✓T ✓R -2/2−
LU-20541 lfs: Implement migrate_stripe command and add test
mine needs rebase — checkpatch: cannot be cherry-picked
needs rebase
ec2
pt_ecro
11 unresolved
XL +2004 −1
2d
LU-20541 lfs: Implement migrate_stripe command and add test
mine needs rebase — checkpatch: cannot be cherry-picked
needs rebase
ec2
pt_ecro
11 unresolved
XL +2004 −1
2d
needs rebase — checkpatch: cannot be cherry-picked
Andreas Dilger voted -1
11 unresolved thread(s) await your reply — last from Gerrit AI review for Lustre
no vote yet from Marc Vef, Zhenyu Xu
build #134057 SUCCESS · tests all Maloo sessions
reviews:
Andreas Dilger -1
no vote yet: Marc Vef, Zhenyu Xu
patchsets:
PS16 09-03
PS17 09-04
PS18 10-12
PS19 10-13
PS20 10-20
+15 earlier
PS1 07-31 PS2 07-31 PS3 07-31 PS4 08-01 PS5 08-03 PS6 08-03 PS7 08-04 PS8 08-05 PS9 08-05 PS10 08-06 PS11 08-26 PS12 08-26 PS13 08-27 PS14 08-27 PS15 08-31threads: 11 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Gerrit AI review for Lustre lfs-migrate_stripe.1:71 — (minor) lfs_migrate_stripe() also accepts `--src-ost-index` and `--dst-ost-index`, but the man page, the SYNOPSIS and the help text don't li
Gerrit AI review for Lustre
(minor) lfs_migrate_stripe() also accepts `--src-ost-index` and `--dst-ost-index`, but the man page, the SYNOPSIS and the help text don't list them. If the patch is refreshed, could they either be documented or dropped?
reply Andreas Dilger lfs-migrate_stripe.1:9 — The -i and -o options are generally used interchangeably for regular lfs migrate, lfs find, lfs setstripe, so it _might_ be confusing here.
Andreas Dilger
The -i and -o options are generally used interchangeably for regular lfs migrate, lfs find, lfs setstripe, so it _might_ be confusing here. However, I do see the benefit that they could be named `--input` and `--output` to make their distinction more clear. I think requiring users to select the output OST index will not result in good choices, as that would be different for each raidset, each file, and a good choice will depend on the failure domain of every other stripe in the raidset.
reply Andreas Dilger lfs-migrate_stripe.1:12 — This is "--block" (or "--non-block") for regular lfs migrate.
Andreas Dilger
This is "--block" (or "--non-block") for regular lfs migrate.
reply Andreas Dilger lfs-migrate_stripe.1:54 — im not sure what this means?
Andreas Dilger
im not sure what this means?
reply Andreas Dilger lfs-migrate_stripe.1:78 — In addition to the complexity of specifying the correct target OST for every file, another complexity here is that it is unlikely that a tar
Andreas Dilger
In addition to the complexity of specifying the correct target OST for every file, another complexity here is that it is unlikely that a target OST has enough space to hold the full capacity of an OST being evacuated, unless it is a brand-new replacement. Otherwise, the single target OST will be full or severely imbalanced compared to the other OSTs. Also, there would only be the write bandwidth of the single target rather than using the distributed write bandwidth and capacity of many OSTs (at least the peers in a target failure domain, or many failure domains if there are many OSTs in the filesystem (which is often true).
reply Andreas Dilger sanity-pfl.sh:26 — (style) the preference for files that are changed is to use the "new" `always_except` helper to manage the list, so that the LU ticket numbe
Andreas Dilger
(style) the preference for files that are changed is to use the "new" `always_except` helper to manage the list, so that the LU ticket numbers are better associated with the excepted subtest, and there is no error in manipulating the string, like there was in this case. (defect) excepted tests need to be associated with an LU ticket that describes the specific issue to be fixed, so that the next person working on this code (maybe you in a year) does not need to reverse engineer the reason for it.
reply Andreas Dilger lfs.c:1667 — I don't think all of this code belongs in lfs.c. I _think_ there is code in llapi to calculate the object offsets, though we've tried to avo
Andreas Dilger
I don't think all of this code belongs in lfs.c. I _think_ there is code in llapi to calculate the object offsets, though we've tried to avoid externalizing that due to the burden of keeping it in sync for complex layouts. If not, then this should live in a separate file to avoid adding complexity here (which is aspirationally a "user" of llapi and not a net provider of new/critical functionality, though it is imperfectly so).
reply Gerrit AI review for Lustre lfs.c:1773 — (minor) Does this still match the MDS side? With the parent change, mdd_layout_swap_allowed() lets a CAP_FOWNER caller through a uid/gid mis
Gerrit AI review for Lustre
(minor) Does this still match the MDS side? With the parent change, mdd_layout_swap_allowed() lets a CAP_FOWNER caller through a uid/gid mismatch when SWAP_LAYOUTS_SINGLE_STRIPE is set:
if (!(flags & SWAP_LAYOUTS_SINGLE_STRIPE))
RETURN(-EPERM);
uc = lu_ucred_check(env);
if (uc == NULL || !cap_raised(uc->uc_cap, CAP_FOWNER))
RETURN(-EPERM);
llapi_fswap_layout_fids() always sets that flag, so root would not get -EPERM here even without the fchown(). The fchown() is still reasonable (the volatile is charged to the right owner while it exists), but the stated reason doesn't hold. If the patch is refreshed, the same wording in lfs-migrate_stripe.1 (NOTES, "so mdd_swap_layouts accepts the exchange") and in the comment above sanity-pfl test_36 ("needs fchown on volatile") could be updated to match.
reply Gerrit AI review for Lustre lfs.c:1920 — (style) This isn't a bug, but this kernel-doc block describes migrate_stripe_copy_data(), while it sits directly above migrate_stripe_copy_r
Gerrit AI review for Lustre
(style) This isn't a bug, but this kernel-doc block describes migrate_stripe_copy_data(), while it sits directly above migrate_stripe_copy_region(), which has its own comment block right after it. The same thing happens further down: the "Resolve OST object FID for stripe @stripe_index ..." block sits above struct migrate_stripe_info and is followed by a second description of migrate_stripe_get_ost_fid(). If the patch is refreshed, could each block be moved to (or merged into) the function it describes?
reply Gerrit AI review for Lustre lfs.c:2288 — (minor) Can LOV_USER_MAGIC_SPECIFIC actually come back from the lustre.lov xattr of a regular file? lod only emits LOV_MAGIC_SPECIFIC for di
Gerrit AI review for Lustre
(minor) Can LOV_USER_MAGIC_SPECIFIC actually come back from the lustre.lov xattr of a regular file? lod only emits LOV_MAGIC_SPECIFIC for directory default layouts (lod_lov.c: `if (is_dir && lod_comp->llc_ostlist.op_count) magic = LOV_MAGIC_SPECIFIC;`), and lov_lsm_pack() writes V1/V3 for file components. If it were ever reached, it would also be parsed wrongly: SPECIFIC uses the lov_user_md_v3 shape (with lmm_pool_name), but the code takes `v1->lmm_objects` for it. The same applies to the plain-layout branch below. If the patch is refreshed, consider dropping SPECIFIC from both checks.
reply Gerrit AI review for Lustre lfs.c:2933 — (suggestion) If the MDS does not negotiate OBD_CONNECT2_ONE_OBJ_SWAP, the -EOPNOTSUPP only appears at the end, in ll_swap_layouts(). By then
Gerrit AI review for Lustre
(suggestion) If the MDS does not negotiate OBD_CONNECT2_ONE_OBJ_SWAP, the -EOPNOTSUPP only appears at the end, in ll_swap_layouts(). By then the volatile has been created on the target OST and the whole stripe has been copied. This loop then repeats that full copy for every remaining FILE operand. For the many-file OST drain that the man page describes, could the loop stop after the first -EOPNOTSUPP, or could support be checked once before any copying starts?
tags: pt_ecro
owner Ronnie Sahlberg · uploader Ronnie Sahlberg · PS20 uploaded 15d ago · NEW · open in Gerrit ↗
commit message
LU-20541 lfs: Implement migrate_stripe command and add test Add lfs migrate_stripe to move OST objects of a file onto another OST using a single-stripe volatile partner and llapi_fswap_layout_fids(). Accepts multiple FILE operands, migrating each one in turn with the same options, to make draining many files off an OST convenient. -i selects a source OST index rather than a stripe index: with multiple FILE operands the stripe holding data for a given source OST differs from file to file, so identifying it by index would not make sense. Instead every stripe currently on the source OST is migrated to the target OST, including repeats of the same OST within one component or across components, unless -I restricts the scan to a single component. Copy follows absolute LOV stripe numbering and object offsets, keeps holes sparse, and ftruncates the volatile so trailing holes still carry file size without SOM. Match source uid/gid on the volatile for mdd_swap_layouts(). Default path is optimistic (DV check at swap); --lock-copy holds a group lock across copy and swap. Clamp the copy end from st_size after reading dv_src (under the group lock for --lock-copy) so a concurrent append cannot leave the new stripe short while CHECK_DV1 still matches. llapi_layout_comp_flags_get() always reports LCME_FL_INIT clear for a plain (non-composite) layout, so skip that check unless the layout is actually composite; otherwise every stripe of a plain-layout file would be silently skipped as "uninstantiated". Document in lfs-migrate_stripe.1. sanity-pfl 30-39 cover content, holes, PFL offsets, size, absolute striping, root on user files, past-EOF components, an OST reused multiple times in a component, and migrating multiple FILE operands in one invocation. Test 39 covers migrate_stripe on a plain (non-PFL) layout. Test 32 is skipped on ZFS as we do not yet have FIEMAP support. LU-1941 Test-Parameters: trivial Signed-off-by: Ronnie Sahlberg <rsahlberg@whamcloud.com> Change-Id: I48be7e597544c6856fdcf8edbd181b9f8d3db263
▶Longstanding (signal older than a week)
(9)
69917
master
J –B ✗T –R 0/2
LU-xxxxx lod: add kunit test for lod_comp_prep_create
mine build failure (#134244)
CI@PS1
XL +1965 −18
12d
LU-xxxxx lod: add kunit test for lod_comp_prep_create
mine build failure (#134244)
CI@PS1
XL +1965 −18
12d
build #134244 FAILURE
patchsets:
PS1 10-22
PS2 10-22
build/test results are from PS1 — PS2…PS2 changed only the commit message (votes copied, CI not re-run)
owner Ronnie Sahlberg · uploader Ronnie Sahlberg · PS2 uploaded 12d ago · NEW · open in Gerrit ↗
commit message
LU-xxxxx lod: add kunit test for lod_comp_prep_create Export lod_ost_alloc_rr(), lod_ost_alloc_qos(), lod_comp_prep_create(), lod_lu_ops and lod_thread_key so a kunit test module can drive component allocation directly, without a mounted filesystem or live OSD/OSP under each OST. Add KUNIT_STATIC_STUB_REDIRECT() on the two allocators and on lod_qos_declare_object_on() so tests can force a given allocator or replace object declaration with a fake dt_object. Add lustre/kunit/lod_comp_test.c, exercising lod_comp_prep_create() for RR and QoS, forcing one allocator via stub while the other returns -EAGAIN. Cover: - FLR cross-mirror OST avoidance, including overstriped mirrors, mirrors with different PFL boundaries, more mirrors than there are OSTs to keep apart, and failure domains spanning OSSs. - EC data/parity pairing and raid-set aware allocation, with and without overstriping, including layouts that must reuse parity or data OSTs. Mirrors the allocation cases from sanity-ec 2b, 2c, 11, 13, 27a, 35a, 35b and 75c. - Mixed PFL layouts combining plain and EC components. - OSTs that are down, full, read-only, not creating, degraded, or without precreated objects, including QoS falling back to RR, and EC -C layouts that exhaust the unique OSTs under the same conditions. - RR spreading stripes evenly across OSTs on several OSSs, and RR preferring OSSs not already used by other mirrors. Known issues: with too few failure domains, lod fails EC and FLR creates, or gives a mirror fewer stripes than requested. These are added as skipped known-issue cases until the desired behavior is decided. Run from sanity test_51k, loading kunit on the MDS with enable=1 and checking the KTAP output. Test-Parameters: ignore Signed-off-by: Ronnie Sahlberg <rsahlberg@whamcloud.com> Assisted-by: ClaudeCode:claude-opus-5.5 Change-Id: I038664652cc29eccf512cc7ffe1fdb271c4dabb4
69509
master
J –B ✓T ✓R 0/2
LU-20900 doc: add osc.active and osp.active man pages
mine 1 unresolved thread(s) await your reply — last from Gerrit AI review for Lustre
2 unresolved
M +225 −0
22d
LU-20900 doc: add osc.active and osp.active man pages
mine 1 unresolved thread(s) await your reply — last from Gerrit AI review for Lustre
2 unresolved
M +225 −0
22d
1 unresolved thread(s) await your reply — last from Gerrit AI review for Lustre
CI green — no vote yet from Andreas Dilger, Alex Zhuravlev
1 thread(s) waiting on others
build #133478 SUCCESS
no vote yet: Andreas Dilger, Alex Zhuravlev
patchsets:
PS1 10-08
PS2 10-08
PS3 10-12
threads: 1 need your reply · 1 waiting on others · 0 own notes · 0 bot
reply Gerrit AI review for Lustre osp.active.4:20 — (minor) This says the parameter also covers OSP imports to remote MDTs, but NAME, SYNOPSIS, Default, Valid Range and MODULES only show the O
Gerrit AI review for Lustre
(minor) This says the parameter also covers OSP imports to remote MDTs, but NAME, SYNOPSIS, Default, Valid Range and MODULES only show the OST form `osp.FSNAME-OST*-osc-MDT*.active`. MDT-to-MDT OSPs are named `FSNAME-MDTxxxx-osp-MDTyyyy` (see mgs_llog.c), so that glob never matches them. The effects described below (precreate, LOD object allocation, sync llog destroys) also don't apply to an MDT OSP, since osp_import_event() returns early when `opd_connect_mdt` is set. If the patch is refreshed, could the page either add the `osp.FSNAME-MDT*-osp-MDT*.active` form and say what deactivating it does, or drop the remote-MDT mention here and at line 40?
owner Ronnie Sahlberg · uploader Ronnie Sahlberg · PS3 uploaded 22d ago · NEW · open in Gerrit ↗
commit message
LU-20900 doc: add osc.active and osp.active man pages Document the osc.*.active and osp.*.active tunables. Signed-off-by: Ronnie Sahlberg <rsahlberg@whamcloud.com> Change-Id: I5a3fe46789a44ab14b5e416b17870a7a2ed8f4a6
62859
master
J ✓B ✓T ✗12R -1/2−
LU-12668 ec: Add tests for computing the parity coverage
mine needs rebase — checkpatch: cannot be cherry-picked
needs rebase
ec2
pt_ecro
L +460 −0
46d
LU-12668 ec: Add tests for computing the parity coverage
mine needs rebase — checkpatch: cannot be cherry-picked
needs rebase
ec2
pt_ecro
L +460 −0
46d
needs rebase — checkpatch: cannot be cherry-picked
enforced failed: custom-1001, custom-1002, review-dne-subtest-change, review-dne-zfs-subtest-change, review-ldiskfs-dne-arm
| failed enforced test | platform | detail | |
|---|---|---|---|
| custom-1001 | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity-ec. | session |
| custom-1002 | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity-ec. | session |
| review-dne-subtest-change | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity-ec. | session |
| review-dne-subtest-change | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity-ec. | session |
| review-dne-zfs-subtest-change | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity-ec. | session |
| review-dne-zfs-subtest-change | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity-ec. | session |
| review-dne-zfs-subtest-change | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity-ec. | session |
| review-dne-zfs-subtest-change | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity-ec. | session |
| review-dne-zfs-subtest-change | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity-ec. | session |
| review-dne-zfs-subtest-change | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity-ec. | session |
| review-dne-zfs-subtest-change | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity-ec. | session |
| review-ldiskfs-dne-arm | RHEL 8.10 / x86_64, Rocky 9.5 / aarch64 | ran 5 tests. 1 tests failed: sanity. | session |
build #127014 SUCCESS · tests all Maloo sessions
no vote yet: Keguang Xu, Qian Yingjin, Marc Vef, Maximilian Dilger
patchsets:
PS43 05-06
PS44 05-14 Marc Vef
PS45 05-20 Marc Vef
PS46 06-22 Marc Vef
PS47 06-26 Marc Vef
+42 earlier
PS1 12-03 PS2 12-03 PS3 12-03 PS4 12-03 PS5 12-03 Patrick Farrell PS6 12-03 Patrick Farrell PS7 12-03 Patrick Farrell PS8 12-04 Patrick Farrell PS9 12-04 PS10 12-04 Patrick Farrell PS11 12-04 Patrick Farrell PS12 12-05 PS13 12-05 PS14 12-05 PS15 12-05 PS16 12-06 PS17 12-09 PS18 12-09 Patrick Farrell PS19 12-09 Patrick Farrell PS20 12-10 PS21 12-10 Patrick Farrell PS22 12-10 PS23 12-10 PS24 12-11 PS25 12-12 Patrick Farrell PS26 12-15 PS27 12-15 PS28 12-16 Patrick Farrell PS29 01-13 Patrick Farrell PS30 01-13 Patrick Farrell PS31 01-14 Patrick Farrell PS32 01-15 Patrick Farrell PS33 01-16 Patrick Farrell PS34 01-29 Patrick Farrell PS35 03-29 Patrick Farrell PS36 03-29 Patrick Farrell PS37 03-31 Patrick Farrell PS38 04-08 Patrick Farrell PS39 04-09 Patrick Farrell PS40 04-10 Patrick Farrell PS41 04-21 Zhenyu Xu PS42 05-05 Patrick Farrelltags: pt_ecro
owner Ronnie Sahlberg · uploader Marc Vef · PS47 uploaded 130d ago · NEW · open in Gerrit ↗
commit message
LU-12668 ec: Add tests for computing the parity coverage When we write or verify the parities we no longer use the whole stripe, instead we compute the coverage of what ranges of parity is important and what can be ignored. This is based on SEEK_DATA/SEEK_HOLE and EOF. Add tests that we compute these ranges correctly. Test-Parameters: trivial Test-Parameters: testlist=sanity-ec Test-Parameters: testlist=sanity-ec fstype=zfs Signed-off-by: Ronnie Sahlberg <rsahlberg@whamcloud.com> Change-Id: Iaee9d0ccb0875f6d515a8adc322fa3cd37bfe0f6
56435
master
J !B ✗T –R -2/2−
LU-18231 odb: add a TODO to remove the spinlock for odb_flags
mine build failure (#108057)
XS +3 −1
61d
LU-18231 odb: add a TODO to remove the spinlock for odb_flags
mine build failure (#108057)
XS +3 −1
61d
build failure (#108057)
James Simmons voted -1
Timothy Day voted -1
janitor run: 1 failing config(s), none unique to this patch — janitor results
build #108057 FAILURE
reviews:
James Simmons -1 · Timothy Day -1
patchsets:
PS1 09-20
PS2 09-20
PS3 09-20
PS4 10-01
owner Ronnie Sahlberg · uploader Ronnie Sahlberg · PS4 uploaded 763d ago · NEW · open in Gerrit ↗
commit message
LU-18231 odb: add a TODO to remove the spinlock for odb_flags Now that all modifications of the odb_flag bits are done using atomic set/clear/test functions we may not need the protection of the spinlock in every situation. That is out of scope for this patch series but is something that we can consider in the future. Add a TODO that we can remove some of the uses of this spinlock in a future series. Test-Parameters: trivial Signed-off-by: Ronnie Sahlberg <rsahlberg@whamcloud.com> Change-Id: I30d880b46247374092d9c592554651c35ecda93d
66111
master
J ✗45B ✓T ✗0R 0/2
DRAFT LU-20244 utils: add support to resync a region
mine janitor: 45 test failures unique to this patch — sanity-ec@ldiskfs+DNE:test_1a, sanity-ec@ldiskfs+DNE:test_1b, sanity-ec@ldiskfs+DNE:test_1c +42 more
45 unique failures
ec2
pt_ecro
M +84 −36
77d
DRAFT LU-20244 utils: add support to resync a region
mine janitor: 45 test failures unique to this patch — sanity-ec@ldiskfs+DNE:test_1a, sanity-ec@ldiskfs+DNE:test_1b, sanity-ec@ldiskfs+DNE:test_1c +42 more
45 unique failures
ec2
pt_ecro
M +84 −36
77d
janitor: 45 test failures unique to this patch — sanity-ec@ldiskfs+DNE:test_1a, sanity-ec@ldiskfs+DNE:test_1b, sanity-ec@ldiskfs+DNE:test_1c +42 more
Maloo voted -1 — tests failed (details on the change)
janitor flagged test failures unique to this patch — full janitor results
| unique failing test | history |
|---|---|
| sanity-ec@ldiskfs+DNE:test_1a | seen in 21 other reviews |
| sanity-ec@ldiskfs+DNE:test_1b | seen in 23 other reviews |
| sanity-ec@ldiskfs+DNE:test_1c | seen in 23 other reviews |
| sanity-ec@ldiskfs+DNE:test_1d | seen in 23 other reviews |
| sanity-ec@ldiskfs+DNE:test_1g | seen in 23 other reviews |
| sanity-ec@ldiskfs+DNE:test_4e | seen in 23 other reviews |
| sanity-ec@ldiskfs+DNE:test_5a | seen in 23 other reviews |
| sanity-ec@ldiskfs+DNE:test_5b | seen in 22 other reviews |
| sanity-ec@ldiskfs+DNE:test_6a | seen in 23 other reviews |
| sanity-ec@ldiskfs+DNE:test_6b | seen in 23 other reviews |
| sanity-ec@ldiskfs+DNE:test_6d | seen in 23 other reviews |
| sanity-ec@ldiskfs+DNE:test_6e | seen in 23 other reviews |
| sanity-ec@ldiskfs+DNE:test_7 | seen in 23 other reviews |
| sanity-ec@ldiskfs+DNE:test_23a | seen in 22 other reviews |
| sanity-ec@ldiskfs+DNE:test_23b | seen in 22 other reviews |
| sanity-ec@ldiskfs+DNE:test_23c | seen in 22 other reviews |
| sanity-ec@ldiskfs+DNE:test_24a | seen in 22 other reviews |
| sanity-ec@ldiskfs+DNE:test_24b | seen in 22 other reviews |
| sanity-ec@ldiskfs+DNE:test_25a | seen in 22 other reviews |
| sanity-ec@ldiskfs+DNE:test_26a | seen in 22 other reviews |
| sanity-ec@ldiskfs+DNE:test_26b | seen in 22 other reviews |
| sanity-ec@ldiskfs+DNE:test_27a | seen in 23 other reviews |
| sanity-ec@ldiskfs+DNE:test_28a | seen in 22 other reviews |
| sanity-ec@zfs:test_1a | seen in 21 other reviews |
| sanity-ec@zfs:test_1b | seen in 23 other reviews |
| sanity-ec@zfs:test_1c | seen in 23 other reviews |
| sanity-ec@zfs:test_1d | seen in 23 other reviews |
| sanity-ec@zfs:test_1g | seen in 23 other reviews |
| sanity-ec@zfs:test_4e | seen in 23 other reviews |
| sanity-ec@zfs:test_5a | seen in 23 other reviews |
| sanity-ec@zfs:test_5b | seen in 22 other reviews |
| sanity-ec@zfs:test_6a | seen in 23 other reviews |
| sanity-ec@zfs:test_6b | seen in 23 other reviews |
| sanity-ec@zfs:test_6d | seen in 23 other reviews |
| sanity-ec@zfs:test_6e | seen in 23 other reviews |
| sanity-ec@zfs:test_7 | seen in 23 other reviews |
| sanity-ec@zfs:test_23a | seen in 22 other reviews |
| sanity-ec@zfs:test_23b | seen in 22 other reviews |
| sanity-ec@zfs:test_24a | seen in 22 other reviews |
| sanity-ec@zfs:test_24b | seen in 22 other reviews |
| sanity-ec@zfs:test_25a | seen in 22 other reviews |
| sanity-ec@zfs:test_26a | seen in 22 other reviews |
| sanity-ec@zfs:test_26b | seen in 22 other reviews |
| sanity-ec@zfs:test_27a | seen in 22 other reviews |
| sanity-ec@zfs:test_28a | seen in 22 other reviews |
no vote yet: Marc Vef, Andreas Dilger, Zhenyu Xu
patchsets:
PS1 05-25
PS2 05-25
PS3 05-25
PS4 08-18
tags: pt_ecro
owner Ronnie Sahlberg · uploader Ronnie Sahlberg · PS4 uploaded 77d ago · NEW · open in Gerrit ↗
commit message
DRAFT LU-20244 utils: add support to resync a region Add support to resync EC for a region of a file instead of the entire file. Test-Parameters: testlist=sanity-ec Signed-off-by: Ronnie Sahlberg <rsahlberg@whamcloud.com> Change-Id: I49a0ab53e7948c40086b532a0e6f9298d1bc8e1e
66112
master
J ✗45B ✓T ✗0R 0/2
DRAFT LU-20244 utils: resync/verify stale mirrors in 1GB chunks.
mine janitor: 45 test failures unique to this patch — sanity-ec@ldiskfs+DNE:test_1a, sanity-ec@ldiskfs+DNE:test_1b, sanity-ec@ldiskfs+DNE:test_1c +42 more
45 unique failures
ec2
pt_ecro
3 unresolved
S +30 −4
77d
DRAFT LU-20244 utils: resync/verify stale mirrors in 1GB chunks.
mine janitor: 45 test failures unique to this patch — sanity-ec@ldiskfs+DNE:test_1a, sanity-ec@ldiskfs+DNE:test_1b, sanity-ec@ldiskfs+DNE:test_1c +42 more
45 unique failures
ec2
pt_ecro
3 unresolved
S +30 −4
77d
janitor: 45 test failures unique to this patch — sanity-ec@ldiskfs+DNE:test_1a, sanity-ec@ldiskfs+DNE:test_1b, sanity-ec@ldiskfs+DNE:test_1c +42 more
Maloo voted -1 — tests failed (details on the change)
3 unresolved thread(s) await your reply — last from Andreas Dilger
janitor flagged test failures unique to this patch — full janitor results
| unique failing test | history |
|---|---|
| sanity-ec@ldiskfs+DNE:test_1a | seen in 21 other reviews |
| sanity-ec@ldiskfs+DNE:test_1b | seen in 23 other reviews |
| sanity-ec@ldiskfs+DNE:test_1c | seen in 23 other reviews |
| sanity-ec@ldiskfs+DNE:test_1d | seen in 23 other reviews |
| sanity-ec@ldiskfs+DNE:test_1g | seen in 23 other reviews |
| sanity-ec@ldiskfs+DNE:test_4e | seen in 23 other reviews |
| sanity-ec@ldiskfs+DNE:test_5a | seen in 23 other reviews |
| sanity-ec@ldiskfs+DNE:test_5b | seen in 22 other reviews |
| sanity-ec@ldiskfs+DNE:test_6a | seen in 23 other reviews |
| sanity-ec@ldiskfs+DNE:test_6b | seen in 23 other reviews |
| sanity-ec@ldiskfs+DNE:test_6d | seen in 23 other reviews |
| sanity-ec@ldiskfs+DNE:test_6e | seen in 23 other reviews |
| sanity-ec@ldiskfs+DNE:test_7 | seen in 23 other reviews |
| sanity-ec@ldiskfs+DNE:test_23a | seen in 22 other reviews |
| sanity-ec@ldiskfs+DNE:test_23b | seen in 22 other reviews |
| sanity-ec@ldiskfs+DNE:test_23c | seen in 22 other reviews |
| sanity-ec@ldiskfs+DNE:test_24a | seen in 22 other reviews |
| sanity-ec@ldiskfs+DNE:test_24b | seen in 22 other reviews |
| sanity-ec@ldiskfs+DNE:test_25a | seen in 22 other reviews |
| sanity-ec@ldiskfs+DNE:test_26a | seen in 22 other reviews |
| sanity-ec@ldiskfs+DNE:test_26b | seen in 22 other reviews |
| sanity-ec@ldiskfs+DNE:test_27a | seen in 23 other reviews |
| sanity-ec@ldiskfs+DNE:test_28a | seen in 22 other reviews |
| sanity-ec@zfs:test_1a | seen in 21 other reviews |
| sanity-ec@zfs:test_1b | seen in 23 other reviews |
| sanity-ec@zfs:test_1c | seen in 23 other reviews |
| sanity-ec@zfs:test_1d | seen in 23 other reviews |
| sanity-ec@zfs:test_1g | seen in 23 other reviews |
| sanity-ec@zfs:test_4e | seen in 23 other reviews |
| sanity-ec@zfs:test_5a | seen in 23 other reviews |
| sanity-ec@zfs:test_5b | seen in 22 other reviews |
| sanity-ec@zfs:test_6a | seen in 23 other reviews |
| sanity-ec@zfs:test_6b | seen in 23 other reviews |
| sanity-ec@zfs:test_6d | seen in 23 other reviews |
| sanity-ec@zfs:test_6e | seen in 23 other reviews |
| sanity-ec@zfs:test_7 | seen in 23 other reviews |
| sanity-ec@zfs:test_23a | seen in 22 other reviews |
| sanity-ec@zfs:test_23b | seen in 22 other reviews |
| sanity-ec@zfs:test_24a | seen in 22 other reviews |
| sanity-ec@zfs:test_24b | seen in 22 other reviews |
| sanity-ec@zfs:test_25a | seen in 22 other reviews |
| sanity-ec@zfs:test_26a | seen in 22 other reviews |
| sanity-ec@zfs:test_26b | seen in 22 other reviews |
| sanity-ec@zfs:test_27a | seen in 22 other reviews |
| sanity-ec@zfs:test_28a | seen in 22 other reviews |
no vote yet: Marc Vef, Andreas Dilger, Zhenyu Xu
patchsets:
PS1 05-25
PS2 05-25
PS3 05-25
PS4 08-18
threads: 3 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Andreas Dilger COMMIT_MSG:14 — I don't see this patch doing these things, mainly changing the buffer size?
Andreas Dilger
I don't see this patch doing these things, mainly changing the buffer size?
reply Andreas Dilger lfs.c:14655 — How was this 1GiB buffer size selected?
Andreas Dilger
How was this 1GiB buffer size selected?
reply Andreas Dilger lfs.c:14663 — The file was stat'dback on line 14591, so that could be used here instead of a new stat() call? If there is a reason the stat() info has go
Andreas Dilger
The file was stat'dback on line 14591, so that could be used here instead of a new stat() call? If there is a reason the stat() info has gone stale since the start of this function, then that is probably a sign the file shouldn't be resync'd at this time.
tags: pt_ecro
owner Ronnie Sahlberg · uploader Ronnie Sahlberg · PS4 uploaded 77d ago · NEW · open in Gerrit ↗
commit message
DRAFT LU-20244 utils: resync/verify stale mirrors in 1GB chunks. Instead of resyncing each stale mirror, one after the other, resync/verify the mirrors one chunk (1GB region) of the file at a time. This is so that if we are resyncing/verifying multiple stale mirrors at a time, that we read data from the up-to-date mirror once, for generating/writing to the first stale mirror and then re-read the original data from page-cache when generating/writing to the other stale mirrors. Otherwise if we resync/verify the whole mirrors one at a time, we risk for very large files that the read data from the good mirror will fall out of cache and need te be re-read for each stale submirror. Test-Parameters: testlist=sanity-ec Signed-off-by: Ronnie Sahlberg <rsahlberg@whamcloud.com> Change-Id: I279cdedf9b07c8f091747fcaa5b103852ee166c7
66110
master
J ✗45B ✓T ✗0R 0/2
DRAFT LU-20244 tests: add tests for resync of FLR + EC
mine janitor: 45 test failures unique to this patch — sanity-ec@ldiskfs+DNE:test_1a, sanity-ec@ldiskfs+DNE:test_1b, sanity-ec@ldiskfs+DNE:test_1c +42 more
45 unique failures
ec2
pt_ecro
M +148 −0
77d
DRAFT LU-20244 tests: add tests for resync of FLR + EC
mine janitor: 45 test failures unique to this patch — sanity-ec@ldiskfs+DNE:test_1a, sanity-ec@ldiskfs+DNE:test_1b, sanity-ec@ldiskfs+DNE:test_1c +42 more
45 unique failures
ec2
pt_ecro
M +148 −0
77d
janitor: 45 test failures unique to this patch — sanity-ec@ldiskfs+DNE:test_1a, sanity-ec@ldiskfs+DNE:test_1b, sanity-ec@ldiskfs+DNE:test_1c +42 more
Maloo voted -1 — tests failed (details on the change)
janitor flagged test failures unique to this patch — full janitor results
| unique failing test | history |
|---|---|
| sanity-ec@ldiskfs+DNE:test_1a | seen in 21 other reviews |
| sanity-ec@ldiskfs+DNE:test_1b | seen in 23 other reviews |
| sanity-ec@ldiskfs+DNE:test_1c | seen in 23 other reviews |
| sanity-ec@ldiskfs+DNE:test_1d | seen in 23 other reviews |
| sanity-ec@ldiskfs+DNE:test_1g | seen in 23 other reviews |
| sanity-ec@ldiskfs+DNE:test_4e | seen in 23 other reviews |
| sanity-ec@ldiskfs+DNE:test_5a | seen in 23 other reviews |
| sanity-ec@ldiskfs+DNE:test_5b | seen in 22 other reviews |
| sanity-ec@ldiskfs+DNE:test_6a | seen in 23 other reviews |
| sanity-ec@ldiskfs+DNE:test_6b | seen in 23 other reviews |
| sanity-ec@ldiskfs+DNE:test_6d | seen in 23 other reviews |
| sanity-ec@ldiskfs+DNE:test_6e | seen in 23 other reviews |
| sanity-ec@ldiskfs+DNE:test_7 | seen in 23 other reviews |
| sanity-ec@ldiskfs+DNE:test_23a | seen in 22 other reviews |
| sanity-ec@ldiskfs+DNE:test_23b | seen in 22 other reviews |
| sanity-ec@ldiskfs+DNE:test_23c | seen in 22 other reviews |
| sanity-ec@ldiskfs+DNE:test_24a | seen in 22 other reviews |
| sanity-ec@ldiskfs+DNE:test_24b | seen in 22 other reviews |
| sanity-ec@ldiskfs+DNE:test_25a | seen in 22 other reviews |
| sanity-ec@ldiskfs+DNE:test_26a | seen in 22 other reviews |
| sanity-ec@ldiskfs+DNE:test_26b | seen in 22 other reviews |
| sanity-ec@ldiskfs+DNE:test_27a | seen in 23 other reviews |
| sanity-ec@ldiskfs+DNE:test_28a | seen in 22 other reviews |
| sanity-ec@zfs:test_1a | seen in 21 other reviews |
| sanity-ec@zfs:test_1b | seen in 23 other reviews |
| sanity-ec@zfs:test_1c | seen in 23 other reviews |
| sanity-ec@zfs:test_1d | seen in 23 other reviews |
| sanity-ec@zfs:test_1g | seen in 23 other reviews |
| sanity-ec@zfs:test_4e | seen in 23 other reviews |
| sanity-ec@zfs:test_5a | seen in 23 other reviews |
| sanity-ec@zfs:test_5b | seen in 22 other reviews |
| sanity-ec@zfs:test_6a | seen in 23 other reviews |
| sanity-ec@zfs:test_6b | seen in 23 other reviews |
| sanity-ec@zfs:test_6d | seen in 23 other reviews |
| sanity-ec@zfs:test_6e | seen in 23 other reviews |
| sanity-ec@zfs:test_7 | seen in 23 other reviews |
| sanity-ec@zfs:test_23a | seen in 22 other reviews |
| sanity-ec@zfs:test_23b | seen in 22 other reviews |
| sanity-ec@zfs:test_24a | seen in 22 other reviews |
| sanity-ec@zfs:test_24b | seen in 22 other reviews |
| sanity-ec@zfs:test_25a | seen in 22 other reviews |
| sanity-ec@zfs:test_26a | seen in 22 other reviews |
| sanity-ec@zfs:test_26b | seen in 22 other reviews |
| sanity-ec@zfs:test_27a | seen in 22 other reviews |
| sanity-ec@zfs:test_28a | seen in 22 other reviews |
no vote yet: Marc Vef, Andreas Dilger, Zhenyu Xu
patchsets:
PS1 05-25
PS2 05-25
PS3 05-25
PS4 08-18
tags: pt_ecro
owner Ronnie Sahlberg · uploader Ronnie Sahlberg · PS4 uploaded 77d ago · NEW · open in Gerrit ↗
commit message
DRAFT LU-20244 tests: add tests for resync of FLR + EC We can have files that use FLR mirroring but at the same time also use EC to protect the FLR mirrors. It is probably not common to use as a persistent end user configuration as Mirrorins and EC usually are meant for different purposes : with Mirroring being prefered when performance outweights storage cost and EC is preferred when storage costs outweigh performance. But there will be situations where FLR+EC will be in use during a transitionary period, for example when migrating an EC protected file between different storage hierarchies. As such we need to have a test for this situation and that we can support and resync buth FLR and EC components at the same time. Test-Parameters: testlist=sanity-ec Signed-off-by: Ronnie Sahlberg <rsahlberg@whamcloud.com> Change-Id: Idcac78327b501d484653dec6be0882b5dbb1fa6f
67690
master
J ✗2B ✓T ✗2R 0/2
LU-20552 mdd: handle SEL and DEFINED magics in lmm oi/gen helpers
mine janitor: 2 test failures unique to this patch — sanity-hsm@ldiskfs+DNE:test_254b, sanity-sec@ldiskfs+DNE:test_72e
2 unique failures
1 unresolved
S +21 −8
89d
LU-20552 mdd: handle SEL and DEFINED magics in lmm oi/gen helpers
mine janitor: 2 test failures unique to this patch — sanity-hsm@ldiskfs+DNE:test_254b, sanity-sec@ldiskfs+DNE:test_72e
2 unique failures
1 unresolved
S +21 −8
89d
janitor: 2 test failures unique to this patch — sanity-hsm@ldiskfs+DNE:test_254b, sanity-sec@ldiskfs+DNE:test_72e
enforced failed: review-dne-zfs-part-5, review-ldiskfs-ubuntu
1 unresolved thread(s) await your reply — last from Gerrit AI review for Lustre
janitor flagged test failures unique to this patch — full janitor results
| unique failing test | history |
|---|---|
| sanity-hsm@ldiskfs+DNE:test_254b | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-sec@ldiskfs+DNE:test_72e | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-zfs-part-5 | RHEL 9.7 / x86_64 | ran 5 tests. 1 tests failed: sanityn. | session |
| review-ldiskfs-ubuntu | RHEL 8.10 / x86_64, Ubuntu 24.04 / x86_64 | ran 6 tests. 1 tests failed: sanity-lnet. | session |
3 optional test failure(s) — informational
build #128784 SUCCESS · tests all Maloo sessions
patchsets:
PS1 08-03
PS2 08-03
PS3 08-05
PS4 08-05
PS5 08-06
threads: 1 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Gerrit AI review for Lustre mdd_object.c:2522 — (defect) Can the SEL|DEFINED combination this now accepts ever reach disk?
Gerrit AI review for Lustre
(defect) Can the SEL|DEFINED combination this now accepts ever reach disk?
mdd_swap_layouts() ORs LOV_MAGIC_DEFINED onto any magic carrying the 0x0BD0 postfix, so a SEL layout applied to a layout-less file does arrive here as SEL|DEFINED and the generation is now written. The buffer then leaves mdd via mdd_declare_xattr_set(fst_o, snd_buf, XATTR_NAME_LOV, LU_XATTR_CREATE):
lod_declare_xattr_set() -> lod_declare_striped_create() ->
lod_prepare_create() -> lod_qos_parse_config()
lod_qos_parse_config() sends every DEFINED magic to lod_use_defined_striping(), which rejects SEL:
if (magic != LOV_MAGIC_V1 && magic != LOV_MAGIC_V3 &&
magic != LOV_MAGIC_COMP_V1 && magic != LOV_MAGIC_FOREIGN)
GOTO(unlock, rc = -EINVAL);
Its second magic test (the one that picks up lcm_entry_count and lcm_layout_gen) has no SEL case either, so the swap still ends in -EINVAL and the generation just written here is discarded.
Should lod_use_defined_striping() gain the SEL case alongside this, or is SEL|DEFINED meant to stay unsupported? If the latter, the commit message wording about generation updates succeeding reads a bit stronger than the code delivers.
owner Ronnie Sahlberg · uploader Ronnie Sahlberg · PS5 uploaded 89d ago · NEW · open in Gerrit ↗
commit message
LU-20552 mdd: handle SEL and DEFINED magics in lmm oi/gen helpers
mdd_lmm_oi() and mdd_lmm_gen() only recognized LOV_MAGIC_COMP_V1.
Layouts with extension components use LOV_MAGIC_SEL (same composite
blob), so mdd_set_lmm_oi() during MDT migrate (mdd_xattrs_migrate_prep)
was a silent no-op and left the old MDT FID in lmm_oi.
Also recognize SEL in mdd_lmm_gen(). Mask LOV_MAGIC_DEFINED there so
generation updates succeed when swap applies a layout onto a layout-less
file (mdd_swap_layouts ORs that bit on the incoming LOV before
mdd_set_lmm_gen(); a two-way swap of existing layouts does not).
mdd_lmm_oi() masks DEFINED only for symmetry (its callers never pass it).
Fixes: 4c7fe0c7cdae ("LU-10070 lod: SEL: interoperability support")
Fixes: 89693927f0b0 ("LU-8998 lod: accomodate to composite layout")
Signed-off-by: Ronnie Sahlberg <rsahlberg@whamcloud.com>
Change-Id: If1c0b7b2ce085b2fae86e147c61db7ad3f3ff4f3
67691
master
J !B ✓T ✗1R 0/2
LU-20553 mdd: detect DoM on SEL layouts in mdd_lmm_dom_size()
mine enforced failed: review-dne-selinux-ssk-part-2
3 unresolved
S +12 −2
89d
LU-20553 mdd: detect DoM on SEL layouts in mdd_lmm_dom_size()
mine enforced failed: review-dne-selinux-ssk-part-2
3 unresolved
S +12 −2
89d
enforced failed: review-dne-selinux-ssk-part-2
3 unresolved thread(s) await your reply — last from Gerrit AI review for Lustre
janitor run: 7 failing config(s), none unique to this patch — janitor results
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-selinux-ssk-part-2 crashed | RHEL 8.10 / x86_64 | ran 7 tests. 1 tests failed: sanity-sec. %% THIS TEST SESSION CRASHED %% | session |
8 optional test failure(s) — informational
build #128783 SUCCESS · tests all Maloo sessions
patchsets:
PS1 08-03
PS2 08-04
PS3 08-05
PS4 08-05
PS5 08-06
threads: 3 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Gerrit AI review for Lustre COMMIT_MSG:9 — Can a DoM+extension file actually reach this helper with lcm_magic == LOV_MAGIC_SEL?
Gerrit AI review for Lustre
Can a DoM+extension file actually reach this helper with lcm_magic == LOV_MAGIC_SEL?
SEL is described as LOD-internal: lod_xattr_get() converts it back before returning the EA.
if ((rc > 0) && buf->lb_buf && strcmp(name, XATTR_NAME_LOV) == 0) {
struct lov_comp_md_v1 *lcm = buf->lb_buf;
if (lcm->lcm_magic == cpu_to_le32(LOV_MAGIC_SEL))
lcm->lcm_magic = cpu_to_le32(LOV_MAGIC_COMP_V1);
}
Every buffer mdd_attr_set() and mdd_swap_layouts() hand to mdd_lmm_dom_size() comes from mdd_stripe_get()->mdo_xattr_get()->dt_xattr_get() on the LOD object, so it has already been through that conversion. That would make the LA_SIZE drop and the swap DoM guards fire correctly today, and the described symptom would not occur.
reply Gerrit AI review for Lustre COMMIT_MSG:21 — 4c7fe0c7cdae is the commit that made SEL a LOD-internal magic ("It is never gets out of LOD, converted on read/write to COMP_V1"), which is
Gerrit AI review for Lustre
4c7fe0c7cdae is the commit that made SEL a LOD-internal magic ("It is never gets out of LOD, converted on read/write to COMP_V1"), which is what keeps mdd seeing COMP_V1. If the analysis above holds, it did not introduce a bug in mdd and this tag should probably go away along with the fix.
reply Gerrit AI review for Lustre mdd_object.c:1294 — Is the LOV_MAGIC_SEL arm reachable? All three callers get their buffer from mdd_stripe_get():
Gerrit AI review for Lustre
Is the LOV_MAGIC_SEL arm reachable? All three callers get their buffer from mdd_stripe_get():
mdd_attr_set() -> mdd_stripe_get(obj, lov_buf, XATTR_NAME_LOV)
mdd_swap_layouts() -> mdd_stripe_get(fst_o/snd_o, ..., XATTR_NAME_LOV)
mdd_xattr_split() -> mdd_split_ea() output, hardcoded COMP_V1
mdd_stripe_get() calls mdo_xattr_get(), which is dt_xattr_get() on mdd_object_child() - the LOD object - and lod_xattr_get() rewrites lcm_magic from SEL to COMP_V1 in place before returning. mdd_stripe_get() then memcpy()s that already-converted buffer.
So mdd_lmm_dom_size() should already be returning the DoM size for a DoM+extension file, and this condition would never take the new branch.
If there is a path I am missing where a raw on-disk SEL blob reaches mdd, could the commit message name it?
owner Ronnie Sahlberg · uploader Ronnie Sahlberg · PS5 uploaded 89d ago · NEW · open in Gerrit ↗
commit message
LU-20553 mdd: detect DoM on SEL layouts in mdd_lmm_dom_size()
mdd_lmm_dom_size() only matched LOV_MAGIC_COMP_V1, so a DoM component
paired with an extension component (lcm_magic == LOV_MAGIC_SEL) was
treated as non-DoM. That skipped the LA_SIZE workaround in mdd_attr_set
and let full layout swap proceed without the DoM guards.
Recognize SEL so DoM detection matches the actual composite layout for
those call sites. mdd_xattr_split is unaffected: it rejects SEL with
-EINVAL before mdd_lmm_dom_size(), and builds buf_vic as plain COMP_V1.
Mask LOV_MAGIC_DEFINED only for consistency with mdd_lmm_oi()/mdd_lmm_gen();
callers pass on-disk EAs or pre-DEFINED swap buffers and never set the
bit here.
Fixes: 4c7fe0c7cdae ("LU-10070 lod: SEL: interoperability support")
Signed-off-by: Ronnie Sahlberg <rsahlberg@whamcloud.com>
Change-Id: Ic9615375f802f17c31ad818ef835751bc56e6e85
Mentions
1 waiting on you · 1 openUnresolved threads where someone @-mentioned you (username, email or full name) — the pings that drown in Gerrit's email. Red: you have not replied since the ping. Muted: you replied, but the thread is still open, so it stays on the list until someone resolves it. Both clear on the refresh after the thread is resolved.
69703
master
J –B ✓T ✗5R 0/2
LU-20690 ec: verify parity against data, allow p > k
reviewing Keguang Xu · Keguang Xu pinged you: “@rsahlberg@whamcloud.com @adilger@thelustrecollective.com: is stripe_idx < nsets * p for m”
pt_ecroraid10-like218_review_prioritypw_shepherd
4 unresolved
L +338 −193
50m
LU-20690 ec: verify parity against data, allow p > k
reviewing Keguang Xu · Keguang Xu pinged you: “@rsahlberg@whamcloud.com @adilger@thelustrecollective.com: is stripe_idx < nsets * p for m”
pt_ecroraid10-like218_review_prioritypw_shepherd
4 unresolved
L +338 −193
50m
1 ping waiting on you:
@you Keguang Xu lod_lov.c:2242 — @rsahlberg@whamcloud.com @adilger@thelustrecollective.com: is stripe_idx < nsets * p for multi-raidset parity from RR intentional? A short l
Gerrit AI review for Lustre
(defect) Can the MDS create a parity that this check then rejects?
With more than one raid set, lod_stripe_count_min() returns 0 for a parity, and lod_ost_alloc_rr() then reports success on a short allocation:
lod_ost_alloc_rr()
if (stripe_idx) rc = 0;
lod_ec_add_parities() /* may still be short, e.g. failure domains */
/* Still short; remember how many we got */
lod_comp->llc_stripe_count = stripe_idx;
stripe_idx < stripe_count_min (0) -> no -ENOSPC
lod_comp_prep_create() does not check the count afterwards, so the layout is stored with fewer than (n0 + n1) * p stripes. If the shortfall is a whole raid set, the count is still a multiple of p and passes lod_ec_parity_valid(). Before this patch such a layout went through open replay (LOV_MAGIC_DEFINED -> lod_qos_parse_config() -> lod_verify_striping()). Now the replay gets -EINVAL here, as do HSM release and xattr copies of the file.
Should RR fail a short EC parity the way lod_ost_alloc_qos() does ("we require the full stripe_count to avoid incomplete raid sets")? Otherwise this check is stricter than what the allocator guarantees.
Keguang Xu
Thanks for catching this. Full parity geometry is nsets * p (nsets = ec_raidset_count from the data stripe count and k). RR can finish with stripe_idx < nsets * p when nsets > 1: lod_stripe_count_min() is 0, so a short lod_ec_add_parities() still returns success and sets llc_stripe_count = stripe_idx. QoS instead requires stripe_idx == nsets * p. @rsahlberg@whamcloud.com @adilger@thelustrecollective.com: is stripe_idx < nsets * p for multi-raidset parity from RR intentional? A short layout (e.g. (nsets-1)*p) can break degraded read / EC recovery, leave some raid sets with no parity to rebuild from, and confuse resync/verify and mirror tools. QoS already refuses this. I think RR should match QoS (fail short EC parity) and the verifier should require count == nsets * p again — happy to follow up if you agree.
owner Keguang Xu · uploader Keguang Xu · PS4 uploaded 2d ago · NEW · open in Gerrit ↗
0 watched
Nothing watched. Add a change above — e.g. after rebasing someone's patch — and its build/test state shows up here.
13 open
▶Failed / broken
(9)
67651
master
J –B ✓T ✓R -2/2−
LU-20541 lfs: Implement migrate_stripe command and add test
needs rebase — checkpatch: cannot be cherry-picked
needs rebase
ec2
pt_ecro
11 unresolved
XL +2004 −1
2d
LU-20541 lfs: Implement migrate_stripe command and add test
needs rebase — checkpatch: cannot be cherry-picked
needs rebase
ec2
pt_ecro
11 unresolved
XL +2004 −1
2d
needs rebase — checkpatch: cannot be cherry-picked
Andreas Dilger voted -1
11 unresolved thread(s) await your reply — last from Gerrit AI review for Lustre
no vote yet from Marc Vef, Zhenyu Xu
build #134057 SUCCESS · tests all Maloo sessions
reviews:
Andreas Dilger -1
no vote yet: Marc Vef, Zhenyu Xu
patchsets:
PS16 09-03
PS17 09-04
PS18 10-12
PS19 10-13
PS20 10-20
+15 earlier
PS1 07-31 PS2 07-31 PS3 07-31 PS4 08-01 PS5 08-03 PS6 08-03 PS7 08-04 PS8 08-05 PS9 08-05 PS10 08-06 PS11 08-26 PS12 08-26 PS13 08-27 PS14 08-27 PS15 08-31threads: 11 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Gerrit AI review for Lustre lfs-migrate_stripe.1:71 — (minor) lfs_migrate_stripe() also accepts `--src-ost-index` and `--dst-ost-index`, but the man page, the SYNOPSIS and the help text don't li
Gerrit AI review for Lustre
(minor) lfs_migrate_stripe() also accepts `--src-ost-index` and `--dst-ost-index`, but the man page, the SYNOPSIS and the help text don't list them. If the patch is refreshed, could they either be documented or dropped?
reply Andreas Dilger lfs-migrate_stripe.1:9 — The -i and -o options are generally used interchangeably for regular lfs migrate, lfs find, lfs setstripe, so it _might_ be confusing here.
Andreas Dilger
The -i and -o options are generally used interchangeably for regular lfs migrate, lfs find, lfs setstripe, so it _might_ be confusing here. However, I do see the benefit that they could be named `--input` and `--output` to make their distinction more clear. I think requiring users to select the output OST index will not result in good choices, as that would be different for each raidset, each file, and a good choice will depend on the failure domain of every other stripe in the raidset.
reply Andreas Dilger lfs-migrate_stripe.1:12 — This is "--block" (or "--non-block") for regular lfs migrate.
Andreas Dilger
This is "--block" (or "--non-block") for regular lfs migrate.
reply Andreas Dilger lfs-migrate_stripe.1:54 — im not sure what this means?
Andreas Dilger
im not sure what this means?
reply Andreas Dilger lfs-migrate_stripe.1:78 — In addition to the complexity of specifying the correct target OST for every file, another complexity here is that it is unlikely that a tar
Andreas Dilger
In addition to the complexity of specifying the correct target OST for every file, another complexity here is that it is unlikely that a target OST has enough space to hold the full capacity of an OST being evacuated, unless it is a brand-new replacement. Otherwise, the single target OST will be full or severely imbalanced compared to the other OSTs. Also, there would only be the write bandwidth of the single target rather than using the distributed write bandwidth and capacity of many OSTs (at least the peers in a target failure domain, or many failure domains if there are many OSTs in the filesystem (which is often true).
reply Andreas Dilger sanity-pfl.sh:26 — (style) the preference for files that are changed is to use the "new" `always_except` helper to manage the list, so that the LU ticket numbe
Andreas Dilger
(style) the preference for files that are changed is to use the "new" `always_except` helper to manage the list, so that the LU ticket numbers are better associated with the excepted subtest, and there is no error in manipulating the string, like there was in this case. (defect) excepted tests need to be associated with an LU ticket that describes the specific issue to be fixed, so that the next person working on this code (maybe you in a year) does not need to reverse engineer the reason for it.
reply Andreas Dilger lfs.c:1667 — I don't think all of this code belongs in lfs.c. I _think_ there is code in llapi to calculate the object offsets, though we've tried to avo
Andreas Dilger
I don't think all of this code belongs in lfs.c. I _think_ there is code in llapi to calculate the object offsets, though we've tried to avoid externalizing that due to the burden of keeping it in sync for complex layouts. If not, then this should live in a separate file to avoid adding complexity here (which is aspirationally a "user" of llapi and not a net provider of new/critical functionality, though it is imperfectly so).
reply Gerrit AI review for Lustre lfs.c:1773 — (minor) Does this still match the MDS side? With the parent change, mdd_layout_swap_allowed() lets a CAP_FOWNER caller through a uid/gid mis
Gerrit AI review for Lustre
(minor) Does this still match the MDS side? With the parent change, mdd_layout_swap_allowed() lets a CAP_FOWNER caller through a uid/gid mismatch when SWAP_LAYOUTS_SINGLE_STRIPE is set:
if (!(flags & SWAP_LAYOUTS_SINGLE_STRIPE))
RETURN(-EPERM);
uc = lu_ucred_check(env);
if (uc == NULL || !cap_raised(uc->uc_cap, CAP_FOWNER))
RETURN(-EPERM);
llapi_fswap_layout_fids() always sets that flag, so root would not get -EPERM here even without the fchown(). The fchown() is still reasonable (the volatile is charged to the right owner while it exists), but the stated reason doesn't hold. If the patch is refreshed, the same wording in lfs-migrate_stripe.1 (NOTES, "so mdd_swap_layouts accepts the exchange") and in the comment above sanity-pfl test_36 ("needs fchown on volatile") could be updated to match.
reply Gerrit AI review for Lustre lfs.c:1920 — (style) This isn't a bug, but this kernel-doc block describes migrate_stripe_copy_data(), while it sits directly above migrate_stripe_copy_r
Gerrit AI review for Lustre
(style) This isn't a bug, but this kernel-doc block describes migrate_stripe_copy_data(), while it sits directly above migrate_stripe_copy_region(), which has its own comment block right after it. The same thing happens further down: the "Resolve OST object FID for stripe @stripe_index ..." block sits above struct migrate_stripe_info and is followed by a second description of migrate_stripe_get_ost_fid(). If the patch is refreshed, could each block be moved to (or merged into) the function it describes?
reply Gerrit AI review for Lustre lfs.c:2288 — (minor) Can LOV_USER_MAGIC_SPECIFIC actually come back from the lustre.lov xattr of a regular file? lod only emits LOV_MAGIC_SPECIFIC for di
Gerrit AI review for Lustre
(minor) Can LOV_USER_MAGIC_SPECIFIC actually come back from the lustre.lov xattr of a regular file? lod only emits LOV_MAGIC_SPECIFIC for directory default layouts (lod_lov.c: `if (is_dir && lod_comp->llc_ostlist.op_count) magic = LOV_MAGIC_SPECIFIC;`), and lov_lsm_pack() writes V1/V3 for file components. If it were ever reached, it would also be parsed wrongly: SPECIFIC uses the lov_user_md_v3 shape (with lmm_pool_name), but the code takes `v1->lmm_objects` for it. The same applies to the plain-layout branch below. If the patch is refreshed, consider dropping SPECIFIC from both checks.
reply Gerrit AI review for Lustre lfs.c:2933 — (suggestion) If the MDS does not negotiate OBD_CONNECT2_ONE_OBJ_SWAP, the -EOPNOTSUPP only appears at the end, in ll_swap_layouts(). By then
Gerrit AI review for Lustre
(suggestion) If the MDS does not negotiate OBD_CONNECT2_ONE_OBJ_SWAP, the -EOPNOTSUPP only appears at the end, in ll_swap_layouts(). By then the volatile has been created on the target OST and the whole stripe has been copied. This loop then repeats that full copy for every remaining FILE operand. For the many-file OST drain that the man page describes, could the loop stop after the first -EOPNOTSUPP, or could support be checked once before any copying starts?
tags: pt_ecro
owner Ronnie Sahlberg · uploader Ronnie Sahlberg · PS20 uploaded 15d ago · NEW · open in Gerrit ↗
commit message
LU-20541 lfs: Implement migrate_stripe command and add test Add lfs migrate_stripe to move OST objects of a file onto another OST using a single-stripe volatile partner and llapi_fswap_layout_fids(). Accepts multiple FILE operands, migrating each one in turn with the same options, to make draining many files off an OST convenient. -i selects a source OST index rather than a stripe index: with multiple FILE operands the stripe holding data for a given source OST differs from file to file, so identifying it by index would not make sense. Instead every stripe currently on the source OST is migrated to the target OST, including repeats of the same OST within one component or across components, unless -I restricts the scan to a single component. Copy follows absolute LOV stripe numbering and object offsets, keeps holes sparse, and ftruncates the volatile so trailing holes still carry file size without SOM. Match source uid/gid on the volatile for mdd_swap_layouts(). Default path is optimistic (DV check at swap); --lock-copy holds a group lock across copy and swap. Clamp the copy end from st_size after reading dv_src (under the group lock for --lock-copy) so a concurrent append cannot leave the new stripe short while CHECK_DV1 still matches. llapi_layout_comp_flags_get() always reports LCME_FL_INIT clear for a plain (non-composite) layout, so skip that check unless the layout is actually composite; otherwise every stripe of a plain-layout file would be silently skipped as "uninstantiated". Document in lfs-migrate_stripe.1. sanity-pfl 30-39 cover content, holes, PFL offsets, size, absolute striping, root on user files, past-EOF components, an OST reused multiple times in a component, and migrating multiple FILE operands in one invocation. Test 39 covers migrate_stripe on a plain (non-PFL) layout. Test 32 is skipped on ZFS as we do not yet have FIEMAP support. LU-1941 Test-Parameters: trivial Signed-off-by: Ronnie Sahlberg <rsahlberg@whamcloud.com> Change-Id: I48be7e597544c6856fdcf8edbd181b9f8d3db263
69917
master
J –B ✗T –R 0/2
LU-xxxxx lod: add kunit test for lod_comp_prep_create
build failure (#134244)
CI@PS1
XL +1965 −18
12d
LU-xxxxx lod: add kunit test for lod_comp_prep_create
build failure (#134244)
CI@PS1
XL +1965 −18
12d
build #134244 FAILURE
patchsets:
PS1 10-22
PS2 10-22
build/test results are from PS1 — PS2…PS2 changed only the commit message (votes copied, CI not re-run)
owner Ronnie Sahlberg · uploader Ronnie Sahlberg · PS2 uploaded 12d ago · NEW · open in Gerrit ↗
commit message
LU-xxxxx lod: add kunit test for lod_comp_prep_create Export lod_ost_alloc_rr(), lod_ost_alloc_qos(), lod_comp_prep_create(), lod_lu_ops and lod_thread_key so a kunit test module can drive component allocation directly, without a mounted filesystem or live OSD/OSP under each OST. Add KUNIT_STATIC_STUB_REDIRECT() on the two allocators and on lod_qos_declare_object_on() so tests can force a given allocator or replace object declaration with a fake dt_object. Add lustre/kunit/lod_comp_test.c, exercising lod_comp_prep_create() for RR and QoS, forcing one allocator via stub while the other returns -EAGAIN. Cover: - FLR cross-mirror OST avoidance, including overstriped mirrors, mirrors with different PFL boundaries, more mirrors than there are OSTs to keep apart, and failure domains spanning OSSs. - EC data/parity pairing and raid-set aware allocation, with and without overstriping, including layouts that must reuse parity or data OSTs. Mirrors the allocation cases from sanity-ec 2b, 2c, 11, 13, 27a, 35a, 35b and 75c. - Mixed PFL layouts combining plain and EC components. - OSTs that are down, full, read-only, not creating, degraded, or without precreated objects, including QoS falling back to RR, and EC -C layouts that exhaust the unique OSTs under the same conditions. - RR spreading stripes evenly across OSTs on several OSSs, and RR preferring OSSs not already used by other mirrors. Known issues: with too few failure domains, lod fails EC and FLR creates, or gives a mirror fewer stripes than requested. These are added as skipped known-issue cases until the desired behavior is decided. Run from sanity test_51k, loading kunit on the MDS with enable=1 and checking the KTAP output. Test-Parameters: ignore Signed-off-by: Ronnie Sahlberg <rsahlberg@whamcloud.com> Assisted-by: ClaudeCode:claude-opus-5.5 Change-Id: I038664652cc29eccf512cc7ffe1fdb271c4dabb4
62859
master
J ✓B ✓T ✗12R -1/2−
LU-12668 ec: Add tests for computing the parity coverage
needs rebase — checkpatch: cannot be cherry-picked
needs rebase
ec2
pt_ecro
L +460 −0
46d
LU-12668 ec: Add tests for computing the parity coverage
needs rebase — checkpatch: cannot be cherry-picked
needs rebase
ec2
pt_ecro
L +460 −0
46d
needs rebase — checkpatch: cannot be cherry-picked
enforced failed: custom-1001, custom-1002, review-dne-subtest-change, review-dne-zfs-subtest-change, review-ldiskfs-dne-arm
| failed enforced test | platform | detail | |
|---|---|---|---|
| custom-1001 | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity-ec. | session |
| custom-1002 | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity-ec. | session |
| review-dne-subtest-change | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity-ec. | session |
| review-dne-subtest-change | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity-ec. | session |
| review-dne-zfs-subtest-change | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity-ec. | session |
| review-dne-zfs-subtest-change | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity-ec. | session |
| review-dne-zfs-subtest-change | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity-ec. | session |
| review-dne-zfs-subtest-change | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity-ec. | session |
| review-dne-zfs-subtest-change | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity-ec. | session |
| review-dne-zfs-subtest-change | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity-ec. | session |
| review-dne-zfs-subtest-change | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity-ec. | session |
| review-ldiskfs-dne-arm | RHEL 8.10 / x86_64, Rocky 9.5 / aarch64 | ran 5 tests. 1 tests failed: sanity. | session |
build #127014 SUCCESS · tests all Maloo sessions
no vote yet: Keguang Xu, Qian Yingjin, Marc Vef, Maximilian Dilger
patchsets:
PS43 05-06
PS44 05-14 Marc Vef
PS45 05-20 Marc Vef
PS46 06-22 Marc Vef
PS47 06-26 Marc Vef
+42 earlier
PS1 12-03 PS2 12-03 PS3 12-03 PS4 12-03 PS5 12-03 Patrick Farrell PS6 12-03 Patrick Farrell PS7 12-03 Patrick Farrell PS8 12-04 Patrick Farrell PS9 12-04 PS10 12-04 Patrick Farrell PS11 12-04 Patrick Farrell PS12 12-05 PS13 12-05 PS14 12-05 PS15 12-05 PS16 12-06 PS17 12-09 PS18 12-09 Patrick Farrell PS19 12-09 Patrick Farrell PS20 12-10 PS21 12-10 Patrick Farrell PS22 12-10 PS23 12-10 PS24 12-11 PS25 12-12 Patrick Farrell PS26 12-15 PS27 12-15 PS28 12-16 Patrick Farrell PS29 01-13 Patrick Farrell PS30 01-13 Patrick Farrell PS31 01-14 Patrick Farrell PS32 01-15 Patrick Farrell PS33 01-16 Patrick Farrell PS34 01-29 Patrick Farrell PS35 03-29 Patrick Farrell PS36 03-29 Patrick Farrell PS37 03-31 Patrick Farrell PS38 04-08 Patrick Farrell PS39 04-09 Patrick Farrell PS40 04-10 Patrick Farrell PS41 04-21 Zhenyu Xu PS42 05-05 Patrick Farrelltags: pt_ecro
owner Ronnie Sahlberg · uploader Marc Vef · PS47 uploaded 130d ago · NEW · open in Gerrit ↗
commit message
LU-12668 ec: Add tests for computing the parity coverage When we write or verify the parities we no longer use the whole stripe, instead we compute the coverage of what ranges of parity is important and what can be ignored. This is based on SEEK_DATA/SEEK_HOLE and EOF. Add tests that we compute these ranges correctly. Test-Parameters: trivial Test-Parameters: testlist=sanity-ec Test-Parameters: testlist=sanity-ec fstype=zfs Signed-off-by: Ronnie Sahlberg <rsahlberg@whamcloud.com> Change-Id: Iaee9d0ccb0875f6d515a8adc322fa3cd37bfe0f6
56435
master
J !B ✗T –R -2/2−
LU-18231 odb: add a TODO to remove the spinlock for odb_flags
build failure (#108057)
XS +3 −1
61d
LU-18231 odb: add a TODO to remove the spinlock for odb_flags
build failure (#108057)
XS +3 −1
61d
build failure (#108057)
James Simmons voted -1
Timothy Day voted -1
janitor run: 1 failing config(s), none unique to this patch — janitor results
build #108057 FAILURE
reviews:
James Simmons -1 · Timothy Day -1
patchsets:
PS1 09-20
PS2 09-20
PS3 09-20
PS4 10-01
owner Ronnie Sahlberg · uploader Ronnie Sahlberg · PS4 uploaded 763d ago · NEW · open in Gerrit ↗
commit message
LU-18231 odb: add a TODO to remove the spinlock for odb_flags Now that all modifications of the odb_flag bits are done using atomic set/clear/test functions we may not need the protection of the spinlock in every situation. That is out of scope for this patch series but is something that we can consider in the future. Add a TODO that we can remove some of the uses of this spinlock in a future series. Test-Parameters: trivial Signed-off-by: Ronnie Sahlberg <rsahlberg@whamcloud.com> Change-Id: I30d880b46247374092d9c592554651c35ecda93d
66111
master
J ✗45B ✓T ✗0R 0/2
DRAFT LU-20244 utils: add support to resync a region
janitor: 45 test failures unique to this patch — sanity-ec@ldiskfs+DNE:test_1a, sanity-ec@ldiskfs+DNE:test_1b, sanity-ec@ldiskfs+DNE:test_1c +42 more
45 unique failures
ec2
pt_ecro
M +84 −36
77d
DRAFT LU-20244 utils: add support to resync a region
janitor: 45 test failures unique to this patch — sanity-ec@ldiskfs+DNE:test_1a, sanity-ec@ldiskfs+DNE:test_1b, sanity-ec@ldiskfs+DNE:test_1c +42 more
45 unique failures
ec2
pt_ecro
M +84 −36
77d
janitor: 45 test failures unique to this patch — sanity-ec@ldiskfs+DNE:test_1a, sanity-ec@ldiskfs+DNE:test_1b, sanity-ec@ldiskfs+DNE:test_1c +42 more
Maloo voted -1 — tests failed (details on the change)
janitor flagged test failures unique to this patch — full janitor results
| unique failing test | history |
|---|---|
| sanity-ec@ldiskfs+DNE:test_1a | seen in 21 other reviews |
| sanity-ec@ldiskfs+DNE:test_1b | seen in 23 other reviews |
| sanity-ec@ldiskfs+DNE:test_1c | seen in 23 other reviews |
| sanity-ec@ldiskfs+DNE:test_1d | seen in 23 other reviews |
| sanity-ec@ldiskfs+DNE:test_1g | seen in 23 other reviews |
| sanity-ec@ldiskfs+DNE:test_4e | seen in 23 other reviews |
| sanity-ec@ldiskfs+DNE:test_5a | seen in 23 other reviews |
| sanity-ec@ldiskfs+DNE:test_5b | seen in 22 other reviews |
| sanity-ec@ldiskfs+DNE:test_6a | seen in 23 other reviews |
| sanity-ec@ldiskfs+DNE:test_6b | seen in 23 other reviews |
| sanity-ec@ldiskfs+DNE:test_6d | seen in 23 other reviews |
| sanity-ec@ldiskfs+DNE:test_6e | seen in 23 other reviews |
| sanity-ec@ldiskfs+DNE:test_7 | seen in 23 other reviews |
| sanity-ec@ldiskfs+DNE:test_23a | seen in 22 other reviews |
| sanity-ec@ldiskfs+DNE:test_23b | seen in 22 other reviews |
| sanity-ec@ldiskfs+DNE:test_23c | seen in 22 other reviews |
| sanity-ec@ldiskfs+DNE:test_24a | seen in 22 other reviews |
| sanity-ec@ldiskfs+DNE:test_24b | seen in 22 other reviews |
| sanity-ec@ldiskfs+DNE:test_25a | seen in 22 other reviews |
| sanity-ec@ldiskfs+DNE:test_26a | seen in 22 other reviews |
| sanity-ec@ldiskfs+DNE:test_26b | seen in 22 other reviews |
| sanity-ec@ldiskfs+DNE:test_27a | seen in 23 other reviews |
| sanity-ec@ldiskfs+DNE:test_28a | seen in 22 other reviews |
| sanity-ec@zfs:test_1a | seen in 21 other reviews |
| sanity-ec@zfs:test_1b | seen in 23 other reviews |
| sanity-ec@zfs:test_1c | seen in 23 other reviews |
| sanity-ec@zfs:test_1d | seen in 23 other reviews |
| sanity-ec@zfs:test_1g | seen in 23 other reviews |
| sanity-ec@zfs:test_4e | seen in 23 other reviews |
| sanity-ec@zfs:test_5a | seen in 23 other reviews |
| sanity-ec@zfs:test_5b | seen in 22 other reviews |
| sanity-ec@zfs:test_6a | seen in 23 other reviews |
| sanity-ec@zfs:test_6b | seen in 23 other reviews |
| sanity-ec@zfs:test_6d | seen in 23 other reviews |
| sanity-ec@zfs:test_6e | seen in 23 other reviews |
| sanity-ec@zfs:test_7 | seen in 23 other reviews |
| sanity-ec@zfs:test_23a | seen in 22 other reviews |
| sanity-ec@zfs:test_23b | seen in 22 other reviews |
| sanity-ec@zfs:test_24a | seen in 22 other reviews |
| sanity-ec@zfs:test_24b | seen in 22 other reviews |
| sanity-ec@zfs:test_25a | seen in 22 other reviews |
| sanity-ec@zfs:test_26a | seen in 22 other reviews |
| sanity-ec@zfs:test_26b | seen in 22 other reviews |
| sanity-ec@zfs:test_27a | seen in 22 other reviews |
| sanity-ec@zfs:test_28a | seen in 22 other reviews |
no vote yet: Marc Vef, Andreas Dilger, Zhenyu Xu
patchsets:
PS1 05-25
PS2 05-25
PS3 05-25
PS4 08-18
tags: pt_ecro
owner Ronnie Sahlberg · uploader Ronnie Sahlberg · PS4 uploaded 77d ago · NEW · open in Gerrit ↗
commit message
DRAFT LU-20244 utils: add support to resync a region Add support to resync EC for a region of a file instead of the entire file. Test-Parameters: testlist=sanity-ec Signed-off-by: Ronnie Sahlberg <rsahlberg@whamcloud.com> Change-Id: I49a0ab53e7948c40086b532a0e6f9298d1bc8e1e
66112
master
J ✗45B ✓T ✗0R 0/2
DRAFT LU-20244 utils: resync/verify stale mirrors in 1GB chunks.
janitor: 45 test failures unique to this patch — sanity-ec@ldiskfs+DNE:test_1a, sanity-ec@ldiskfs+DNE:test_1b, sanity-ec@ldiskfs+DNE:test_1c +42 more
45 unique failures
ec2
pt_ecro
3 unresolved
S +30 −4
77d
DRAFT LU-20244 utils: resync/verify stale mirrors in 1GB chunks.
janitor: 45 test failures unique to this patch — sanity-ec@ldiskfs+DNE:test_1a, sanity-ec@ldiskfs+DNE:test_1b, sanity-ec@ldiskfs+DNE:test_1c +42 more
45 unique failures
ec2
pt_ecro
3 unresolved
S +30 −4
77d
janitor: 45 test failures unique to this patch — sanity-ec@ldiskfs+DNE:test_1a, sanity-ec@ldiskfs+DNE:test_1b, sanity-ec@ldiskfs+DNE:test_1c +42 more
Maloo voted -1 — tests failed (details on the change)
3 unresolved thread(s) await your reply — last from Andreas Dilger
janitor flagged test failures unique to this patch — full janitor results
| unique failing test | history |
|---|---|
| sanity-ec@ldiskfs+DNE:test_1a | seen in 21 other reviews |
| sanity-ec@ldiskfs+DNE:test_1b | seen in 23 other reviews |
| sanity-ec@ldiskfs+DNE:test_1c | seen in 23 other reviews |
| sanity-ec@ldiskfs+DNE:test_1d | seen in 23 other reviews |
| sanity-ec@ldiskfs+DNE:test_1g | seen in 23 other reviews |
| sanity-ec@ldiskfs+DNE:test_4e | seen in 23 other reviews |
| sanity-ec@ldiskfs+DNE:test_5a | seen in 23 other reviews |
| sanity-ec@ldiskfs+DNE:test_5b | seen in 22 other reviews |
| sanity-ec@ldiskfs+DNE:test_6a | seen in 23 other reviews |
| sanity-ec@ldiskfs+DNE:test_6b | seen in 23 other reviews |
| sanity-ec@ldiskfs+DNE:test_6d | seen in 23 other reviews |
| sanity-ec@ldiskfs+DNE:test_6e | seen in 23 other reviews |
| sanity-ec@ldiskfs+DNE:test_7 | seen in 23 other reviews |
| sanity-ec@ldiskfs+DNE:test_23a | seen in 22 other reviews |
| sanity-ec@ldiskfs+DNE:test_23b | seen in 22 other reviews |
| sanity-ec@ldiskfs+DNE:test_23c | seen in 22 other reviews |
| sanity-ec@ldiskfs+DNE:test_24a | seen in 22 other reviews |
| sanity-ec@ldiskfs+DNE:test_24b | seen in 22 other reviews |
| sanity-ec@ldiskfs+DNE:test_25a | seen in 22 other reviews |
| sanity-ec@ldiskfs+DNE:test_26a | seen in 22 other reviews |
| sanity-ec@ldiskfs+DNE:test_26b | seen in 22 other reviews |
| sanity-ec@ldiskfs+DNE:test_27a | seen in 23 other reviews |
| sanity-ec@ldiskfs+DNE:test_28a | seen in 22 other reviews |
| sanity-ec@zfs:test_1a | seen in 21 other reviews |
| sanity-ec@zfs:test_1b | seen in 23 other reviews |
| sanity-ec@zfs:test_1c | seen in 23 other reviews |
| sanity-ec@zfs:test_1d | seen in 23 other reviews |
| sanity-ec@zfs:test_1g | seen in 23 other reviews |
| sanity-ec@zfs:test_4e | seen in 23 other reviews |
| sanity-ec@zfs:test_5a | seen in 23 other reviews |
| sanity-ec@zfs:test_5b | seen in 22 other reviews |
| sanity-ec@zfs:test_6a | seen in 23 other reviews |
| sanity-ec@zfs:test_6b | seen in 23 other reviews |
| sanity-ec@zfs:test_6d | seen in 23 other reviews |
| sanity-ec@zfs:test_6e | seen in 23 other reviews |
| sanity-ec@zfs:test_7 | seen in 23 other reviews |
| sanity-ec@zfs:test_23a | seen in 22 other reviews |
| sanity-ec@zfs:test_23b | seen in 22 other reviews |
| sanity-ec@zfs:test_24a | seen in 22 other reviews |
| sanity-ec@zfs:test_24b | seen in 22 other reviews |
| sanity-ec@zfs:test_25a | seen in 22 other reviews |
| sanity-ec@zfs:test_26a | seen in 22 other reviews |
| sanity-ec@zfs:test_26b | seen in 22 other reviews |
| sanity-ec@zfs:test_27a | seen in 22 other reviews |
| sanity-ec@zfs:test_28a | seen in 22 other reviews |
no vote yet: Marc Vef, Andreas Dilger, Zhenyu Xu
patchsets:
PS1 05-25
PS2 05-25
PS3 05-25
PS4 08-18
threads: 3 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Andreas Dilger COMMIT_MSG:14 — I don't see this patch doing these things, mainly changing the buffer size?
Andreas Dilger
I don't see this patch doing these things, mainly changing the buffer size?
reply Andreas Dilger lfs.c:14655 — How was this 1GiB buffer size selected?
Andreas Dilger
How was this 1GiB buffer size selected?
reply Andreas Dilger lfs.c:14663 — The file was stat'dback on line 14591, so that could be used here instead of a new stat() call? If there is a reason the stat() info has go
Andreas Dilger
The file was stat'dback on line 14591, so that could be used here instead of a new stat() call? If there is a reason the stat() info has gone stale since the start of this function, then that is probably a sign the file shouldn't be resync'd at this time.
tags: pt_ecro
owner Ronnie Sahlberg · uploader Ronnie Sahlberg · PS4 uploaded 77d ago · NEW · open in Gerrit ↗
commit message
DRAFT LU-20244 utils: resync/verify stale mirrors in 1GB chunks. Instead of resyncing each stale mirror, one after the other, resync/verify the mirrors one chunk (1GB region) of the file at a time. This is so that if we are resyncing/verifying multiple stale mirrors at a time, that we read data from the up-to-date mirror once, for generating/writing to the first stale mirror and then re-read the original data from page-cache when generating/writing to the other stale mirrors. Otherwise if we resync/verify the whole mirrors one at a time, we risk for very large files that the read data from the good mirror will fall out of cache and need te be re-read for each stale submirror. Test-Parameters: testlist=sanity-ec Signed-off-by: Ronnie Sahlberg <rsahlberg@whamcloud.com> Change-Id: I279cdedf9b07c8f091747fcaa5b103852ee166c7
66110
master
J ✗45B ✓T ✗0R 0/2
DRAFT LU-20244 tests: add tests for resync of FLR + EC
janitor: 45 test failures unique to this patch — sanity-ec@ldiskfs+DNE:test_1a, sanity-ec@ldiskfs+DNE:test_1b, sanity-ec@ldiskfs+DNE:test_1c +42 more
45 unique failures
ec2
pt_ecro
M +148 −0
77d
DRAFT LU-20244 tests: add tests for resync of FLR + EC
janitor: 45 test failures unique to this patch — sanity-ec@ldiskfs+DNE:test_1a, sanity-ec@ldiskfs+DNE:test_1b, sanity-ec@ldiskfs+DNE:test_1c +42 more
45 unique failures
ec2
pt_ecro
M +148 −0
77d
janitor: 45 test failures unique to this patch — sanity-ec@ldiskfs+DNE:test_1a, sanity-ec@ldiskfs+DNE:test_1b, sanity-ec@ldiskfs+DNE:test_1c +42 more
Maloo voted -1 — tests failed (details on the change)
janitor flagged test failures unique to this patch — full janitor results
| unique failing test | history |
|---|---|
| sanity-ec@ldiskfs+DNE:test_1a | seen in 21 other reviews |
| sanity-ec@ldiskfs+DNE:test_1b | seen in 23 other reviews |
| sanity-ec@ldiskfs+DNE:test_1c | seen in 23 other reviews |
| sanity-ec@ldiskfs+DNE:test_1d | seen in 23 other reviews |
| sanity-ec@ldiskfs+DNE:test_1g | seen in 23 other reviews |
| sanity-ec@ldiskfs+DNE:test_4e | seen in 23 other reviews |
| sanity-ec@ldiskfs+DNE:test_5a | seen in 23 other reviews |
| sanity-ec@ldiskfs+DNE:test_5b | seen in 22 other reviews |
| sanity-ec@ldiskfs+DNE:test_6a | seen in 23 other reviews |
| sanity-ec@ldiskfs+DNE:test_6b | seen in 23 other reviews |
| sanity-ec@ldiskfs+DNE:test_6d | seen in 23 other reviews |
| sanity-ec@ldiskfs+DNE:test_6e | seen in 23 other reviews |
| sanity-ec@ldiskfs+DNE:test_7 | seen in 23 other reviews |
| sanity-ec@ldiskfs+DNE:test_23a | seen in 22 other reviews |
| sanity-ec@ldiskfs+DNE:test_23b | seen in 22 other reviews |
| sanity-ec@ldiskfs+DNE:test_23c | seen in 22 other reviews |
| sanity-ec@ldiskfs+DNE:test_24a | seen in 22 other reviews |
| sanity-ec@ldiskfs+DNE:test_24b | seen in 22 other reviews |
| sanity-ec@ldiskfs+DNE:test_25a | seen in 22 other reviews |
| sanity-ec@ldiskfs+DNE:test_26a | seen in 22 other reviews |
| sanity-ec@ldiskfs+DNE:test_26b | seen in 22 other reviews |
| sanity-ec@ldiskfs+DNE:test_27a | seen in 23 other reviews |
| sanity-ec@ldiskfs+DNE:test_28a | seen in 22 other reviews |
| sanity-ec@zfs:test_1a | seen in 21 other reviews |
| sanity-ec@zfs:test_1b | seen in 23 other reviews |
| sanity-ec@zfs:test_1c | seen in 23 other reviews |
| sanity-ec@zfs:test_1d | seen in 23 other reviews |
| sanity-ec@zfs:test_1g | seen in 23 other reviews |
| sanity-ec@zfs:test_4e | seen in 23 other reviews |
| sanity-ec@zfs:test_5a | seen in 23 other reviews |
| sanity-ec@zfs:test_5b | seen in 22 other reviews |
| sanity-ec@zfs:test_6a | seen in 23 other reviews |
| sanity-ec@zfs:test_6b | seen in 23 other reviews |
| sanity-ec@zfs:test_6d | seen in 23 other reviews |
| sanity-ec@zfs:test_6e | seen in 23 other reviews |
| sanity-ec@zfs:test_7 | seen in 23 other reviews |
| sanity-ec@zfs:test_23a | seen in 22 other reviews |
| sanity-ec@zfs:test_23b | seen in 22 other reviews |
| sanity-ec@zfs:test_24a | seen in 22 other reviews |
| sanity-ec@zfs:test_24b | seen in 22 other reviews |
| sanity-ec@zfs:test_25a | seen in 22 other reviews |
| sanity-ec@zfs:test_26a | seen in 22 other reviews |
| sanity-ec@zfs:test_26b | seen in 22 other reviews |
| sanity-ec@zfs:test_27a | seen in 22 other reviews |
| sanity-ec@zfs:test_28a | seen in 22 other reviews |
no vote yet: Marc Vef, Andreas Dilger, Zhenyu Xu
patchsets:
PS1 05-25
PS2 05-25
PS3 05-25
PS4 08-18
tags: pt_ecro
owner Ronnie Sahlberg · uploader Ronnie Sahlberg · PS4 uploaded 77d ago · NEW · open in Gerrit ↗
commit message
DRAFT LU-20244 tests: add tests for resync of FLR + EC We can have files that use FLR mirroring but at the same time also use EC to protect the FLR mirrors. It is probably not common to use as a persistent end user configuration as Mirrorins and EC usually are meant for different purposes : with Mirroring being prefered when performance outweights storage cost and EC is preferred when storage costs outweigh performance. But there will be situations where FLR+EC will be in use during a transitionary period, for example when migrating an EC protected file between different storage hierarchies. As such we need to have a test for this situation and that we can support and resync buth FLR and EC components at the same time. Test-Parameters: testlist=sanity-ec Signed-off-by: Ronnie Sahlberg <rsahlberg@whamcloud.com> Change-Id: Idcac78327b501d484653dec6be0882b5dbb1fa6f
67690
master
J ✗2B ✓T ✗2R 0/2
LU-20552 mdd: handle SEL and DEFINED magics in lmm oi/gen helpers
janitor: 2 test failures unique to this patch — sanity-hsm@ldiskfs+DNE:test_254b, sanity-sec@ldiskfs+DNE:test_72e
2 unique failures
1 unresolved
S +21 −8
89d
LU-20552 mdd: handle SEL and DEFINED magics in lmm oi/gen helpers
janitor: 2 test failures unique to this patch — sanity-hsm@ldiskfs+DNE:test_254b, sanity-sec@ldiskfs+DNE:test_72e
2 unique failures
1 unresolved
S +21 −8
89d
janitor: 2 test failures unique to this patch — sanity-hsm@ldiskfs+DNE:test_254b, sanity-sec@ldiskfs+DNE:test_72e
enforced failed: review-dne-zfs-part-5, review-ldiskfs-ubuntu
1 unresolved thread(s) await your reply — last from Gerrit AI review for Lustre
janitor flagged test failures unique to this patch — full janitor results
| unique failing test | history |
|---|---|
| sanity-hsm@ldiskfs+DNE:test_254b | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-sec@ldiskfs+DNE:test_72e | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-zfs-part-5 | RHEL 9.7 / x86_64 | ran 5 tests. 1 tests failed: sanityn. | session |
| review-ldiskfs-ubuntu | RHEL 8.10 / x86_64, Ubuntu 24.04 / x86_64 | ran 6 tests. 1 tests failed: sanity-lnet. | session |
3 optional test failure(s) — informational
build #128784 SUCCESS · tests all Maloo sessions
patchsets:
PS1 08-03
PS2 08-03
PS3 08-05
PS4 08-05
PS5 08-06
threads: 1 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Gerrit AI review for Lustre mdd_object.c:2522 — (defect) Can the SEL|DEFINED combination this now accepts ever reach disk?
Gerrit AI review for Lustre
(defect) Can the SEL|DEFINED combination this now accepts ever reach disk?
mdd_swap_layouts() ORs LOV_MAGIC_DEFINED onto any magic carrying the 0x0BD0 postfix, so a SEL layout applied to a layout-less file does arrive here as SEL|DEFINED and the generation is now written. The buffer then leaves mdd via mdd_declare_xattr_set(fst_o, snd_buf, XATTR_NAME_LOV, LU_XATTR_CREATE):
lod_declare_xattr_set() -> lod_declare_striped_create() ->
lod_prepare_create() -> lod_qos_parse_config()
lod_qos_parse_config() sends every DEFINED magic to lod_use_defined_striping(), which rejects SEL:
if (magic != LOV_MAGIC_V1 && magic != LOV_MAGIC_V3 &&
magic != LOV_MAGIC_COMP_V1 && magic != LOV_MAGIC_FOREIGN)
GOTO(unlock, rc = -EINVAL);
Its second magic test (the one that picks up lcm_entry_count and lcm_layout_gen) has no SEL case either, so the swap still ends in -EINVAL and the generation just written here is discarded.
Should lod_use_defined_striping() gain the SEL case alongside this, or is SEL|DEFINED meant to stay unsupported? If the latter, the commit message wording about generation updates succeeding reads a bit stronger than the code delivers.
owner Ronnie Sahlberg · uploader Ronnie Sahlberg · PS5 uploaded 89d ago · NEW · open in Gerrit ↗
commit message
LU-20552 mdd: handle SEL and DEFINED magics in lmm oi/gen helpers
mdd_lmm_oi() and mdd_lmm_gen() only recognized LOV_MAGIC_COMP_V1.
Layouts with extension components use LOV_MAGIC_SEL (same composite
blob), so mdd_set_lmm_oi() during MDT migrate (mdd_xattrs_migrate_prep)
was a silent no-op and left the old MDT FID in lmm_oi.
Also recognize SEL in mdd_lmm_gen(). Mask LOV_MAGIC_DEFINED there so
generation updates succeed when swap applies a layout onto a layout-less
file (mdd_swap_layouts ORs that bit on the incoming LOV before
mdd_set_lmm_gen(); a two-way swap of existing layouts does not).
mdd_lmm_oi() masks DEFINED only for symmetry (its callers never pass it).
Fixes: 4c7fe0c7cdae ("LU-10070 lod: SEL: interoperability support")
Fixes: 89693927f0b0 ("LU-8998 lod: accomodate to composite layout")
Signed-off-by: Ronnie Sahlberg <rsahlberg@whamcloud.com>
Change-Id: If1c0b7b2ce085b2fae86e147c61db7ad3f3ff4f3
67691
master
J !B ✓T ✗1R 0/2
LU-20553 mdd: detect DoM on SEL layouts in mdd_lmm_dom_size()
enforced failed: review-dne-selinux-ssk-part-2
3 unresolved
S +12 −2
89d
LU-20553 mdd: detect DoM on SEL layouts in mdd_lmm_dom_size()
enforced failed: review-dne-selinux-ssk-part-2
3 unresolved
S +12 −2
89d
enforced failed: review-dne-selinux-ssk-part-2
3 unresolved thread(s) await your reply — last from Gerrit AI review for Lustre
janitor run: 7 failing config(s), none unique to this patch — janitor results
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-selinux-ssk-part-2 crashed | RHEL 8.10 / x86_64 | ran 7 tests. 1 tests failed: sanity-sec. %% THIS TEST SESSION CRASHED %% | session |
8 optional test failure(s) — informational
build #128783 SUCCESS · tests all Maloo sessions
patchsets:
PS1 08-03
PS2 08-04
PS3 08-05
PS4 08-05
PS5 08-06
threads: 3 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Gerrit AI review for Lustre COMMIT_MSG:9 — Can a DoM+extension file actually reach this helper with lcm_magic == LOV_MAGIC_SEL?
Gerrit AI review for Lustre
Can a DoM+extension file actually reach this helper with lcm_magic == LOV_MAGIC_SEL?
SEL is described as LOD-internal: lod_xattr_get() converts it back before returning the EA.
if ((rc > 0) && buf->lb_buf && strcmp(name, XATTR_NAME_LOV) == 0) {
struct lov_comp_md_v1 *lcm = buf->lb_buf;
if (lcm->lcm_magic == cpu_to_le32(LOV_MAGIC_SEL))
lcm->lcm_magic = cpu_to_le32(LOV_MAGIC_COMP_V1);
}
Every buffer mdd_attr_set() and mdd_swap_layouts() hand to mdd_lmm_dom_size() comes from mdd_stripe_get()->mdo_xattr_get()->dt_xattr_get() on the LOD object, so it has already been through that conversion. That would make the LA_SIZE drop and the swap DoM guards fire correctly today, and the described symptom would not occur.
reply Gerrit AI review for Lustre COMMIT_MSG:21 — 4c7fe0c7cdae is the commit that made SEL a LOD-internal magic ("It is never gets out of LOD, converted on read/write to COMP_V1"), which is
Gerrit AI review for Lustre
4c7fe0c7cdae is the commit that made SEL a LOD-internal magic ("It is never gets out of LOD, converted on read/write to COMP_V1"), which is what keeps mdd seeing COMP_V1. If the analysis above holds, it did not introduce a bug in mdd and this tag should probably go away along with the fix.
reply Gerrit AI review for Lustre mdd_object.c:1294 — Is the LOV_MAGIC_SEL arm reachable? All three callers get their buffer from mdd_stripe_get():
Gerrit AI review for Lustre
Is the LOV_MAGIC_SEL arm reachable? All three callers get their buffer from mdd_stripe_get():
mdd_attr_set() -> mdd_stripe_get(obj, lov_buf, XATTR_NAME_LOV)
mdd_swap_layouts() -> mdd_stripe_get(fst_o/snd_o, ..., XATTR_NAME_LOV)
mdd_xattr_split() -> mdd_split_ea() output, hardcoded COMP_V1
mdd_stripe_get() calls mdo_xattr_get(), which is dt_xattr_get() on mdd_object_child() - the LOD object - and lod_xattr_get() rewrites lcm_magic from SEL to COMP_V1 in place before returning. mdd_stripe_get() then memcpy()s that already-converted buffer.
So mdd_lmm_dom_size() should already be returning the DoM size for a DoM+extension file, and this condition would never take the new branch.
If there is a path I am missing where a raw on-disk SEL blob reaches mdd, could the commit message name it?
owner Ronnie Sahlberg · uploader Ronnie Sahlberg · PS5 uploaded 89d ago · NEW · open in Gerrit ↗
commit message
LU-20553 mdd: detect DoM on SEL layouts in mdd_lmm_dom_size()
mdd_lmm_dom_size() only matched LOV_MAGIC_COMP_V1, so a DoM component
paired with an extension component (lcm_magic == LOV_MAGIC_SEL) was
treated as non-DoM. That skipped the LA_SIZE workaround in mdd_attr_set
and let full layout swap proceed without the DoM guards.
Recognize SEL so DoM detection matches the actual composite layout for
those call sites. mdd_xattr_split is unaffected: it rejects SEL with
-EINVAL before mdd_lmm_dom_size(), and builds buf_vic as plain COMP_V1.
Mask LOV_MAGIC_DEFINED only for consistency with mdd_lmm_oi()/mdd_lmm_gen();
callers pass on-disk EAs or pre-DEFINED swap buffers and never set the
bit here.
Fixes: 4c7fe0c7cdae ("LU-10070 lod: SEL: interoperability support")
Signed-off-by: Ronnie Sahlberg <rsahlberg@whamcloud.com>
Change-Id: Ic9615375f802f17c31ad818ef835751bc56e6e85
▶Review feedback — your turn
(1)
69509
master
J –B ✓T ✓R 0/2
LU-20900 doc: add osc.active and osp.active man pages
1 unresolved thread(s) await your reply — last from Gerrit AI review for Lustre
2 unresolved
M +225 −0
22d
LU-20900 doc: add osc.active and osp.active man pages
1 unresolved thread(s) await your reply — last from Gerrit AI review for Lustre
2 unresolved
M +225 −0
22d
1 unresolved thread(s) await your reply — last from Gerrit AI review for Lustre
CI green — no vote yet from Andreas Dilger, Alex Zhuravlev
1 thread(s) waiting on others
build #133478 SUCCESS
no vote yet: Andreas Dilger, Alex Zhuravlev
patchsets:
PS1 10-08
PS2 10-08
PS3 10-12
threads: 1 need your reply · 1 waiting on others · 0 own notes · 0 bot
reply Gerrit AI review for Lustre osp.active.4:20 — (minor) This says the parameter also covers OSP imports to remote MDTs, but NAME, SYNOPSIS, Default, Valid Range and MODULES only show the O
Gerrit AI review for Lustre
(minor) This says the parameter also covers OSP imports to remote MDTs, but NAME, SYNOPSIS, Default, Valid Range and MODULES only show the OST form `osp.FSNAME-OST*-osc-MDT*.active`. MDT-to-MDT OSPs are named `FSNAME-MDTxxxx-osp-MDTyyyy` (see mgs_llog.c), so that glob never matches them. The effects described below (precreate, LOD object allocation, sync llog destroys) also don't apply to an MDT OSP, since osp_import_event() returns early when `opd_connect_mdt` is set. If the patch is refreshed, could the page either add the `osp.FSNAME-MDT*-osp-MDT*.active` form and say what deactivating it does, or drop the remote-MDT mention here and at line 40?
owner Ronnie Sahlberg · uploader Ronnie Sahlberg · PS3 uploaded 22d ago · NEW · open in Gerrit ↗
commit message
LU-20900 doc: add osc.active and osp.active man pages Document the osc.*.active and osp.*.active tunables. Signed-off-by: Ronnie Sahlberg <rsahlberg@whamcloud.com> Change-Id: I5a3fe46789a44ab14b5e416b17870a7a2ed8f4a6
▶In CI
(1)
64927
master
J –B ✓T …R 0/2
LU-20016 utils: add an EC computation benchmark
build OK — testing in progress (typically 6–14h)
ec2
pt_ecropw_bigfix
L +620 −2
8h
LU-20016 utils: add an EC computation benchmark
build OK — testing in progress (typically 6–14h)
ec2
pt_ecropw_bigfix
L +620 −2
8h
no vote yet: patrick bot, Hiroshi Nishida, Marc Vef, Andreas Dilger, Maximilian Dilger, Timothy Day, Patrick Farrell
patchsets:
PS14 10-26 patrick bot
PS15 10-26 patrick bot
PS16 10-27 patrick bot
PS17 11-03 Andreas Dilger
PS18 11-03 patrick bot
+13 earlier
PS1 03-26 PS2 03-27 PS3 03-27 PS4 05-13 Andreas Dilger PS5 05-13 Andreas Dilger PS6 05-13 Janitor Bot PS7 09-14 PS8 09-15 PS9 10-13 patrick bot PS10 10-13 patrick bot PS11 10-15 patrick bot PS12 10-17 patrick bot PS13 10-24 patrick bottags: pt_ecro pw_bigfix
owner Ronnie Sahlberg · uploader patrick bot · PS18 uploaded 9h ago · NEW · open in Gerrit ↗
commit message
LU-20016 utils: add an EC computation benchmark Add ec_perf_bench to measure EC encode throughput and compare systems and builds. It reports source data rates per thread and in aggregate, along with the CPU model, speed, online logical CPU count and EC implementation. Note that in the ISA-L library, computing parities and recovering lost data stripes is the same operation: ec_encode_data(). The difference is not in the computations but rather the content of the coefficient matrix. The cost of these operations is primarily bound by the number of stripes to compute which amusingly means that recovering a single lost stripe should be FASTER than generating two parities. Build erasurecode before the rest of utils and add an explicit rule for erasurecode/libec.a, so ec_perf_bench's dependency on the static library is honored under parallel make. Build libec.a with -fPIC: ec_perf_bench is the first program linked against it with the PIE hardening flags. Add sanity-ec test_0b, which runs ec_perf_bench for a few geometries and logs the CPU, implementation and throughput. Link the benchmark explicitly with libpthread, including when libcfs is configured without pthread support. Test-Parameters: trivial testlist=sanity-ec Signed-off-by: Ronnie Sahlberg <rsahlberg@whamcloud.com> Change-Id: I61f409b631a8f4aefe0ceb2628e56f58f4c3a07c Assisted-by: Codex:gpt-6.1-sol Assisted-by: ClaudeCode:claude-sonnet-5 Assisted-by: ClaudeCode:claude-opus-5-5 Assisted-by: ClaudeCode:claude-sonnet-5-5
▶Needs reviewers
(1)
70057
master
J –B ✓T ✓R 0/2
LU-21048 AGENTS: note zero-init struct depending on CONST==0
CI green — no vote yet from Andreas Dilger, Oleg Drokin
CI@PS1
XS +5 −0
6d
LU-21048 AGENTS: note zero-init struct depending on CONST==0
CI green — no vote yet from Andreas Dilger, Oleg Drokin
CI@PS1
XS +5 −0
6d
build #134513 SUCCESS · tests all Maloo sessions
no vote yet: Andreas Dilger, Oleg Drokin
patchsets:
PS1 10-27
PS2 10-27
build/test results are from PS1 — PS2…PS2 changed only the commit message (votes copied, CI not re-run)
owner Ronnie Sahlberg · uploader Ronnie Sahlberg · PS2 uploaded 7d ago · NEW · open in Gerrit ↗
commit message
LU-21048 AGENTS: note zero-init struct depending on CONST==0
Add a review checklist item for code that compares foo->field == CONST
while a different, zero-initialized instance of the same struct is
relied upon to mean the same CONST, with no explicit assignment or
BUILD_BUG_ON() tying the two together.
Example:
if (scope->ios_scope == LL_IO_SCOPE_FILE) {
memset(&lfd->fd_io_scope, 0, sizeof(lfd->fd_io_scope));
return 0;
}
Change-Id: Ifcee6df1689f6aaf66dace5bde05f32dc08fa359
Signed-off-by: Ronnie Sahlberg <rsahlberg@whamcloud.com>
▶Waiting on reviewers
(0)
nothing here right now
▶Ready to land
(1)
69916
master
J –B ✓T ✓R +2/2
LU-21014 lod: keep EC raid sets on distinct OSTs in RR
all green — queued for landing (master-next)
ec2
pt_ecro
CI@PS2
master-next
5 unresolved
S +8 −2
6d
LU-21014 lod: keep EC raid sets on distinct OSTs in RR
all green — queued for landing (master-next)
ec2
pt_ecro
CI@PS2
master-next
5 unresolved
S +8 −2
6d
all green — queued for landing (master-next)
5 reviewer comment(s) to address if a respin is needed — last from Gerrit AI review for Lustre
build #134322 SUCCESS · tests all Maloo sessions
reviews:
Keguang Xu +1 · Andreas Dilger +1
no vote yet: Marc Vef
patchsets:
PS1 10-22
PS2 10-23
PS3 10-27 Andreas Dilger
threads: 5 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Gerrit AI review for Lustre COMMIT_MSG:19 — (minor) This fixes a placement bug from the commit that added the EC RR reuse path, lod_ec_add_data() and the lag_ost_avail gate in lod_chec
Gerrit AI review for Lustre
(minor) This fixes a placement bug from the commit that added the EC RR reuse path, lod_ec_add_data() and the lag_ost_avail gate in lod_check_and_reserve_ost(). That commit's message promises "-C: require unique OSTs within each raidset", which the RR loop reuse did not keep. Should this carry:
Fixes: c53abca9f9ee ("LU-19852 lod: raidset aware stripe allocator")
reply Andreas Dilger lod_qos.c:779 — This says where EC reuse happens but not why it can't happen here. Please add that lag_ost_avail counts OSTs that RR skips (inactive, degra
Andreas Dilger
This says where EC reuse happens but not why it can't happen here. Please add that lag_ost_avail counts OSTs that RR skips (inactive, degraded), so the loop could reuse an OST before every usable OST was placed. Can go in the follow-on patch.
reply Andreas Dilger lod_qos.c:1463 — Pre-existing and not critical for this release: lod_ec_add_data() only checks failure domains within the raid set, not OST identity. An OST
Andreas Dilger
Pre-existing and not critical for this release: lod_ec_add_data() only checks failure domains within the raid set, not OST identity. An OST with failure domain 0 skips the check entirely. When the list mixes domain 0 and non-zero domain OSTs, a "continue" here for a domain collision shifts the cyclic order, so a domain 0 OST can be placed twice in one raid set. Separately, if lod_ec_add_data() returns short, the parity split is computed from the reduced stripe count, which may not keep the uniqueness the original split had. Something for a later patch.
reply Andreas Dilger lod_qos.c:1768 — With this change EC components never set overstriped in the RR loop, so LOV_PATTERN_OVERSTRIPING is always cleared, even when lod_ec_add_dat
Andreas Dilger
With this change EC components never set overstriped in the RR loop, so LOV_PATTERN_OVERSTRIPING is always cleared, even when lod_ec_add_data()/lod_ec_add_parities() do reuse OSTs afterward. "lfs getstripe" then shows a -C EC layout with repeated OSTs but no overstriping. This already happened with all OSTs active, and now also with an OST down. Setting overstriped when lod_ec_add_data()/lod_ec_add_parities() place a reused OST would fix it. Also, clearing the flag before an error return means the reserve=0 retry runs as a -c layout. Not critical, could go in the follow-on patch.
reply Keguang Xu lod_qos.c:2831 — +1
Andreas Dilger
lod_ost_alloc_qos() has the same issue: for an EC component with overstriping, QoS still reuses an OST at any point in its weighted random loop, and with failure domain 0 nothing stops two stripes of one raid set from landing on the same OST, even with all OSTs up. The same "&& !lod_comp->llc_cstripe_count" check here would fix it, since QoS already calls lod_ec_add_data()/lod_ec_add_parities() afterward. LU-9 weighted RR QoS allocation also fixes this, but it is unlikely to land for 2.18.0, so please fix it in a follow-on patch for 2.18.0.
Keguang Xu
+1
tags: pt_ecro
build/test results are from PS2 — PS3…PS3 changed only the commit message (votes copied, CI not re-run)
owner Ronnie Sahlberg · uploader Andreas Dilger · PS3 uploaded 7d ago · NEW · open in Gerrit ↗
commit message
LU-21014 lod: keep EC raid sets on distinct OSTs in RR
With overstriping, lod_check_and_reserve_ost() lets the RR loop reuse
an OST while lag_ost_avail says unique OSTs remain. That count includes
OSTs RR skips, such as inactive or degraded ones, so an EC data
component can reuse an OST before lod_ec_add_data() takes over, which
repeats the placed stripes assuming they are unique and so puts two
stripes of a raid set on one OST, e.g. -C 13 --ec 5+2 on 8 OSTs with
one down.
Leave all OST reuse for EC components to lod_ec_add_data() and
lod_ec_add_parities(), which keep each raid set on distinct OSTs.
Test-Parameters: trivial testlist=sanity-ec ostcount=8
Fixes: c53abca9f9ee ("LU-19852 lod: raidset aware stripe allocator")
Signed-off-by: Ronnie Sahlberg <rsahlberg@whamcloud.com>
Assisted-by: ClaudeCode:claude-opus-5.5
Change-Id: I8fe6431de113351e92653780fe17db2e8a180697
▶Parked (WIP / self-blocked)
(0)
nothing here right now
Carrying — uploaded by me, owned by others
1 open▶Failed / broken
(0)
nothing here right now
▶Review feedback — your turn
(0)
nothing here right now
▶In CI
(0)
nothing here right now
▶Needs reviewers
(0)
nothing here right now
▶Waiting on reviewers
(0)
nothing here right now
▶Ready to land
(1)
69575
master
J –B ✓T ✓R +2/2
LU-20690 utils: add EC parity-stripe I/O helpers
carrying Keguang Xu · all green — ready to land (not in master-next yet)
218_review_priorityraid10-like218_review_blockerpt_ecro
1 unresolved
L +244 −115
1d
LU-20690 utils: add EC parity-stripe I/O helpers
carrying Keguang Xu · all green — ready to land (not in master-next yet)
218_review_priorityraid10-like218_review_blockerpt_ecro
1 unresolved
L +244 −115
1d
all green — ready to land (not in master-next yet)
1 reviewer comment(s) to address if a respin is needed — last from Gerrit AI review for Lustre
build #134756 SUCCESS · tests all Maloo sessions
reviews:
Ronnie Sahlberg +1 · Andreas Dilger +1
no vote yet: Marc Vef
patchsets:
PS4 10-23
PS5 10-23
PS6 10-23
PS7 10-29 Ronnie Sahlberg
PS8 10-29 Ronnie Sahlberg
+3 earlier
PS1 10-11 PS2 10-13 PS3 10-14threads: 1 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Gerrit AI review for Lustre lfs.c:17527 — (suggestion) 'lfs mirror write' now refuses a parity mirror, but 'lfs mirror copy' still writes into one. 'lfs mirror copy -i1 -o<parity_id>
Gerrit AI review for Lustre
(suggestion) 'lfs mirror write' now refuses a parity mirror, but 'lfs mirror copy' still writes into one. 'lfs mirror copy -i1 -o<parity_id>' does, and so does the documented '-o -1' form, because get_other_mirror_ids() collects every mirror including parity. The path is llapi_mirror_copy_many() -> llapi_mirror_write(), which overwrites the parity with raw data. LL_LEASE_RESYNC_DONE then marks that mirror in sync, so it is the same corruption the new write check prevents. This predates the patch. verify_mirror_id_by_fd() now returns is_parity, though, so this call site could reject an explicit parity target, and the -1 case could skip parity mirrors. If the patch is refreshed, or in a follow-on, consider doing that.
tags: 218_review_priority raid10-like 218_review_blocker pt_ecro
owner Keguang Xu · uploader Ronnie Sahlberg · PS8 uploaded 5d ago · NEW · open in Gerrit ↗
commit message
LU-20690 utils: add EC parity-stripe I/O helpers Prepare userspace for the RAID10-like EC parity layout, where the p parity stripes of a raidset share one file offset and must be addressed by (pos, parity index) through LL_IO_SCOPE_STRIPE. Add internal llapi_mirror_read_parity() and llapi_mirror_write_parity() (lustreapi_internal.h, not lustreapi.h), which pin the I/O to one parity stripe with LL_IO_SCOPE_STRIPE. They share the pread/pwrite loop of llapi_mirror_read() and llapi_mirror_write(). llapi_ec_write_parities() and llapi_ec_verify_parities() take the parity component instead of stripe size and id, and do parity I/O through the _parity helpers. Offsets are unchanged: parity i is still at ec_pos + i * stripe_size. With the current RAID0|PARITY encoding lov ignores the designated stripe, so resync and verify behave as before. The zero-fill fallback of parity punch, the hole check of verify, and 'lfs mirror read' and 'lfs mirror copy' of a parity mirror still use mirror I/O; they need the same change before the RAID10 layout is enabled. Add llapi_layout_is_parity_mirror() to the public API and use it in lfs in place of its own is_parity_mirror() and mirror id lookup. 'lfs mirror write' now refuses a parity mirror and points to 'lfs mirror resync'. Test-Parameters: testlist=sanity-ec ostcount=8 Signed-off-by: Keguang Xu <kxu@ddn.com> Signed-off-by: Ronnie Sahlberg <rsahlberg@whamcloud.com> Assisted-by: Cursor:Grok-4.6/Opus5.5 llm_code_and_review_tools Assisted-by: ClaudeCode:claude-opus-5-5 Change-Id: I58eae79087e99eb6a5751919a9da17970074c215
▶Parked (WIP / self-blocked)
(0)
nothing here right now
28 open
▶Re-review needed — new patchset since your vote
(1)
65798
master
J –B ✓T ✓R +1/2
LU-20238 ec: GFNI-accelerated EC primitives
reviewing Hiroshi Nishida · PS15→PS24 since your +1
pt_ecropw_smallfix
CI@PS23
XL +3332 −38
17h
LU-20238 ec: GFNI-accelerated EC primitives
reviewing Hiroshi Nishida · PS15→PS24 since your +1
pt_ecropw_smallfix
CI@PS23
XL +3332 −38
17h
build #134847 SUCCESS · tests all Maloo sessions
reviews:
Andreas Dilger +1
no vote yet: patrick bot, Keguang Xu, Patrick Farrell, Marc Vef, Maximilian Dilger, Zhenyu Xu, Oleg Drokin
patchsets:
PS20 10-21 patrick bot
PS21 10-21
PS22 10-24 patrick bot
PS23 10-30 patrick bot
PS24 11-03 Andreas Dilger
+19 earlier
PS1 05-11 PS2 05-11 PS3 05-11 PS4 05-12 PS5 05-12 PS6 05-13 PS7 05-13 PS8 05-17 PS9 06-08 PS10 06-17 PS11 07-10 PS12 07-10 PS13 08-05 PS14 08-06 PS15 08-07 PS16 10-01 patrick bot PS17 10-02 PS18 10-05 patrick bot PS19 10-13your previous vote: +1 on PS15 (2026-09-07 08:51) — now at PS24
tags: pt_ecro pw_smallfix
build/test results are from PS23 — PS24…PS24 changed only the commit message (votes copied, CI not re-run)
owner Hiroshi Nishida · uploader Andreas Dilger · PS24 uploaded 17h ago · NEW · open in Gerrit ↗
commit message
LU-20238 ec: GFNI-accelerated EC primitives
Add a runtime-dispatched GFNI fast path to libec.a (LU-19465).
On x86_64 with GFNI, ec_encode_data(), ec_encode_data_update(),
ec_init_tables(), gf_vect_dot_prod() and gf_vect_mad() route to
AVX-512 or AVX2 GFNI kernels; everywhere else the existing
ec_*_base() path is used unchanged.
The kernels are C intrinsics (_mm{256,512}_gf2p8affine_epi64_epi8)
gated per-function with __attribute__((target(...))), so the build
needs only GCC >= 10 / clang >= 8 and no NASM. They use only the
GF(2^8) affine instruction and XOR/load/store, not the PSHUFB
nibble-table lookup the ISA-L AVX2/SSE kernels rely on.
The multi-output AVX-512 dot_prod kernels take the coefficient as
an EVEX {1to8} embedded broadcast to keep it off Port5; compilers
will not emit {1to8} from intrinsics, so a short inline-asm macro
is used. The mad kernels use _mm512_set1_epi64(), the coefficient
being loop-invariant there.
Against ISA-L's NASM kernels this reaches parity on AVX-512 (+1%
to -5%) and matches or beats NASM on 4 of 5 AVX2 benchmarks, the
one slower case by 6%.
A configure probe (EC_GFNI_SUPPORT) compile-tests the intrinsic
and defines LUSTRE_EC_GFNI for the libec.a build only. It rejects
GCC 8 and 9, which mark GF2P8AFFINEQB commutative and can swap its
data and matrix operands, giving wrong parity. Every
dispatch block is guarded by the pair defined(LUSTRE_EC_GFNI) &&
!defined(__KERNEL__), so no shipped consumer reaches a GFNI kernel
yet: ec.ko and liblustreapi both take the base path, and the
numbers above compare kernels directly rather than describing a
user-visible speedup. Follow-on patches add the Kbuild plumbing
and the liblustreapi wiring.
gfni_ec_test checks that the GFNI and base paths produce identical
output, and exits 77 without GFNI so a caller can skip instead of
recording a base-against-base pass. It installs with the test
suite; sanity-ec.sh test_0 sweeps geometries and lengths through
it. -i picks the kernel family directly, because the runtime
dispatch always prefers AVX-512 and would otherwise leave the
AVX2 kernels untested on any CPU that has both.
The vendored gf_*_gfni.c kernels are reflowed for lustre
checkpatch; see lustre/utils/erasurecode/GFNI_VENDORED.md.
Test-Parameters: trivial testlist=sanity-ec
Signed-off-by: Hiroshi Nishida <hnishida@thelustrecollective.com>
Assisted-by: Claude:Opus-5 claude-code
Change-Id: Ia40a743c8e47c018250728668090215c7bd8365b
▶Awaiting your review — CI green
(13)
58253
master
J –B ✓T ✓R +1/2
LU-17531 lfs: add 'mirror extend --no-resync' option
reviewing Zhenyu Xu · CI green — awaiting your review
pt_ecropw_smallfix
M +190 −5
1h
LU-17531 lfs: add 'mirror extend --no-resync' option
reviewing Zhenyu Xu · CI green — awaiting your review
pt_ecropw_smallfix
M +190 −5
1h
build #135058 SUCCESS · tests all Maloo sessions
reviews:
Jian Yu +1
no vote yet: Marc Vef, Andreas Dilger, Patrick Farrell
patchsets:
PS20 10-28 patrick bot
PS21 10-28 patrick bot
PS22 10-30 patrick bot
PS23 10-31 patrick bot
PS24 11-01 patrick bot
+19 earlier
PS1 02-27 PS2 02-27 PS3 02-28 PS4 03-01 PS5 03-03 PS6 03-03 PS7 03-04 PS8 03-05 PS9 03-06 PS10 04-17 PS11 05-05 Andreas Dilger PS12 05-05 Andreas Dilger PS13 05-05 Andreas Dilger PS14 05-05 Andreas Dilger PS15 06-01 PS16 08-12 PS17 10-14 patrick bot PS18 10-16 patrick bot PS19 10-27 patrick bottags: pt_ecro pw_smallfix
owner Zhenyu Xu · uploader patrick bot · PS24 uploaded 2d ago · NEW · open in Gerrit ↗
commit message
LU-17531 lfs: add 'mirror extend --no-resync' option Allow adding a mirror without syncing its content beforehand, so that it can be resynced later. The new mirrors are marked stale and stay unusable until "lfs mirror resync" is run. Merging a stale mirror needs FLR EC enabled on both the client and the MDS (llite_enable_flr_ec and mdt_enable_flr_ec, negotiated at mount), otherwise the extend is refused. --no-resync cannot be used with -f VICTIM_FILE or with --ec, since the parity mirror is computed from up-to-date data. Assisted-by: Codex:gpt-6.1-sol Signed-off-by: Bobi Jam <bobijam@whamcloud.com> Change-Id: I1b43fb0299c2aaea72587eff9168e4cdee075624
64919
master
J –B ✓T ✓R +2/2
LU-12669 lov: slow and dead OST detection for degraded reads
reviewing Maximilian Dilger · CI green — awaiting your review
pt_ecro
5 unresolved
XL +2386 −78
9h
LU-12669 lov: slow and dead OST detection for degraded reads
reviewing Maximilian Dilger · CI green — awaiting your review
pt_ecro
5 unresolved
XL +2386 −78
9h
build #134398 SUCCESS · tests all Maloo sessions
reviews:
Keguang Xu +1 · Andreas Dilger +1
no vote yet: Zhenyu Xu
patchsets:
PS48 09-26
PS49 10-05 Andreas Dilger
PS50 10-05 Andreas Dilger
PS51 10-15 Andreas Dilger
PS52 10-24 Andreas Dilger
+47 earlier
PS1 03-26 PS2 03-26 PS3 03-29 Andreas Dilger PS4 03-29 Patrick Farrell PS5 03-29 Patrick Farrell PS6 03-29 Patrick Farrell PS7 03-29 Ronnie Sahlberg PS8 03-30 Ronnie Sahlberg PS9 03-31 Ronnie Sahlberg PS10 03-31 Patrick Farrell PS11 03-31 Ronnie Sahlberg PS12 04-01 Ronnie Sahlberg PS13 04-01 Ronnie Sahlberg PS14 04-07 Ronnie Sahlberg PS15 04-08 Patrick Farrell PS16 04-09 Patrick Farrell PS17 04-09 Patrick Farrell PS18 04-09 Patrick Farrell PS19 04-09 Patrick Farrell PS20 04-09 Patrick Farrell PS21 04-09 Patrick Farrell PS22 04-09 Patrick Farrell PS23 04-09 Patrick Farrell PS24 04-10 Patrick Farrell PS25 04-10 Patrick Farrell PS26 04-10 Patrick Farrell PS27 04-10 Patrick Farrell PS28 04-10 Patrick Farrell PS29 04-14 Patrick Farrell PS30 04-14 Patrick Farrell PS31 04-14 Patrick Farrell PS32 04-15 Patrick Farrell PS33 04-15 Patrick Farrell PS34 04-15 Patrick Farrell PS35 04-21 PS36 04-25 PS37 05-04 PS38 05-20 Marc Vef PS39 06-04 Ronnie Sahlberg PS40 07-13 Marc Vef PS41 07-13 Marc Vef PS42 07-13 Marc Vef PS43 07-15 Marc Vef PS44 07-26 Marc Vef PS45 07-26 Marc Vef PS46 08-04 PS47 08-19threads: 5 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Gerrit AI review for Lustre COMMIT_MSG:62 — (minor) Earlier review agreed to keep the lov_io_set_range(), readahead and via_hybrid_switched fixes in this patch. The io_latency_stats ar
Gerrit AI review for Lustre
(minor) Earlier review agreed to keep the lov_io_set_range(), readahead and via_hybrid_switched fixes in this patch. The io_latency_stats array fix is newer, though, and is a different case. The arrays are allocated with PTLRPC_MAX_BRW_BITS - PAGE_SHIFT entries, but brw_interpret() indexes them with fls(page_count) - 1. A maximum-size RPC therefore writes one histogram past the end of the allocation. d67cf23fb18a is already in 2.17.0, so this heap overflow needs to reach b2_17, and the EC degraded-read feature will not be backported there. Could the OSC_LAT_BUCKETS change go in a separate patch with its own Fixes: line, so it can be cherry-picked on its own?
reply Marc Vef patchset comment — Conflicts with master: Does not apply after the 1 change below it: lustre/osc/osc_cache.c
Marc Vef
Conflicts with master: Does not apply after the 1 change below it: lustre/osc/osc_cache.c
reply Gerrit AI review for Lustre lov_io.c:3631 — (defect) lov_sub_unavailable() is evaluated again for every parity stripe on each pass, and the answer can change between the passes. Pass 0
Gerrit AI review for Lustre
(defect) lov_sub_unavailable() is evaluated again for every parity stripe on each pass, and the answer can change between the passes. Pass 0 does a synchronous lov_ec_read_parity_stripe() (cl_sync_io_wait(), no soft deadline) for each available stripe, and a slow mark is time-bound, so cl_read_slow_until can expire while pass 0 is reading. Example, err_nr == 2, pcount == 2, parity p0 slow-marked: pass 0 skips p0 and reads p1. p0's mark expires during that read. Pass 1 now sees p0 as available, so `lov_sub_unavailable(los) != pass` skips it again, par_stripes_used stays 1, and the read fails with "not enough parity stripes" -EIO. Before this patch the single loop would have read p0 and recovered. The opposite flip (a stripe already read in pass 0 gets marked slow by another reader's soft timeout) would read it again and put the same index twice into ecr_parity_used[], which makes the decode matrix singular (-EIO from gf_invert_matrix()). Could the availability of each parity stripe be sampled once before the passes (e.g. a small bitmap of pcount bits) so each stripe is tried exactly once?
reply Gerrit AI review for Lustre lov_lock.c:238 — (minor) Is it intended that this also matches stripes that have no sub-IO only because they are past EOF? lov_ecio_add_data_sub() caps data_
Gerrit AI review for Lustre
(minor) Is it intended that this also matches stripes that have no sub-IO only because they are past EOF? lov_ecio_add_data_sub() caps data_ext at ec_inode_size, so in a small file the other data stripes of the expanded raid set get no sub-IO, while io_ext here is the uncapped [lis_pos, lis_endpos). Those sub-locks on healthy OSTs are then turned into placeholders instead of being enqueued.
That may well be harmless (no pages are rebuilt there), but it is not what the comment says ("as it routes around the OST, is rebuilt"), and it widens the placeholder use from unavailable OSTs to every stripe past EOF of a degraded read. If the patch is refreshed, either intersect with the EOF-capped extent here, or document the past-EOF case in the comment and commit message.
reply Gerrit AI review for Lustre osc_request.c:4231 — (minor) osc_setup_common() is also called by mdc_setup(), and DoM reads go through the same osc_queue_sync_pages()/osc_build_rpc() path, so
Gerrit AI review for Lustre
(minor) osc_setup_common() is also called by mdc_setup(), and DoM reads go through the same osc_queue_sync_pages()/osc_build_rpc() path, so a mirrored file with a DoM component gets soft deadlines on its MDT reads with slow_read_pct=300. But slow_read_pct, slow_read_min_ms and slow_read_stats are only registered for osc, so an admin cannot see or turn this off for the MDC (`osc.*.slow_read_pct=0` does not cover it). Should MDC either get the same tunables, or start with cl_slow_read_pct = 0?
tags: pt_ecro
owner Maximilian Dilger · uploader Andreas Dilger · PS52 uploaded 10d ago · NEW · open in Gerrit ↗
commit message
LU-12669 lov: slow and dead OST detection for degraded reads
A read of an EC file whose data stripe is on a dead OST waits for
the RPC's adaptive timeout, 7 s in production, before it is
reconstructed from parity; a slow OSS extends that with early
replies, and even a dead import costs the FLR retry rounds first.
Give such reads a soft deadline and route around the OST. A
request past it fails with -ETIMEDOUT without failing the import or
touching the adaptive timeout. Each OSC keeps a smoothed OST_READ
latency and deviation per RPC size, as for the TCP retransmission
timer, and a top-level no-delay read of an EC or mirrored file gets
a deadline, counted from its send, of the largest of
osc.*.slow_read_pct (default 300) percent of the smoothed latency,
that latency plus four deviations, and osc.*.slow_read_min_ms
(default 250 ms for a non-rotational OST, 2 s otherwise). An
abandoned read marks the import slow for four times its deadline;
each further soft timeout before a successful read doubles the
deadline and the mark, up to the adaptive timeout.
LOV treats a deactivated, invalid, disconnected or slow-marked import
as unavailable, but not one reconnecting from idle. A read of a dead
stripe is reconstructed at once when its raid set's own parity covers
its dead stripes, and of a slow-marked one only when it covers all of
its unavailable stripes; otherwise the read waits for them, e.g. until
an OSS failover completes. A read spanning several raid sets waits if
any of them cannot be rebuilt. With no in-sync parity the file reads
like a plain mirror. A read of part of a raid set, whose
reconstruction reads many times its size, gets no soft deadline and is
not reconstructed around a slow stripe when most of the set's other
stripes are on OSTs running at over twice their median latency since
mount and over an eighth of slow_read_min_ms. A plain mirror's
buffered reads get the same deadline and rotate mirrors on expiry,
unless no other mirror can serve the read. An EC read skips the lock
and read of a stripe it reconstructs by having no sub-IO for it,
rather than through the lso_status shared with other readers.
osc.*.slow_read_stats shows the estimates and counters.
A 1MiB read of stripe 0 of a 4+2 EC file on an 8-OST VM, with one
30s stall of its OST (OBD_FAIL_OST_BRW_PAUSE_BULK), then 200 1MiB
direct and 200 4KiB buffered random reads while 4 writers load all
OSTs:
slow_read_pct 0 (off) 300 (default)
direct read, stall 30053ms 2069ms
buffered read, stall 30055ms 2048ms
reads under load: 0 soft timeouts, no extra parity or survivor reads
Also fix lov_io_set_range() rounding the reconstruction range end
past its component, which LBUGged "uncovered page!"; the
ra_cur_pages leak in ll_readahead_handle_work() when
cl_io_rw_init() fails, which stopped readahead for the mount; and
do_file_read_iter() never clearing via_hybrid_switched, which ran
later O_DIRECT AIO reads on the same lu_env synchronously. Also fix
ll_readahead_handle_work() passing a page index and count to
cl_io_rw_init() as bytes, which routed async readahead of FLR and EC
files by the wrong extent, and the client io_latency_stats arrays
being one size short for a maximum-size RPC.
Add sanity-ec 54a-54k, and change test_29a to check that a read with
more stripes lost than parity waits for their OSTs.
Test-Parameters: testlist=sanity-ec ostcount=8
Test-Parameters: testlist=sanity-ec ostcount=8 fstype=zfs
Test-Parameters: testlist=sanity,sanity-flr ostcount=8
Fixes: c2791674260b ("LU-12043 llite: improve single-thread read performance")
Fixes: 3fc4243da7ef ("LU-13802 llite: tag switched hybrid IOs")
Fixes: 783c13bb0b8f ("LU-12669 ec: recover data from parity")
Fixes: d67cf23fb18a ("LU-18993 osc: Add IO RPC latency statistics by size")
Signed-off-by: Maximilian Dilger <mdilger@whamcloud.com>
Signed-off-by: Andreas Dilger <adilger@thelustrecollective.com>
Assisted-by: ClaudeCode:claude-opus-5.5 ltvm,llm_code_and_review_tools
Change-Id: I0913e1ee977c9850193c92835edb185b0aedc6d4
69392
master
J –B ✓T ✓R 0/2
LU-12669 ec: wait for stripes that parity cannot rebuild
reviewing Andreas Dilger · CI green — awaiting your review
pt_ecro218_review_priority
1 unresolved
L +289 −36
9h
LU-12669 ec: wait for stripes that parity cannot rebuild
reviewing Andreas Dilger · CI green — awaiting your review
pt_ecro218_review_priority
1 unresolved
L +289 −36
9h
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-zfs-part-1 | RHEL 9.8 / x86_64 | ran 3 tests. 1 tests failed: sanity. | session |
build #134706 SUCCESS · tests all Maloo sessions
no vote yet: Keguang Xu, Marc Vef, Zhenyu Xu
patchsets:
PS1 10-03
PS2 10-14
PS3 10-28
threads: 1 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Marc Vef patchset comment — Conflicts with master-next: Conflicts with #69350 LU-12669 ec: create lock placeholder for reconstructed pages, number 54 in the queue: lust
Marc Vef
Conflicts with master-next: Conflicts with #69350 LU-12669 ec: create lock placeholder for reconstructed pages, number 54 in the queue: lustre/include/cl_object.h
tags: pt_ecro 218_review_priority
owner Andreas Dilger · uploader Andreas Dilger · PS3 uploaded 6d ago · NEW · open in Gerrit ↗
commit message
LU-12669 ec: wait for stripes that parity cannot rebuild
A read of an EC file whose raid set has more data stripes on stopped
OSTs than parity can rebuild fails with -EAGAIN or -EIO, while the
same read of a file without parity waits for the OSTs to return,
e.g. after an OSS failover. Adding parity to a file should not make
it less available than a plain striped file.
When CIT_EC_RD finds too many unavailable stripes or too little
parity, set the new cl_io::ci_ec_wait, which cl_io_loop() turns into
a restart, and record that raid set's range. Restart the read up to
the start of that raid set as CIT_EC_RD, so earlier raid sets are
still rebuilt from parity, then read that raid set as a plain read
without the no-delay flag, which waits for the stripes' OSTs. The
rest of the read goes back to the no-delay read, so later raid sets
are also rebuilt from parity. A synchronous direct read whose aio
was freed for the CIT_EC_RD restart gets a new one. A read of a
deactivated OST still fails at once. Since waiting for the OSTs is
not an error, print a debug message instead of a console warning.
Change sanity-ec test_29a to check that such a buffered or direct
read waits for its OSTs and then returns the right data, and add
test_29b and test_29c for reads whose second or first raid set is
rebuilt from parity.
Test-Parameters: testlist=sanity-ec ostcount=8
Fixes: 783c13bb0b8f ("LU-12669 ec: recover data from parity")
Signed-off-by: Andreas Dilger <adilger@thelustrecollective.com>
Assisted-by: ClaudeCode:claude-opus-5-5 ltvm llm_code_and_review_tools
Change-Id: I9956bab1b63744d0b52d03268b95c78ca73ebbe5
69697
master
J –B ✓T ✓R +2/2
LU-20967 osd-ldiskfs: name the failure_domain local file
reviewing Andreas Dilger · CI green — awaiting your review
218_review_blockerpt_ecro218_review_priority
CI@PS7
4 unresolved
L +320 −5
10h
LU-20967 osd-ldiskfs: name the failure_domain local file
reviewing Andreas Dilger · CI green — awaiting your review
218_review_blockerpt_ecro218_review_priority
CI@PS7
4 unresolved
L +320 −5
10h
build #134528 SUCCESS · tests all Maloo sessions
reviews:
Chris Walker +1 · Alex Zhuravlev +1
no vote yet: Marc Vef
patchsets:
PS4 10-26
PS5 10-27
PS6 10-27
PS7 10-27
PS8 11-02
+3 earlier
PS1 10-15 PS2 10-21 Marc Vef PS3 10-22threads: 4 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Gerrit AI review for Lustre COMMIT_MSG:41 — (style) This isn't a bug, but contrib/git-hooks/commit-msg rejects this trailer ("commit message invalid signoff section line"), because Co-
Gerrit AI review for Lustre
(style) This isn't a bug, but contrib/git-hooks/commit-msg rejects this trailer ("commit message invalid signoff section line"), because Co-authored-by is not in its accepted tag list (Acked-by, Tested-by, Reported-by, Reviewed-by, Suggested-by, CC). A second Signed-off-by: line for the co-author would pass the hook, if the patch is refreshed.
reply Andreas Dilger osd_scrub.c:2530 — The relink should check the mode on the inode and insert the dirent with the correct type.
Gerrit AI review for Lustre
(defect) This loop runs for every osd_lf_maps[] entry with a non-zero FID, not only OLF_SHOW_NAME regular files as the osd_lf_relink() comment says. Two side effects:
- For entries without OLF_SHOW_NAME (lost+found/OSD_LPF_OID, index_backup/INDEX_BACKUP_OID), osd_lf_fid2name() returns "". osd_obj_spec_insert() then returns 0 without inserting anything, so osd_lf_relink() returns true. The stale-mapping deletion is silently skipped, and a journal handle is started for nothing.
- update_log_dir is OLF_SHOW_NAME, and on MDT0000 its FID from lu_update_log_dir_fid(fid, 0) equals the map FID {FID_SEQ_UPDATE_LOG_DIR, 0, 0}. If its name is lost, it gets relinked through osd_obj_add_entry(), which hardcodes `i_mode = S_IFREG`. That produces a regular-file dirent for a directory. If e2fsck pass 3 already reconnected it to /lost+found, it also produces a hard link to a directory.
Should the relink be restricted to `(map->olm_flags & OLF_SHOW_NAME) && !(map->olm_flags & (OLF_SCAN_SUBITEMS | OLF_IDX_IN_FID))`, or should the inode be checked for S_ISREG before relinking?
Andreas Dilger
The relink should check the mode on the inode and insert the dirent with the correct type.
reply Andreas Dilger osd_scrub.c:2476 — Seems reasonable to fix.
Gerrit AI review for Lustre
(minor) The kernel-doc says %false means "no such object", but osd_lf_relink() also returns false when the object does exist and the relink just failed:
osd_oi_lookup() -> -EIO / -ENOMEM
osd_iget() -> -ENOMEM / -EIO (not only -ENOENT/-ESTALE)
osd_journal_start_sb() -> error
osd_obj_spec_insert() -> -ENOSPC, etc.
In each case osd_initial_OI_scrub() then calls osd_scrub_refresh_mapping(DTO_INDEX_DELETE) and drops the OI mapping of an inode that still exists. That leaves last_rcvd, failure_domain, etc. orphaned, which is the outcome this function is meant to prevent. The old code dropped the mapping in these cases too, so this isn't new breakage.
If the patch is refreshed, consider returning an int and dropping the mapping only for -ENOENT/-ESTALE, or at least correcting the Return: description.
Andreas Dilger
Seems reasonable to fix.
reply Alex Zhuravlev sanity-scrub.sh:1601 — probably we could avoid this block if failure_domain is presented already?
Alex Zhuravlev
probably we could avoid this block if failure_domain is presented already?
tags: 218_review_blocker pt_ecro 218_review_priority
build/test results are from PS7 — PS8…PS8 changed only the commit message (votes copied, CI not re-run)
owner Andreas Dilger · uploader Andreas Dilger · PS8 uploaded 1d ago · NEW · open in Gerrit ↗
commit message
LU-20967 osd-ldiskfs: name the failure_domain local file
The failure_domain file added in LU-19066 has no entry in the
osd_lf_maps[] table in osd_scrub.c, so osd_lf_fid2name() returns no
name for its FID and osd_obj_spec_insert() creates no directory entry
for it in the OST device root. e2fsck then treats the inode as
disconnected and wants to reconnect it into lost+found:
Pass 4: Checking reference counts
Unattached inode 88
Connect to /lost+found? no
myfs-OST0003: ***** WARNING: Filesystem still has errors *****
Add a FAILURE_DOMAIN entry to osd_lf_maps[] with OLF_SHOW_NAME, like
health_check, so the file is linked into the device root under its own
name and e2fsck no longer reports an error.
Existing targets already have the unnamed inode, and the same can
happen to any named local file whose name is lost to directory
corruption that e2fsck repaired. The initial OI scrub already walks
osd_lf_maps[] to drop stale OI mappings for files that no longer
exist; make it instead relink a file that still has a valid OI mapping
and inode but no name in the root, so such files are recovered on
mount rather than left unattached. The relink is restricted to plain
named regular-file entries and keeps the OI mapping on a transient
failure, so an inode that still exists is never orphaned.
When e2fsck has already reconnected such a file into lost+found under
a numeric name, the OI scrub now renames it back out of lost+found to
its proper name during the lost+found scan, moving the single name
rather than adding a second one, so the link count stays correct.
Fixes: 612732b59482 ("LU-19066 obdfilter: Create a failure_domain file")
Signed-off-by: Andreas Dilger <adilger@thelustrecollective.com>
Co-authored-by: Chris Walker <chris.walker@netapp.com>
Assisted-by: ClaudeCode:claude-opus-4-8 ltvm llm_code_and_review_tools
Change-Id: Idf1c415213059670f4fbac1b708526acc73ebbe5
70150
master
J –B ✓T ✓R 0/2
LU-19823 lod: fit EC raid sets to the OSTs without domains
reviewing Andreas Dilger · CI green — awaiting your review
pt_ecro
2 unresolved
M +80 −24
15h
LU-19823 lod: fit EC raid sets to the OSTs without domains
reviewing Andreas Dilger · CI green — awaiting your review
pt_ecro
2 unresolved
M +80 −24
15h
build #134751 SUCCESS · tests all Maloo sessions
no vote yet: Keguang Xu
threads: 2 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Gerrit AI review for Lustre lfs-setstripe.1:419 — (minor) Following the lod_ec_fit_fdoms() question: when STRIPE_COUNT is larger than the available OSTs, the raid sets can end up below 3/4 o
Gerrit AI review for Lustre
(minor) Following the lod_ec_fit_fdoms() question: when STRIPE_COUNT is larger than the available OSTs, the raid sets can end up below 3/4 of DATA_STRIPES (e.g. `-c 12 --ec 6+3` on 7 OSTs gives 4+3 and 3+3). If that is intended, could this sentence say the floor only applies when the stripe count fits the OSTs?
reply Gerrit AI review for Lustre lod_qos.c:3882 — (minor) Once count is clamped to nost, can the raid sets drop below the K - K/4 floor that the commit message and man page promise? The earl
Gerrit AI review for Lustre
(minor) Once count is clamped to nost, can the raid sets drop below the K - K/4 floor that the commit message and man page promise? The early return here skips the kmin check, and RR/QoS then re-split the stripes they place.
Example, without domains (or with 8 OSTs in 8 domains), `-c 12 --ec 6+3`:
count = min(12, 8) = 8
ec_split_stripes(8, 6) -> 2 x 4, k = 4
nfdom 8 >= k + p 7 -> return 0
lod_ost_alloc_rr() places 8, lod_ec_shrink_data_geometry() -> 2 x 4
The file gets two 4+3 raid sets, but kmin for 6 is 5. On 7 OSTs it gets 4+3 and 3+3. With domains configured the parent returned ENOSPC for both cases (k2 = 4 < kmin), so for those setups this is a behaviour change.
At the same time `-c 6 --ec 6+3` on 7 OSTs still fails, because k2 = 4 < kmin = 5. So the same 6+3 request is refused at K=4 when it is narrow and accepted at K=3 or 4 when it is wider than the OSTs. Should the clamped path also compare k against kmin, or is the floor meant to apply only to the parity fit?
tags: pt_ecro
owner Andreas Dilger · uploader Andreas Dilger · PS1 uploaded 5d ago · NEW · open in Gerrit ↗
commit message
LU-19823 lod: fit EC raid sets to the OSTs without domains
With "lfs setstripe -c 6 --ec 6+3" on 8 OSTs, QoS shrank the single
raid set to 5+3 so that its parity fit, while RR placed all 6 data
stripes and then failed with ENOSPC when it found only 2 OSTs left
for the parity. Which one ran depended on the free space balance of
the OSTs, so sanity-ec test_27h passed or failed depending on the
earlier tests.
lod_ec_fit_fdoms() already fits the raid sets to the failure domains
before either allocator places the data. Without failure domains,
count each active OST as a domain of its own, so RR and QoS fit the
same K. A -c component wider than the active OSTs is fitted by the
stripes it can place, and if its raid sets must shrink, still to at
least 3/4 of the requested K. As with domains, a layout may be
stored with the smaller K of its raid sets. Describe this in
lfs-setstripe.1.
Have sanity-ec test_27h check that a layout which can't fit fails, and
one that can gets fewer data stripes, with both the RR and QoS
allocators.
Fixes: c53abca9f9ee ("LU-19852 lod: raidset aware stripe allocator")
Signed-off-by: Andreas Dilger <adilger@thelustrecollective.com>
Assisted-by: ClaudeCode:claude-opus-5.5 ltvm,llm_code_and_review_tools
Change-Id: Ief45b5df095e03fd96065b85eb6b1008bd3ebbe5
69422
master
J –B ✓T ✓R 0/2
LU-8933 lod: leave inactive targets out of the RR array
reviewing Andreas Dilger · CI green — awaiting your review
218_review_prioritypt_ecro
CI@PS9
2 unresolved
L +675 −128
16h
LU-8933 lod: leave inactive targets out of the RR array
reviewing Andreas Dilger · CI green — awaiting your review
218_review_prioritypt_ecro
CI@PS9
2 unresolved
L +675 −128
16h
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-1 | RHEL 9.8 / x86_64 | ran 3 tests. 1 tests failed: sanity. | session |
build #135075 SUCCESS · tests all Maloo sessions
no vote yet: patrick bot, Keguang Xu
patchsets:
PS6 10-31 patrick bot
PS7 11-01 patrick bot
PS8 11-01 patrick bot
PS9 11-01
PS10 11-03
+5 earlier
PS1 10-05 PS2 10-10 PS3 10-13 PS4 10-31 patrick bot PS5 10-31threads: 2 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Gerrit AI review for Lustre COMMIT_MSG:22 — (minor) Is "full" the right example here? A full MDT was already skipped before this patch: lod_mdt_alloc_rr() and lod_mdt_alloc_qos() call
Gerrit AI review for Lustre
(minor) Is "full" the right example here? A full MDT was already skipped before this patch: lod_mdt_alloc_rr() and lod_mdt_alloc_qos() call lod_statfs_check() on the same cached ltd_statfs that made lod_statfs_and_check() mark it inactive, and that rejects OS_STATFS_ENOSPC/ENOINO for MDTs. The case that is really new seems to be "deactivated by config" (or a statfs error other than -ENOTCONN). This can be fixed whenever the patch is next refreshed.
reply Gerrit AI review for Lustre sanity.sh:7262 — (suggestion) Would this subtest pass without the patch too? "lctl --device %osp deactivate" goes ptlrpc_set_import_active(0) -> IMP_EVENT_IN
Gerrit AI review for Lustre
(suggestion) Would this subtest pass without the patch too? "lctl --device %osp deactivate" goes ptlrpc_set_import_active(0) -> IMP_EVENT_INACTIVE -> opd_imp_active = 0. After that, osp_statfs() returns -ENOTCONN, and lod_statfs_and_check() sets ltd_discon = 1 along with ltd_active = 0. Before this patch, lod_mdt_alloc_rr() and lod_mdt_alloc_qos() already skipped ltd_discon MDTs. With MDSCOUNT=3, the old RR loop also gives MDSCOUNT - 1 stripes: the deactivated MDT is skipped, and the use_degraded pass finds the other remote MDT already used. So the stripe count and "not on MDT0001" checks seem to hold on the old code as well. The new `!mdt->ltd_active` checks only matter for an MDT that is inactive but not ltd_discon, e.g. the lod_process_config() "osp.*.active=0" path before the next statfs, or a statfs error other than -ENOTCONN. If the patch is refreshed, could the test reach one of those, or check its result against an unpatched MDS, so that it fails without the fix?
tags: 218_review_priority pt_ecro
build/test results are from PS9 — PS10…PS10 changed only the commit message (votes copied, CI not re-run)
owner Andreas Dilger · uploader Andreas Dilger · PS10 uploaded 17h ago · NEW · open in Gerrit ↗
commit message
LU-8933 lod: leave inactive targets out of the RR array
Inactive OSTs stayed in the round-robin array, so every layout that
reached one skipped it and used up an index, and the OST after it in
the array got its share of first stripes as well as its own.
Leave inactive targets out of the array built by lod_qos_calc_rr(),
unless all of them are inactive, and rebuild the arrays when a target
becomes active or inactive, counted in lq_rr_gen along with failure
domain changes. The RR allocators index the array by its own size
rather than the pool's. The periodic statfs update still checks the
inactive targets, and notices when they become active again. OSTs
that are full, read-only, or have max_create_count=0 are inactive for
this too, so they also leave the array until they can be used again.
This also stops directory stripes being allocated on an inactive MDT
that is not disconnected, e.g. one that is full or deactivated by
config, which lod_mdt_alloc_rr() and lod_mdt_alloc_qos() did not check
for. Keep returning -EINPROGRESS when no target could be used and a
target of the pool is disconnected, or one left out of the array
became active since it was built, and don't let the smaller array
raise the rounds of an overstriped directory above
lod_max_stripes_per_mdt. Overstriped OST layouts from the RR
allocator are likewise spread over the active OSTs only, e.g. "lfs
setstripe -C 8" with 1 of 8 OSTs inactive gets 8 stripes with 2 on one
OST, instead of 7 stripes.
Rebuilding the arrays after a target becomes active or inactive only
tries to take lq_rw_sem, and the allocators keep using the old array,
so creates don't wait behind allocators sleeping in precreate
(LU-15393). Failure domain changes are now rebuilt the same way.
Only if the array stays stale for 10 * qos_maxage, or at once and then
every qos_maxage after an omitted target becomes active, does one
thread wait at most 2s for it, as QoS allocation does. Move that
timed wait to lu_down_write_timeout() for both, and the backoff to
lu_rr_should_wait() and lu_rr_wait_failed(), which lod_rr_test checks.
Count the targets that become active in lq_active_gen for this.
Also avoid a static checker warning about lrfs_count - 1 underflowing
in lu_rr_fdoms_init().
Add sanity test_51i to check the first stripe balance and overstriping
with OST0001 deactivated, and test_51k to check that RR and QoS
directory stripes skip a deactivated MDT. test_51i waits until every
OST has enough precreated objects, using up the short FID sequence
tail of any OST that has too few. With 8 OSTs and 800 2-stripe files
test_51i gives these first stripes per active OST:
before 50-200
after 113-115
Check up to 32 OSTs in sanity test_51g, or 64 with SLOW=yes, and
check the OSSs used by other mirrors once per layout in lod_rr_test
rather than once per OST, so that test_51g takes about 20s.
Use the renamed timer cleanup API where available, with a fallback for
older kernels.
Fixes: ced540165ef5 ("LU-16623 lod: handle object allocation consistently")
Signed-off-by: Andreas Dilger <adilger@thelustrecollective.com>
Assisted-by: ClaudeCode:claude-opus-5.5 ltvm,llm_code_and_review_tools
Assisted-by: Codex:gpt-6.1-sol
Change-Id: I8361eea7d707559ba65a9377fa642ca7833ebbe5
66882
master
J –B ✓T ✓R +2/2
LU-20211 mdt: trunc(0) layout replace on inactive stripes
reviewing Keguang Xu · CI green — awaiting your review
pt_ecro218_review_priority
3 unresolved
XL +1320 −64
17h
LU-20211 mdt: trunc(0) layout replace on inactive stripes
reviewing Keguang Xu · CI green — awaiting your review
pt_ecro218_review_priority
3 unresolved
XL +1320 −64
17h
build #135174 SUCCESS · tests all Maloo sessions
reviews:
Andreas Dilger +1 · Zhenyu Xu +1
no vote yet: Qian Yingjin, Marc Vef
patchsets:
PS41 10-28
PS42 10-30
PS43 11-02 Andreas Dilger
PS44 11-02 Andreas Dilger
PS45 11-02 Andreas Dilger
+29 earlier
PS1 06-26 PS13 07-27 PS14 07-28 PS15 07-31 PS16 08-05 PS17 08-06 PS18 08-07 PS19 08-12 PS20 08-20 PS21 08-25 PS22 08-25 PS23 09-02 PS24 09-08 PS25 09-08 PS26 09-09 PS27 09-11 PS28 09-17 PS29 10-08 Andreas Dilger PS30 10-08 Andreas Dilger PS31 10-08 Andreas Dilger PS32 10-12 PS33 10-12 PS34 10-13 Andreas Dilger PS35 10-15 Andreas Dilger PS36 10-15 Andreas Dilger PS37 10-16 Andreas Dilger PS38 10-19 Andreas Dilger PS39 10-22 Andreas Dilger PS40 10-26 Andreas Dilgerthreads: 2 need your reply · 0 waiting on others · 1 own notes · 0 bot
note Ronnie Sahlberg cl_object.h:226 — Or change CL_FSYNC_LOCAL = 0 and a BUILD_BUG_ON(CL_FSYNC_LOCAL != 0) would make it safe if future code blindly clears the conf where t
Ronnie Sahlberg
The risk is for future code. A new layout-change caller that just zeroes conf would get CL_FSYNC_NONE without anyone noticing. Prune would start writeback but not wait for it, and the old layout would be torn down while dirty pages were still being written to its objects. The likely result is lost or misdirected writes, or crashes and assertion failures during cleanup. The code compiles fine and nothing warns, so this would be hard to trace back to the missing field.
Ronnie Sahlberg
Or change CL_FSYNC_LOCAL = 0 and a BUILD_BUG_ON(CL_FSYNC_LOCAL != 0) would make it safe if future code blindly clears the conf where this enum is embedded.
reply Gerrit AI review for Lustre mdd_object.c:4453 — (style) This isn't a bug, but the kernel-doc for this non-static function does not describe @env, @obj or @mlc, and has no Return: section.
Gerrit AI review for Lustre
(style) This isn't a bug, but the kernel-doc for this non-static function does not describe @env, @obj or @mlc, and has no Return: section. `kernel-doc -v` warns about all three parameters. If the patch is refreshed, consider adding them.
reply Gerrit AI review for Lustre mdt_reint.c:955 — (defect) Can the victim's new layout land on the same OST that lod_ost_offline() just reported as offline?
Gerrit AI review for Lustre
(defect) Can the victim's new layout land on the same OST that lod_ost_offline() just reported as offline?
The template keeps the source stripe count as an assigned count, so lod_stripe_count_min() requires all of it. A stopped OST is not excluded by the allocator. osp_statfs() returns -EAGAIN for a DISCON import, lod_statfs_and_check() keeps it active, and the last RR pass accepts it:
lod_ost_alloc_qos() -> -EAGAIN (too few good OSTs)
lod_ost_alloc_rr(): speed == 2, connecting -> rc = 0
osp_precreate_reserve(): opd_pre_status -ENODEV, objects still in the pool -> success
The reserve hands out a precreated object without contacting the OST. Take 4 OSTs, a file created with `-c -1` and OST0 stopped. trunc(0) instantiates 4 stripes with one on OST0, swaps, bumps the generation and replies MS_LAYOUT_REPLACED. The client's punch of the new object then blocks on OST0, the same hang this patch is meant to avoid. The swap and the new objects are wasted as well. The comment in sanity-flr test_50e ("RR last-resort may place on the DISCONN OST") suggests this was seen in testing.
Would it work to run mo_layout_check(MD_LAYOUT_UNAVAILABLE) on the victim after mo_layout_change() and skip the swap if it still reports an unavailable stripe? setattr would then fall back to the normal trunc(0), as the commit message describes for allocation failures.
tags: pt_ecro 218_review_priority
owner Keguang Xu · uploader Andreas Dilger · PS45 uploaded 1d ago · NEW · open in Gerrit ↗
commit message
LU-20211 mdt: trunc(0) layout replace on inactive stripes When truncate(0) hits a file whose layout references deactivated or disconnected OSTs, and the client advertises OBD_CONNECT2_LAYOUT_REPLACE, replace the layout: move the old layout onto a volatile victim and instantiate a fresh layout on the file from the existing pattern via QoS/RR. A full or read-only OST is still usable and does not trigger this. If the new layout cannot be allocated, keep the old layout and do a normal trunc(0). Skip it for a lease holder (MDS_TRUNC_KEEP_LEASE): lfs mirror resync and copy truncate only one mirror, and the in-sync mirror must stay. An OST is offline if it was deactivated or its OSP import is not connected, which is checked directly since LOD only learns of the disconnection at its next statfs refresh. After the layout swap, do not update the parent FID of the volatile victim's objects, which are destroyed on close, nor of any object on an offline OST. That update reads the object's filter_fid first, and the RPC would wait for an unreachable OST while LAYOUT EX is held. An OST that reconnects between the declare and execute passes is also skipped at execute, since no OSP sub-transaction was declared for it. Skip replace when any component has LCME_FL_NOSYNC. That flag freezes the mirror's existing objects; swap would discard the snapshot. The NOSYNC test runs once, inside mdt_replace_unavailable_layout(), which returns 0 so setattr falls through to a normal trunc(0). mdt_reint_setattr() does not check NOSYNC. It probes for an unavailable layout before mdt_attr_set() and without a DLM lock, so a healthy trunc(0) skips LAYOUT EX. If the probe finds one, mdt_attr_set() takes UPDATE|LAYOUT|XATTR EX in a single enqueue and replaces the layout under it. A second lock on the file while the saved UPDATE lock is held could queue behind a setxattr waiting for both, and deadlock (LU-3601). The unavailable-stripe result is re-checked under the lock, so a concurrent trunc(0) that already replaced the layout does not allocate a second set of objects. Extend the layout API with MD_LAYOUT_UNAVAILABLE (detect stripes on offline OSTs) and MD_LAYOUT_INSTANTIATE (allocate from a source pattern). Add lod_generate_lovea_template() to emit uninstantiated LOVEA templates that omit placement hints so new stripes use QoS/RR, and trigger replacement from mdt_reint_setattr() via mdt_replace_unavailable_layout(). Layout-type handling for templates / instantiate: - DoM: never carries OST objects; force stripe_count to 0 and skip the OST object array so LOVEA size matches INIT DoM. - PFL/DoM: keep the DoM component and replace only OST components. - SEL: coerce LOV_MAGIC_SEL to COMP_V1 for lod_qos_parse_config(); keep LCME_FL_EXTENSION and restamp SEL when LOVEA is written. - EC: re-emit bound data/parity as unbound (IS_LINK_ID + shared link id) so lod_qos_prep_create() can pair before component IDs exist. Layout replace creates a volatile victim via mdt_orphan_open(). Set mlc_no_inherit on MD_LAYOUT_INSTANTIATE so the new layout does not inherit the local ROOT default pool from the orphan parent. Zero mti_spec first defensively before the volatile create; mdt_thread_info_reset() already clears it per request, and setattr does not leave create state there. After a successful swap, sync the object before replying so the new layout is durable; replay skips replace. On success, return MS_LAYOUT_REPLACED (with OBD_MD_FLEASIZE) in the setattr reply so the client applies the new LOVEA. Before applying it, the client discards its dirty pages past the returned size (all of them for trunc(0)), so prune does not write them back to unavailable OSTs. This lets a later server replace only the OST objects past a non-zero truncate size. The client reserves the default layout size in the setattr reply buffer of any truncate. A resent trunc(0) setattr (lost or truncated reply) returns the current layout with MS_LAYOUT_REPLACED, whether or not the original request replaced it; the client ignores a layout whose generation is unchanged. Add sanity/test_27xt (plain, PFL/DoM, SEL), sanity-ec/test_74b (EC), and sanity-flr/test_50e (mirrors, resync), which stop the OST. Add sanity/test_27xv, which holds the replace with OBD_FAIL_MDS_LAYOUT_REPLACE_PAUSE while a setxattr from a second mount waits for the file, with sync_lock_cancel=never so the saved UPDATE lock stays PW, to check for the deadlock. Test-Parameters: testlist=sanity serverversion=2.17 env=SANITY_EXCEPT="24D 27D" Test-Parameters: testlist=sanity-flr ostcount=5 serverversion=2.17 env=SANITY_FLR_EXCEPT="0a 34b" Test-Parameters: testlist=sanity clientversion=2.17 Assisted-by: Cursor:Grok-4.6 llm_code_and_review_tools Signed-off-by: Keguang Xu <kxu@ddn.com> Signed-off-by: Andreas Dilger <adilger@thelustrecollective.com> Assisted-by: ClaudeCode:claude-opus-5.5 ltvm,llm_code_and_review_tools Assisted-by: Cursor:Composer Change-Id: I07e0792a51e144d935cece4b028e17f659e4ccfd
69698
master
J –B ✓T ✓R 0/2
LU-19066 target: add failure domains for MDT devices
reviewing Andreas Dilger · CI green — awaiting your review
CI@PS1
3 unresolved
L +305 −136
1d
LU-19066 target: add failure domains for MDT devices
reviewing Andreas Dilger · CI green — awaiting your review
CI@PS1
3 unresolved
L +305 −136
1d
build #133716 SUCCESS · tests all Maloo sessions
no vote yet: wangdi
patchsets:
PS1 10-15
PS2 11-02
threads: 3 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Andreas Dilger mdt.failure_domain.4:1 — Can be fixed if patch is refreshed, but not required since the failure domain is unused
Gerrit AI review for Lustre
(minor) This `.so` points to obdfilter.failure_domain.4, but that page describes only OSTs. Its NAME line says "control the failure_domain for OSTs", Scope is "Per-OST device", Config is "Always present on OST devices", and SYNOPSIS/EXAMPLES show only `obdfilter.*.failure_domain`. Running `man mdt.failure_domain` would never mention the MDT parameter. Should the shared page be updated to cover `mdt.*.failure_domain` too (NAME, SYNOPSIS, Scope, MODULES, and an MDT example)?
Andreas Dilger
Can be fixed if patch is refreshed, but not required since the failure domain is unused
reply Gerrit AI review for Lustre tgt_main.c:587 — (style) This isn't a bug, but these helpers are sysfs show/store backends, not seq_file operations. In Lustre the `_seq_show`/`_seq_store` s
Gerrit AI review for Lustre
(style) This isn't a bug, but these helpers are sysfs show/store backends, not seq_file operations. In Lustre the `_seq_show`/`_seq_store` suffix usually means a seq_file handler. If the patch is refreshed, consider tgt_failure_domain_show()/tgt_failure_domain_store() (and the matching declarations in lu_target.h).
reply Gerrit AI review for Lustre tgt_main.c:763 — (defect) This call sits after the early return at the OBDF_REPLAYABLE check:
Gerrit AI review for Lustre
(defect) This call sits after the early return at the OBDF_REPLAYABLE check:
if (!test_bit(OBDF_REPLAYABLE, obd->obd_flags))
RETURN(0);
mdt_init0() clears OBDF_REPLAYABLE when the setup record has "n" in buffer 4. mgs_write_log_mdt0() writes that "n" for `failover.mode=failout`. On a failout MDT the stored failure_domain is therefore never read, and obt_failure_domain stays 0 after every mount. A `set_param mdt.*.failure_domain=N` is still written to disk, but it reads back as 0 after the next restart.
The OST has the same problem. ofd_fs_setup() used to call ofd_failure_domain_read() unconditionally. Now an OFD set up with OBDF_REPLAYABLE cleared (the 'n' check in ofd_init0()) also stops loading its domain, which is a regression from the current OST behaviour.
Could the read move above the OBDF_REPLAYABLE check, guarded by `dt != NULL` for obdecho? Or could ofd_fs_setup()/mdt_init0() call it directly?
build/test results are from PS1 — PS2…PS2 changed only the commit message (votes copied, CI not re-run)
owner Andreas Dilger · uploader Andreas Dilger · PS2 uploaded 1d ago · NEW · open in Gerrit ↗
commit message
LU-19066 target: add failure domains for MDT devices A per-OST failure_domain was added so the MDS can keep mirror and EC parity stripes in different hardware fault domains from the data stripes. MDTs have no equivalent, so fault domains cannot be taken into account when placing remote directories or DNE layouts across MDTs. Add the same failure_domain to MDT devices. Move the local-file read/write code out of the OFD into generic tgt_failure_domain_read() and tgt_failure_domain_write() helpers in the target layer shared by OST and MDT, and rename OFD_FAILURE_DOMAIN_OID to FAILURE_DOMAIN_OID. The MDT loads its failure_domain at setup, exposes it through the mdt.*.failure_domain parameter, and reports it in obd_statfs so that "lfs df --mdt=N --output=domain" and the LOD object allocator can use it, as for OSTs. Also make the shared helper safe on a read-only device: read without creating the file and write returns -EROFS, so an rdonly_dev or snapshot mount of a target formatted before the file existed still works. The failure_domain is a lone __u32 with no invariant tying it to any neighbouring field, so access it with READ_ONCE()/WRITE_ONCE() rather than taking ofd_flags_lock, keeping a lock out of the OST_STATFS reply path, as suggested in review of the LU-17000 data-race fix. Signed-off-by: Andreas Dilger <adilger@thelustrecollective.com> Assisted-by: ClaudeCode:claude-opus-5-5 ltvm llm_code_and_review_tools Change-Id: I7b9c4d89652efb30aee25ef5484b4873de3ebbe5
70175
master
J –B ✓T ✓R +1/2
LU-20565 tests: run sanity-ec with fewer OSTs
reviewing Andreas Dilger · CI green — awaiting your review
pt_ecro
4 unresolved
M +31 −29
1d
LU-20565 tests: run sanity-ec with fewer OSTs
reviewing Andreas Dilger · CI green — awaiting your review
pt_ecro
4 unresolved
M +31 −29
1d
build #134789 SUCCESS · tests all Maloo sessions
reviews:
Keguang Xu +1
no vote yet: Marc Vef
threads: 4 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Andreas Dilger sanity-ec.sh:1501 — Strange. There was a full session with `testlist=sanity-ec ostcount=4` that passed, so either this subtest is not being run, or the stripe c
Gerrit AI review for Lustre
(minor) test_5a isn't in the list, but it seems to hit the same ENOSPC on 4 OSTs. It hard-codes `-c 4 --ec 4+1` with no OSTCOUNT gate, and a 4+1 raidset needs 5 distinct OSTs. For a single raidset, lod_stripe_count_min() gives the parity component its own cstripe count of unique OSTs, and the reuse/shrink fallbacks in lod_qos.c only run when ec_raidset_count(sc) > 1. None of the later LU-20565 patches in the relation chain touch 5a either. Will the `ostcount=4` session still fail here? If so, 5a could use `-c $EC_DSTRIPE $EC_ARG` like the other subtests, or get a `(( OSTCOUNT >= 5 )) || skip` gate.
Andreas Dilger
Strange. There was a full session with `testlist=sanity-ec ostcount=4` that passed, so either this subtest is not being run, or the stripe count for this component is being shrunk to 3+1 or similar with 4 OSTs? Either way I don't think this is a regression in this patch. It could be fixed if refreshed.
reply Andreas Dilger sanity-ec.sh:1510 — Hmm, this is also checking stripe_count=4, so it isn't clear how this could pass with OSTCOUNT=4?
Andreas Dilger
Hmm, this is also checking stripe_count=4, so it isn't clear how this could pass with OSTCOUNT=4?
reply Andreas Dilger sanity-ec.sh:1558 — I think that is an anti-feature of the tests that all of the components are aligned on raidset boundaries. That isn't always possible (eg.
Gerrit AI review for Lustre
(suggestion) This isn't a bug, but with the scaled geometry the 128M and 1G boundaries are no longer a multiple of the row width when EC_DSTRIPE is 3, 5 or 6 (4, 5, 7 and 8+ OSTs, with 1M stripes). For example, 128M % 3M = 2M. The later patches in this series put each PFL boundary in front of an EC component on a multiple of the row width. If the patch is refreshed, should 5b do the same, e.g. `$((32 * EC_DSTRIPE))M` and `$((256 * EC_DSTRIPE))M`, with the second write's seek moved to match?
Andreas Dilger
I think that is an anti-feature of the tests that all of the components are aligned on raidset boundaries. That isn't always possible (eg. a 64KiB DoM first component with an EC second component). The EC calculations should work properly in this case.
reply Andreas Dilger sanity-ec.sh:4496 — Partial-raidset overwrites should also work properly.
Gerrit AI review for Lustre
(minor) The seek is scaled to the start of row 2, but count=4 isn't scaled. The old test overwrote exactly one full row (seek=8 count=4 with 4x1M rows). Now that only happens when EC_DSTRIPE is 4 or 2, and with 3, 5 or 6 data stripes it is a partial-row overwrite. If the full-row case was intended, count=$EC_DSTRIPE would keep it. Otherwise the commit message's "overwrite from EC_DSTRIPE" could say that only the offset is scaled.
Andreas Dilger
Partial-raidset overwrites should also work properly.
tags: pt_ecro
owner Andreas Dilger · uploader Andreas Dilger · PS1 uploaded 5d ago · NEW · open in Gerrit ↗
commit message
LU-20565 tests: run sanity-ec with fewer OSTs On a filesystem with 4 OSTs, sanity-ec subtests 4e, 5b, 6d, 6e, 6f, 7a, 23a, 23b, 23c, 24a, 25a, 26a and 28a would fail in "lfs setstripe" with "No space left on device (28)", because they hard-code an EC 4+2 geometry and the raidset allocator needs 6 distinct OSTs for it. None of these subtests depends on that geometry, so use the EC_ARG, EC_DSTRIPE and EC_CSTRIPE defaults that enable_ec() scales to OSTCOUNT for the layout and the expected stripe counts. Size the sanity-ec/26a file and overwrite from EC_DSTRIPE so it still covers 5 full rows. Test-Parameters: trivial testlist=sanity-ec Test-Parameters: testlist=sanity-ec ostcount=4 Signed-off-by: Andreas Dilger <adilger@thelustrecollective.com> Assisted-by: ClaudeCode:claude-opus-5-5 ltvm llm_code_and_review_tools Change-Id: Ie76079973f5ee62cb77888d448194913693ebbe5
60181
master
J –B ✓T ✓R 0/2
LU-9 lod: weighted round-robin QoS allocation
reviewing Frederick Dilger · CI green — awaiting your review
2 unresolved
XL +1163 −76
1d
LU-9 lod: weighted round-robin QoS allocation
reviewing Frederick Dilger · CI green — awaiting your review
2 unresolved
XL +1163 −76
1d
build #135077 SUCCESS · tests all Maloo sessions
no vote yet: Andreas Dilger, Patrick Farrell
patchsets:
PS48 10-06 Andreas Dilger
PS49 10-07 Andreas Dilger
PS50 10-10 Andreas Dilger
PS51 10-13 Andreas Dilger
PS52 11-01 Andreas Dilger
+45 earlier
PS1 07-15 PS2 07-15 PS5 07-23 PS6 07-23 PS7 08-06 PS8 08-06 PS9 08-18 PS10 09-06 PS11 09-07 PS12 09-07 PS13 09-07 PS14 09-08 PS15 09-08 PS16 09-14 PS17 09-14 PS18 09-15 PS19 09-16 PS20 09-18 PS21 09-18 PS22 09-18 PS23 09-23 PS24 09-23 PS25 10-01 PS26 10-01 PS27 10-01 PS28 10-04 PS29 10-07 PS30 11-12 PS31 11-12 PS32 11-12 PS33 11-12 PS34 11-12 PS35 01-18 PS36 01-22 PS37 01-22 PS38 01-22 PS39 01-22 PS40 01-22 PS41 01-22 PS42 01-24 PS43 01-28 PS44 01-28 PS45 01-30 PS46 02-05 PS47 10-05 Andreas Dilgerthreads: 3 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Frederick Dilger lod_qos.c:1704 — I don't know if a get_random_u64_below method exists
Andreas Dilger
(defect) This was ok when it was only the OST index number, but if this is tracking the initial weight then it needs to be a 64-bit value, otherwise it may only ever start in OST0000.
Frederick Dilger
Done
Frederick Dilger
I don't know if a get_random_u64_below method exists
reply Gerrit AI review for Lustre lod_qos.c:2909 — (minor) This isn't a bug, but the comment is a bit broader than what lu_qos_weight_adjust() does. Only the weights above the average are mov
Gerrit AI review for Lustre
(minor) This isn't a bug, but the comment is a bit broader than what lu_qos_weight_adjust() does. Only the weights above the average are moved down toward it; weights below the average are left alone. So even at qos_prio_free=0% the allocation isn't plain round-robin when some OSTs are fuller than average. The commit message and lod.qos_prio_free(4) put it precisely ("moves the weights above the average down toward it"), so if the patch is refreshed, maybe use the same wording here.
reply Gerrit AI review for Lustre lproc_lod.c:681 — (style) This isn't a bug, but `is_mdt` is always false here. Only qos_wrr_enable is registered, with no mdt_qos_wrr_enable, and lq_wrr_enabl
Gerrit AI review for Lustre
(style) This isn't a bug, but `is_mdt` is always false here. Only qos_wrr_enable is registered, with no mdt_qos_wrr_enable, and lq_wrr_enable on lod_mdt_descs is never read, because ltd_qos_slot() is only called from lod_ost_alloc_qos(). If the patch is refreshed, consider dropping the parameter in __qos_wrr_enable_show() and __qos_wrr_enable_store(), or folding them into qos_wrr_enable_show()/qos_wrr_enable_store() using &lod->lod_ost_descs directly.
owner Frederick Dilger · uploader Andreas Dilger · PS52 uploaded 2d ago · NEW · open in Gerrit ↗
commit message
LU-9 lod: weighted round-robin QoS allocation
When OST free space is unbalanced, lod_ost_alloc_qos() picks each
stripe at random, weighted by free space less penalties for recently
used OSTs and OSSs. The random choice only balances allocations on
average, so some OSTs get far more or fewer objects than their share,
and first stripes are not balanced at all.
Use the round-robin array and start index for QoS allocation too, and
map each round-robin index to an OST by weight, so that OSTs are used
in proportion to their free space, and in round-robin order if their
free space is the same. Each pass through the array spaces its
indices evenly over the total weight, at least as far apart as the
largest weight so that consecutive indices use different OSTs, or one
per OST if the weights are nearly equal. After every index has been
used as a start, the spacing is shifted by a golden ratio fraction, so
that OSTs whose weight is not a multiple of the spacing get their
share over several passes. An OST gets at most one stripe of a
layout, so cap the weights at 1/stripes of the total and share the
rest among the other OSTs by weight, and overstriped layouts other
than EC still fall back to round-robin allocation.
Drop the penalties from the OST weights, since they only served to
spread the random choices, so the tgt_penalty values shown by
lod.*.qos_ost_weights no longer affect OST allocation. qos_prio_free
now moves the weights above the average down toward it, so 100%
allocates in proportion to free space, and 0% uses the OSTs with more
than the average free space equally. Fuller OSTs keep a weight in
proportion to their free space. lod.*.qos_ost_weights shows the
weights that are used. Scale the weights down by a power of two if
needed so their sums cannot overflow. MDT QoS allocation and the
qos_threshold_rr and qos_prio_free defaults are unchanged.
An OST that can't be used for a stripe now only moves that stripe on
to the next OST in the array. Before, the random choice skipped the
weight of avoided, used or failing OSTs differently than it summed
it, so allocation often failed and fell back to round-robin when
OSTs were offline (LU-20526). Also return success when a layout
using the default striping gets fewer stripes than requested but at
least the minimum, instead of -ENOSPC, which skipped the round-robin
fallback and failed the create.
Add lod.*.qos_wrr_enable, 1 by default, which can be set to 0 to pick
the OSTs at random by the same weights, without the penalties, as a
fallback in case of problems with weighted round-robin allocation.
Add man pages for lod.qos_threshold_rr, lod.qos_prio_free,
lod.qos_maxage and lod.qos_ost_weights, and their mdt_ versions, and
for lod.qos_wrr_enable. Also fix lod.*.qos_maxage, which showed
mdt_qos_maxage.
Add a QoS mode to lod_rr_test and run it in sanity test_51g, and add
sanity test_51h to run test_51d with qos_threshold_rr=0, and to check
that qos_wrr_enable=0 uses all OSTs. Repeat the creates of test_51d
if an OST starts a new FID sequence during them, since it has no
precreated objects for a while. lod_rr_test with 3-48 OSTs on 2-4
OSSs, and more free space on the last OSS, finds these fail to put
4/5-5/4 of each OST's capped share of objects on it, or 2/3-3/2 of its
share of first objects. Before is modelled as the weighted random
choice without penalties:
before after
2x free space 335/3516 0/3516
4x free space 1665/3516 0/3516
10x, qos_prio_free=90% 2305/3516 0/3516
2x, qos_prio_free=50% 160/3516 0/3516
10x on one OST, 1-4 OSS 2712/4689 0/4689
For example 16 OSTs on 2 OSSs, 4 stripes, 4x free space on OSS1:
OSS0 OSTs OSS1 OSTs
objects #0 objects objects #0 objects
before 167-191 34-44 605-636 136-188
after 156-164 39-41 640 160
wanted 160 40 640 160
Fixes: ced540165ef5 ("LU-16623 lod: handle object allocation consistently")
Signed-off-by: Frederick Dilger <fdilger@whamcloud.com>
Signed-off-by: Andreas Dilger <adilger@thelustrecollective.com>
Assisted-by: ClaudeCode:claude-opus-5.5 ltvm,llm_code_and_review_tools
Change-Id: Ie314438e03f867fe978adc37d62b504532961cd2
65219
master
J –B ✓T ✓R +1/2
LU-12669 llite: make AIO reads on EC file synchronous
reviewing Patrick Farrell · CI green — awaiting your review
pw_ownpt_ecro
M +127 −14
2d
LU-12669 llite: make AIO reads on EC file synchronous
reviewing Patrick Farrell · CI green — awaiting your review
pw_ownpt_ecro
M +127 −14
2d
build #134978 SUCCESS · tests all Maloo sessions
reviews:
Andreas Dilger +1
no vote yet: Marc Vef, Shaun Tancheff, Zhenyu Xu
patchsets:
PS35 10-20 patrick bot
PS36 10-28 patrick bot
PS37 10-28 patrick bot
PS38 10-29 patrick bot
PS39 10-31 patrick bot
+34 earlier
PS1 04-10 PS2 04-10 PS3 04-10 PS4 04-10 PS5 04-10 PS6 04-15 PS7 04-15 PS8 04-25 PS9 04-29 PS10 04-29 PS11 04-29 PS12 04-29 PS13 05-05 PS14 05-05 PS15 05-05 PS16 05-06 Ronnie Sahlberg PS17 05-20 Marc Vef PS18 06-04 Ronnie Sahlberg PS19 07-13 Marc Vef PS20 07-13 Marc Vef PS21 07-13 Marc Vef PS22 07-15 Marc Vef PS23 07-26 Marc Vef PS24 07-26 Marc Vef PS25 08-17 Marc Vef PS26 08-17 Marc Vef PS27 08-17 Marc Vef PS28 08-17 Marc Vef PS29 08-17 Marc Vef PS30 08-19 Maximilian Dilger PS31 10-16 patrick bot PS32 10-18 patrick bot PS33 10-19 patrick bot PS34 10-19 patrick bottags: pw_own pt_ecro
owner Patrick Farrell · uploader patrick bot · PS39 uploaded 3d ago · NEW · open in Gerrit ↗
commit message
LU-12669 llite: make AIO reads on EC file synchronous For sync DIO, EC recovery on read failure runs inline in ll_file_io_generic() after cl_sync_io_wait_recycle(). AIO has the same recovery requirement but cannot run recovery from the sub-DIO completion path: ll_file_io_generic() returns -EIOCBQUEUED to the VFS before the BRW completion fires, so the syscall context recovery needs (the lu_env, the user's iov_iter, the range lock) is gone by the time the read error is known. Rather than building a workqueue-based async recovery path, make AIO reads on EC files behave as sync DIO: after cl_io_loop(), for an AIO read on a layout with a parity mirror, set cda_no_aio_complete and cda_creator_free to disarm the async ki_complete path, then drop into the same wait + restart code sync DIO uses. The VFS calls ki_complete itself when we return. The check is on the whole layout, not on the component at the read offset, so a read starting in a plain component is drained on its first pass too. Otherwise an error from that pass surfaces in a later EC pass, which reconstructs only its own range and reports the earlier bytes as read. For the same reason, an AIO read whose layout gains a parity mirror after an earlier async pass has moved bytes stays async, and reports a read error as it would on a plain file. The flag flip is race-free because the submission ref on cda_sync is still held: end_io cannot fire until we drop it in cl_sync_io_wait_recycle(). This disables async semantics for every AIO read on an EC file, not only those that need recovery. We cannot tell at submission time whether reconstruction will be needed, so the sync conversion drains queued IO even when submission requests a restart without returning -EIOCBQUEUED. As a side effect, the range_lock taken by ll_file_io_generic() is now held until all sub-DIOs have drained, instead of being dropped while they are still in flight. Do not retry -EINVAL or -EFAULT as a reconstruction read, for sync DIO or AIO: they reject the request itself, so an unaligned O_DIRECT read fails on an EC file as it does on a plain file. Re-enable the existing degraded AIO regression tests now that these reads use the synchronous recovery path. Cover an inactive later stripe in a single multi-stripe AIO, and a failed plain component ahead of an EC one. Test-Parameters: testlist=sanity-ec Test-Parameters: testlist=sanity-ec fstype=zfs Assisted-by: Opus:4.8 llm_code_and_review_tools Assisted-by: Codex:gpt-6.1-sol Signed-off-by: Patrick Farrell <pfarrell@whamcloud.com> Signed-off-by: Marc Vef <mvef@whamcloud.com> Change-Id: I394a3610e33b29ead8f5adb52dfa21db6b721944
69710
master
J –B ✓T ✓R 0/2
LU-12669 lov: split EC reads at a raid set parity cannot cover
reviewing Andreas Dilger · CI green — awaiting your review
218_review_prioritypt_ecro
3 unresolved
M +202 −17
6d
LU-12669 lov: split EC reads at a raid set parity cannot cover
reviewing Andreas Dilger · CI green — awaiting your review
218_review_prioritypt_ecro
3 unresolved
M +202 −17
6d
build #134400 SUCCESS · tests all Maloo sessions
no vote yet: Keguang Xu
patchsets:
PS1 10-15
PS2 10-24
threads: 3 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Andreas Dilger lov_io.c:857 — This counts rows from the component start (cstart + n * row_size + first * ssize), but data object "first" is at file offset row * row_size
Andreas Dilger
This counts rows from the component start (cstart + n * row_size + first * ssize), but data object "first" is at file offset row * row_size + first * ssize counted from offset 0 (RAID0 striping is absolute). When e_start is not a multiple of stripe_count * stripe_size (e.g. "-E 4M -c 1 -E -1 -S 1M -c 8 --ec 4+1") the split lands at the wrong raid set. lov_ec_io_route() groups objects with lov_ec_raid_set() by object index, as LOD allocates them (and as the per raid set failure domains in 69493 apply to), while the CIT_EC_RD reconstruction it routes to groups by offset - e_start, so for such components the route can decide a set is rebuildable while the reconstruction works on a different set of objects. Both come from the offset mapping bug in https://review.whamcloud.com/68361 (see the lov_io.c:2926 thread there), which proposes shared ec_unit_raidset()/ec_data_to_parity() helpers in lustre_user.h using the absolute geometry. When this series is rebased onto the fixed 68361, please compute the split offset from the absolute row (row = pos / row_size, offset of object "first" in that row = row * row_size + first * ssize, clipped to the component extent) through those helpers, and add a 72a variant with an EC component whose e_start is not a multiple of the stripe width.
reply Gerrit AI review for Lustre lov_io.c:894 — (minor) If the patch is refreshed: the Return: description still says LOV_EC_RECONSTRUCT means rebuild the unavailable stripes and LOV_EC_WA
Gerrit AI review for Lustre
(minor) If the patch is refreshed: the Return: description still says LOV_EC_RECONSTRUCT means rebuild the unavailable stripes and LOV_EC_WAIT means parity cannot stand in for them. With @split, RECONSTRUCT is now also returned when a later set cannot be rebuilt, and WAIT when a later set can. Maybe add "up to @split" to both, so a caller doesn't ignore @split the way the RECONSTRUCT branch in lov_io_mirror_init() safely can.
reply Gerrit AI review for Lustre lov_io.c:1272 — (minor) This stops the CIT_READ itself at the split, but the readahead window doesn't stop there. vvp_io_read_start() sets vui_ra_pages from
Gerrit AI review for Lustre
(minor) This stops the CIT_READ itself at the split, but the readahead window doesn't stop there. vvp_io_read_start() sets vui_ra_pages from vui_tot_bytes, which covers the whole remaining request, and ll_readahead() widens the window to that ("Enlarge the RA window to encompass the full read"). Nothing in lov_io_read_ahead_prep() checks lis_io_endpos or whether the stripe is unreachable.
So with readahead on (the default) and a PR lock still cached on the dead data stripe of the next, rebuildable set, the following looks possible:
CIT_READ (waits, ci_ndelay=0) -> ll_readahead()
-> osc_io_read_ahead_prep() finds the cached lock
-> pages past the split go out with no OBD_BRW_NDELAY
and stay locked until that OST recovers
restart -> CIT_EC_RD -> lov_ec_read_stripe_pages()
-> get_folio_grab(FGP_LOCK) on one of those pages blocks
The read would then still wait for the dead OST of the set that parity can rebuild, which is what this patch is meant to avoid. test_72a runs with ec_readahead_off, so it wouldn't catch this. Should readahead in the waiting read be capped at lis_io_endpos, or could the test also run with readahead enabled?
tags: 218_review_priority pt_ecro
owner Andreas Dilger · uploader Andreas Dilger · PS2 uploaded 10d ago · NEW · open in Gerrit ↗
commit message
LU-12669 lov: split EC reads at a raid set parity cannot cover A read of an EC file that touches a raid set with more dead stripes than its parity can stand in for waits for their OSTs, even for the dead stripes of raid sets that parity could rebuild, so the whole read waits for every dead OST. Reconstructing the whole read instead fails on that set with -EIO, as a CIT_EC_RD cycle covers all raid sets of a row at once. Stop the read where the first raid set of the other kind starts, and restart the rest there: a reconstruction stops before a set that cannot be rebuilt (cl_io::ci_ec_split), and ll_file_io_generic() restarts the rest as a CIT_READ, which waits for that set; a read that waits stops before a set that can be rebuilt. A failed direct read whose DIO state is already freed keeps restarting as CIT_EC_RD. A large read() across many rows with alternating raid sets uses three restarts per row, as going back to reconstruction restarts once more as CIT_READ and then as CIT_EC_RD, so it returns short after about 333 such rows, once RETRY_ATTEMPTS restarts are used up. Add sanity-ec test_72a, which reads two rows and brings back only the raid set that cannot be rebuilt, and checks that the read completes with the data stripe of the other set still down. Test-Parameters: testlist=sanity-ec ostcount=8 Signed-off-by: Andreas Dilger <adilger@thelustrecollective.com> Assisted-by: ClaudeCode:claude-opus-5.5 ltvm,llm_code_and_review_tools Change-Id: I21a023db83276919086acb9bc75cbf3d733ebbe5
69825
master
J –B ✓T ✓R 0/2
LU-12668 utils: resync EC parity with mirror resync API
reviewing Andreas Dilger · CI green — awaiting your review
pt_ecro
4 unresolved
L +653 −238
6d
LU-12668 utils: resync EC parity with mirror resync API
reviewing Andreas Dilger · CI green — awaiting your review
pt_ecro
4 unresolved
L +653 −238
6d
build #134523 SUCCESS · tests all Maloo sessions
no vote yet: Keguang Xu
patchsets:
PS1 10-19
PS2 10-21
PS3 10-21
threads: 4 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Gerrit AI review for Lustre llapi_mirror_find_stale.3:123 — (nit) The if has only a comment as its body, so the start = comps[0].lrc_start line becomes the conditional statement and start is left unse
Gerrit AI review for Lustre
(nit) The if has only a comment as its body, so the start = comps[0].lrc_start line becomes the conditional statement and start is left unset when count > 0. Maybe add a return or goto here if the page is refreshed.
reply Gerrit AI review for Lustre lfs.c:16560 — (minor) Before the patch [start, end) covered only the stale data components. This loop now also covers the parity entries. The comment says
Gerrit AI review for Lustre
(minor) Before the patch [start, end) covered only the stale data components. This loop now also covers the parity entries. The comment says that is harmless because parity covers the same extents, but that only holds for the data components a parity protects, not for the data components that happen to be stale. This patch makes the two diverge: if the parity resync fails, the data entries are still cleared and the parity stays stale. Take a later write that stales only M2 [0, 1M). The next resync gets data [0, 1M) plus parity [1M, EOF), so llapi_mirror_resync_data() reads the whole file from the source mirror and writes nothing beyond 1M. It also counts those reads in --stats. Should the range be taken from the non-parity entries only? The man page EXAMPLES do the same min/max over every entry.
reply Gerrit AI review for Lustre liblustreapi_layout.c:4102 — (suggestion) Nothing in the tree passes LCME_FL_NOSYNC, and no test covers it, but it becomes part of the public API and the man page. Is th
Gerrit AI review for Lustre
(suggestion) Nothing in the tree passes LCME_FL_NOSYNC, and no test covers it, but it becomes part of the public API and the man page. Is there a planned user? If not, it might be simpler to support only LCME_FL_PARITY for now and add NOSYNC once something needs it. The -EINVAL check on unknown flags keeps it easy to add later.
reply Gerrit AI review for Lustre liblustreapi_layout.c:6054 — (defect) llapi_mirror_find_stale_flags() and lfs_mirror_force_resync() fill every entry with lrc_synced = true. Some early failures return b
Gerrit AI review for Lustre
(defect) llapi_mirror_find_stale_flags() and lfs_mirror_force_resync() fill every entry with lrc_synced = true. Some early failures return before any copy and leave it set: - this calloc() failing returns -ENOMEM; - the fstat() below takes goto out; - in llapi_mirror_resync_data(), the fstat(), sysconf() and the 64MB posix_memalign() failures return directly. They skip the out_free path that clears lrc_synced of the data entries. Before this patch that was harmless, because lfs dropped the lease on rc < 0. Now lfs_mirror_resync_file() collects every entry with lrc_synced set and sends LL_LEASE_RESYNC_DONE with those ids. lod_declare_update_sync_pending() then clears LCME_FL_STALE on them. So a posix_memalign() ENOMEM (a strict overcommit or RLIMIT_AS setting is enough) leaves the stale data mirror marked in sync without being written. With has_parity set it gets worse. llapi_ec_resync_parity() still sees the data entries as synced, so it recomputes the parity from the stale data and reports that synced too. Could these early returns clear lrc_synced first, for every entry here and for the data entries in llapi_mirror_resync_data()? That matches the contract in the header comment and the man page.
tags: pt_ecro
owner Andreas Dilger · uploader Andreas Dilger · PS3 uploaded 13d ago · NEW · open in Gerrit ↗
commit message
LU-12668 utils: resync EC parity with mirror resync API
'lfs mirror resync' would resync stale data components with
llapi_mirror_resync_many_params() and then stale parity components
with a separate llapi_ec_resync_many_params(). Other callers of the
generic resync functions would never resync parity, and parity
components passed to llapi_mirror_resync_many_params() would have
file data copied into them. Running `lfs mirror resync --only' on
a data mirror would also leave the stale parity protecting it, as
only the parity mirror's own id selected parity components.
Instead, resync parity components in llapi_mirror_resync_many_params()
from the data components they protect, after the data components have
been copied, and skip a parity component whose data component failed
in the same call. Count --stats and bandwidth progress once over
both, with the EC struct llapi_resync_progress. Replace
llapi_ec_resync_many_params() and llapi_ec_find_stale(), which are not
yet included in a release, with llapi_mirror_find_stale_flags(), which
collects the stale data components and, with LCME_FL_PARITY, then the
stale parity components, also those protecting a mirror given in
@mirror_ids, and resync both kinds of component in one call from
lfs. With LCME_FL_NOSYNC it also collects the components of NOSYNC
mirrors without listing them in @mirror_ids.
llapi_mirror_find_stale() still returns only data components, for
callers that copy data themselves.
An error in one component no longer undoes the others: lrc_synced
stays set for each component that was synced, and lfs still clears
LCME_FL_STALE from those before returning the error.
'lfs mirror resync --force-resync' now marks components to be synced
as llapi_mirror_find_stale() does, not after.
Add man pages for llapi_mirror_find_stale(3), covering the new
llapi_mirror_find_stale_flags(), and llapi_mirror_resync_many(3).
Add sanity-ec test_12i.
Test-Parameters: testlist=sanity-ec,sanity-flr
Fixes: 03191be6f459 ("LU-12668 ec: add support to resync stale ec comps")
Signed-off-by: Andreas Dilger <adilger@thelustrecollective.com>
Assisted-by: ClaudeCode:claude-opus-5.5 ltvm,llm_code_and_review_tools
Change-Id: Ic40b61c233d1898cd75b30afe01adb45e23ebbe5
▶Awaiting review — CI not green yet
(2)
69703
master
J –B ✓T ✗5R 0/2
LU-20690 ec: verify parity against data, allow p > k
reviewing Keguang Xu · Keguang Xu pinged you: “@rsahlberg@whamcloud.com @adilger@thelustrecollective.com: is stripe_idx < nsets * p for m”
pt_ecroraid10-like218_review_prioritypw_shepherd
4 unresolved
L +338 −193
50m
LU-20690 ec: verify parity against data, allow p > k
reviewing Keguang Xu · Keguang Xu pinged you: “@rsahlberg@whamcloud.com @adilger@thelustrecollective.com: is stripe_idx < nsets * p for m”
pt_ecroraid10-like218_review_prioritypw_shepherd
4 unresolved
L +338 −193
50m
Keguang Xu pinged you: “@rsahlberg@whamcloud.com @adilger@thelustrecollective.com: is stripe_idx < nsets * p for m”
blocked on the owner: enforced tests failed
awaiting review (CI not green yet)
| failed enforced test | platform | detail | |
|---|---|---|---|
| custom-1001 | RHEL 9.7 / x86_64 | ran 3 tests. 1 tests failed: sanity-ec. | session |
| review-dne-part-7 | RHEL 9.8 / x86_64 | ran 6 tests. 1 tests failed: sanity-ec. | session |
| review-dne-subtest-change | RHEL 9.7 / x86_64 | ran 3 tests. 1 tests failed: sanity-ec. | session |
| review-dne-zfs-part-7 | RHEL 9.8 / x86_64 | ran 6 tests. 1 tests failed: sanity-ec. | session |
| review-dne-zfs-subtest-change | RHEL 9.7 / x86_64 | ran 3 tests. 1 tests failed: sanity-ec. | session |
build #135173 SUCCESS · tests all Maloo sessions
no vote yet: Marc Vef, Andreas Dilger
patchsets:
PS1 10-15
PS2 10-15
PS3 10-26
PS4 11-02
1 ping waiting on you:
@you Keguang Xu lod_lov.c:2242 — @rsahlberg@whamcloud.com @adilger@thelustrecollective.com: is stripe_idx < nsets * p for multi-raidset parity from RR intentional? A short l
Gerrit AI review for Lustre
(defect) Can the MDS create a parity that this check then rejects?
With more than one raid set, lod_stripe_count_min() returns 0 for a parity, and lod_ost_alloc_rr() then reports success on a short allocation:
lod_ost_alloc_rr()
if (stripe_idx) rc = 0;
lod_ec_add_parities() /* may still be short, e.g. failure domains */
/* Still short; remember how many we got */
lod_comp->llc_stripe_count = stripe_idx;
stripe_idx < stripe_count_min (0) -> no -ENOSPC
lod_comp_prep_create() does not check the count afterwards, so the layout is stored with fewer than (n0 + n1) * p stripes. If the shortfall is a whole raid set, the count is still a multiple of p and passes lod_ec_parity_valid(). Before this patch such a layout went through open replay (LOV_MAGIC_DEFINED -> lod_qos_parse_config() -> lod_verify_striping()). Now the replay gets -EINVAL here, as do HSM release and xattr copies of the file.
Should RR fail a short EC parity the way lod_ost_alloc_qos() does ("we require the full stripe_count to avoid incomplete raid sets")? Otherwise this check is stricter than what the allocator guarantees.
Keguang Xu
Thanks for catching this. Full parity geometry is nsets * p (nsets = ec_raidset_count from the data stripe count and k). RR can finish with stripe_idx < nsets * p when nsets > 1: lod_stripe_count_min() is 0, so a short lod_ec_add_parities() still returns success and sets llc_stripe_count = stripe_idx. QoS instead requires stripe_idx == nsets * p. @rsahlberg@whamcloud.com @adilger@thelustrecollective.com: is stripe_idx < nsets * p for multi-raidset parity from RR intentional? A short layout (e.g. (nsets-1)*p) can break degraded read / EC recovery, leave some raid sets with no parity to rebuild from, and confuse resync/verify and mirror tools. QoS already refuses this. I think RR should match QoS (fail short EC parity) and the verifier should require count == nsets * p again — happy to follow up if you agree.
threads: 4 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Keguang Xu lod_lov.c:2242 — Thanks for catching this.
Gerrit AI review for Lustre
(defect) Can the MDS create a parity that this check then rejects?
With more than one raid set, lod_stripe_count_min() returns 0 for a parity, and lod_ost_alloc_rr() then reports success on a short allocation:
lod_ost_alloc_rr()
if (stripe_idx) rc = 0;
lod_ec_add_parities() /* may still be short, e.g. failure domains */
/* Still short; remember how many we got */
lod_comp->llc_stripe_count = stripe_idx;
stripe_idx < stripe_count_min (0) -> no -ENOSPC
lod_comp_prep_create() does not check the count afterwards, so the layout is stored with fewer than (n0 + n1) * p stripes. If the shortfall is a whole raid set, the count is still a multiple of p and passes lod_ec_parity_valid(). Before this patch such a layout went through open replay (LOV_MAGIC_DEFINED -> lod_qos_parse_config() -> lod_verify_striping()). Now the replay gets -EINVAL here, as do HSM release and xattr copies of the file.
Should RR fail a short EC parity the way lod_ost_alloc_qos() does ("we require the full stripe_count to avoid incomplete raid sets")? Otherwise this check is stricter than what the allocator guarantees.
Keguang Xu
Thanks for catching this. Full parity geometry is nsets * p (nsets = ec_raidset_count from the data stripe count and k). RR can finish with stripe_idx < nsets * p when nsets > 1: lod_stripe_count_min() is 0, so a short lod_ec_add_parities() still returns success and sets llc_stripe_count = stripe_idx. QoS instead requires stripe_idx == nsets * p. @rsahlberg@whamcloud.com @adilger@thelustrecollective.com: is stripe_idx < nsets * p for multi-raidset parity from RR intentional? A short layout (e.g. (nsets-1)*p) can break degraded read / EC recovery, leave some raid sets with no parity to rebuild from, and confuse resync/verify and mirror tools. QoS already refuses this. I think RR should match QoS (fail short EC parity) and the verifier should require count == nsets * p again — happy to follow up if you agree.
reply Gerrit AI review for Lustre lod_qos.c:1278 — (defect) Can the MDS still create an instantiated parity whose data component is not instantiated? If so, this check rejects a layout the MD
Gerrit AI review for Lustre
(defect) Can the MDS still create an instantiated parity whose data component is not instantiated? If so, this check rejects a layout the MDS wrote itself.
A mirror-targeted resync instantiates every component of the named mirror, whatever its extent:
lfs mirror copy -i <data> -o -1 f (or -o <parity>)
-> ll_file_resync() lil_mirror_id = parity mirror
-> lod_declare_update_rdonly() -> lod_prepare_resync_mirror()
-> lod_declare_instantiate_components() /* only needs lod_comp_find_linked() != NULL */
-> lod_comp_prep_create() /* sizes parity from data->llc_stripe_count */
lfs_mirror_copy() does not refuse a parity target, and lod_ec_check_data_usable() and lod_ec_add_parities() return early when data has no stripes allocated. With `-E 128M --ec 2+1 -E -1 -c 4 --ec 4+2` and less than 128M written, the parity of [128M, EOF) is stored INIT while its data component is not.
Before this patch that layout parsed fine, and lov_ea.c still skips such a pair (`!lsme_inited(data_entry)`). Now, once the object is reloaded (cache eviction or MDT restart), lod_parse_striping() returns -EINVAL. lod_declare_destroy() returns that error, so the file can no longer be unlinked, and resync and mirror split fail too.
Should an uninstantiated data peer be skipped here, the way the client does it? The other option is to refuse, in lod_declare_instantiate_components(), a parity whose data component is not instantiated and is not being instantiated in the same call.
reply Gerrit AI review for Lustre lod_qos.c:3960 — (minor) This comment doesn't seem to match lod_verify_ec_parity_comps(). That function skips parity components that are not instantiated (`!
Gerrit AI review for Lustre
(minor) This comment doesn't seem to match lod_verify_ec_parity_comps(). That function skips parity components that are not instantiated (`!lod_comp_inited(comp)` -> continue) and never looks at data components. lod_comp_prep_create() only runs on components that are being instantiated, so a layout from disk with a zero lcme_dstripe_count/lcme_cstripe_count still reaches this point unchecked. This test is still the only thing that keeps the `% 0` out of ec_split_stripes(). The old wording ("a layout loaded from disk does not pass through it again") was accurate. If the patch is refreshed, consider restoring it so the check below doesn't look redundant to the next reader.
reply Gerrit AI review for Lustre liblustreapi_layout.c:2833 — (minor) Now that layout_ec_verify() only rejects a zero or out-of-range data_stripe_count, Documentation/man3/llapi_layout_comp_add_parity_o
Gerrit AI review for Lustre
(minor) Now that layout_ec_verify() only rejects a zero or out-of-range data_stripe_count, Documentation/man3/llapi_layout_comp_add_parity_only.3 is out of date. It still says data_stripe_count is used for "bounding K+P", and lists EINVAL when the counts "did not fit data_stripe_count". If the patch is refreshed, consider updating both sentences to the new rule, where P may exceed the data stripe count.
tags: pt_ecro raid10-like 218_review_priority pw_shepherd
owner Keguang Xu · uploader Keguang Xu · PS4 uploaded 2d ago · NEW · open in Gerrit ↗
commit message
LU-20690 ec: verify parity against data, allow p > k With the RAID10-like parity layout the p parities of a raidset share one offset, so the parity of a component fits in its extent whatever p is. Remove the p <= k checks in lfs and llapi; k+p <= 256 and p <= 15 remain. Also drop the mirror-extend stripe_count < p guard in ec_check_data_comp() so --ec 2+3 works on a two-stripe target. An instantiated parity is checked against its data component in lod_verify_ec_parity_comps() after lod_use_defined_striping() / lod_parse_striping(), using lod_comp_find_linked() for the same pairing rule as the allocator (covers layout-change replay). Require a bidirectional link, matching k/p and stripe size, and parity stripe count ec_raidset_count() * p. lod_verify_striping() checks k/p and rejects an instantiated parity with stripe_count == 0 before DEFINED object init. Tests: sanity-ec 4a and 10 accept p > k, and 4b rejects k == 0 and k > 255. 8m covers mirror extend --ec 2+3 on a two-stripe target. 300 covers PFL -E 2M --ec 2+3 create/resync/verify, and 305 covers p > k multi-raidset create/resync/verify. llapi_layout_test test47 allows 3+4. Test-Parameters: testlist=sanity-ec ostcount=8 Signed-off-by: Keguang Xu <kxu@ddn.com> Assisted-by: Cursor:Composer llm_code_and_review_tools Change-Id: I3878502e8ff739cb5ed420ff359e2008376303e7
62479
master
J !B ✓T ✗10R -1/2−
LU-19298 lod: use Xarray instead of static arrays for comp entires
reviewing James Simmons · blocked on the owner: needs rebase — checkpatch: cannot be cherry-picked; enforced tests failed
needs rebase
stalled 216d
1 unresolved
L +442 −423
216d
LU-19298 lod: use Xarray instead of static arrays for comp entires
reviewing James Simmons · blocked on the owner: needs rebase — checkpatch: cannot be cherry-picked; enforced tests failed
needs rebase
stalled 216d
1 unresolved
L +442 −423
216d
blocked on the owner: needs rebase — checkpatch: cannot be cherry-picked; enforced tests failed
awaiting review (CI not green yet)
janitor run: 3 failing config(s), none unique to this patch — janitor results
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-2 crashed | RHEL 9.5 / x86_64 | ran 13 tests. 2 tests failed: sanity-pfl, sanity-lfsck. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-part-2 crashed | RHEL 8.10 / x86_64 | ran 13 tests. 2 tests failed: sanity-pfl, sanity-lfsck. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-part-4 crashed | RHEL 8.10 / x86_64 | ran 11 tests. 2 tests failed: sanity-quota, sanity-flr. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-part-4 crashed | RHEL 9.5 / x86_64 | ran 11 tests. 2 tests failed: sanity-quota, sanity-flr. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-part-7 crashed | RHEL 8.10 / x86_64 | ran 7 tests. 1 tests failed: sanity-pcc. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-part-7 crashed | RHEL 9.5 / x86_64 | ran 7 tests. 1 tests failed: sanity-pcc. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-zfs-part-2 crashed | RHEL 8.10 / x86_64 | ran 13 tests. 2 tests failed: sanity-pfl, sanity-lfsck. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-zfs-part-4 | RHEL 8.10 / x86_64 | ran 11 tests. 1 tests failed: sanity-flr. | session |
| review-dne-zfs-part-7 crashed | RHEL 8.10 / x86_64 | ran 7 tests. 1 tests failed: sanity-pcc. %% THIS TEST SESSION CRASHED %% | session |
| review-zfs | RHEL 8.10 / x86_64 | ran 10 tests. 1 tests failed: sanity-flr. | session |
build #119712 SUCCESS · tests all Maloo sessions
no vote yet: Qian Yingjin, Alexey Lyashkov, Andreas Dilger, Zhenyu Xu, Patrick Farrell
patchsets:
PS1 11-10
PS2 11-16
PS3 12-12
threads: 1 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Andreas Dilger patchset comment — James, file layout join/migrate/mirror happen _maybe_ only once or twice in the lifetime of a file, so it doesn't make sense to add a comple
Patrick Farrell
James, the lack of ability to remove other components than the last one is a deliberate choice to prevent the creation of incomplete layouts. There is nothing about the current approach that can’t support removing other components, it’s just a sanity restriction.
James Simmons
Think about file join work with 2 mirrors each with 3 components and another file with also 2 mirrors also with 3 components. Its going to be merged right. The current approach would require allocating a new larger array. Then copying items from file 1 static array and then copying items from file 2 static array. Then deleting the old array. Some slicing is needed due the 2 mirrors. Compared to Xarray its erasing the reference to pointers in file 2 xarray and adding a reference of that same pointer into file 1 Xarray. Do you feel the former approach is way better? Honestly the biggest impact is for the file join project so the really important opinion I need is from Alexey. Alexey what do you think?
Patrick Farrell
Yes, I do - it's very simple. You allocate a larger array and write the layout to it. Very simple. It requires no complex data structures and no locking. The idea that we should have references across two xarrays is very concerning - that means the layout components need reference counting then, I guess? They do not today. There is no particular impact on file join - it is just as easy to do file join via layout copy as any other operation.
Andreas Dilger
James, file layout join/migrate/mirror happen _maybe_ only once or twice in the lifetime of a file, so it doesn't make sense to add a complex data structure and overhead to optimize a 0.00001% usage case. That is doubly a problem if it means many small allocations and/or additional locking needs to be added to handle this extremely rare use case.
owner James Simmons · uploader James Simmons · PS3 uploaded 326d ago · NEW · open in Gerrit ↗
commit message
LU-19298 lod: use Xarray instead of static arrays for comp entires The LOD layer implements very large static arrays to manage the component entries for each layout. This works well for the case that all the components are for block I/O that are expected to be aligned to each other in a specific order. In such cases the API works to add or delete components at the end of such layouts. With the upcoming introducting of parity and foreign components the rules change in that you can delete or add a component located in the middle of the layout. This would be very complicated when using static arrays. To make life easier for upcoming projects we move away from static arrays to using Xarrays. We no longer requires creating a whole new array and copying components over. Instead we just insert or delete components into the Xarray. This current implementation just does the change from static arrary to Xarray without truly introducing gaps in the Xarray. This can be done in follow on patches and can be used to greatly simplify the code. For example since "gaps" are allowed in the Xarray we can place components in the Xarray using the mirror id as apart of the index which mirrors the component ID. This removes the need to manage the new mirror ranges in the Xarray. Change-Id: I67020f899ad89bfa6095c4b22f7f1b07b6de3e86 Signed-off-by: James Simmons <jsimmons@infradead.org>
▶Voted on current patchset
(12)
69493
master
J –B ✓T ✓R +3/2
LU-19823 lod: unique failure domains per EC raid set
reviewing Andreas Dilger · you voted +1 on current PS
pt_ecro218_review_priority218_review_blocker
L +464 −119
30m
LU-19823 lod: unique failure domains per EC raid set
reviewing Andreas Dilger · you voted +1 on current PS
pt_ecro218_review_priority218_review_blocker
L +464 −119
30m
build #134652 SUCCESS · tests all Maloo sessions
reviews:
Keguang Xu +1 · Ronnie Sahlberg +1 · Maximilian Dilger +1
no vote yet: Marc Vef, kg.xu, Oleg Drokin
patchsets:
PS1 10-07
PS2 10-13
PS3 10-24
PS4 10-27
PS5 10-28
your previous vote: +1 on PS2 (2026-10-15 05:13) — now at PS5
tags: pt_ecro 218_review_priority 218_review_blocker
owner Andreas Dilger · uploader Andreas Dilger · PS5 uploaded 6d ago · NEW · open in Gerrit ↗
commit message
LU-19823 lod: unique failure domains per EC raid set
With "lfs setstripe -c N --ec K+M" the allocator required every data
and parity stripe of the component to be in a different failure
domain, while with -C this was only needed within each raid set.
A wide file such as "-c 40 --ec 8+2" on 40 OSTs needs 10 domains
per raid set but 50 for the component, so it failed with ENOSPC
unless the file was overstriped.
Each raid set is protected on its own, so require different failure
domains only within each raid set, for both -c and -C. With -c the
data stripes are still on different OSTs, so the file can use the
bandwidth of all OSTs, and parity shares OSTs with the data of other
raid sets. A -c component short of OSTs is split into raid sets
again after its stripes are placed, so keep each run of consecutive
data stripes as long as the largest possible raid set in different
domains. QoS no longer trims the data stripes of a -c component with
several raid sets to leave separate OSTs for its parity.
Each raid set still needs its data and parity stripes in different
failure domains, but the data stripes of a -c component need fewer, so
with too few domains the data could be placed and the RR allocator
then accepted a parity component with too few stripes. Check the
domains before placing the data, and use raid sets of fewer data
stripes, down to K - K/4 as in lod_stripe_count_min(), or fail with
ENOSPC. A single raid set gets fewer data stripes, so "-c 3 --ec 2+1"
with 3 domains becomes "-c 2 --ec 2+1". Also fail a parity component
that RR could not place completely, as QoS does, since other mirrors
can use up domains that this check does not see.
An EC file is also two mirrors, so the FLR check required different
domains for all stripes of the data component too. Leave the domains
within an EC component to the EC check.
Also fix lod_comp_find_linked() matching a plain mirror component to
the parity of an EC mirror, which let the plain mirror share a failure
domain with that parity, and restore the count of OSTs available to
mirrors when QoS gives up, so the RR fallback can place EC stripes.
Rename lod_fd_check_*() to lod_fdom_check_*() so "fd" is not read as a
file descriptor. Describe the mirror rules in
obdfilter.failure_domain.4 and reference it from lfs-setstripe.1,
lfs-mirror-create.1 and lfs-mirror-extend.1.
Fixes: 026de09ead3d ("LU-19823 lod: Make the stripe allocators failure domain aware.")
Fixes: c53abca9f9ee ("LU-19852 lod: raidset aware stripe allocator")
Signed-off-by: Andreas Dilger <adilger@thelustrecollective.com>
Assisted-by: ClaudeCode:claude-opus-5.5 ltvm,llm_code_and_review_tools
Change-Id: Ic197df8fba1a9e0a313442cc435d1959763ebbe5
69908
master
J –B ✓T …R +1/2
LU-12669 ec: fix degraded read page leak and short read
reviewing Maximilian Dilger · you voted +1 on current PS
218_review_prioritypt_ecro
2 unresolved
L +253 −8
37m
LU-12669 ec: fix degraded read page leak and short read
reviewing Maximilian Dilger · you voted +1 on current PS
218_review_prioritypt_ecro
2 unresolved
L +253 −8
37m
reviews:
Ronnie Sahlberg +1
no vote yet: Andreas Dilger, Zhenyu Xu, Patrick Farrell
patchsets:
PS1 10-22
PS2 11-03
threads: 2 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Misc Code Checks Robot (Gatekeeper helper) osc_page.c:205 — error: osc_page_lru_add():'opg' dereferencing possible ERR_PTR()
Misc Code Checks Robot (Gatekeeper helper)
error: osc_page_lru_add():'opg' dereferencing possible ERR_PTR()
reply Gerrit AI review for Lustre sanity-ec.sh:7818 — (style) The fixed `sleep 1` is meant to start the read at 5M after the EC read is paused at the fail_loc. If the DIO attempt and the switch
Gerrit AI review for Lustre
(style) The fixed `sleep 1` is meant to start the read at 5M after the EC read is paused at the fail_loc. If the DIO attempt and the switch to CIT_EC_RD take longer than 1s on a slow VM, the 5M read finishes before the pause, nothing cuts i_size, and the test passes without testing the race. If the patch is refreshed, consider waiting for the one-shot fail_loc to fire (CFS_FAILED, 0x40000000, set in fail_loc) with wait_update, rather than sleeping a fixed time.
tags: 218_review_priority pt_ecro
owner Maximilian Dilger · uploader Maximilian Dilger · PS2 uploaded 4h ago · NEW · open in Gerrit ↗
commit message
LU-12669 ec: fix degraded read page leak and short read
Fix two bugs in degraded EC reads:
- Pages rebuilt from parity stay busy on the OSC until their lock is
cancelled, as only a completed transfer puts a page on the LRU
list. A degraded read of more than max_cached_mb then waits in
osc_lru_alloc() forever. Add cl_page_lru_add() (cpo_lru_add) so
vvp_io_ec_rd_end() puts each rebuilt page it keeps on the LRU
list.
- While the OST of the last stripe is unavailable the file's KMS is
short, and vvp_prep_size() of a concurrent read writes it to i_size.
An EC read near EOF then reads that i_size back and returns no data,
or its copy-out stops at it. Keep the MDT size that
vvp_update_inode_size() got, raise i_size for the whole read, and
restart if i_size still cuts it short.
Add sanity-ec test_49g for the page leak, and test_51b, with two new
fail_locs, for the short read.
Test-Parameters: testlist=sanity-ec ostcount=8
Fixes: 783c13bb0b8f ("LU-12669 ec: recover data from parity")
Fixes: 240cad9a0a82 ("LU-19344 llite: set read size correctly")
Assisted-by: ClaudeCode:claude-opus-5.5 llm_code_and_review_tools
Signed-off-by: Maximilian Dilger <mdilger@whamcloud.com>
Change-Id: Ie052eeefc07d5bdb67d93c2307c47a3968441bd5
70067
master
J –B ✓T …R +2/2
LU-20690 ec: copy parity in 1+N recovery reads
reviewing Zhenyu Xu · you voted +1 on current PS
218_review_prioritypw_shepherdpt_ecro
1 unresolved
M +87 −14
1h
LU-20690 ec: copy parity in 1+N recovery reads
reviewing Zhenyu Xu · you voted +1 on current PS
218_review_prioritypw_shepherdpt_ecro
1 unresolved
M +87 −14
1h
reviews:
Keguang Xu +1 · Ronnie Sahlberg +1
no vote yet: Marc Vef
patchsets:
PS1 10-27
PS2 11-03 Andreas Dilger
your previous vote: +1 on PS1 (2026-10-29 21:30) — now at PS2
threads: 1 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Andreas Dilger COMMIT_MSG:29 — Correction to my comment above: EC is not in any release. 2.17.0 has only the format definitions (LCME_FL_PARITY) and the EC library, not th
Gerrit AI review for Lustre
(minor) This fixes data corruption on degraded reads, so should it carry a Fixes: line? The wrong decode for a single-data-stripe raidset goes back to the original recovery code, not only to --ec 1+N:
Fixes: 783c13bb0b8f ("LU-12669 ec: recover data from parity")
lov_io_ec_rd_start() has always used the per-raidset dcount (sc.esc_k1 for the tail raidsets). llapi_ec_compute_parities() is also called with the per-raidset k, so it memcpy()s for those raidsets. ec_split_stripes(5, 2) gives n0=2 k0=2 n1=1 k1=1, so a `-c 5 --ec 2+2` file (and the same for -c 7, -c 9, ...) has a 1+2 tail raidset. Before this patch, losing that raidset's data stripe and parity 0 returned data * 2. That layout was valid before LU-20568 allowed --ec 1+N.
If the patch is refreshed, it may help to say in the body that this case is fixed as well, since it affects released layouts and matters when deciding on backports.
Andreas Dilger
Agreed, this is not only --ec 1+N. ec_split_stripes() gives a raidset with one data stripe in several layouts that were already valid before --ec 1+N was allowed: - the tail raidset of an odd stripe count with --ec 2+N: ec_split_stripes(5, 2) gives 2 raidsets of 2 and 1 of 1, so `lfs setstripe -c 5 --ec 2+2` (likewise -c 7, -c 9, ...) has a 1+2 tail raidset - any -c 1 component with an EC layout, since ec_split_stripes(1, k) always gives k = 1 llapi_ec_compute_parities() is called with the per-raidset k, so it memcpy()s the parity for these raidsets, and lov_io_ec_rd_start() uses the per-raidset dcount. Losing the data stripe and parity 0 of such a raidset thus returned data * gf_inv(2) on released versions too. That makes this a data corruption fix that needs to be backported, so please add the Fixes: line and describe these cases in the commit message. It would also be good to have a test for the released-layout case, e.g. a variant of test_40e with `-c 5 --ec 2+2` that fails the data OST of the 1+2 tail raidset and its parity 0, and checks the md5sum. The fix keys on the per-raidset dcount, so it should already cover this.
Andreas Dilger
Correction to my comment above: EC is not in any release. 2.17.0 has only the format definitions (LCME_FL_PARITY) and the EC library, not the client recovery read or the llapi parity code, so no released files have these layouts and no Fixes: or backport is needed. The rest still applies to master: the fix also covers raidsets with one data stripe that are not --ec 1+N (the tail raidset of `-c 5 --ec 2+2`, and -c 1 components), so the commit message could say so, and a `-c 5 --ec 2+2` variant of test_40e would cover the tail raidset case.
tags: 218_review_priority pw_shepherd pt_ecro
owner Zhenyu Xu · uploader Andreas Dilger · PS2 uploaded 1h ago · NEW · open in Gerrit ↗
commit message
LU-20690 ec: copy parity in 1+N recovery reads A raidset with one data stripe stores a copy of that stripe in each of its p parity objects: llapi_ec_compute_parities() memcpy()s the data instead of calling ec_encode_data() when k == 1, so --ec 1+N writes p identical copies. The client recovery path did not know this and always ran the Cauchy decode, where the coefficient of parity stripe i is gf_inv(i + 1). Only parity stripe 0 has coefficient 1, matching what is on disk. A read that lost the data stripe and parity stripe 0, and fell back to any other parity, thus returned data * 2, * 3, ... rather than the data. Copy the first parity page that could be read over the error page when the raidset has one data stripe, in lov_ec_recover_page(). The RS setup is of no use in that case either, so skip the encode matrix in lov_ec_bufs_alloc() and the scratch matrices, GF tables, matrix inversion and ec_init_tables() in lov_ec_recover_init() when dcount is 1. Add sanity-ec test 40e, which fails the data OST and the OST of parity stripe 0 in a 1+2 layout, so the read has to be rebuilt from parity stripe 1. Test-Parameters: testlist=sanity-ec ostcount=8 Signed-off-by: Bobi Jam <bobijam@whamcloud.com> Assisted-by: AugmentAgent:DeepSeek-V4.1-Flash Change-Id: Idbe55e61f464d1e91bb5093bf1c41442dc588f72
68361
master
J –B ✓T …R +1/2
LU-20690 ec: store EC parity like RAID10
reviewing Keguang Xu · you voted +1 on current PS
ec2
218_review_prioritypt_ecroraid10-like
13 unresolved
XL +2329 −745
1h
LU-20690 ec: store EC parity like RAID10
reviewing Keguang Xu · you voted +1 on current PS
ec2
218_review_prioritypt_ecroraid10-like
13 unresolved
XL +2329 −745
1h
reviews:
Ronnie Sahlberg +1
no vote yet: Marc Vef, Andreas Dilger
patchsets:
PS20 10-30 Ronnie Sahlberg
PS21 11-01
PS22 11-03 Andreas Dilger
PS23 11-03 Andreas Dilger
PS24 11-03 Andreas Dilger
+11 earlier
PS1 08-26 PS7 09-03 PS8 09-07 PS9 09-10 PS10 09-11 PS11 09-23 PS12 10-08 PS13 10-08 PS17 10-23 PS18 10-29 PS19 10-29 Ronnie Sahlbergyour previous vote: +1 on PS23 (2026-11-03 23:17) — now at PS24
threads: 11 need your reply · 2 waiting on others · 0 own notes · 0 bot
reply Gerrit AI review for Lustre COMMIT_MSG:174 — (minor) The patch also fixes the raid set mapping in degraded reads and resync, which counted rows and raid sets from e_start instead of fil
Gerrit AI review for Lustre
(minor) The patch also fixes the raid set mapping in degraded reads and resync, which counted rows and raid sets from e_start instead of file offset 0 (the wrong-parity rebuild described above). That counting came from landed commits, so a Fixes: line would help with tracking, even though EC has not shipped:
Fixes: 783c13bb0b ("LU-12669 ec: recover data from parity")
The resync side of the same problem dates from 03191be6f4 ("LU-12668 ec: add support to resync stale ec comps").
reply Keguang Xu patchset comment — With the changing of layout from `PARITY|RAID0` TO RAID10-like `PARITY`, we not only store the layout header differently to disk, but also w
Andreas Dilger
Should the removal of the LOV_PATTERN_RAID0 from EC layouts be moved into an earlier patch? That affects the on-disk layout of all the files and should be included into the 2.18.0 release, even if the 1+2 layout is not allowed initially. If this patch doesn't make it then we could force 1+2 to be 2+2 at create time? Not ideal, but probably easier to get landed.
Keguang Xu
With the changing of layout from `PARITY|RAID0` TO RAID10-like `PARITY`, we not only store the layout header differently to disk, but also we need to adjust our access path, say, in the parity component, stripes belong to the same raidset are arranged as RAID1 (logicall, they share the same file offset), stripes from different raidsets are stored as RAID0. To read/write data from/to parity, we need to designate stripe first. We can move the layout changes into an earlier patch. However, for EC to function properly, all of these patches must be landed together as a single set.
reply Gerrit AI review for Lustre lfs-mirror-read.1:30 — (minor) llapi_layout_parity_pos_to_io() starts each component's dump at the slot of the raid set that holds e_start, not at raid set 0. Take
Gerrit AI review for Lustre
(minor) llapi_layout_parity_pos_to_io() starts each component's dump at the slot of the raid set that holds e_start, not at raid set 0. Take -E 4M -c 1 -E eof -S 1M -c 8 --ec 4+1: the second component has O = 3M, e_start is in raid set 1, and its dump begins with the parity object of raid set 1, followed by raid set 0 of the next row. The order matches getstripe only when e_start is a multiple of the stripe width. lfs-getstripe.1 has the same issue ("dumps this RAID0 of all parity stripes"). If the patch is refreshed, could both pages say that the first row starts at the raid set of e_start?
reply Misc Code Checks Robot (Gatekeeper helper) lod_internal.h:751 — warn: lod_comp_shrink_to_extent():always true condition '(lod_comp->llc_stripe_count <= 65535) => (0-u16max <= u16max)'
Misc Code Checks Robot (Gatekeeper helper)
warn: lod_comp_shrink_to_extent():always true condition '(lod_comp->llc_stripe_count <= 65535) => (0-u16max <= u16max)'
reply Misc Code Checks Robot (Gatekeeper helper) lod_internal.h:751 — warn: lod_comp_shrink_to_extent():always true condition '(lod_comp->llc_stripe_count <= 65535) => (0-u16max <= u16max)'
Misc Code Checks Robot (Gatekeeper helper)
warn: lod_comp_shrink_to_extent():always true condition '(lod_comp->llc_stripe_count <= 65535) => (0-u16max <= u16max)'
reply Misc Code Checks Robot (Gatekeeper helper) lod_internal.h:751 — warn: lod_comp_shrink_to_extent():always true condition '(lod_comp->llc_stripe_count <= 65535) => (0-u16max <= u16max)'
Misc Code Checks Robot (Gatekeeper helper)
warn: lod_comp_shrink_to_extent():always true condition '(lod_comp->llc_stripe_count <= 65535) => (0-u16max <= u16max)'
reply Misc Code Checks Robot (Gatekeeper helper) lod_internal.h:751 — warn: lod_comp_shrink_to_extent():always true condition '(lod_comp->llc_stripe_count <= 65535) => (0-u16max <= u16max)'
Misc Code Checks Robot (Gatekeeper helper)
warn: lod_comp_shrink_to_extent():always true condition '(lod_comp->llc_stripe_count <= 65535) => (0-u16max <= u16max)'
reply Misc Code Checks Robot (Gatekeeper helper) lod_internal.h:751 — warn: lod_comp_shrink_to_extent():always true condition '(lod_comp->llc_stripe_count <= 65535) => (0-u16max <= u16max)'
Misc Code Checks Robot (Gatekeeper helper)
warn: lod_comp_shrink_to_extent():always true condition '(lod_comp->llc_stripe_count <= 65535) => (0-u16max <= u16max)'
reply Andreas Dilger lov_internal.h:160 — With RAID0|PARITY gone, lsme_parity_slots_per_raidset() is always 1 for parity and only multiplies poff at two places in lov_io.c. The six
Andreas Dilger
With RAID0|PARITY gone, lsme_parity_slots_per_raidset() is always 1 for parity and only multiplies poff at two places in lov_io.c. The six geometry helpers (lsme_stripe_origin, lsme_stripes_per_slot, lsme_parity_single_slot, lsme_slot_count, lsme_stripe_slot, lsme_parity_slots_per_raidset) reduce to one rule: for parity, origin = e_start, width = (stripe_count / p) * stripe_size, slot = stripe / p; otherwise RAID0. Two helpers would do, and the single-slot case can become an invalid entry. About 25 lines.
reply Gerrit AI review for Lustre lfs.c:4553 — (suggestion) This isn't a bug, but the ignored[] list repeats the names in lov_pattern_names[] in liblustreapi_layout.c, and llapi_lov_strin
Gerrit AI review for Lustre
(suggestion) This isn't a bug, but the ignored[] list repeats the names in lov_pattern_names[] in liblustreapi_layout.c, and llapi_lov_string_pattern() already parses the comma-separated getstripe form. The copy will drift when a new pattern name is added. If the patch is refreshed, consider calling llapi_lov_string_pattern() and mapping LOV_PATTERN_MDT and LOV_PATTERN_OVERSTRIPING to the LLAPI_LAYOUT_* values. The "unknown_" prefix would still need handling here.
reply Gerrit AI review for Lustre liblustreapi_layout.c:3229 — (minor) Carried over from the PS17 comment on liblustreapi_mirror.c, which asked for the parity-dump helpers to be static in lfs.c rather th
Gerrit AI review for Lustre
(minor) Carried over from the PS17 comment on liblustreapi_mirror.c, which asked for the parity-dump helpers to be static in lfs.c rather than new public API. mirror_dump_parity() moved, but llapi_layout_parity_pos_to_io() is still a global llapi_* function. liblustreapi.map exports `llapi_*`, so it is still in liblustreapi.so's ABI even though only lustreapi_internal.h declares it. If the patch is refreshed, could it move into lfs.c and use the public layout getters, or at least lose the llapi_ prefix so the map doesn't export it?
tags: 218_review_priority pt_ecro raid10-like
owner Keguang Xu · uploader Andreas Dilger · PS24 uploaded 1h ago · NEW · open in Gerrit ↗
commit message
LU-20690 ec: store EC parity like RAID10
The k >= p restriction is not a Cauchy/ISA-L limit. It comes from
storing parity as RAID0|PARITY: the p parity objects of a raidset are
concatenated along the file offset, so raidset_count * p * stripe_size
does not fit in a finite PFL extent when p > k (for example
--ec 2+3 -E 2M). This patch changes the parity layout; the p <= k
checks in lfs and llapi stay until a following patch removes them.
Store EC parity as LOV_PATTERN_PARITY instead. A raidset is an EC
split of the stripe set, and the layout is like RAID10 in that it has
the same two axes:
- across the raidsets of one stripe set: like RAID0, one
stripe_size per raidset;
- within one raidset: like RAID1, the p parity stripes share one
file offset (the same object_off).
The RAID1 axis comes from recovery. A raidset of k data and p parity
stripes survives the loss of any p of its k + p stripes, just as a
RAID1 of p + 1 copies survives the loss of any p copies. RAID1 is the
k == 1 case, where each parity is a copy of the data (--ec 1+N). The
p parities protect the same data, so they share its offset: the
offset says which data is protected, the parity index says which
redundancy unit it is.
What differs from RAID1 is I/O, not the role. For k > 1 the parities
are not replicas: each holds a different parity, and a lost stripe is
rebuilt from any k survivors rather than copied from one. The parity
uses the extent of the data component.
RAID0 places data rows from file offset 0, whereas counting EC rows
and raidsets from e_start groups the wrong k stripes when e_start is
not a multiple of the data stripe width: the stripes EC groups as one
raidset are not the objects lod paired with that raidset's parity
OSTs, and a degraded read rebuilds a lost stripe from the wrong
parity. For example -E 4M -c 1 -E eof -S 1M -c 8 --ec 4+1 puts offset
4M on object 4 (raidset 1), which counting from e_start encodes into
the parity of raidset 0. When e_start is not a multiple of
stripe_size, as after a 64K DoM component, counting stripe_size
parity slots from e_start also splits stripes at
e_start + n * stripe_size and overflows e_end.
Count rows and raidsets from file offset 0, as RAID0 maps the data
objects:
row = off / (stripe_count * stripe_size)
ec_off = O
+ (row - row of e_start) * raidset_count * stripe_size
+ raidset * stripe_size + off % stripe_size
Data before e_start is taken as zero, and so is its parity, which is
not stored: the origin O moves back from e_start over the raidsets of
the first row that end before e_start, and over the part of the
raidset of e_start below e_start % stripe_size when e_start is in its
last data stripe. slot % raidset_count stays the raidset, so the
parity OSTs lod pairs are unchanged, and every stored parity byte has
data in the component. Common DoM and PFL layouts with an unaligned
e_start are supported and keep their parity within [e_start, e_end),
such as:
- -E 64K -L mdt -E 1M -c 1 -S 1M -E eof -c 4 -S 4M --ec 4+2;
- -E 64K -L mdt -E 16M -c 2 -S 1M -E eof -c 4 -S 4M --ec 2+2;
- -E 64K -L mdt -E eof -c 4 -S 1M --ec 2+2;
- -E 1M -c 1 -S 1M -E 64M -c 1 -S 4M -E eof -c 4 -S 4M --ec 4+2.
When every raidset has one data stripe (--ec 1+N, or one data
stripe), there is one parity slot per data stripe and nothing to
pack, so rows and O count from file offset 0, as RAID0 does: ec_off
is the data offset, and each parity object is a copy of its data
object at the same object offsets, so it can stand in for it.
Otherwise O depends only on e_start, the data stripe count, k and the
stripe size, not on e_end, and when e_start is a multiple of the
stripe width, O is e_start.
Add ec_raidset_count(), ec_raidset_first(), ec_stripe_to_raidset()
and ec_off_to_raidset_offset() next to ec_split_stripes() in
lustre_user.h, and struct ec_parity_geom with ec_parity_geom_init(),
ec_data_to_parity() and its inverse ec_parity_to_data(), with
ec_parity_width() for the parity bytes of one stripe set, and use
them in lov, lod and llapi instead of open-coding the k0 * n0 split.
ec_parity_geom_init() also records the data row of parity slot 0 in
epg_row0 (0 for 1-data raidsets).
lov caches O in lsme_parity_origin when the layout is unpacked and
returns it from lsme_stripe_origin(), and lov_parity_geom_init()
fails a degraded read whose pair does not match in stripe size,
raidsets or origin; the parity mirror EOF of such a pair is also
bounded by one parity row per stripe set from e_start. Raidset
objects before e_start read as zero in degraded reads and resync.
A read is widened to whole raid sets, but not past the e_end of its
component, so a read ending there does not start an empty recovery
cycle for the next component's first raid set, which may begin before
its e_start.
lsme_parity_raid10() now just returns lsme_is_parity(), as every
parity component is LOV_PATTERN_PARITY, and
lsme_parity_slots_per_raidset() is dropped.
A component shorter than one stripe (e_end < e_start + stripe_size)
whose raidset continues past e_end (e.g. [64K, 1M) with -S 1M -c 2
--ec 2+2, or [1M, 4M) with -S 4M -c 2 --ec 2+2, where the second
stripe is never reached) still has no room for a full stripe_size
parity slot from e_start. ec_parity_fits() detects it:
llapi_layout_sanity() refuses it with LSE_EC_PARITY_FIT,
llapi_ec_check_comp_match() refuses to resync or verify it, and
lod_comp_prep_create() checks it again with the final data stripe
count, also for lfs mirror extend --ec.
The lov slot geometry, the STRIPE I/O scope and the per-stripe llapi
helpers were added by the previous patches and only take effect for
LOV_PATTERN_PARITY. This patch switches the encoding so they apply:
llapi_pattern_to_lov() and llapi_layout_to_lum() emit
LOV_PATTERN_PARITY, lov_pattern_supported() accepts it in place of
RAID0|PARITY (and lov_pattern_available() via that), and lod allocates
and verifies parity components with it. EC has not shipped, so the old
combination is not kept. Finite-extent stripe-count shrinking, now in
one lod_comp_shrink_to_extent() helper instead of three copies, is
skipped for parity components. lsm_unpackmd_comp_md_v1() and
lod_verify_striping() reject a component whose LCME_FL_PARITY flag and
LOV_PATTERN_PARITY disagree, since the parity geometry follows the
flag.
vvp_prep_size() no longer writes KMS into i_size for parity I/O.
ci_parity_eof is derived from i_size, and KMS is only a lower bound
of the data size, so a parity read within KMS shrank ci_parity_eof
for later parity I/O.
Userspace resync and verify move to the RAID10 offsets: one
stripe_size per raidset, each parity addressed by its stripe index,
leaving the part of the first parity slot below e_start alone. The
punch, zero-fill and hole verify of a parity slot are bounded by the
e_end of its component; no slot runs past e_end while
ec_parity_fits() holds, so this is only a defensive bound. Hole
punch-or-clear and hole verify loop over the p parity stripes that
share an offset when they fall back to zero-fill or zero-content
reads.
lfs setstripe --yaml parses the pattern as the comma-separated flags
lfs getstripe -y prints, so "parity,overstriped" keeps overstriping.
lfs mirror read of a parity mirror still dumps every parity object in
RAID0 order, through mirror_dump_parity() in lfs, from e_start. The
dump of a component stops at its e_end: when the extent is not a
multiple of the data stripe set, the raid sets of the last row past
e_end hold the data of the next component. The glimpse lock of such
a read spans every component, so lov_lock_sub_init() no longer
rejects a glimpse because a component the I/O does not cover has
fewer parity stripes than the designated one; lov_io_iter_init()
checks the components the I/O covers.
Example: -E 128M -c 11 -S 1M --ec 4+2
data/parity extent [0, 128M)
raidsets [4,2], [4,2], [3,2] (raidset_count=3)
parity has 6 OST objects
one data stripe set = 11M
one parity stripe set = 3M (not 1M flat, not 6M concat)
stripeset raidset data_pos ec_off concat objects
--------- ------- ----------- ------- ------- -------
0 0 [0, 4M) 0 0 0,1
0 1 [4M, 8M) 1M 2M 2,3
0 2 [8M, 11M) 2M 4M 4,5
1 0 [11M, 15M) 3M 6M 0,1
1 1 [15M, 19M) 4M 8M 2,3
1 2 [19M, 22M) 5M 10M 4,5
The concat column is what RAID0|PARITY would have used, and is what
overflows a finite extent when p > k.
Tests: sanity-ec 12c/12d/34c cover
holes and multi-raidset offsets, 30d and 31b-31e check the parity dump
size, 34d dumps a mixed-p mirror whose first extent is not a multiple
of the stripe set, 63d recovers reads from parity of raidset 1 in a
PFL component that does not start at 0, 301 covers an e_start that
stripe_size does not divide and checks that a component whose parity
would pass e_end is refused for that reason, 302 resyncs, verifies and
reads degraded common PFL layouts with an unaligned e_start, 303
recovers reads when e_start is not a multiple of the stripe width,
with equal and unequal raidsets, 304 covers zero-fill before e_start,
305 truncates at raidset and unaligned component boundaries, and 306
reads degraded across a component boundary where the raid set of the
first component runs into the next one.
llapi_layout_test asserts the component pattern is LLAPI_LAYOUT_PARITY
and 68 checks the parity placement over a range of geometries and
extents, and that 1-data raidset copies are at the data object
offsets.
Test-Parameters: testlist=sanity-ec ostcount=8
Test-Parameters: testlist=llapi_layout_test
Test-Parameters: testlist=sanity-ec ostcount=8 fstype=zfs
Signed-off-by: Keguang Xu <kxu@ddn.com>
Signed-off-by: Ronnie Sahlberg <rsahlberg@whamcloud.com>
Signed-off-by: Andreas Dilger <adilger@thelustrecollective.com>
Assisted-by: Cursor:Composer/Opus5.5 llm_code_and_review_tools
Assisted-by: ClaudeCode:claude-opus-5-5 ltvm llm_code_and_review_tools
Assisted-by: ClaudeCode:claude-fable-5-1 llm_code_and_review_tools
Change-Id: I9574df44969ddd40776f028b3c326d150ea08eb5
50622
master
J !B ✓T ✗9R +1/2
LU-15834 lfs: mirror extend take current OSTs into account
reviewing Zhenyu Xu · blocked on the owner: enforced tests failed
pw_shepherd
2 unresolved
L +538 −63
4h
LU-15834 lfs: mirror extend take current OSTs into account
reviewing Zhenyu Xu · blocked on the owner: enforced tests failed
pw_shepherd
2 unresolved
L +538 −63
4h
blocked on the owner: enforced tests failed
you voted +1 on current PS
janitor run: 2 failing config(s), none unique to this patch — janitor results
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-4 | RHEL 8.10 / x86_64 | ran 9 tests. 1 tests failed: sanity-quota. | session |
| review-dne-part-4 | RHEL 9.4 / x86_64 | ran 9 tests. 1 tests failed: sanity-quota. | session |
| review-dne-subtest-change | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity-flr. | session |
| review-dne-zfs-part-4 | RHEL 8.10 / x86_64 | ran 9 tests. 1 tests failed: sanity-flr. | session |
| review-dne-zfs-part-5 | RHEL 8.10 / x86_64 | ran 6 tests. 2 tests failed: sanityn, lustre-rsync-test. | session |
| review-dne-zfs-subtest-change | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity-flr. | session |
| review-ldiskfs | RHEL 9.4 / x86_64 | ran 5 tests. 1 tests failed: sanity-lnet. | session |
| review-ldiskfs | RHEL 8.10 / x86_64, SLES 15.5 / x86_64 | ran 5 tests. 1 tests failed: sanity-lnet. | session |
| review-ldiskfs-ubuntu | RHEL 8.10 / x86_64, Ubuntu 22.04 / x86_64 | ran 6 tests. 1 tests failed: sanity-sec. | session |
4 optional test failure(s) — informational
build #112602 SUCCESS · tests all Maloo sessions
reviews:
Ronnie Sahlberg +1
no vote yet: Qian Yingjin, Andreas Dilger, Alex Zhuravlev
patchsets:
PS17 11-01
PS18 12-18
PS19 02-10
PS20 03-25
PS21 04-17
+16 earlier
PS1 04-13 PS2 06-02 PS3 06-02 PS4 05-20 PS5 06-26 PS6 06-26 PS7 10-10 PS8 10-11 PS9 10-11 PS10 10-11 PS11 10-25 PS12 10-25 PS13 10-25 PS14 10-25 PS15 10-28 PS16 10-28threads: 0 need your reply · 0 waiting on others · 2 own notes · 0 bot
note Ronnie Sahlberg lod_qos.c:540 — These changes are unrelated to the intent of the commit and should probably be part of a separate "cleanup" patch.
Ronnie Sahlberg
These changes are unrelated to the intent of the commit and should probably be part of a separate "cleanup" patch. This and all other instances of the same change.
note Ronnie Sahlberg liblustreapi_layout.c:914 — Obj_count is only modified for the call to compute blob_size so this conditional to decrement it back to the original value should be move
Ronnie Sahlberg
Obj_count is only modified for the call to compute blob_size so this conditional to decrement it back to the original value should be moved to to line 857 just after blob_size = ... So the increment and decrement are close together. Even better would be to skip the conditional increment/decrement and do : blob_size = lov_user_md_size(obj_count + (comp->llc_flags & LCME_FL_FOR_MERGE) ? 1 : 0, magic); and thus avoid temporarily modifying obj_count.
tags: pw_shepherd
owner Zhenyu Xu · uploader Zhenyu Xu · PS21 uploaded 565d ago · NEW · open in Gerrit ↗
commit message
LU-15834 lfs: mirror extend take current OSTs into account Makes mirror extend try to allocate different OSTs from existing mirrors. When extending a mirror, the source file FID is stored in the victim layout's first component's object l_ost_oi::oi_fid, also set a special flag LCME_FL_FOR_MERGE in the component. As LOD parses this merge victim layout, it extracts the source file FID in lod_object::ldo_merge_src_fid, and as LOD is trying to allocate OST objects, it would try to avoid those OST indices already used in the overlapping components from the source file. Signed-off-by: Bobi Jam <bobijam@whamcloud.com> Change-Id: I8bcb0411ed64447c34fa8c1443c45a3888d73842
69828
master
J –B ✓T ✓R +2/2
LU-20958 llite: drop strict SOM size with the UPDATE lock
reviewing Andreas Dilger · you voted +1 on current PS
218_review_prioritypt_ecro
2 unresolved
S +35 −1
20h
LU-20958 llite: drop strict SOM size with the UPDATE lock
reviewing Andreas Dilger · you voted +1 on current PS
218_review_prioritypt_ecro
2 unresolved
S +35 −1
20h
build #134055 SUCCESS · tests all Maloo sessions
reviews:
Keguang Xu +1 · Ronnie Sahlberg +1
no vote yet: Zhenyu Xu, Patrick Farrell
patchsets:
PS1 10-19
PS2 10-19
threads: 2 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Andreas Dilger sanity-flr.sh:2570 — This should be fixed, but I'm reluctant to refresh the patch just for this. Will push a separate patch on top to fix, can be merged in if t
Gerrit AI review for Lustre
(style) This gate and skip message were copied from test_44e, which uses the enable_strict_som tunable. test_44i never touches that tunable, so the "for SOM tunable" reason doesn't fit here. If the patch is refreshed, could the message say what this test actually needs from the MDS?
Keguang Xu
Or should we use the recent version like 2.17.59?
Andreas Dilger
Agreed, the gate and skip message come from test_44e. If this patch is refreshed, the message will say what the test needs (strict SOM after resync) and use the 2.17.59 version.
Andreas Dilger
This should be fixed, but I'm reluctant to refresh the patch just for this. Will push a separate patch on top to fix, can be merged in if this needs to be refreshed for another reason.
reply Andreas Dilger sanity-flr.sh:2591 — The test cases are verified before/after to detect the failure, so this _should_ be enough to detect an issue.
Keguang Xu
(suggestion) Should we use 2 clients? cli1 `dd + stats` then cli2 `dd` which would revoke the `UPDATE` lock from cli1?
Andreas Dilger
One client is enough: strict SOM is only set on an FLR file after a resync, and the first write from the same client sends a layout write intent, which takes LAYOUT|UPDATE in EX mode on the MDS and cancels this client's own UPDATE lock too. The test of the bits will be in 64086, as above.
Andreas Dilger
The test cases are verified before/after to detect the failure, so this _should_ be enough to detect an issue.
tags: 218_review_priority pt_ecro
owner Andreas Dilger · uploader Andreas Dilger · PS2 uploaded 15d ago · NEW · open in Gerrit ↗
commit message
LU-20958 llite: drop strict SOM size with the UPDATE lock A strict SOM size and blocks from the MDS are only valid under the MDS UPDATE lock: a write or truncate of the file takes LAYOUT|UPDATE in EX mode before the MDS marks the SOM stale. The client kept OBD_MD_FLSIZE|OBD_MD_FLBLOCKS in lli_attr_valid after that lock was cancelled, so anything trusting them without a getattr would use a size from before another client's write. stat() was not affected, since ll_getattr() revalidates first, but EC lseek and the fsync blocks update are about to rely on these bits. Clear them from lli_attr_valid when the UPDATE lock is cancelled, so the next getattr fetches them again. Add sanity-flr test_44i, which writes a mirrored file with a strict SOM size and checks the blocks stored at close. Signed-off-by: Andreas Dilger <adilger@thelustrecollective.com> Assisted-by: ClaudeCode:claude-opus-5.5 ltvm,llm_code_and_review_tools Change-Id: Ice12d7b03bb2b78e4f6b1f839d4b8ac4b03ebbe5
69517
master
J –B ✓T ✓R +2/2
LU-20690 ec: implement STRIPE I/O scope
reviewing Keguang Xu · you voted +1 on current PS
218_review_blockerraid10-like218_review_prioritypt_ecro
3 unresolved
L +455 −99
1d
LU-20690 ec: implement STRIPE I/O scope
reviewing Keguang Xu · you voted +1 on current PS
218_review_blockerraid10-like218_review_prioritypt_ecro
3 unresolved
L +455 −99
1d
build #134549 SUCCESS · tests all Maloo sessions
reviews:
Ronnie Sahlberg +1 · Andreas Dilger +1
no vote yet: Marc Vef, Zhenyu Xu
patchsets:
PS5 10-17
PS6 10-22 Marc Vef
PS7 10-23
PS8 10-27
PS9 10-27
+4 earlier
PS1 10-08 PS2 10-10 PS3 10-13 PS4 10-14threads: 3 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Marc Vef patchset comment — I think there is a slight misunderstanding. The diagram puts each raidset's parity at the data offset of the raidset's first stripe. So, (0,
Ronnie Sahlberg
I attach an ASCII diagram of the layout, I this should go into ec.txt : === -c 8 -S ss --ec 4x2 Stripe size is ss 8 stripes per Stripe Set 2 Raid Sets, each 4 data stripes. 2 Parities, each with 2 stripes The SCOPE_STRIPE objects are conceptually sparse. Parity data is aligned to the same offset as the first data stripe in the raidset they protect. +-----------+----------+-----------------+-----------------+ | OFFSET | DATA | PARITY P0 | PARITY P1 | | | (1 obj | ci_designated_ | ci_designated_ | | | each) | stripe = 0 | stripe = 1 | +-----------+----------+-----------------+-----------------+ | 0 | d0 | phys stripe 0 | phys stripe 1 | \ \ | ss | d1 | | | | R 0 | | 2*ss | d2 | | | | | | 3*ss | d3 | | | / | +-----------+----------+-----------------+-----------------+ | S 0 | 4*ss | d4 | phys stripe 2 | phys stripe 3 | \ | | 5*ss | d5 | | | | R 1 | | 6*ss | d6 | | | | | | 7*ss | d7 | | | / / +-----------+----------+-----------------+-----------------+ | 8*ss | d0 | phys stripe 0 | phys stripe 1 | \ \ | 9*ss | d1 | | | | R 0 | | 10*ss | d2 | | | | | S 1 | 11*ss | d3 | | | / | +-----------+----------+-----------------+-----------------+ ... === I like that you align the parity stripe offset into the SCOPE_STRIPE P* "mirror" to the same offset as the first data stripe of the raidset it protects. That makes it trivial to map between a raidset offset and where the corresponding parity data is laid out. But it does however also mean that if an application wants to read all the parity data it would have to be aware of the ec geometry so that it could compute the stride between the individual parity stripes. You can't just "open, SCOPE_STRIPE(P0) then read all the data from offset 0 to eof and you have all the parity data for P0. Should it perhaps in the future also plug into faking SEEK_DATA/SEEK_HOLE for this so [0, ss[ would be DATA and [ss,4*ss[ would be HOLE ? I think that would be very useful for applications that would like to use this API as it would somewhat reduce the need to be ec-geometry-aware when reading from SCOPE_STRIPE. But that could be added much later.
Marc Vef
I think there is a slight misunderstanding. The diagram puts each raidset's parity at the data offset of the raidset's first stripe. So, (0, 4·ss, 8·ss) with holes.
But, the code packs them one stripe size apart (0, 1·ss, 2·ss). Keguang described this in more detail in LU-20690 ec: like-RAID10 parity layout | https://review.whamcloud.com/c/fs/lustre-release/+/68361 where he updated ec.txt. And Section 3 (of ec.txt) describes this. This matches what `lov_offset.c` does in 69516 (previous patch).
from ec.txt in 68361:
```
parity-offset = stripeset * raidset-count * stripe-size
+ raid-set * stripe-size
parity-object = raid-set * number-of-parities
```
This means a reader with a fixed index gets all of that parity back to back without holes
reply Andreas Dilger lov_io.c:1235 — What does "Acknowledged" mean here? That you will fix this in a later iteration, a later patch, comment is incorrect, other?
Gerrit AI review for Lustre
(minor) Carried over from patchset 8, where it was marked Done: the stripe index is still validated separately here, in lov_io_lru_reserve() and in lov_lock_sub_init(), and lov_page.c checks for a negative stripe. lov_io_mirror_init() still has no check. The checks also still disagree: this one runs only after uninstantiated components are skipped, while lov_lock_sub_init() checks every component in the range. One check in the ci_designated_mirror branch of lov_io_mirror_init(), once the mirror is resolved, would remove the per-caller copies.
Keguang Xu
Acknowledged
Andreas Dilger
What does "Acknowledged" mean here? That you will fix this in a later iteration, a later patch, comment is incorrect, other?
reply Gerrit AI review for Lustre lov_io.c:1319 — (style) Carried over from patchset 8, where it was Acknowledged: this isn't a bug, but this branch runs only for truncate. A truncate is nev
Gerrit AI review for Lustre
(style) Carried over from patchset 8, where it was Acknowledged: this isn't a bug, but this branch runs only for truncate. A truncate is never CIT_READ/CIT_WRITE, so lov_foreach_io_stripe() always visits every stripe here. If the patch is refreshed, the plain `for (stripe = 0; stripe < r0->lo_nr; stripe++)` loop would keep the churn, and conflicts with the EC read patches, smaller.
tags: 218_review_blocker raid10-like 218_review_priority pt_ecro
owner Keguang Xu · uploader Keguang Xu · PS9 uploaded 7d ago · NEW · open in Gerrit ↗
commit message
LU-20690 ec: implement STRIPE I/O scope In the RAID10-like EC parity layout the p stripes of a raidset share one file offset but hold different data, so read and write must name one of them. Implement LL_IO_SCOPE_STRIPE for that. ll_io_scope_validate() accepts STRIPE with ios_mirror_id in [1, MIRROR_ID_MAX] and ios_stripe_idx below LOV_EC_MAX_CODING_STRIPES. ios_stripe_idx must be 0 for FILE and MIRROR. It is not checked against p here: the scope outlives the layout and the I/O type is not known yet. ll_io_scope_init() handles STRIPE like MIRROR and, for STRIPE, copies ios_stripe_idx into cl_io::ci_designated_stripe and sets ci_designated_stripe_set. OBJECT stays reserved. ci_designated_stripe is an unsigned index. 0 is a valid stripe, so ci_designated_stripe_set says whether it is in use. A zeroed cl_io is unset. The index is meaningful only with ci_designated_mirror set. lov visits only the stripes an I/O touches through lov_foreach_io_stripe(), and maps an offset to a stripe through lov_io_stripe_number(). On a parity component, read and write use only the designated stripe of each raidset and fail with -EINVAL if it is unset or not less than p. Punch, truncate, fallocate and lseek reach every stripe and ignore the index, so a leftover STRIPE scope does not fail them. These helpers target the bare LOV_PATTERN_PARITY encoding for stripe picking. lov_page_init_composite() also refuses CPT_CACHEABLE pages when ci_designated_mirror is set on any parity component (lsm_entry_is_parity()), including RAID0|PARITY. That covers MIRROR and STRIPE scopes and LL_IOC_FLR_SET_MIRROR: a designated parity read that falls back to the page cache (fcntl clears O_DIRECT, or a short O_DIRECT read finished through the cache) returns -EINVAL. sanity-ec test_312 checks that case. llapi_io_scope_set(3) and the uapi comment document STRIPE, and that ios_layout_version 0 uses the fd version from the last lease release or resync lease. LL_IOC_SET_IO_SCOPE reuses nr 177 with LL_IOC_FLR_SET_MIRROR (different size) to save an ioctl number. sanity-flr test_213a checks the ioctl limits for FILE, MIRROR and STRIPE, that OBJECT stays reserved, that mirror resync still goes through the SET_MIRROR alias, and that a STRIPE read of a non-parity mirror ignores the index. sanity-ec test_311 checks that lseek, truncate and fallocate succeed for any index, and skips below 6 OSTs. io_scope gains -b, -x, -r, -t, -f and -l for that. Test-Parameters: testlist=sanity-flr Test-Parameters: testlist=sanity-ec ostcount=8 Assisted-by: Cursor:Composer-2 llm_code_and_review_tools Signed-off-by: Keguang Xu <kxu@ddn.com> Change-Id: Ia8c9e729df4f8651ac4f9dad88d4aef8b056100d
69762
master
J –B ✓T ✓R +2/2
LU-20287 lov: don't block setattr on unavailable OST
reviewing Keguang Xu · you voted +1 on current PS
pt_ecro218_review_priority
master-next
1 unresolved
L +319 −25
1d
LU-20287 lov: don't block setattr on unavailable OST
reviewing Keguang Xu · you voted +1 on current PS
pt_ecro218_review_priority
master-next
1 unresolved
L +319 −25
1d
build #134595 SUCCESS · tests all Maloo sessions
reviews:
Ronnie Sahlberg +1 · Andreas Dilger +1
no vote yet: Marc Vef
patchsets:
PS3 10-22
PS4 10-25
PS5 10-27
PS6 10-27 Marc Vef
PS7 10-28
+2 earlier
PS1 10-17 PS2 10-18threads: 1 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Andreas Dilger cl_object.h:2567 — seems reasonable if patch is refreshed
Gerrit AI review for Lustre
(minor) The new mtime and the new atime are both compared with one shared baseline, max(ctime, sa_cur_time). sa_cur_time is the max of the old mtime and atime, the cached OST mtime and atime, and the inode mtime and atime that vvp_attr_get() reads at iter_init. ll_md_setattr() has already written the new values into the inode by then. ll_merge_attr() merges each field on its own (atime with atime, mtime with mtime), so a newer value in the *other* field can never win the max() for this one.
With the shared baseline:
touch -m -d '+1 hour' f # mtime ahead, no lock (new >= ctime)
touch -a f # atime = now < base (mtime +1h)
The second command now counts as backward. vvp_io_setattr_lock() takes a CLM_WRITE [0, EOF] lock, which revokes other clients' extent locks even when every OST is up. If an OST is down, the command also blocks. Before this patch it took no lock. touch -m behaves the same way when the atime is ahead. So does utimensat() with atime < mtime when both are later than ctime, because the new mtime is already in the inode.
Would it be safer to keep separate mtime and atime baselines (sa_cur_mtime / sa_cur_atime), so that each new time is compared only with its own field? The comments on sa_cur_time, in cl_setattr_ost() and in vvp_io_setattr_iter_init() would then also match what is actually collected.
Andreas Dilger
seems reasonable if patch is refreshed
tags: pt_ecro 218_review_priority
owner Keguang Xu · uploader Keguang Xu · PS7 uploaded 6d ago · NEW · open in Gerrit ↗
commit message
LU-20287 lov: don't block setattr on unavailable OST chown/chgrp/chmod/touch wait in cl_setattr_ost() when a stripe OST is down: VFS sets ATTR_CTIME and the client sends OST_SETATTR to every stripe. That RPC only carries times/flags; UID/GID/PROJID are authoritative on the MDT and are pushed by MDS osp_sync (persistent llog, retried until the OST returns). Skipping the client RPC therefore does not leave stale ownership on OST objects. For non-truncate/non-fallocate setattr on any layout, mark LOV sub-IOs ci_ndelay so OSC sends OST_SETATTR with rq_no_delay and rq_no_resend (plus a 5s delay limit for idle import reconnect), and ignore -EAGAIN/-ENOTCONN/-ESHUTDOWN/-ETIMEDOUT for such sub-IOs in osc_io_setattr_end(). Ndelay applies only when the new mtime/atime are >= max(ctime, sa_cur_time), where sa_cur_time is the known prior inode/cached OST times: ll_merge_attr() takes max(MDT, OST), so skipping an OST that already holds a newer time would leave that value visible. Missed updates are not repaired later, and on a slow but connected OST the client update may also be dropped. The CLM_WRITE [0, EOF] lock in vvp_io_setattr_lock() uses that same baseline, not ctime alone. Plain touch/utime(NULL) therefore takes the lock when sa_cur_time is ahead of the client clock (writer clock skew, or a future timestamp) and revokes other clients' cached extent locks; that path does not set ndelay. That is intentional: without it ndelay would skip the newer OST and max() would keep the wrong time. Still block when: - mtime/atime moves earlier than that baseline; - OP_XVALID_FLAGS is set (chattr, encryption flag): MDS never pushes flags to OSTs. This only unblocks the setattr RPC itself (including chmod(2)). stat/glimpse can still hang when no usable stripe/mirror is reachable: e.g. coreutils chmod stats via FTS before chmod(2), so the command may block on plain files even though the syscall would not. That is unchanged here (see LU-11962 for MDT SOM). Also re-push UID/GID/PROJID from the MDT inode on FLR RESYNC_DONE in lod_layout_change() with the layout version update. osp_sync normally retries ownership pushes; this is belt-and-suspenders if an MDS->OST ownership setattr was skipped (e.g. exercised with OBD_FAIL_LFSCK_BAD_OWNER; layout LFSCK can also repair that). Add sanity 39v (plain file) and sanity-flr 100a/100b. Test-Parameters: testlist=sanity env=ONLY=39v Test-Parameters: testlist=sanity-flr Assisted-by: Cursor:Grok-4.6/Opus5.5 llm_code_and_review_tools Signed-off-by: Keguang Xu <kxu@ddn.com> Change-Id: I5005451e10f293279c441c1fc6d012fb5337d95d
69426
master
J –B ✓T ✓R +1/2
LU-19823 lod: spread failover groups over the RR array
reviewing Andreas Dilger · you voted +1 on current PS
pt_ecro218_review_priority
5 unresolved
M +203 −11
2d
LU-19823 lod: spread failover groups over the RR array
reviewing Andreas Dilger · you voted +1 on current PS
pt_ecro218_review_priority
5 unresolved
M +203 −11
2d
build #135076 SUCCESS · tests all Maloo sessions
reviews:
Ronnie Sahlberg +1
no vote yet: Keguang Xu, Marc Vef
patchsets:
PS2 10-06
PS3 10-07
PS4 10-10
PS5 10-13
PS6 11-01
+1 earlier
PS1 10-05your previous vote: +1 on PS5 (2026-10-23 03:10) — now at PS6
threads: 5 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Gerrit AI review for Lustre lu_tgt_alloc.h:26 — (nit) ltd_rr_failover_order() stores lu_rr_group_order() + 1 here, so 0 still means "not set". Maybe "failure domain, or failover group orde
Gerrit AI review for Lustre
(nit) ltd_rr_failover_order() stores lu_rr_group_order() + 1 here, so 0 still means "not set". Maybe "failure domain, or failover group order + 1, 0 if not set"?
reply Gerrit AI review for Lustre lod_qos.c:294 — (minor) If the patch is refreshed, could this kernel-doc also say that, without failure domains, the targets are ordered by failover group (
Gerrit AI review for Lustre
(minor) If the patch is refreshed, could this kernel-doc also say that, without failure domains, the targets are ordered by failover group (ltd_rr_failover_order())? It would also help to note that a change to the import's connection list doesn't trigger a resort and only takes effect at the next rebuild for another reason.
reply Andreas Dilger lod_qos.c:440 — This should be a very uncommon config. I don't want to make the code increasingly complex to handle theoretical corner cases. 99% of systems
Gerrit AI review for Lustre
(minor) With failover groups set as lrt_fd, lu_rr_fill() takes the by_fd path. In that path a server's targets are only spaced within their group, not across the whole array. When the OSSs of a pair have different OST counts, this can put two OSTs of the same OSS next to each other where the old by-server order did not.
I ran lu_rr_fill() in userspace (the lod_rr_test harness) with 6 OSSs in 3 pairs (oss/2) and OST counts 2,3 | 2,4 | 3,4 (18 OSTs). OSS sequence of the array:
old: 3 5 1 4 0 2 3 5 1 4 3 5 0 2 1 4 3 5
new: 5 3 1 4 2 0 5 3 1 4 3 5 0 2 4 1 3 5
The old order has no adjacent same-OSS slots and one same-pair slot. The new order has one adjacent pair of slots, and it is on a single OSS (5 at the end wraps to 5 at the start). Over 4-OSS configs with 1-8 OSTs per OSS, 972 of 4096 have more same-OSS adjacencies than before. The smallest is 2,4 | 4,3, where the old order had none. Equal pairs, and pairs that differ by one OST (e.g. one inactive OST), are fine.
Is that trade-off intended? If not, one option is to use the failover order only when it doesn't increase same-server adjacency, or to keep server spacing as the primary key and use the group only to break ties. Either way, it would help to mention it in the commit message.
Andreas Dilger
This should be a very uncommon config. I don't want to make the code increasingly complex to handle theoretical corner cases. 99% of systems will have totally uniform OSS nodes. A fraction will have maybe 2-3 different OSS configs, likely in different pools that would not be in the same allocation.
reply Andreas Dilger lod_qos.c:443 — I don't think this is _worse_ than before the patch. There are more patches in this series, and it could be further improved in a later pat
Gerrit AI review for Lustre
(defect) When any OST has ltq_failure_domain set, fdoms is allocated, and lu_rr_fdoms_init() now makes one lu_rr_fdom per inferred failover group instead of one per server. For FLR and EC layouts (fdom_rr in lod_ost_alloc_rr()), each slot of such a group now hands out the targets of both OSSs of the pair in turn from the shared lrf_next/lrf_next0 counters, and the lod_oss_avoided() retries skip through the pair's targets. Is that intended? The commit message says this "only orders the array, and does not limit where the stripes of a layout or its mirrors may go", but it also changes which OST each slot gives.
I checked this with lod_rr_test changed so that -u leaves the first half of the OSSs without a domain (pairs 0/1, 2/3, ... as with -F), and compared runs with and without -F:
lod_rr_test -o 10 -s 4 -d 4 -u -c 2 -M -F
OST1 has 560 objects, OST2 has 81
OST0 has 300 #0 objects, OST2 has 1
(without -F: 467 vs 366, and 200 #0 objects on each OST)
Over -o 8-64 -s 4-16 -d 2-8 -u -c 1-4:
- with -M, failed combinations go from 360 to 980 of 9399, and layouts with two stripes on one OSS from 1233 to 65633
- with -e 2, failed combinations go from 305 to 969 of 10467, and layouts with two stripes on one OSS from 100 to 116724
One option is to keep a separate lu_rr_fdom per server for the inferred groups and use the group only to order the array. Another is to skip ltd_rr_failover_order() when the array has explicit failure domains.
Andreas Dilger
I don't think this is _worse_ than before the patch. There are more patches in this series, and it could be further improved in a later patch.
reply Andreas Dilger sanity.sh:7000 — Can be done in a later patch. Mixed fdom and non-fdom configs _should_ be rare, but it should try to do a reasonable job if that happens. We
Gerrit AI review for Lustre
(suggestion) With -u, only OSS 0 has no domain, so its inferred group holds just that one OSS. This case doesn't cover an inferred group of two OSSs next to explicit domains, which is the case lrrt_inferred exists for. The -U line below covers it only with -c 1, without mirrors or parity. Could a case with an HA pair that has no domain, along with -M and -e, be added? That would also cover the lu_rr_fdom_tgt() imbalance described in lod_qos.c.
Andreas Dilger
Can be done in a later patch. Mixed fdom and non-fdom configs _should_ be rare, but it should try to do a reasonable job if that happens. We can refine this further, but it is not the common case.
tags: pt_ecro 218_review_priority
owner Andreas Dilger · uploader Andreas Dilger · PS6 uploaded 2d ago · NEW · open in Gerrit ↗
commit message
LU-19823 lod: spread failover groups over the RR array Without failure domains, the round-robin array only keeps the targets of each server apart. The targets of the two servers of an HA pair can still be next to each other in the array, so consecutive stripes of a file are on servers that can fail together, or be unavailable together while one of them fails over to the other. For the targets without a failure domain, ltd_rr_failover_order() groups them by the lowest NID of their primary and failover connections, which is the same for all the targets that can fail over to each other, and orders the array by group as for failure domains. lrrt_inferred keeps these groups apart from explicit failure domains with the same number, also when only some targets have a domain. All the targets of a server go in the group of its lowest NID, since the array is ordered only by server if a server is in several groups. The groups are ranked by NID, first by network and then by address, and lu_rr_group_order() orders them by the reversed bits of their rank, so groups with close NIDs, likely in the same network or rack, are mostly far apart in the array. Unlike failure domains, this does not limit where the stripes of a layout or its mirrors may go, but when other OSTs have failure domains, a slot of a failover group gives the OSTs of both servers of the group in turn to EC and FLR layouts. The MDT round-robin array, used for striped directories, is ordered the same way. The failover NIDs are read from the import at each rebuild of the array, so add_conn and del_conn take effect at the next rebuild. Add a -F option to lod_rr_test to put the OSSs without a failure domain in HA pairs, and check that consecutive OSTs in the array are on different pairs, and a -U option to leave every other OST without a failure domain. Without the ordering, "lod_rr_test -f -o 4-64 -s 2-16 -F" finds OSTs of one HA pair next to each other in 1852 of 30512 combinations, and in none with it. Signed-off-by: Andreas Dilger <adilger@thelustrecollective.com> Assisted-by: ClaudeCode:claude-opus-5.5 ltvm,llm_code_and_review_tools Change-Id: I39eae90881b61feee2e9b2aa20978a38e93ebbe5
69305
master
J –B ✓T ✓R +2/2
LU-8933 lod: balance round-robin first stripe start
reviewing Andreas Dilger · you voted +1 on current PS
218_review_prioritytestfix
master-next
2 unresolved
L +400 −66
2d
LU-8933 lod: balance round-robin first stripe start
reviewing Andreas Dilger · you voted +1 on current PS
218_review_prioritytestfix
master-next
2 unresolved
L +400 −66
2d
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-1 | RHEL 9.8 / x86_64 | ran 3 tests. 1 tests failed: sanity. | session |
build #134287 SUCCESS · tests all Maloo sessions
reviews:
Keguang Xu +1 · Ronnie Sahlberg +1
no vote yet: Lai Siyao, Oleg Drokin
patchsets:
PS2 09-30
PS3 10-02
PS4 10-05
PS5 10-10
PS6 10-22
+1 earlier
PS1 09-29your previous vote: +1 on PS5 (2026-10-12 22:03) — now at PS6
threads: 2 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Andreas Dilger lod_qos.c:1013 — seems reasonable if patch needs to be refreshed for some other reason
Gerrit AI review for Lustre
(suggestion) This isn't a bug, but the only caller passes `stripes` as `stripe_count`, which lod_ost_alloc_rr() has just set from `lod_comp->llc_stripe_count`. The mirror/EC branch then replaces it with `comp->llc_stripe_count`, and when no earlier match is found `comp == lod_comp`, so that is the same value again. Because the argument never changes the result, it reads as if the caller could pass some other count here. If the patch is refreshed, could lod_rr_key() use `comp->llc_stripe_count` in both cases and drop the parameter?
Andreas Dilger
seems reasonable if patch needs to be refreshed for some other reason
reply Keguang Xu lod_qos.c:1448 — (discussion) whether set key as `key = e_start | ((u64)stripe_count << 48)` be more clear and explicit compared with this implicit addition?
Keguang Xu
(discussion) whether set key as `key = e_start | ((u64)stripe_count << 48)` be more clear and explicit compared with this implicit addition?
tags: 218_review_priority testfix
owner Andreas Dilger · uploader Andreas Dilger · PS6 uploaded 12d ago · NEW · open in Gerrit ↗
commit message
LU-8933 lod: balance round-robin first stripe start
With qos_threshold_rr=100, some OST/stripe count combinations give
some OSTs twice as many first stripes (#0 objects) as others, e.g.
6 OSTs with 4 stripes, or two OSSs with 12 OSTs each and 16 stripes,
where the OSTs of one OSS got 75 and the other OSS 125 per 100.
Each layout starts where the previous one ended, so layouts start
only on OSTs gcd(stripes, OSTs) apart in the RR array, and the start
index wraps after an uneven number of layouts. Advancing the start
offset by one on every wrap then visits some of those OST sets more
often than others, and lod_qos_calc_rr() interleaves the OSSs in the
array, so the imbalance can follow the OSS boundary. The components
of PFL layouts, allocated in turn, advance the same start index, so
a fixed sequence of stripe counts can also leave the start of each
component on only a few OSTs. Overstriped layouts with more stripes
than OSTs advance the start index by more than the OST count, but it
was only wrapped by one OST count, so the same OSTs got the extra
stripes of every layout until the next reseed.
Keep a separate start index for each stripe count and component
extent, in struct lu_qos_rr_stream, for the 16 (LQR_STREAMS) most
recently used. A new one continues from the start index of the one it
replaces, so using more of them in turn is no worse than before. The
mirrors and EC parity of one extent share the start index of the first
of them, and when they are allocated one after the other they continue
from each other without advancing the start offset, so they are still
on different OSSs. Advance the start offset once every N/gcd(stride,
N) layouts, where the stride is the stripes of a layout and of the
mirrors or parity that continue from it, after every OST in the
current set has been used as a start, so each run of N layouts with
the same stripe count starts once on each of N OSTs. Count layouts
rather than wraps, since OSTs that are skipped change the stride
between layouts. Wrap the start index fully for overstriped layouts.
This also fixes the same imbalance for directory stripes over remote
MDTs.
Make sanity test_51g check the first stripe balance, overstriped, PFL,
mirrored and EC layouts, and keep the test_51d exceptions only for
older MDSs. Before this patch, lod_rr_test finds that these fail the
test_51d first stripe check (for some component):
before after
3-256 OSTs, 1-8 OSSs, 1-256 stripes 50777/263079 0/263079
3-32 OSTs, up to 4 stripes per OST 2511/8388 0/8388
3-64 OSTs, PFL with 1, 4, all stripes 25/247 0/247
3-64 OSTs, PFL with 8, 4, 2, 1 stripes 68/247 0/247
562 of the overstriped combinations also fail it for total objects
before this patch. With one unusable OST that is skipped, 3544 of
4500 combinations of 4-48 OSTs have more than 3x the #0 objects on
some OST than another before this patch, and 853 after.
Objects per OST from sanity test_51d, 6 OSTs, 600 files -C 4:
OST0 OST1 OST2 OST3 OST4 OST5
before #0 133 67 133 67 135 67
after #0 100 100 101 101 100 100
total ~402 ~402 ~402 ~402 ~402 ~402
Fixes: c7f2e70a27e8 ("LU-1303 lod: QoS allocation policy")
Fixes: fa34a15f619c ("LU-15282 lod: less spinlock on the alloc rr")
Signed-off-by: Andreas Dilger <adilger@thelustrecollective.com>
Assisted-by: ClaudeCode:claude-opus-5.5 ltvm,llm_code_and_review_tools
Change-Id: I9c0157db12c09c5ff5d75cfac31a9abf3e3ebbe5
69421
master
J –B ✓T ✓R +2/2
LU-19823 lod: balance RR allocation across failure domains
reviewing Andreas Dilger · you voted +1 on current PS
218_review_prioritypt_ecro
master-next
7 unresolved
XL +982 −177
6d
LU-19823 lod: balance RR allocation across failure domains
reviewing Andreas Dilger · you voted +1 on current PS
218_review_prioritypt_ecro
master-next
7 unresolved
XL +982 −177
6d
build #134288 SUCCESS · tests all Maloo sessions
reviews:
Keguang Xu +1 · Ronnie Sahlberg +1
no vote yet: Marc Vef
patchsets:
PS1 10-05
PS2 10-10
PS3 10-10
PS4 10-13
PS5 10-22
your previous vote: +1 on PS4 (2026-10-17 02:28) — now at PS5
threads: 7 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Gerrit AI review for Lustre lod_qos.c:1665 — (defect) What happens when every OST that lu_rr_fdom_tgt() offers is rejected? This loop then calls lu_rr_fdom_tgt() exactly lrf_count times
Gerrit AI review for Lustre
(defect) What happens when every OST that lu_rr_fdom_tgt() offers is rejected? This loop then calls lu_rr_fdom_tgt() exactly lrf_count times. The domain counter advances by a full cycle and ends up where it started. The OST returned is the last one tried, which is lrfs_tgts[(next - 1) % lrf_count]: the OST most recently handed out from that counter. So the rotation doesn't move, and each such stripe lands on the same OST as the previous consumer of the counter.
This happens whenever all OSTs of a domain are on OSSs in lag_oss_avoid_array. lod_collect_avoidance() doesn't skip components whose llc_id is still LCME_ID_INVAL at create time. So for EC parity, the avoid list holds the OSSs of the file's own data stripes, not just those of other FLR mirrors. Some cases:
- one OSS with several domains, FLR or EC
- an HA pair whose OSTs share enclosures as domains, with EC data stripes on both OSSs
With the patch's own lod_rr_test harness, which has the same loop:
-f -o 4-16 -s 1 -d 2-4 -D -M 43 of 52 combinations fail
(last OST of each domain gets 5x the others)
-f -o 6-16 -s 1 -d 3-4 -D -e 1 47 of 55 fail
-o 12 -s 2 -d 3 -D -e 1 -c 2 OST7 450 objects, OST4 200, same domain
This looks different from LU-20925. That ticket covers the skew when only some of a domain's OSTs are avoided, while here the rotation stops completely, and it also hits EC parity, which has no mirrors. In the harness, taking one more lu_rr_fdom_tgt() after the loop when nothing qualified (so the counter advances by one net) brings the first two runs to 0 failures. It also leaves the existing -d, -d -M and -d -D -M results unchanged or better. Another option is to pass an offset to lu_rr_fdom_tgt(), so the probe doesn't touch the shared counter.
reply Keguang Xu lod_qos.c:616 — (style) lod_oss_avoid_some -> lod_flr_has_unused_oss?
Keguang Xu
(style) lod_oss_avoid_some -> lod_flr_has_unused_oss?
reply Keguang Xu lod_qos.c:632 — (style) lod_oss_avoided -> lod_flr_oss_used_by_peer ?
Keguang Xu
(style) lod_oss_avoided -> lod_flr_oss_used_by_peer ?
reply Keguang Xu lod_qos.c:645 — (style) lod_fdom_tgt_skip -> lod_rr_fdom_ost_unusable?
Keguang Xu
(style) lod_fdom_tgt_skip -> lod_rr_fdom_ost_unusable?
reply Keguang Xu lod_qos.c:1587 — (style) slot_ost_fallback?
Keguang Xu
(style) slot_ost_fallback?
reply Andreas Dilger lod_rr_test.c:245 — This is only the test so efficiency is not the primary concern, but could be updated if patch is refreshed.
Gerrit AI review for Lustre
(minor) This loop calls oss_used(), which itself scans every OST, once for every OST, on every rr_alloc() call. It doesn't stop at the first unused OSS, and it also runs without failure domains (lqr_fdoms == NULL), where oss_avoid is never used. So every lod_rr_test invocation now does O(OSTs^2) work per layout, including the ones that existed before this patch.
Built locally with gcc -O2:
-o 3-64 -s 1-4 5.8s -> 93s
-o 3-48 -s 2-8 -M 2.9s -> 31s
pre-existing 8 runs 22s -> 245s
full test_51g ~9 min
That will take much longer on CI VMs, and much longer still when the subtest-change sessions loop test_51g.
Gating the loop as lod_ost_alloc_rr() does, and stopping at the first match, brings each run back to about 5-10s with the same results (0 failed combinations for each test_51g case I reran):
if (!rt->no_first && lqr->lqr_fdoms)
for (i = 0; i < rt->ost_count && !oss_avoid; i++)
Andreas Dilger
This is only the test so efficiency is not the primary concern, but could be updated if patch is refreshed.
reply Andreas Dilger sanity-ec.sh:5693 — Can be fixed if patch needs to be refreshed.
wc-checkpatch
(style) 'comma_list $(mdts_nodes' may be misspelled - perhaps 'mdts_nodes'?
Andreas Dilger
Can be fixed if patch needs to be refreshed.
tags: 218_review_priority pt_ecro
owner Andreas Dilger · uploader Andreas Dilger · PS5 uploaded 12d ago · NEW · open in Gerrit ↗
commit message
LU-19823 lod: balance RR allocation across failure domains
The RR array interleaves OSTs only by OSS, and EC and FLR layouts
that need their stripes in different failure domains skip the OSTs
of domains they already use. Each skip advances the shared start
index, so the layouts lock into a pattern that uses some OSTs much
more than others and some not at all, e.g. 24 OSTs on 6 OSSs in 3
failure domains with 3-stripe EC layouts get 0-401 objects per OST.
Order the RR array in lu_rr_fill() by failure domain, then by OSS in
each domain, so that consecutive OSTs are in different failure
domains, unless OSSs have OSTs in several domains, when it is ordered
by OSS as before so consecutive OSTs are still on different OSSs.
Stagger OSSs and domains with the same OST count so that their OSTs do
not fall next to each other, and swap apart any OSTs still next to one
of their own OSS or domain, as with OSSs of different sizes. Domains
of different sizes still need skips, so layouts that need distinct
domains now scan from a start reserved by lu_rr_reserve() without
advancing the shared index, use each array slot only to pick a failure
domain, and take the OSTs of each domain in turn in lu_rr_fdom_tgt(),
separately for the first stripes of each stripe count and component,
and likewise for the OSTs of each OSS without a failure domain,
skipping any the layout already uses. Layouts that use several OSTs
of an OSS without a failure domain can still be up to about 1.3x
unbalanced within it, but a failure domain should be set for all OSTs.
A domain offers only one of its OSTs per slot, so if a layout is still
short of stripes, try the slot OSTs themselves before accepting fewer.
EC parity takes the OSTs of each domain like the later stripes, so it
does not shift the first stripes of the data. FLR mirrors prefer the
OSTs of a domain on an OSS that the other mirrors do not use yet,
which can unbalance domains whose OSTs are on several OSSs (LU-20925).
Rebuild the RR arrays when an OST failure domain changes, counted in
lq_rr_gen, since it is only known once the OST has reported statfs.
Add failure domains to lod_rr_test and sanity test_51g, and add
sanity-ec test_35c to check RR balance with unequal domains. Test
of lod_rr_test with 3-64 OSTs, 1-16 OSSs, 1-8 failure domains and
up to one stripe per domain, comparing OSTs in the same domain:
combinations 24 OSTs, 6 OSSs, 3 domains, 3 stripes
failed objects per OST #0 objects per OST
before 16344/22165 0-401 0-399
after 0/22165 300 100
sanity-ec test_35c, 8 OSTs in domains 1,1,1,1,2,3,2,3, 160 EC 2+1
files with qos_threshold_rr=100, objects per OST:
OST0 OST1 OST2 OST3 OST4 OST5 OST6 OST7
before 80 79 1 0 81 81 79 79
after 41 41 39 39 80 80 80 80
Signed-off-by: Andreas Dilger <adilger@thelustrecollective.com>
Assisted-by: ClaudeCode:claude-opus-5.5 ltvm,llm_code_and_review_tools
Change-Id: I7111ce7a05f6431ceeaba20213d3c3921e3ebbe5
64937
master
J –B ✗T –R +0/2−
LU-20016 ec: ISA-L SIMD for userspace and kernel
reviewing Patrick Farrell · blocked on the owner: build failure
21 unresolved
XL +36039 −19
32d
LU-20016 ec: ISA-L SIMD for userspace and kernel
reviewing Patrick Farrell · blocked on the owner: build failure
21 unresolved
XL +36039 −19
32d
blocked on the owner: build failure
you voted +1 on current PS
build #132756 FAILURE
reviews:
Ronnie Sahlberg +1 · Andreas Dilger -1
no vote yet: Qian Yingjin, Hiroshi Nishida, Marc Vef
patchsets:
PS1 03-27
PS2 03-27
PS3 03-27
threads: 21 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply patrick bot COMMIT_MSG:14 — Patrick-Bot: Converting the NASM routines and maintaining a second assembly implementation needs a dedicated change with instruction-equival
Andreas Dilger
It would make sense to put an LLM to work on converting the NASM .asm files int GCC .S files. It should be possible to have it iterate on getting the GCC-compiled code to generate the same x86 byte code, or at least compile and run correctly to pass whatever correctness tests exist for this code.
In fact, a quick search shows that NASM already has a tool to do this:
Automatically convert Intel NASM assembly to GNU Assembler (GAS/GASM)
syntax using the intel2gas tool, which converts between NASM and AT&T
syntax, or by utilizing NASM's built-in output capabilities to generate
GAS-compatible objects.
$ intel2gas -i input.asm -o output.s
These generated/converted .S files should be stored alongside the original .asm files in Git. If NASM is available the originals can be compiled, but in the common case where NASM is not available the .S files would be compiled and linked into the kernel modules.
I think it is worthwhile to keep both, since it would be easier to update the .asm files from upstream ISA-L, but it might be some time before the .S files are update to match.
patrick bot
Patrick-Bot: Converting the NASM routines and maintaining a second assembly implementation needs a dedicated change with instruction-equivalence and runtime validation across the ISA variants. This exceeds small-fix scope.
reply patrick bot COMMIT_MSG:7 — Patrick-Bot: Changed the commit subject to LU-19905, whose ticket covers importing ISA-L assembly. LU-20016 describes the benchmark tool. No
Andreas Dilger
This should probably use LU-19905, or change the description of LU-20016?
patrick bot
Patrick-Bot: Changed the commit subject to LU-19905, whose ticket covers importing ISA-L assembly. LU-20016 describes the benchmark tool. No JIRA fields were changed. These local edits remain unpublished: upload refuses the obsolete ancestry, and rebasing onto 64927 PS8 needs substantive EC integration choices.
reply patrick bot COMMIT_MSG:71 — Patrick-Bot: Removed the duplicated performance table and its associated claims from this commit message. No aarch64 measurements are claime
Andreas Dilger
This table is the same between the x86 and aarch64 patches. It would be useful to fix one or the other to have the correct data for that CPU architecture.
patrick bot
Patrick-Bot: Removed the duplicated performance table and its associated claims from this commit message. No aarch64 measurements are claimed, and change 64938 was not modified. These local edits remain unpublished: upload refuses the obsolete ancestry, and rebasing onto 64927 PS8 needs substantive EC integration choices.
reply patrick bot ec_aarch64_neon.c:17 — Patrick-Bot: The comment now names the verified 5.14 (RHEL9) and 6.12 (RHEL10) NEON APIs and removes the unsupported claim about older kbuil
Andreas Dilger
(minor) It would be better to specify which kernel version is non-functional, so that this can become conditional upon a newer kernel (assuming there is a benefit to use SVE-optimized versions).
patrick bot
Patrick-Bot: The comment now names the verified 5.14 (RHEL9) and 6.12 (RHEL10) NEON APIs and removes the unsupported claim about older kbuild rejecting SVE directives. Enabling kernel SVE remains separate work. These local edits remain unpublished: upload refuses the obsolete ancestry, and rebasing onto 64927 PS8 needs substantive EC integration choices.
reply patrick bot ec_aarch64_neon.c:20 — Patrick-Bot: The comment now names Linux 5.14 (RHEL9) and 6.12 (RHEL10), whose headers provide the no-argument NEON API, and removes unverif
Andreas Dilger
(minor) Again, please specify kernel versions so that this can be fixed in the future for newer kernel versions.
patrick bot
Patrick-Bot: The comment now names Linux 5.14 (RHEL9) and 6.12 (RHEL10), whose headers provide the no-argument NEON API, and removes unverified compatibility claims. These local edits remain unpublished: upload refuses the obsolete ancestry, and rebasing onto 64927 PS8 needs substantive EC integration choices.
reply patrick bot ec_aarch64_neon.c:31 — Patrick-Bot: Changed the availability flag to bool and its assignments to true/false. These local edits remain unpublished: upload refuses t
Andreas Dilger
(style) `bool`?
patrick bot
Patrick-Bot: Changed the availability flag to bool and its assignments to true/false. These local edits remain unpublished: upload refuses the obsolete ancestry, and rebasing onto 64927 PS8 needs substantive EC integration choices.
reply patrick bot ec_aarch64_neon.c:34 — Patrick-Bot: The NEON declarations remain local. A shared architecture header needs a signature audit and integration with the userspace and
wc-checkpatch
(style) externs should be avoided in .c files
Andreas Dilger
These warnings are correct and the prototypes should be moved to a .h file that is included here and into the file where these functions are implemented. Having the function prototype in a local .c file prevents the compiler from checking argument type/count against the implementation, and can result in hard-to-find bugs in the future.
patrick bot
Patrick-Bot: The NEON declarations remain local. A shared architecture header needs a signature audit and integration with the userspace and assembly builds; that work remains for the owner.
reply patrick bot ec_aarch64_neon.c:165 — Patrick-Bot: Changed the loop to rows >= 6 and removed case 6. The NEON wrapper matches scalar parity for rows 1..24 using scalar stand-ins
Andreas Dilger
(style) should this be changed to `rows >= 6` and remove the `case 6:` in the switch, as is done in `ec_encode_data_neon()` above?
patrick bot
Patrick-Bot: Changed the loop to rows >= 6 and removed case 6. The NEON wrapper matches scalar parity for rows 1..24 using scalar stand-ins under ASan/UBSan; actual ARM runtime validation remains outstanding. These local edits remain unpublished: upload refuses the obsolete ancestry, and rebasing onto 64927 PS8 needs substantive EC integration choices.
reply patrick bot ec_base_aliases.c:1 — Patrick-Bot: Added BSD-3-Clause SPDX tags to 116 files with existing complete BSD-3-Clause notices. The two aarch64_label.h files have no li
Andreas Dilger
These files should all get SPDX headers with BSD 3-clause license markers
patrick bot
Patrick-Bot: Added BSD-3-Clause SPDX tags to 116 files with existing complete BSD-3-Clause notices. The two aarch64_label.h files have no license notice; their intended license needs confirmation. Existing GPL/BSD-2-Clause identifiers were preserved. The local additions are unpublished because upload is blocked by obsolete ancestry.
reply patrick bot ec_benchmark.c:9 — Patrick-Bot: Adding deterministic known-answer encode/decode checks and fixed reference hashes changes the benchmark design and needs indepe
Andreas Dilger
Does it make sense to add a (post benchmark) step to confirm that the generated data is correct? Going fast doesn't help if the parity is wrong... Something like: - use PRNG to generate repeated/consistent "random" data in the data stripes - generate parity chunks under timer for benchmark - calculate hash (adler32?) of "random" data chunks - compare data chunk hashes to hard-coded values to confirm correct data - calculate hash of generated parity chunks - compare parity chunk hashes to hard-coded values from C code to verify parity - reconstruct data chunks under timer for benchmark - calculate hash of reconstructed data chunks - compare data chunk hash to original value to confirm correct data reconstruction Having static hash values compiled into the test module (vs. comparing against just-computed C hash values) helps confirm the assembly and C versions are operating correctly, and do not change over time for whatever reason. This should also catch new ASM versions as they are added, or selected for new CPU architectures or variants.
patrick bot
Patrick-Bot: Adding deterministic known-answer encode/decode checks and fixed reference hashes changes the benchmark design and needs independently verified test vectors. This remains for the owner.
reply patrick bot ec_benchmark.c:11 — Patrick-Bot: Moving the benchmark into a separate module requires build, symbol-interface and lifecycle changes. Its long non-preemptible ba
Andreas Dilger
Another option to avoid having this code resident in the kernel for the 0.0000001% of the time it is needed would be to put it into a dedicated `lustre/kunit/ec_benchmark.c` test module, so that `modprobe ec_benchmark` loads and runs the benchmark and prints the output to the console. There is already an `ec_test.c`, but it might become more heavyweight in the future and having a dedicated `ec_benchmark.ko` module might be better.
patrick bot
Patrick-Bot: Moving the benchmark into a separate module requires build, symbol-interface and lifecycle changes. Its long non-preemptible batch also needs redesign. This remains for the owner.
reply patrick bot ec_benchmark.c:122 — Patrick-Bot: Joined the final parameters onto the preceding declaration line. These local edits remain unpublished: upload refuses the obsol
Andreas Dilger
(style) can fit on previous line
patrick bot
Patrick-Bot: Joined the final parameters onto the preceding declaration line. These local edits remain unpublished: upload refuses the obsolete ancestry, and rebasing onto 64927 PS8 needs substantive EC integration choices.
owner Patrick Farrell · uploader Patrick Farrell · PS3 uploaded 221d ago · NEW · open in Gerrit ↗
commit message
LU-20016 ec: ISA-L SIMD for userspace and kernel
Integrate Intel ISA-L optimized assembly into Lustre's
erasure coding library for both userspace and kernel,
on x86_64 and aarch64. Add debugfs kernel benchmark
for measuring FPU save/restore overhead.
Userspace x86_64 (libec.a):
- 72 NASM assembly files (SSE/AVX/AVX2/AVX-512/GFNI)
- ec_multibinary.asm: runtime CPUID dispatch
- ec_highlevel_func.c: N-vector dispatch layer
- Falls back to C scalar when NASM unavailable
Userspace aarch64 (libec.a):
- NEON + SVE .S assembly + SVE C intrinsics
- ec_aarch64_dispatcher.c: getauxval() dispatch
- ec_aarch64_highlevel_func.c: N-vector dispatch
Kernel x86_64 (ec.ko):
- Pre-assemble ISA-L NASM .asm files into .o,
link into ec.ko (71 assembly objects)
- ec_dispatch.c: boot_cpu_has() selects AVX2/AVX/SSE
at module init, kernel_fpu_begin/end wrapping
- ec_highlevel_func.c: N-vector dispatch layer
- Falls back to C scalar in interrupt context
Kernel aarch64 (ec.ko):
- NEON .S assembly files (GAS format, direct kbuild)
- ec_aarch64_neon.c: kernel_neon_begin/end wrapping
with may_use_simd() check, hwcap detection
- SVE excluded from kernel (toolchain portability)
Build system:
- lustre-erasurecode.m4: detect NASM, aarch64
- erasurecode/autoMakefile.am: three-way dispatch
- utils/Makefile.am: link against libec.a
- ec/Makefile.in: NASM pre-assembly for kernel
Bug fixes in ec_perf_bench.c:
- -p flag was setting k instead of p
- frag_ptrs allocated stripe_size pointers not m
- Inverted exit code and stale rc from getopt
- Use aligned_alloc(64) for data buffers
Kernel benchmark (debugfs):
- /sys/kernel/debug/lustre/ec/benchmark
- 4 phases: FPU overhead, SIMD+FPU per-call,
SIMD+FPU amortized, C scalar baseline
- Input format (write to debugfs entry):
echo 1 > .../ec/benchmark (defaults)
echo "k=5 p=2 s=128" > .../ec/benchmark
cat .../ec/benchmark
Parameters (key=value, space separated):
k data stripes (default 5, max k+p=16)
p parity stripes (default 2)
s stripe size in KB (default 128, max 65536)
"echo 1" runs with all defaults. Unrecognized
input returns -EINVAL. cat shows results or
usage instructions if not yet run.
Fix gf_vect_mul_init naming to use _base suffix
consistently (aligns with ISA-L convention) in
both userspace and kernel ec_base.c.
Performance (5+2, 1 thread, QEMU VM, AVX2):
Stripe | Kernel | Kernel | Userspace | SIMD | Kernel vs
Size | SIMD | Scalar | SIMD | Speedup | Userspace
| | | | in Kernel|
-------|---------|---------|-----------|----------|----------
64 KB | 17099 | 540 | 404345* | 31.7x | 0.04x*
128 KB | 16888 | 531 | 197511* | 31.8x | 0.09x*
256 KB | 17032 | 539 | 98401* | 31.6x | 0.17x*
1 MB | 17142 | 538 | 24830 | 31.9x | 0.69x
4 MB | 10309 | 533 | 5385 | 19.3x | 1.91x
16 MB | 10954 | 534 | 1048 | 20.5x | 10.5x
All throughput in MB/s. (*) Userspace numbers at
small stripes are inflated by cache residency.
At 4-16MB the kernel is faster -- its kvmalloc
pages are physically scattered, matching real
Lustre page cache behavior. Replicating this in
userspace is non-trivial and not worth the effort;
the kernel benchmark is authoritative.
FPU save/restore overhead was measured at 25-54 ns
on this platform (Ryzen 3700X) -- negligible vs
encode time (~39us at 128KB). The benchmark
measures this separately (Phase 1) so it can be
characterized on other hardware where it may be
more significant.
Generated with Claude Code + Tools
Test-Parameters: testlist=sanity-ec
Change-Id: If4c57c328c0e23bb6769dcbc45d52d43b03a7837
Signed-off-by: Patrick Farrell <pfarrell@whamcloud.com>
CC'd — on your radar, review not requested
(1)
69511
master
J –B ✗T –R -1/2−
LU-20802 lov: add OBJECT I/O scope read and lseek
cc Keguang Xu · blocked on the owner: needs rebase — checkpatch: cannot be cherry-picked; build failure
needs rebase
WIP
2 unresolved
XL +1103 −63
2d
LU-20802 lov: add OBJECT I/O scope read and lseek
cc Keguang Xu · blocked on the owner: needs rebase — checkpatch: cannot be cherry-picked; build failure
needs rebase
WIP
2 unresolved
XL +1103 −63
2d
build #133120 FAILURE
threads: 0 need your reply · 0 waiting on others · 2 own notes · 0 bot
note Ronnie Sahlberg patchset comment — Aside from READ and LSEEK, should this also modify fstat and friends?
Ronnie Sahlberg
Aside from READ and LSEEK, should this also modify fstat and friends? It feels like at least block-size and eof of the object would be usefule to retreive, possibly the timestamps as well.
note Ronnie Sahlberg lov_io.c:871 — Should we check here if the object has been administratively deactivated, like osc.active=0 and fail early?
Ronnie Sahlberg
Should we check here if the object has been administratively deactivated, like osc.active=0 and fail early?
owner Keguang Xu · uploader Keguang Xu · PS2 uploaded 26d ago · NEW · open in Gerrit ↗
commit message
LU-20802 lov: add OBJECT I/O scope read and lseek Open LL_IO_SCOPE_OBJECT for O_DIRECT pread and lseek (SEEK_DATA, SEEK_HOLE, SEEK_END). The caller names one OST object by (ios_comp_id, ios_stripe_idx); pos is an offset on that object. ios_comp_id must be non-zero and stripe index 0 is valid. A non-zero ios_obj_fid only checks that the pair still names that object. FID alone is rejected. The ioctl only checks the arguments; the target is resolved on each I/O. Add ci_obj_io / ci_obj_target and a separate lov_obj_io_ops table so OBJECT I/O is one identity sub-IO. File-offset helpers (lov_io_rw_iter_init, lov_io_iter_init, lov_io_lseek_end, lov_offset.c) are unchanged. EOF is the target object's kms, a third case beside i_size and ci_parity_eof. Do not copy the FLR layout generation into ci_layout_version; ios_layout_version is checked when the caller sets it. Reject mmap, buffered read, write, truncate, and fallocate on an OBJECT-scope fd. Dead objects return -EIO without CIT_EC_RD. OBJECT is checked before the scope switch, so STRIPE can update that switch on its own. sanity-flr test_213a and test_214 cover the ioctl and object read/lseek. Test-Parameters: ignore forjanitoronly Assisted-by: Cursor:Grok-4.6/Opus5.5 llm_code_and_review_tools Assisted-by: Cursor:Grok-4.6 llm_code_and_review_tools Signed-off-by: Keguang Xu <kxu@ddn.com> Change-Id: If4dd254f6d2d50a300d9c31d575565daacb89873
Merged — last 30 days
(4)
67602
master
J –B ✓T ✓R +5/2
LU-20534 mdd: add single-stripe layout swap
mine
ec2
pt_ecro
8 unresolved
XL +1568 −168
6d
LU-20534 mdd: add single-stripe layout swap
mine
ec2
pt_ecro
8 unresolved
XL +1568 −168
6d
reviews:
Keguang Xu +1 · Marc Vef +1 · Andreas Dilger +1 · Oleg Drokin +2
patchsets:
PS23 09-19
PS24 09-20
PS25 09-20
PS26 10-09
PS27 10-12 Marc Vef
+22 earlier
PS1 07-28 PS2 07-29 PS3 07-29 PS4 07-29 PS5 07-31 PS6 08-01 PS7 08-03 PS8 08-04 PS9 08-05 PS10 08-05 PS11 08-06 PS12 08-07 PS13 08-25 PS14 08-26 PS15 09-03 PS16 09-04 PS17 09-07 PS18 09-07 PS19 09-07 PS20 09-09 PS21 09-17 PS22 09-17tags: pt_ecro
owner Ronnie Sahlberg · uploader Oleg Drokin · PS28 uploaded 6d ago · MERGED · open in Gerrit ↗
commit message
LU-20534 mdd: add single-stripe layout swap Allow swap_layouts to exchange a single OST object between two files, selected by OST object FID. Negotiate support with OBD_CONNECT2_ONE_OBJ_SWAP and add llapi_fswap_layout_fids() for tools such as lfs migrate. Skip mdd_dom_fixup() and HSM xattr rewrite for SINGLE_STRIPE, and reject CLOSE|SINGLE_STRIPE. Find objects in both COMP_V1 and SEL layouts. Add a new LL_IOC_LOV_SWAP_LAYOUTS_FID ioctl backed by a 64-byte struct lustre_swap_layouts_fid (adds sl_fid1/sl_fid2) instead of growing the existing 32-byte struct lustre_swap_layouts, so LL_IOC_LOV_SWAP_LAYOUTS and old userspace keep working unchanged. ll_file_ioctl() accepts both ioctls; the plain one is rejected for SINGLE_STRIPE. wiretest/wirecheck cover both struct layouts. Mask SWAP_LAYOUTS_MDS_RELEASE in ll_swap_layouts() and mdt_swap_layouts() so clients cannot invoke the server-only HSM-release path and skip uid/gid checks. mdt_swap_layouts() now calls mdt_init_ucred()/mdt_exit_ucred() so permission checks use real client credentials instead of an uninitialized ucred. mdd_layout_swap_allowed() allows a uid/gid mismatch under CAP_FOWNER only when SWAP_LAYOUTS_SINGLE_STRIPE is set, so root can migrate/replace stripes on files it does not own via the FID-based single-stripe swap. Generic swap_layouts (sanity 184b) still requires matching uid/gid for every caller, including root, so quotas stay coherent. mdd_swap_single_stripe() rejects mismatched lmm_stripe_size between the two LOV components (-EINVAL) to avoid corrupting the RAID0 mapping. Object size lives on the OSTs and is not validated here; llapi_fswap_layout_fids() documents that the caller must supply a stripe of matching size so file size does not change. Additionally pass the swap flags as a 64-bit enum instead of a simple __u64. This makes it easier to track when/where these flags are used. Add a test that we rollback changes properly if it fails mid-swap. Test-Parameters: trivial Signed-off-by: Ronnie Sahlberg <rsahlberg@whamcloud.com> Change-Id: I603ad3810c5f3efc1860f477b283acb0c35df1a7 Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/67602 Tested-by: Maloo <maloo@whamcloud.com> Reviewed-by: Marc Vef <mvef@whamcloud.com> Tested-by: jenkins <devops@whamcloud.com> Reviewed-by: Oleg Drokin <green@whamcloud.com> Reviewed-by: Andreas Dilger <adilger@thelustrecollective.com> Reviewed-by: Keguang Xu <kxu@ddn.com>
reviews:
Keguang Xu +1 · Marc Vef +1 · Andreas Dilger +1 · Oleg Drokin +2
patchsets:
PS2 09-03 Keguang Xu
PS3 09-29 Keguang Xu
PS4 09-29 Keguang Xu
PS5 09-30 Keguang Xu
PS6 10-07 Keguang Xu
+1 earlier
PS1 08-14tags: pt_ecro
owner Ronnie Sahlberg · uploader Oleg Drokin · PS7 uploaded 13d ago · MERGED · open in Gerrit ↗
commit message
LU-20568 lfs: allow --ec 1+1 --ec required k >= 2, so a component with one data stripe could not be protected. Allow k == 1. That parity is a copy of the data stripe, which is 1+1 on the current layout: one parity object in the same extent. Userspace also accepts p > 1 when k == 1, for example --ec 1+2, and copies the data onto each parity object. The kernel changes that store this 1+N parity without outgrowing a finite extent are follow-up patches. For k >= 2, p <= k is unchanged. Signed-off-by: Ronnie Sahlberg <rsahlberg@whamcloud.com> Signed-off-by: Keguang Xu <kxu@ddn.com> Change-Id: I03abe044301d95fbe168fba32f109bbb09d7bd53 Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/67993 Tested-by: Maloo <maloo@whamcloud.com> Tested-by: jenkins <devops@whamcloud.com> Reviewed-by: Marc Vef <mvef@whamcloud.com> Reviewed-by: Andreas Dilger <adilger@thelustrecollective.com> Reviewed-by: Oleg Drokin <green@whamcloud.com>
64616
master
J –B ✓T ✓R +4/2
LU-19823 lod: Make the stripe allocators failure domain aware.
mine
ec2
pt_ecro
1 unresolved
XL +903 −109
12d
LU-19823 lod: Make the stripe allocators failure domain aware.
mine
ec2
pt_ecro
1 unresolved
XL +903 −109
12d
reviews:
Keguang Xu +1 · Marc Vef +1 · Oleg Drokin +2
patchsets:
PS32 09-22
PS33 09-22
PS34 09-24
PS35 10-08 Marc Vef
PS36 10-08 Marc Vef
+31 earlier
PS1 03-17 PS2 03-17 PS3 03-17 PS4 03-23 PS5 03-24 PS6 03-27 PS7 03-29 PS8 03-30 PS9 03-31 PS10 03-31 PS11 04-01 PS12 04-01 PS13 04-07 PS14 04-16 PS15 04-23 PS16 04-28 PS17 04-28 PS18 08-20 PS19 08-20 PS20 08-24 PS21 08-26 PS22 08-26 PS23 08-26 PS24 08-31 PS25 09-01 PS26 09-02 PS27 09-04 PS28 09-07 PS29 09-07 PS30 09-07 PS31 09-09tags: pt_ecro
owner Ronnie Sahlberg · uploader Oleg Drokin · PS37 uploaded 13d ago · MERGED · open in Gerrit ↗
commit message
LU-19823 lod: Make the stripe allocators failure domain aware. OST failure domains (FD) let an administrator mark which OSTs share external resources (storage enclosure, network switch, power supply, etc.), so that redundant layouts (FLR mirrors, EC data/parity) can avoid placing more than one copy of the same data on OSTs that could fail together. Previously the round-robin and QoS stripe allocators did not consult this information at all, so FLR and EC layouts could end up with all copies/parity in a single failure domain. Make lod_ost_alloc_rr() and lod_ost_alloc_qos() honor a non-zero OST failure domain (0 means "no domain configured", and disables the checks for that OST): - EC: without overstriping (-c) every stripe of the data component and its linked parity component must be in a different FD. With overstriping (-C) only the data/parity stripes within the same raid set need unique FDs; the same FD may repeat across raid sets. - FLR: stripes within a single component must have unique FDs, and a component may not reuse the FD of an overlapping component in another mirror, except for the linked EC data/parity pair, which describe the same raid set rather than independent replicas. When a component is short of unique-FD OSTs, reuse OSTs from earlier raid sets for overstriped EC layouts (mirroring the existing parity fallback), or shrink the EC geometry for non-overstriped layouts, rather than failing the allocation outright. lod_ost_alloc_rr() also no longer collapses llc_stripe_count down to the number of stripes actually placed for EC components before the EC fallback path runs; the fallback needs the original requested stripe_count to compute its target geometry, so that value is now preserved until after the fallback has run (behaviour is unchanged for non-EC components). Also add Documentation/failure-domain.txt describing the FD design and rules, document the obdfilter.*.failure_domain parameter in Documentation/man4/obdfilter.failure_domain.4, and add sanity-ec test_35a/test_35b regression tests. Signed-off-by: Ronnie Sahlberg <rsahlberg@whamcloud.com> Change-Id: I7bf09636939915b866eb97d9952bab2968d7718e Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/64616 Reviewed-by: Marc Vef <mvef@whamcloud.com> Reviewed-by: Oleg Drokin <green@whamcloud.com> Tested-by: jenkins <devops@whamcloud.com> Reviewed-by: Keguang Xu <kxu@ddn.com> Tested-by: Maloo <maloo@whamcloud.com>
56434
master
J –B ✓T ✓R +5/2
LU-18231 obd: change obd_recovery_expired into OBDF_RECOVERY_EXPIRED
mine
S +10 −12
12d
LU-18231 obd: change obd_recovery_expired into OBDF_RECOVERY_EXPIRED
mine
S +10 −12
12d
reviews:
James Simmons +1 · Arshad Hussain +1 · Oleg Drokin +2 · Timothy Day +1
patchsets:
PS7 08-25 James Simmons
PS8 08-25 James Simmons
PS9 09-03 James Simmons
PS10 09-07 James Simmons
PS11 10-05 James Simmons
+6 earlier
PS1 09-20 PS2 09-20 PS3 09-20 PS4 10-01 PS5 10-02 Andreas Dilger PS6 08-03 James Simmonsowner Ronnie Sahlberg · uploader Oleg Drokin · PS12 uploaded 13d ago · MERGED · open in Gerrit ↗
commit message
LU-18231 obd: change obd_recovery_expired into OBDF_RECOVERY_EXPIRED
obd_recovery_expired is set from interrupt context and
was moved to a dedicated bitfield variable in
commit 848d709605948 ("b=17760 Separate locking for obd
bitfield and recovery") as to avoid having to use locking
from within the interrupt context.
As we now have migrated to use atomic {test|set|clear}_bit
operations to set individual bits we no longer depend on
spinlocks when accessing them and can thus move this bit
back into the bitmap.
Signed-off-by: Ronnie Sahlberg <rsahlberg@whamcloud.com>
Change-Id: I81a2a7efc057b67cdfd82ca978116d44bbca82b8
Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/56434
Reviewed-by: James Simmons <jsimmons@infradead.org>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
Reviewed-by: Timothy Day <timday@thelustrecollective.com>
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Arshad Hussain <arshad.hussain@aeoncomputing.com>