Zhenyu Xu bobijam · review.whamcloud.com
Needs your action
1 new · 42 longstanding
57083
master
J !B ✓T ✗2R -1/2−
LU-18466 lod: make sure layout gen changed under lock
mine needs rebase — checkpatch: cannot be cherry-picked
needs rebase
1 unresolved
L +231 −136
4d
LU-18466 lod: make sure layout gen changed under lock
mine needs rebase — checkpatch: cannot be cherry-picked
needs rebase
1 unresolved
L +231 −136
4d
needs rebase — checkpatch: cannot be cherry-picked
enforced failed: review-dne-part-7, review-dne-zfs-part-7
1 thread(s) waiting on others
janitor run: 2 failing config(s), none unique to this patch — janitor results
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-7 | RHEL 9.5 / x86_64 | ran 5 tests. 1 tests failed: sanity-pcc. | session |
| review-dne-zfs-part-7 | RHEL 8.10 / x86_64 | ran 5 tests. 1 tests failed: sanity-scrub. | session |
build #116939 SUCCESS · tests all Maloo sessions
no vote yet: Qian Yingjin, Lai Siyao, Andreas Dilger, Alex Zhuravlev, Oleg Drokin
patchsets:
PS24 06-30
PS25 07-03
PS26 09-19
PS27 09-19 Janitor Bot
PS28 09-25 Janitor Bot
+23 earlier
PS1 11-20 PS2 11-21 PS3 11-28 PS4 11-28 PS5 11-29 PS6 11-30 PS7 12-05 PS8 12-18 PS9 01-11 PS10 01-11 PS11 03-12 Andreas Dilger PS12 03-13 PS13 03-17 PS14 03-28 PS15 03-29 PS16 04-03 PS17 04-03 PS18 04-09 PS19 04-10 PS20 04-23 PS21 05-09 PS22 05-21 PS23 06-17threads: 0 need your reply · 1 waiting on others · 0 own notes · 0 bot
owner Zhenyu Xu · uploader Janitor Bot · PS28 uploaded 405d ago · NEW · open in Gerrit ↗
commit message
LU-18466 lod: make sure layout gen changed under lock
In transaction declaration phase, LOD layer should not change
lod_layout_gen as there is no object lock protecting it so that
its layout gen can be changed by another transaction.
This patch adds lti_layout_gen_save/lti_layout_gen_dst array to save
the layout gen before/after values, and during the transaction
execution phase with the lod object been protected with
lod_write_lock(), we would check the lod_object's layout gen, if
it keeps its value equals to lti_layout_gen_save, we'd update it to
lti_layout_gen_dst of the lod_object; if it has been changed by
others, we'd return -EAGAIN, so that MDD can retry the transaction.
This patch also fixes a glitch in mdd_xattr_set(), it needs to check
the return code for retry.
Fixes: d5ab62af24 ("LU-17048 mdd: protect layout change in MDD layer")
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: I6e7edabaac8f1d43d799b5ab3e2ec527d152fa55
▶Longstanding (signal older than a week)
(42)
69675
master
J –B ✓T ✗1R 0/2
LU-19344 llite: report EOF for read racing local append
mine enforced failed: review-dne-selinux-ssk-part-2
pw_haltpw_shepherd
16 unresolved
M +117 −0
1d
LU-19344 llite: report EOF for read racing local append
mine enforced failed: review-dne-selinux-ssk-part-2
pw_haltpw_shepherd
16 unresolved
M +117 −0
1d
enforced failed: review-dne-selinux-ssk-part-2
12 unresolved thread(s) await your reply — last from Gerrit AI review for Lustre
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-selinux-ssk-part-2 failed 4× | RHEL 8.10 / x86_64 | ran 7 tests. 1 tests failed: sanity-sec. | session |
build #134364 SUCCESS · tests all Maloo sessions
no vote yet: Alexey Lyashkov, Vitaly Fertman
patchsets:
PS1 10-14
PS2 10-23 Alexey Lyashkov
PS3 10-23 Alexey Lyashkov
PS4 10-23 Alexey Lyashkov
threads: 12 need your reply · 0 waiting on others · 4 own notes · 0 bot
reply Gerrit AI review for Lustre COMMIT_MSG:36 — (suggestion) LU-19344 is about the cached-read cost of file_read_confine_iter(), and 240cad9a0a quoted a 20-30% regression on 8k cached read
Gerrit AI review for Lustre
(suggestion) LU-19344 is about the cached-read cost of file_read_confine_iter(), and 240cad9a0a quoted a 20-30% regression on 8k cached reads. Since this patch brings the confinement back, and also moves cl_env_get() back in front of the cache read path, could the message include before/after numbers for that workload?
reply Gerrit AI review for Lustre COMMIT_MSG:43 — (minor) This list of what the CIT_MISC cl_io_init()/cl_io_fini() pair adds seems incomplete. For a CIT_MISC io without ci_ignore_layout, lov
Gerrit AI review for Lustre
(minor) This list of what the CIT_MISC cl_io_init()/cl_io_fini() pair adds seems incomplete. For a CIT_MISC io without ci_ignore_layout, lov_io_init_composite()/lov_io_init_empty() also do atomic_inc(&lov->lo_active_ios), and lov_io_fini() drops it. That pin is what keeps lov_conf_set() from running lov_layout_change() while the attributes are being read (see the inline comment in file_read_confine_iter()). Could the message mention this?
reply Gerrit AI review for Lustre COMMIT_MSG:56 — (minor) vvp_env_new_attr() already does memset(attr, 0, sizeof(*attr)) on the thread's shared cl_attr, so cat_kms is already 0 before the lo
Gerrit AI review for Lustre
(minor) vvp_env_new_attr() already does memset(attr, 0, sizeof(*attr)) on the thread's shared cl_attr, so cat_kms is already 0 before the lookup. This rationale doesn't seem to hold. If the patch is refreshed, the bullet (and the explicit assignment) could be dropped.
reply Gerrit AI review for Lustre COMMIT_MSG:16 — (minor) "bumped around a write by this client that publishes a larger size" doesn't seem to cover every such write. O_DIRECT writes never qu
Gerrit AI review for Lustre
(minor) "bumped around a write by this client that publishes a larger size" doesn't seem to cover every such write. O_DIRECT writes never queue pages, so vvp_io_write_commit() returns at `npages == 0` before either bump. Large buffered writes that do_file_write_iter() switches to DIO via ll_hybrid_bio_dio_switch_check() take the same path. So whether a racing reader at EOF gets EOF or the appended data depends on the write size. fallocate() and truncate-up don't bump either. If that's intended, could the message say which writes are covered? The counter also moves on every buffered commit, including overwrites that don't change the size, not only on writes that publish a larger size.
reply Gerrit AI review for Lustre COMMIT_MSG:32 — (minor) If this is a fix, the behaviour it restores was removed by 240cad9a0a, which also dropped the original 251b with the rationale that
Gerrit AI review for Lustre
(minor) If this is a fix, the behaviour it restores was removed by 240cad9a0a, which also dropped the original 251b with the rationale that "The read after the write should never return an end-of-file (EOF)". Should the message carry
Fixes: 240cad9a0a ("LU-19344 llite: set read size correctly")
and explain why that rationale no longer holds?
reply Gerrit AI review for Lustre file.c:2537 — (minor) attr comes from vvp_env_new_attr(), which already zeroes the whole struct, so this assignment is redundant.
Gerrit AI review for Lustre
(minor) attr comes from vvp_env_new_attr(), which already zeroes the whole struct, so this assignment is redundant.
reply Gerrit AI review for Lustre file.c:2539 — (defect) Without the CIT_MISC io, what keeps the layout stable while this runs? lov_attr_get() uses LOV_2DISPATCH_NOLOCK and says "Layout is
Gerrit AI review for Lustre
(defect) Without the CIT_MISC io, what keeps the layout stable while this runs? lov_attr_get() uses LOV_2DISPATCH_NOLOCK and says "Layout is protected from changing by ongoing IO". Nothing on this path holds lo_type_guard or raises lo_active_ios, and the ll_layout_version_get() check above is only a snapshot.
A possible race on one client:
T1: read() -> file_read_confine_iter() -> cl_object_attr_get()
-> lov_attr_get_composite() walking lo_entries / lo_lsm
T2: layout lock revoked (e.g. PFL instantiation from another node),
then stat/write -> ll_layout_refresh() -> lov_conf_set():
lo_active_ios == 0 -> lov_layout_change()
-> lov_fini_composite() frees lo_entries and lo_lsm
lov_layout_change() doesn't take coh_attr_guard, so the spinlock held here doesn't exclude it either. Some existing callers have the same pattern (ll_readahead_handle_work(), ll_merge_attr() on the append path), but the old file_read_confine_iter() was pinned by its CIT_MISC io. This patch puts the unpinned lookup on every read() syscall. Would taking lov_conf_freeze()-style protection, or a lightweight lo_active_ios reference, avoid the race without the full cl_io_init() cost?
note Zhenyu Xu file.c:2347 — The new size becomes visible to a reader here, need to bump the lli_size_gen here. With the ll_file_io_generic() bump in place, the secon
Zhenyu Xu
The new size becomes visible to a reader here, need to bump the lli_size_gen here. With the ll_file_io_generic() bump in place, the second bump in vvp_io_write_commit() (after cl_io_commit_async() ) becomes redundant — the window now closes at ll_merge_attr() .
reply Gerrit AI review for Lustre file.c:2662 — (defect) Can this report EOF for data that was in the file before the read started?
Gerrit AI review for Lustre
(defect) Can this report EOF for data that was in the file before the read started?
`orig_size` is the client's cached i_size, not EOF. Since 240cad9a0a, vvp_prep_size() does `i_size_write(inode, kms)`, and kms can be lower than the real size. lli_size_gen also moves on any buffered commit on this client, including an overwrite that doesn't extend the file. Example:
node B: appends, file grows 1M -> 2M
node A, P1: cat reaches offset 1M (i_size == kms == 1M)
orig_ki_pos >= orig_size, gen == G
vvp_prep_size(): pos > kms -> glimpse -> 2M
copies 1M of node B's data
node A, P2: overwrites offset 0 -> vvp_io_write_commit() -> gen G+2
node A, P1: gen changed -> revert, return 0
cat stops at 1M even though node B's data was there before the read was issued. That contradicts the comment above, which says "A larger size discovered from another node during the read ... is returned normally" (commit message lines 30-31 say the same). Would it be safer to take the EOF baseline from a validated size (a glimpse, or kms under the lock), and to bump the counter only when a commit actually raises kms?
note Zhenyu Xu file.c:2668 — iov_iter_revert(to, result) assumes result is exactly the amount the iter was advanced. For the fast-read path that holds; for ll_file_io
Zhenyu Xu
iov_iter_revert(to, result) assumes result is exactly the amount the iter was advanced. For the fast-read path that holds; for ll_file_io_generic() (which can restart and internally rewind/reexpand the iter) it's less obvious. The code this replaced used the more forgiving iov_iter_truncate(to, 0) , which doesn't need to know the consumed count.
reply Gerrit AI review for Lustre file.c:2742 — (minor) This is bumped only before the write, but the tiny-write size reaches the inode after __generic_file_write_iter(), through ll_merge_
Gerrit AI review for Lustre
(minor) This is bumped only before the write, but the tiny-write size reaches the inode after __generic_file_write_iter(), through ll_merge_attr() below. A reader whose snapshot falls between this increment and ll_merge_attr() sees the new generation with the old i_size, and can then return the appended bytes. vvp_io_write_commit() bumps after the commit to avoid exactly this. Should there be a matching increment after ll_merge_attr() here?
reply Gerrit AI review for Lustre llite_internal.h:256 — (minor) If the patch is refreshed: "similar as i_version" reads oddly ("similar to i_version"?). Also, the counter is bumped on every buffer
Gerrit AI review for Lustre
(minor) If the patch is refreshed: "similar as i_version" reads oddly ("similar to i_version"?). Also, the counter is bumped on every buffered write commit and tiny write, not only on writes that make a larger size visible, so "Bumped around a write ... that makes a larger file size visible" overstates it.
tags: pw_halt pw_shepherd
owner Zhenyu Xu · uploader Alexey Lyashkov · PS4 uploaded 13d ago · NEW · open in Gerrit ↗
commit message
LU-19344 llite: report EOF for read racing local append A read issued at EOF must report EOF even if the file grows while it is in flight. i_size cannot express this: osc_page_touch_at() raises kms and the inode size as soon as the pages enter the cache, so a paused reader resumes with the appended data already visible. A glimpse cannot help either, since the client holding the extent lock owns the kms. Add a per inode counter, lli_size_gen, bumped around a write by this client that publishes a larger size: in vvp_io_write_commit() on both sides of cl_io_commit_async(), which raises kms page by page, and in ll_do_tiny_write(), which can extend the file inside an already dirty page. do_file_read_iter() snapshots i_size and the counter on entry and rechecks at the end; if the read started at or beyond the snapshotted EOF and the counter moved, ki_pos is restored, the iter reverted and 0 returned. The counter is advisory. It is not ordered against the size store and is per inode rather than per range, so it can move for an unrelated local write and a reader can still miss a write committing in the window between the two bumps. The counter moves only for local writes, so a size learned from another node is still returned normally. Signed-off-by: Alexey Lyashkov <alexey.lyashkov@hpe.com> Change-Id: I2f30aa9317dfe6e3f57d3b4a21537217921d9a82
50622
master
J !B ✓T ✗9R +1/2
LU-15834 lfs: mirror extend take current OSTs into account
mine enforced failed: review-dne-part-4, review-dne-subtest-change, review-dne-zfs-part-4, review-dne-zfs-part-5, review-dne-zfs-subtest-change, review-ldiskfs, review-ldiskfs-ubuntu
pw_shepherd
2 unresolved
L +538 −63
1d
LU-15834 lfs: mirror extend take current OSTs into account
mine enforced failed: review-dne-part-4, review-dne-subtest-change, review-dne-zfs-part-4, review-dne-zfs-part-5, review-dne-zfs-subtest-change, review-ldiskfs, review-ldiskfs-ubuntu
pw_shepherd
2 unresolved
L +538 −63
1d
enforced failed: review-dne-part-4, review-dne-subtest-change, review-dne-zfs-part-4, review-dne-zfs-part-5, review-dne-zfs-subtest-change, review-ldiskfs, review-ldiskfs-ubuntu
2 unresolved thread(s) await your reply — last from Ronnie Sahlberg
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: 2 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply 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.
reply 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 567d 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
58291
master
J –B ✓T ✗7R -1/2−
LU-18771 flr: allow merge mirrored layout
mine needs rebase — checkpatch: cannot be cherry-picked
needs rebase
pw_smallfix
5 unresolved
L +196 −72
1d
LU-18771 flr: allow merge mirrored layout
mine needs rebase — checkpatch: cannot be cherry-picked
needs rebase
pw_smallfix
5 unresolved
L +196 −72
1d
needs rebase — checkpatch: cannot be cherry-picked
enforced failed: custom-1001, review-dne-part-4, review-dne-zfs-part-4, review-dne-zfs-part-5, review-zfs
5 unresolved thread(s) await your reply — last from patrick bot
| failed enforced test | platform | detail | |
|---|---|---|---|
| custom-1001 | RHEL 9.7 / x86_64 | ran 4 tests. 1 tests failed: sanity-flr. | session |
| review-dne-part-4 | RHEL 9.7 / x86_64 | ran 9 tests. 2 tests failed: sanity-quota, sanity-flr. | session |
| review-dne-part-4 | RHEL 10.1 / x86_64 | ran 9 tests. 2 tests failed: sanity-quota, sanity-flr. | session |
| review-dne-zfs-part-4 | RHEL 9.8 / x86_64 | ran 9 tests. 2 tests failed: sanity-quota, sanity-flr. | session |
| review-dne-zfs-part-4 | RHEL 10.1 / x86_64 | ran 9 tests. 2 tests failed: sanity-quota, sanity-flr. | session |
| review-dne-zfs-part-5 | RHEL 9.7 / x86_64 | ran 5 tests. 1 tests failed: sanityn. | session |
| review-zfs | RHEL 8.10 / x86_64 | ran 8 tests. 2 tests failed: sanity-flr, sanity-quota. | session |
build #134321 SUCCESS · tests all Maloo sessions
no vote yet: Andreas Dilger
patchsets:
PS9 10-14 patrick bot
PS10 10-14 patrick bot
PS11 10-21 patrick bot
PS12 10-21 patrick bot
PS13 10-23 patrick bot
+8 earlier
PS1 03-04 PS2 03-05 PS3 03-06 PS4 03-25 PS5 04-17 PS6 05-05 Andreas Dilger PS7 06-01 PS8 08-12threads: 5 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply patrick bot lod_qos.c:806 — Patrick-Bot: Not changed. Whether the extra retry should apply only to the first component of mirrored layouts, or move to its own change, i
Gerrit AI review for Lustre
(minor) The new clause fires for the first component of every layout, not just mirrors - a plain or default-striped file also has `llc_extent.e_start == 0`. The practical effect shows up with default striping (LOD_USES_DEFAULT_STRIPE), where stripe_count_min is 3/4 of stripe_count: the allocator now escalates to speed 1 and 2 to fill the remaining quarter. At speed 2 lod_check_and_reserve_ost() stops honouring OS_STATFS_DEGRADED and stops calling lod_should_avoid_ost(), so first components can land on degraded OSTs and on OSTs already used by a conflicting mirror component. For an FLR patch that last one seems to work against the goal. Was the intent to limit this to mirrored layouts?
patrick bot
Patrick-Bot: Not changed. Whether the extra retry should apply only to the first component of mirrored layouts, or move to its own change, is a design decision for the patch owner.
reply patrick bot lfs.c:2286 — Patrick-Bot: Done in patchset 10: a failure to get the mirror count now fails the extend. Leaving this thread open for a related problem in
Gerrit AI review for Lustre
(minor) The return value is not checked, and `rc` is overwritten by the migrate_open_files() call below. If llapi_layout_mirror_count_get() ever fails, `mirror_cnt` stays 0 and the multi-mirror handling is silently skipped.
patrick bot
Patrick-Bot: Done in patchset 10: a failure to get the mirror count now fails the extend. Leaving this thread open for a related problem in the same hunk. Clearing resync for a multi-mirror merge makes lfs set LL_LEASE_ALLOW_STALE, and since LU-18746 llite refuses that with EOPNOTSUPP unless the client has llite_enable_flr_ec=1. That parameter defaults to 0. So every extend that adds more than one mirror fails on a default client, as in sanity-flr 0d, 0e, 0f, 0m and 44d on rocky9 ldiskfs. With llite_enable_flr_ec=1 those tests pass. test-framework does not set it either: it sets MODOPTS_LLITE, but load_module reads MODOPTS_LUSTRE for the llite module. How the merge should mark the new mirrors stale without needing FLR EC is for the patch owner to decide.
reply patrick bot lfs.c:2453 — Patrick-Bot: Not changed. Rejecting a mixed list would break sanity-flr test_0d, which runs 'lfs mirror extend -N -S 4M -N -f $tf-2 $tf-1' a
Gerrit AI review for Lustre
(minor) This picks the whole strategy from the first list entry only. Previously each entry was dispatched on its own `m_file`. With `lfs mirror extend -N -f victim -N2 -c1 FILE` the loop now calls mirror_extend_file() for the second entry too, with `victim_file == NULL`, which turns into `open(NULL, ...)` and an EFAULT. The man page does say -f cannot be combined with SETSTRIPE_OPTIONS, but nothing enforces it for extend (mirror_create_sanity_check() is only called from mirror_create()). Should mirror_extend() reject a mixed list up front?
patrick bot
Patrick-Bot: Not changed. Rejecting a mixed list would break sanity-flr test_0d, which runs 'lfs mirror extend -N -S 4M -N -f $tf-2 $tf-1' and expects it to succeed. Handling the -f entries one by one and merging the rest changes the order mirrors are added in, so this is left for the patch owner.
reply Gerrit AI review for Lustre lfs.c:2368 — (minor) When more than one mirror is added, the data is now copied by lfs_mirror_resync_file(). That function always opens the file with O_D
Gerrit AI review for Lustre
(minor) When more than one mirror is added, the data is now copied by lfs_mirror_resync_file(). That function always opens the file with O_DIRECT, so 'lfs mirror extend -D|--non-direct -N2 FILE' silently ignores -D. Before this change, each mirror was copied by migrate_nonblock() on descriptors that migrate_open_files() opened according to LLAPI_MIGRATION_NONDIRECT. The single-mirror path still honours -D, so the option now behaves differently depending on how many mirrors are added. If the patch is refreshed, could migration_flags be passed down to the resync, or could the man page say that -D only applies to single-mirror extends?
reply patrick bot liblustreapi.c:2451 — Patrick-Bot: Not changed. Keeping, splitting out or dropping the hex lcme_id output is for the patch owner to decide. If it stays, the examp
Gerrit AI review for Lustre
(minor) This changes `lfs getstripe` output for every composite file, and it looks unrelated to the mirror-merge work.
A couple of things go stale with it: the worked example in the comment above this function still shows `- lcme_id: 1`, and Documentation/ec.txt shows decimal ids too. Test suites also scrape this field (`awk '/lcme_id/{print $2}'` in sanity-flr.sh and sanity-ec.sh).
If the hex form is wanted, could it go in its own patch together with the doc updates?
patrick bot
Patrick-Bot: Not changed. Keeping, splitting out or dropping the hex lcme_id output is for the patch owner to decide. If it stays, the example in the comment above and Documentation/ec.txt need updating too.
tags: pw_smallfix
owner Zhenyu Xu · uploader patrick bot · PS13 uploaded 13d ago · NEW · open in Gerrit ↗
commit message
LU-18771 flr: allow merge mirrored layout This patch prepares a merge victim llapi_layout to contain all mirrors, and mark them as stale mirrors. On MDS, LOD accepts it for merge. After the stale mirrors have been merged, a resync will update the content into the newly merged mirrors. A victim holding its own EC data/parity pair is refused for now, as renumbering its mirrors would break the links between them. The layout check on the merged victim accepts the nocompr mirror flag, so 'lfs mirror extend -N --flags=nocompr' works. The DoM first component of each merged victim mirror is marked stale, as its data is only in the victim MDT object. Test-Parameters: testlist=sanity-flr,sanity-ec Signed-off-by: Bobi Jam <bobijam@whamcloud.com> Change-Id: I37b8eb18c5b8d3f099bc3d76ed0e4215790f61f0
56847
master
J –B ✓T ✗7R 0/2
LU-18332 lfs: migrate to mirrored file
mine enforced failed: review-dne-part-3, review-dne-part-4, review-dne-zfs-part-1, review-dne-zfs-part-4, review-zfs
pw_smallfixpw_halt
8 unresolved
M +221 −6
6d
LU-18332 lfs: migrate to mirrored file
mine enforced failed: review-dne-part-3, review-dne-part-4, review-dne-zfs-part-1, review-dne-zfs-part-4, review-zfs
pw_smallfixpw_halt
8 unresolved
M +221 −6
6d
enforced failed: review-dne-part-3, review-dne-part-4, review-dne-zfs-part-1, review-dne-zfs-part-4, review-zfs
8 unresolved thread(s) await your reply — last from Gerrit AI review for Lustre
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-3 | RHEL 9.8 / x86_64 | ran 3 tests. 1 tests failed: conf-sanity. | session |
| review-dne-part-4 | RHEL 9.7 / x86_64 | ran 9 tests. 2 tests failed: sanity-quota, sanity-flr. | session |
| review-dne-part-4 | RHEL 10.1 / x86_64 | ran 9 tests. 2 tests failed: sanity-quota, sanity-flr. | session |
| review-dne-zfs-part-1 | RHEL 9.8 / x86_64 | ran 3 tests. 1 tests failed: sanity. | session |
| review-dne-zfs-part-4 | RHEL 9.8 / x86_64 | ran 9 tests. 2 tests failed: sanity-quota, sanity-flr. | session |
| review-dne-zfs-part-4 | RHEL 10.1 / x86_64 | ran 9 tests. 2 tests failed: sanity-quota, sanity-flr. | session |
| review-zfs | RHEL 8.10 / x86_64 | ran 8 tests. 2 tests failed: sanity-flr, sanity-quota. | session |
build #133892 SUCCESS · tests all Maloo sessions
no vote yet: Patrick Farrell
patchsets:
PS15 04-17
PS16 08-12
PS17 10-14 patrick bot
PS18 10-16 patrick bot
PS19 10-17 patrick bot
+14 earlier
PS1 11-01 PS2 11-02 PS3 11-02 PS4 02-10 PS5 02-26 PS6 02-26 PS7 02-27 PS8 02-27 PS9 02-28 PS10 03-03 PS11 03-03 PS12 03-04 PS13 03-05 PS14 03-06threads: 8 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Gerrit AI review for Lustre sanity-flr.sh:3434 — (style) Carrying this forward from patchset 6, where it was asked whether these cases should be split into separate 63a/b/c/d subtests. test
Gerrit AI review for Lustre
(style) Carrying this forward from patchset 6, where it was asked whether these cases should be split into separate 63a/b/c/d subtests. test_63 still runs all four migrations in one subtest, so a failure in one hides the others and the cases can't be run on their own.
reply Gerrit AI review for Lustre sanity-flr.sh:3435 — (defect) The test needs two things on the MDS: the mdt_enable_flr_ec module parameter, which came with LU-12187 in 2.17.51, and the stale-mi
Gerrit AI review for Lustre
(defect) The test needs two things on the MDS: the mdt_enable_flr_ec module parameter, which came with LU-12187 in 2.17.51, and the stale-mirror merge support from LU-18771. A 2.16.52-70 gate lets in a released 2.17.0 MDS, which has neither. On that MDS, `cat /sys/module/mdt/parameters/mdt_enable_flr_ec` fails and the test errors out with "cannot read FLR_EC setting" instead of skipping. Should the gate use the 3-component version that includes LU-18771? The skip message should then say why the version is needed, e.g. "need MDS with stale mirror merge support".
reply Gerrit AI review for Lustre lfs.c:3392 — (style) This isn't a bug, but several err_str values here end in "\n" (this one, plus "cannot get layout\n", "cannot get mirror count\n", th
Gerrit AI review for Lustre
(style) This isn't a bug, but several err_str values here end in "\n" (this one, plus "cannot get layout\n", "cannot get mirror count\n", the comp_use/mirror id ones and "cannot delete mirror\n"). The final fprintf() appends ": %s\n", so the strerror text ends up on its own line. Also, mirror_merge(), mirror_extend_layout(), lfs_mirror_resync_file() and mirror_split() already print their own errors, so every failure is reported twice. If the patch is refreshed, consider dropping the newlines and the duplicate messages.
reply Gerrit AI review for Lustre lfs.c:3457 — (defect) Can this destroy the only up-to-date copy of the data? lfs_mirror_resync_file() releases its lease before the purge loop starts, an
Gerrit AI review for Lustre
(defect) Can this destroy the only up-to-date copy of the data? lfs_mirror_resync_file() releases its lease before the purge loop starts, and nothing (group lock or lease) stops writers from that point until mirror_split() runs. If the file is written in that window, the MDS picks a primary mirror (possibly an original one) and marks the new mirrors stale. mirror_split(MF_DESTROY) then removes the original. mdd_split_ea() only refuses when no *data* mirror would remain, and stale data mirrors still count. So the file ends up with only stale mirrors, and the write is lost. The `lfs mirror delete` path checks last_non_stale_mirror() and resyncs before splitting. Should each split here do the same check, or should the whole extend/resync/purge sequence run under a lease or group lock like lfs_migrate() does in its default blocking mode?
reply Gerrit AI review for Lustre lfs.c:3474 — (style) This isn't a bug, but free() and llapi_layout_free() both accept NULL, so the `if (ioc)` / `if (m_layout)` / `if (f_layout)` checks
Gerrit AI review for Lustre
(style) This isn't a bug, but free() and llapi_layout_free() both accept NULL, so the `if (ioc)` / `if (m_layout)` / `if (f_layout)` checks can go if the patch is refreshed.
reply Gerrit AI review for Lustre lfs.c:5592 — (defect) Now that migrate goes through the mirror path, how is `-N=COUNT` (mirror_total_mode) meant to work? The block below subtracts the f
Gerrit AI review for Lustre
(defect) Now that migrate goes through the mirror path, how is `-N=COUNT` (mirror_total_mode) meant to work? The block below subtracts the file's existing mirror count, but lfs_migrate_to_mirror() then purges all of those original mirrors. For a file with 2 mirrors: - `lfs migrate -N=4` creates 2 new mirrors and deletes the old 2, leaving 2 mirrors instead of 4. - `-N=3` gives mirror_count 1, so it falls back to plain lfs_migrate(). - `-N=2` prints "no new mirrors will be created" and then runs lfs_migrate() anyway. Should `=COUNT` be rejected for migrate, or treated as the absolute target count?
reply Gerrit AI review for Lustre lfs.c:6473 — (style) This isn't a bug, but this block-local `int mirror_count` shadows the function-scope `mirror_count` that the -N parsing sets just ab
Gerrit AI review for Lustre
(style) This isn't a bug, but this block-local `int mirror_count` shadows the function-scope `mirror_count` that the -N parsing sets just above. If the patch is refreshed, a distinct name such as `total_mirrors` would make it clear which count the `> 1` check uses.
reply Gerrit AI review for Lustre lfs.c:6540 — (defect) With a single mirror (`-N` or `-N1`), mirror_count is 1, so this falls through to lfs_migrate() with `param`/`layout`. With -N, tho
Gerrit AI review for Lustre
(defect) With a single mirror (`-N` or `-N1`), mirror_count is 1, so this falls through to lfs_migrate() with `param`/`layout`. With -N, though, every -E component was built into `mirror_list->m_layout` (lpp points there), and `layout` is still NULL. So `lfs migrate -N -E2M -Eeof -c-1 file` builds `param` from the last component's args and migrates to a plain, non-composite layout. The [0,2M) component and any --flags are dropped without a warning. The new test step "migrate to 1 mirror w/ 2 components" only compares checksums, so it passes even though no component layout is created. Should the single-mirror case also go through lfs_migrate_to_mirror(), or pass `mirror_list->m_layout` to lfs_migrate()? And should the test check verify_comp_count for that step?
tags: pw_smallfix pw_halt
owner Zhenyu Xu · uploader patrick bot · PS19 uploaded 18d ago · NEW · open in Gerrit ↗
commit message
LU-18332 lfs: migrate to mirrored file This patch makes "lfs migrate" accept -N options to migrate to a mirrored layout. It first merges new mirrors to the original file, then resync the contents to all the new mirrors, and last purges the original mirrors from the file. The migration test enables FLR_EC on the client and every MDT while it runs, as stale mirror merging requires both. Signed-off-by: Bobi Jam <bobijam@whamcloud.com> Change-Id: Ie81e6120260a7406b8f8c8e57ba085666c25587a Assisted-by: Codex:gpt-6.1-sol Signed-off-by: Patrick Farrell <patrick@thelustrecollective.com>
65737
master
J –B ✓T ✗2R -1/2−
LU-10026 csdc: set compress component for file
cc Marc Vef · needs rebase — checkpatch: cannot be cherry-picked
needs rebase
csdc
14 unresolved
XL +1163 −16
14d
LU-10026 csdc: set compress component for file
cc Marc Vef · needs rebase — checkpatch: cannot be cherry-picked
needs rebase
csdc
14 unresolved
XL +1163 −16
14d
needs rebase — checkpatch: cannot be cherry-picked
enforced failed: custom-1001, review-dne-part-7
14 unresolved thread(s) await your reply — last from Gerrit AI review for Lustre
| failed enforced test | platform | detail | |
|---|---|---|---|
| custom-1001 | RHEL 9.7 / x86_64 | ran 3 tests. 1 tests failed: sanity-pfl. | session |
| review-dne-part-7 | RHEL 9.8 / x86_64 | ran 6 tests. 1 tests failed: sanity-pcc. | session |
build #132858 SUCCESS · tests all Maloo sessions
no vote yet: James Simmons, Roman Bolshakov, Andreas Dilger, Artem Blagodarenko
patchsets:
PS11 08-19 Artem Blagodarenko
PS12 08-20 Artem Blagodarenko
PS13 08-20 Artem Blagodarenko
PS14 08-21 Artem Blagodarenko
PS15 10-05 Roman Bolshakov
+10 earlier
PS1 05-07 PS2 05-07 PS3 05-28 PS4 05-28 PS5 06-11 PS6 06-11 PS7 06-16 Artem Blagodarenko PS8 06-16 Artem Blagodarenko PS9 07-24 Artem Blagodarenko PS10 08-19 Artem Blagodarenkothreads: 14 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Gerrit AI review for Lustre COMMIT_MSG:56 — (minor) The body doesn't mention the client-side gate added by squashing Ib1e2123ff: the new lustre_check_lov_user_md() and lustre_check_lov
Gerrit AI review for Lustre
(minor) The body doesn't mention the client-side gate added by squashing Ib1e2123ff: the new lustre_check_lov_user_md() and lustre_check_lov_comp_md_v1() in ptlrpc/pack_generic.c, and their calls from ll_lov_setstripe_ea_info() and ll_xattr_set(). These reject a compress layout when `llite.*.enable_compression=0`, which is a user-visible behaviour change. Could a short paragraph describing them be added?
reply Artem Blagodarenko patchset comment — Hi Andreas. Thanks for poining to this. I have reverted all fixed by Patchset 11 pushing wrong branch. I have reverted to Patchset 10 where
Andreas Dilger
@ablagodarenko@thelustrecollective.com it looks like the patches were rebased, but did not address any of the AI review comments? While we can't go overboard changing every detail of the patches, I think it does make sense to fix the code where possible so that we don't carry technical debt later.
Artem Blagodarenko
Hi Andreas. Thanks for poining to this. I have reverted all fixed by Patchset 11 pushing wrong branch. I have reverted to Patchset 10 where I addressed AI bot comments and fixed build.
reply Roman Bolshakov patchset comment — Squashed Ib1e2123ffdb239c3e1401d682ae9c2c49e3f4a6f into the change. I'll address a couple more comments in another push.
Roman Bolshakov
Squashed Ib1e2123ffdb239c3e1401d682ae9c2c49e3f4a6f into the change. I'll address a couple more comments in another push.
reply Andreas Dilger lfs-getstripe.1:331 — Should be fixed if patch is refreshed.
Gerrit AI review for Lustre
(minor) There is no `.TP` before this entry, so `--compress-type|--compr-type` and its description get folded into the `-z, --extension-size` paragraph above instead of starting their own tagged item. The two entries below it do have theirs.
Oleg Drokin
weird but in my man output it looks ok.
Artem Blagodarenko
The entry was missing its .TP in the troff source. Some man implementations are lenient and reflow correctly, but others fold the entry into the previous paragraph. Added .TP for correctness.
Artem Blagodarenko
Done. Added the missing .TP before the --compress-type|--compr-type entry.
Andreas Dilger
Should be fixed if patch is refreshed.
reply Gerrit AI review for Lustre llapi_layout_compress_set.3:105 — (minor) Neither of the two new man3 pages has an EXAMPLES section. Lustre llapi pages are expected to carry a short usage example showing th
Gerrit AI review for Lustre
(minor) Neither of the two new man3 pages has an EXAMPLES section. Lustre llapi pages are expected to carry a short usage example showing the required header and a realistic call.
reply Gerrit AI review for Lustre llapi_layout_compress_set.3:71 — (minor) This, and the matching EINVAL entry under ERRORS, says a `stripe_size` that is not a multiple of `chunk_size` is an error. llapi_lay
Gerrit AI review for Lustre
(minor) This, and the matching EINVAL entry under ERRORS, says a `stripe_size` that is not a multiple of `chunk_size` is an error. llapi_layout_compress_set() never fails for that: it decrements `log_bits` until the chunk divides the stripe and stores the smaller chunk (sanity-pfl test_100c expects 3*64KiB to become 128KiB). Similarly, gzip/lz4/lz4fast levels outside the listed ranges are clamped by their from_*_level() helpers, not rejected with EINVAL as the text above says (test_100c expects gzip:15 to read back as 9). If the patch is refreshed, could the page describe the rounding and clamping instead?
reply Gerrit AI review for Lustre llapi_parse_compress_type.3:62 — (minor) llapi_parse_compress_type() also returns -EINVAL - for a level that isn't a valid number or falls outside +/-COMPR_LEVEL_MAX - which
Gerrit AI review for Lustre
(minor) llapi_parse_compress_type() also returns -EINVAL - for a level that isn't a valid number or falls outside +/-COMPR_LEVEL_MAX - which neither RETURN VALUES nor ERRORS mentions. Mixing -1 with -Exxx returns in one function is also awkward for callers; would returning -EINVAL for the unknown-type case be more consistent?
reply Gerrit AI review for Lustre lustreapi.h:1457 — (minor) The 9 used as the lz4 default collides with a real level. from_lz4_level(10) returns 9, and to_lz4_level(9) returns 9 because 9 == L
Gerrit AI review for Lustre
(minor) The 9 used as the lz4 default collides with a real level. from_lz4_level(10) returns 9, and to_lz4_level(9) returns 9 because 9 == LZ4HC_DEFAULT_CLEVEL, so 'lfs setstripe -Z lz4:10' reports back as lz4:9 and level 10 can never be displayed - even though lfs-setstripe.1 documents 1-16 as the valid lz4 range.
reply Gerrit AI review for Lustre file.c:2838 — (defect) This gate runs only for regular files: ll_lov_setstripe_ea_info(), and the `lov.` branch in ll_xattr_set(). A directory default goe
Gerrit AI review for Lustre
(defect) This gate runs only for regular files: ll_lov_setstripe_ea_info(), and the `lov.` branch in ll_xattr_set(). A directory default goes through ll_setstripe_ea() -> ll_dir_setstripe() (and the LL_IOC_LOV_SETSTRIPE case in ll_dir_ioctl()), which never calls lustre_check_lov_user_md(). So on a client with `enable_compression=0`:
lfs setstripe -E eof -Z lz4 $dir # accepted
touch $dir/f # MDS instantiates a compress layout
This still produces a file the client can't handle. lsm_lmm_verify_v1v3() rejects it with "file compression not enabled", and the PS14 report shows a later unlink or stripe change hitting the lov_io_layout_at() LBUG. Should ll_dir_setstripe() apply the same check? Or, if allowing compressed defaults on a disabled client is intended, should the client reject the layout cleanly instead of asserting?
reply Gerrit AI review for Lustre xattr.c:425 — (defect) On this `lov.` path nothing validates `size` before lustre_check_lov_user_md() walks the entries. lustre_check_lov_comp_md_v1() rea
Gerrit AI review for Lustre
(defect) On this `lov.` path nothing validates `size` before lustre_check_lov_user_md() walks the entries. lustre_check_lov_comp_md_v1() reads `lcm_entry_count` and then up to 65535 `lcm_entries[]`, but the buffer here is only the `size` bytes copied in by the VFS.
The `lustre.` xattr namespace needs only write permission on the inode, so any file owner can trigger it:
setxattr(f, "lustre.lov.add", buf, 8, 0); /* buf starts with LOV_USER_MAGIC_COMP_V1 */
That reads lcm_entry_count past the end of an 8-byte allocation and keeps reading for up to ~3MB. KASAN reports it as slab-out-of-bounds. Before this patch, little-endian clients only read `lmm_magic` here.
The next change in the series ("utils: add 'lfs find' support for compressed file") adds a `size < need` check just above this call. Since this patch introduces the read, should that check move here? Passing `size` into lustre_check_lov_user_md(), the way lustre_swab_lov_user_md() takes one, would also let it validate the buffer itself.
reply Gerrit AI review for Lustre lod_qos.c:3191 — (minor) This applies the chunk adjustment to every component including extension ones, where llc_stripe_size holds the extension size rather
Gerrit AI review for Lustre
(minor) This applies the chunk adjustment to every component including extension ones, where llc_stripe_size holds the extension size rather than a real stripe size. lod_declare_layout_add() deliberately skips LCME_FL_EXTENSION components for exactly that reason, so the same input layout gets different chunk_lum_bits depending on whether it arrives via create or via --component-add. Should this site skip extension components as well? While there: the comment added in lod_declare_layout_add() says chunk adjustment is deferred until instantiation, but nothing calls lod_adjust_compr_chunk_size() on the instantiation path - the only three callers are here, lod_declare_layout_add() and lod_striping_from_default().
reply Gerrit AI review for Lustre pack_generic.c:2672 — (defect) -ENOTSUPP (524) is kernel-internal and has no userspace errno, so this reaches `lfs setstripe` through ioctl()/setxattr() as "Unkno
Gerrit AI review for Lustre
(defect) -ENOTSUPP (524) is kernel-internal and has no userspace errno, so this reaches `lfs setstripe` through ioctl()/setxattr() as "Unknown error 524". The erasure-coding check just above it in ll_lov_setstripe_ea_info() returns -EOPNOTSUPP for the same kind of rejection. Should this be -EOPNOTSUPP too? While here, a couple of nits: `rc` is never changed from 0, there's a double blank line after the EXPORT_SYMBOL(), and the default case in lustre_check_lov_user_md() logs "Invalid LOV magic" but still returns 0.
tags: csdc
owner Marc Vef · uploader Roman Bolshakov · PS15 uploaded 30d ago · NEW · open in Gerrit ↗
commit message
LU-10026 csdc: set compress component for file
Introduce per-component compression support for composite LOV layouts.
A new LCME_FL_COMPRESS component flag marks entries that carry
compress fields; the flag is set when the user supplies a compression
type via 'lfs setstripe -Z' and is propagated through the LOD and LOV
layers so that compressed components are distinguished from plain
ones.
LOD layer:
- lod_parse_striping(): read lcme_compr_type/lvl/chunk_lum_bits from
the user-supplied lov_comp_md_v1 when LOV_PATTERN_COMPRESS is set.
- lod_use_defined_striping(): likewise for pre-defined layouts.
- lod_get_default_lov_striping(): carry compress fields into the LOD
component when inheriting a default layout that includes
compression.
- lod_generate_lovea(): serialise llc_compr_* fields into the on-wire
lcm entry when LOV_PATTERN_COMPRESS is set.
- lod_adjust_compr_chunk_size(): new helper that rounds down the
requested chunk-size exponent so the chunk fits evenly within one
stripe and within one RPC (clamped to COMPR_CHUNK_MAX_BITS in the
following changes).
API / utils layer:
- 'lfs setstripe' gains --compress|-Z <type>[:<level>] and
--compress-chunk=<size> options to set the compression type, level,
and chunk size on a new component. Like -S and -c, -Z is inherited
by subsequent -E components unless overridden by another -Z.
Example:
$ lfs setstripe -Eeof -Z lz4:5 --compress-chunk=512 <file>
- 'lfs getstripe' gains --compress-type, --compress-level, and
--compress-chunk options to print individual compress parameters:
Example:
$ lfs getstripe <file>
lcme_compr_type: lz4
lcme_compr_lvl: 5
lcme_compr_chunk_kb: 512
lmm_pattern: raid0,compress
- llapi_layout_merge(): copy compress fields when merging layouts.
- Two new man3 pages: llapi_layout_compress_set.3 and
llapi_parse_compress_type.3.
Misc:
- dump_lsm() in lov_ea.c prints compress fields for debugging.
- compr_name_from_type() helper added in lov_internal.h and wired up
in dump_lsm() to print compression type names in debug output.
Test-Parameters: testlist=sanity-pfl serverversion=2.17
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Signed-off-by: Artem Blagodarenko <ablagodarenko@ddn.com>
Signed-off-by: Marc Vef <mvef@whamcloud.com>
Signed-off-by: Roman Bolshakov <rbolshakov@ddn.com>
Change-Id: Ife0382469cbc5099e0c6dc96534bb169ddeff61e
Was-Change-Id: Ib1e2123ffdb239c3e1401d682ae9c2c49e3f4a6f
68778
master
J !B ✓T ✓R +1/2
LU-20703 llite: limit readahead window by the readahead budget
mine 3 unresolved thread(s) await your reply — last from Gerrit AI review for Lustre
3 unresolved
M +84 −5
43d
LU-20703 llite: limit readahead window by the readahead budget
mine 3 unresolved thread(s) await your reply — last from Gerrit AI review for Lustre
3 unresolved
M +84 −5
43d
3 unresolved thread(s) await your reply — last from Gerrit AI review for Lustre
no vote yet from Qian Yingjin, Li Dongyang
janitor run: 4 failing config(s), none unique to this patch — janitor results
build #131763 SUCCESS · tests all Maloo sessions
reviews:
Xiyang Wang +1
no vote yet: Qian Yingjin, Li Dongyang
patchsets:
PS1 09-10
PS2 09-15
threads: 3 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Gerrit AI review for Lustre rw.c:1288 — (minor) The comment above the block still says the readahead goes "up to ra_max_pages_per_file", and the CDEBUG below prints ra_max_read_ahe
Gerrit AI review for Lustre
(minor) The comment above the block still says the readahead goes "up to ra_max_pages_per_file", and the CDEBUG below prints ra_max_read_ahead_whole_pages and ra_max_pages_per_file. Neither is the limit any more. If the patch is refreshed, could the comment name the effective limit and the trace print ra_max_window_pages(ra) (or ra_max_pages) so the dump matches what the window is actually clamped to?
reply Gerrit AI review for Lustre rw.c:1309 — (defect) Capping this window makes it possible for ras_whole_file_read to be true while the window no longer covers the file, and nothing re
Gerrit AI review for Lustre
(defect) Capping this window makes it possible for ras_whole_file_read to be true while the window no longer covers the file, and nothing recovers from that.
The entry test is kms_pages <= ra_max_read_ahead_whole_pages, but the window is now min(ra_max_window_pages(ra), ra_max_read_ahead_whole_pages). max_read_ahead_whole_mb is only clamped against ra_max_pages_per_file and max_read_ahead_mb is not clamped against it at all, so ra_max_pages < kms_pages <= ra_max_read_ahead_whole_pages is reachable: with brw_size=16M (whole = 16M) and max_read_ahead_mb=8, a 12M file on its second read gets ras_whole_file_read = true and a 8M window.
From there ll_readahead() takes end_idx = ras_window_start_idx + ras_window_pages - 1 and only stretches it far enough to cover the current read, ras_update() returns early on ras_whole_file_read so the window is never grown or moved, and this function resets ras_next_readahead_idx to 0 on every read() while the whole-file test keeps matching. The readahead frontier can never pass ra_max_pages, and the tail of the file is read a page per RPC for the life of the fd.
Before the patch the window was ra_max_read_ahead_whole_pages >= kms_pages, so the frontier walked to EOF: ll_ra_count_get() clamped each reservation to the remaining budget, and cached pages return 1 from ll_read_ahead_page() without consuming any reservation.
Would folding the budget into the entry test fix it, so the normal detector keeps running when the budget cannot cover the file?
if (kms_pages && kms_pages <= min(ra->ra_max_read_ahead_whole_pages,
ra_max_window_pages(ra))) {
reply Gerrit AI review for Lustre sanity.sh:13358 — (suggestion) This was raised on patchset 1 and the pass criterion is unchanged: 101d still passes or fails on two dd wall-clock numbers, whi
Gerrit AI review for Lustre
(suggestion) This was raised on patchset 1 and the pass criterion is unchanged: 101d still passes or fails on two dd wall-clock numbers, which is what makes it flaky in the first place. Now that the patch makes the async gate reachable, the new instrumentation already reads the values that would make this deterministic. Could the test also assert on them unconditionally, e.g. llite.*.read_ahead_stats async_readahead > 0, or that the osc.*.rpc_stats read histogram is not dominated by 1-page RPCs? That would fail for the LU-20703 reason rather than for timing noise.
owner Zhenyu Xu · uploader Zhenyu Xu · PS2 uploaded 51d ago · NEW · open in Gerrit ↗
commit message
LU-20703 llite: limit readahead window by the readahead budget
The per-file readahead window is capped by ra_max_pages_per_file,
independently of the global readahead budget ra_max_pages
(llite.*.max_read_ahead_mb). When the budget is set below the
per-file window (e.g. sanity/101d sets max_read_ahead_mb=40 while
max_read_ahead_per_file_mb=64 on a 64K-page client), the readahead
window target exceeds the whole readahead budget, and then:
* the async readahead gate in kickoff_async_readahead() is never
satisfied: the throttle defaults to ra_max_pages_per_file, so
the gate only opens at the maximal window, but a cache miss
runs ras_reset() and drops the window back to 0, and it takes
ra_max_pages_per_file / ras_rpc_pages growth steps to climb
back;
* every cache miss runs a synchronous readahead walk that reserves
the whole remaining budget and holds it until its read RPCs
complete;
* while the budget is in flight the reader catches up with the
readahead frontier, and further misses can only reserve one page
via the pages_min override, degenerating into a storm of one-page
(64KB) read RPCs plus per-miss readahead state and lock-match
overhead, making the readahead-enabled read slower than the
readahead-disabled one: "readahead 22.8092s > no-readahead
10.3606s (80M)".
Limit the effective per-file readahead window by the readahead
budget with a new helper ra_max_window_pages(), and use it where
the window growth is capped (ras_stride_increase_window(),
ras_increase_window()), where the whole-file-read window is
initialized (ll_ras_enter()) and in the async readahead gate
(kickoff_async_readahead()). The stored tunables are unchanged,
so raising max_read_ahead_mb again restores the original behavior.
The window grows in ras_rpc_pages steps once it reaches one RPC
(ras_increase_window() aligns every step), so it tops out at
ra_max_window_pages() rounded down to the RPC size. Round the
async readahead throttle down to the same granularity, otherwise
it can exceed every value the window can take and async readahead
never fires (e.g. brw_size=16 on a 64K-page client with
max_read_ahead_mb=40: window tops out at 512 pages, throttle is
640). Throttles below one RPC are left unaligned, since such
windows are still reachable via the sub-RPC window in
ras_increase_window().
Also add opt-in (DEBUG_101D=1, or DEBUG_101D=trace to also capture
the D_READA trace) instrumentation to sanity/101d, which dumps the
readahead parameters, readahead stats and read RPC size histogram
around the measured reads, and restores the debug mask via
debugsave()/debugrestore() when tracing.
Assisted-by: Augment Agent:GLM 5.3 Flash
Test-Parameters: testlist=sanity.sh env=ONLY=101d,ONLY_REPEAT=50 clientdistro=rocky9.5 clientarch=aarch64
Fixes: c2791674260b ("LU-12043 llite: improve single-thread read performance")
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: I01818568c4cba4ff40bee0b725f7e7dcf0bc9063
68788
master
J ✓B ✗T –R 0/2
LU-10026 tests: compression component via --component-add
reviewing Marc Vef · build failure (#131544)
csdc
1 unresolved
S +15 −0
55d
LU-10026 tests: compression component via --component-add
reviewing Marc Vef · build failure (#131544)
csdc
1 unresolved
S +15 −0
55d
build failure (#131544)
1 unresolved thread(s) await your reply — last from Marc Vef
build #131544 FAILURE
threads: 1 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Marc Vef patchset comment — [Marc Bot] upstream remarks for reference:
Marc Vef
[Marc Bot] upstream remarks for reference: The lod fix this test was written for is already on master (90c093b7850, LU-17468); only the sanity-compr test_1a part was unlanded - ported under a new Change-Id with the original as Was-Change-Id.
tags: csdc
owner Marc Vef · uploader Marc Vef · PS1 uploaded 55d ago · NEW · open in Gerrit ↗
commit message
LU-10026 tests: compression component via --component-add
Add sanity-compr test_1a: create a file with a plain first component,
append a compressed component with "lfs setstripe --component-add
-Z gzip" and verify the added component carries the compression
type. This covers the compression branch of the component-add path
in lod_declare_layout_add().
The lod fix this test was written for is already on master as
commit 90c093b7850 ("LU-17468 lod: component add missed pattern
info"); only the test part is new here.
Test-Parameters: forjanitoronly
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Signed-off-by: Marc Vef <mvef@whamcloud.com>
Was-Change-Id: I7ad746a550f1afea54a6f5b68823a79a85a44082
Change-Id: I0624bf3f5f9c965f826e72656a8cd8198c5624fd
68389
master
J !B ✗T –R 0/2
LU-10026 csdc: inherit CSDC params unless overriden
reviewing Marc Vef · build failure (#130361)
csdc
1 unresolved
L +258 −25
68d
LU-10026 csdc: inherit CSDC params unless overriden
reviewing Marc Vef · build failure (#130361)
csdc
1 unresolved
L +258 −25
68d
build failure (#130361)
1 unresolved thread(s) await your reply — last from Marc Vef
janitor run: 7 failing config(s), none unique to this patch — janitor results
build #130361 FAILURE
threads: 1 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Marc Vef patchset comment — [Marc Bot] upstream remarks for reference:
Marc Vef
[Marc Bot] upstream remarks for reference:
- Rewritten onto the current naming: LL_COMPR_TYPE_SPEC_NONE = 9 added (MAX moves to 10); wire asserts extended accordingly (this tree carries LL_COMPR_TYPE_MAX asserts the original did not have).
- compr_type_table: the NONE row loses its name, SPEC_NONE row ("none") added before the MAX sentinel - the compress_type_2str()/parse helpers were already in the matching form.
- The inheritance-hint struct uses cd_compr_chunk_lum_bits with this series' lum-bits semantics (offset above COMPR_CHUNK_MIN_BITS - no +16 at use sites), and lod_adjust_compr_chunk_size() is called in its take-by-value/return-by-value form.
- lod_qos_parse_config: the convert_plain arm skips all lcme-derived assignments including fields this tree has that the original context did not (llc_mirror_link_id, llc_dstripe_count, llc_cstripe_count).
- SPEC_NONE clearing blocks in lod_parse_striping/lsm_unpackmd applied at the current field naming.
- test_1000d version gate converted to compression_supported.
tags: csdc
owner Marc Vef · uploader Marc Vef · PS1 uploaded 70d ago · NEW · open in Gerrit ↗
commit message
LU-10026 csdc: inherit CSDC params unless overriden If a parent directory has been set CSDC parameters, the file created under it needs to inherit the CSDC parameters unless another CSDC parameters or an empty CDSC has been specified for a component of the file. The file create method includes touch, setstripe a plain layout file, or setstripe a composite layout file. As "-Z none" would be used to set compression type to 0 and server would treat it as no CSDC parameters has been set, so "-Z none" can not be used to stop inherit parent directory's CSDC inheritance, so this patch introduces another compression type LL_COMPR_TYPE_SPEC_NONE to associate with "none" compresstion type, and it can be used to stop the CSDC inheritance from parent directories, when user uses "-Z none" to reset compression type, this patch would set the compression type to LL_COMPR_TYPE_SPEC_NONE. If we use patched new client to create a file with "-Z none" upon old servers, the old servers cannot recognize this new LL_COMPR_TYPE_SPEC_NONE compression type, and it just records the type as is in the layout. On old clients "lfs getstripe" will show "unknown" to the component's lcme_compr_type, and on new clients, "lfs getstripe" will show "none" to the lcme_compr_type. When we write data to this file, both clients work but with different behavior. On old client, with "unknown" compression type, it chooses a fallback algorithm to compress the data, twisting the original intention not to compress the component; while on new client, it will treat "none" component as uncompressed one as intended. Test-Parameters: forjanitoronly DDN-bug-id: EX-10201 Signed-off-by: Bobi Jam <bobijam@whamcloud.com> Signed-off-by: Marc Vef <mvef@whamcloud.com> Change-Id: Ibbdb3f6489cf7e19bfebe075bf88580f39ed79e4
68410
master
J !B ✗T –R 0/2
LU-10026 llite: issue compressiblity change in workqueue
reviewing Marc Vef · build failure (#130382)
csdc
3 unresolved
M +118 −56
68d
LU-10026 llite: issue compressiblity change in workqueue
reviewing Marc Vef · build failure (#130382)
csdc
3 unresolved
M +118 −56
68d
build failure (#130382)
3 unresolved thread(s) await your reply — last from Marc Vef
janitor run: 7 failing config(s), none unique to this patch — janitor results
build #130382 FAILURE
no vote yet: Artem Blagodarenko
threads: 3 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Marc Vef patchset comment — [Marc Bot] upstream remarks for reference:
Marc Vef
[Marc Bot] upstream remarks for reference: The test_1021 tweaks (sleeps, echo moves) re-applied against the unwrapped assertion blocks; ci_need_change_layout renamed as in the original.
reply Misc Code Checks Robot (Gatekeeper helper) vvp_io.c:292 — warn: vvp_layout_minor_change():passing zero to 'ERR_CAST'
Misc Code Checks Robot (Gatekeeper helper)
warn: vvp_layout_minor_change():passing zero to 'ERR_CAST'
reply Misc Code Checks Robot (Gatekeeper helper) vvp_io.c:294 — error: vvp_layout_minor_change():'vlcw' dereferencing possible ERR_PTR()
Misc Code Checks Robot (Gatekeeper helper)
error: vvp_layout_minor_change():'vlcw' dereferencing possible ERR_PTR()
tags: csdc
owner Marc Vef · uploader Marc Vef · PS1 uploaded 70d ago · NEW · open in Gerrit ↗
commit message
LU-10026 llite: issue compressiblity change in workqueue This patch uses kernel-global workqueue to handle the file's minor layout change RPC equest. At vvp_io_fini() when it find that the file's compressibility should be changed, it creates a work and insert the request to the kernel workqueue. This would prevent the layout minor change RPC issued from within an IO, and it could avoid the possible double lock the LOV conf lock. lov: replace switch compressibility The switch compressibility flag results in weird behavior - it tells us we are to flip what's there, but results in some very hard to read code. I *think* the existing code is probably correct in absence of race conditions, but an instruction to "flip" rather than set is very confusing and could easily do the wrong thing if there's a race which changes the compressibility value. Replace it with two explicit bit flags. DDN-bug-id: EX-10857 Was-Change-Id: I3b1d9f8d635e0bdbe67d5806127727a7264d26be Singed-off-by: Artem Blagodarenko <ablagodarenko@ddn.com> Test-Parameters: forjanitoronly DDN-bug-id: EX-10857 Signed-off-by: Patrick Farrell <pfarrell@whamcloud.com> Signed-off-by: Bobi Jam <bobijam@whamcloud.com> Signed-off-by: Artem Blagodarenko <ablagodarenko@ddn.com> Signed-off-by: Marc Vef <mvef@whamcloud.com> Change-Id: Ic4345b1387288ab11ce9061f40b056b07cb976bf
68368
master
J !B ✗T –R 0/2
LU-10026 csdc: tune allowed compression type on server
reviewing Marc Vef · build failure (#130343)
csdc
1 unresolved
L +258 −18
68d
LU-10026 csdc: tune allowed compression type on server
reviewing Marc Vef · build failure (#130343)
csdc
1 unresolved
L +258 −18
68d
build failure (#130343)
1 unresolved thread(s) await your reply — last from Marc Vef
janitor run: 8 failing config(s), none unique to this patch — janitor results
build #130343 FAILURE
threads: 1 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Marc Vef patchset comment — [Marc Bot] upstream remarks for reference:
Marc Vef
[Marc Bot] upstream remarks for reference: - The patch re-created a libcfs_string.h/.c pair to host string-mask helpers; master already provides cfs_str2mask()/cfs_mask2str() with u64 masks (lnet/libcfs/debug.c), so both files were dropped and the new compress_types stores call the existing helper (~0ULL masks). A hunk that narrowed the existing capability-mask store from ~0ULL to ~0 was dropped for the same reason. - mdt.*.compress_types and obdfilter.*.compress_types are implemented as sysfs attributes (the target-side procfs vars tables the original patch extended no longer exist on master). - The obd_compress_types mask enum / COMPRESS_NAMES use the series' type naming (lz4 for the HC type) and already include zstd, which is a valid layout type at this point in the series. - OST-side only, as in the original: OBD_CONNECT2_COMPRESS is advertised in OST_CONNECT_SUPPORTED2 and requested by the OSC; MDT enabling remains pending (test_1013b keeps its unconditional skip; its old-version negative-check block, meaningless on master, was dropped). - compression_supported() in test-framework.sh now probes the OSC import for the compressed_file connect flag instead of comparing versions. (The OSC import, not the MDC one, because MDT support is not enabled.) - test_1013a/b were placed before test_1015 (the tests they were anchored to arrive later in the series).
tags: csdc
owner Marc Vef · uploader Marc Vef · PS1 uploaded 70d ago · NEW · open in Gerrit ↗
commit message
LU-10026 csdc: tune allowed compression type on server
Use lctl get_param {mdt|obdfiler}.*.compress_types to list supported
compression types on server.
Use lctl set_param {mdt|obdfilter}.*.compress_types="+gzip-lzo" to
add gzip to and delete lzo from existing compression types on server.
Server will negotiate supported compression types with client in
ocd_compress_types and client import stats could show the negotiated
supported compression types in "lctl get_param {mdc|odc}.*.import"
connect_data section:
import:
....
connect_data:
....
compress_types: [ fast,best,gzip,lz4fast,lz4hc,lzo ]
The OST support for the connect flags is enabled in this patch, but
MDT enabling is pending unaligned compression support for DoM files.
test: refine sanity-compr.sh/test_0a
Only change and verify compression types negotiation between client
and OST0000.
DDN-bug-id: EX-9802
Was-Change-Id: I307f3826973f48791b7fbf4cdfa121401b059b0e
Was-Change-Id: Ic22685d2b21e872c01d90f2c3062b5d0d9b92ec2
test: sanity-compr.sh/test_0a failure
* move sanity-compr.sh test_0a/test_0b to test_1013a/test_1013b
* explicitly specify client's hostname to get client's negotiated
compression types, as test environtment could mount several clients
DDN-bug-id: EX-9802
Was-Change-Id: Ic091f55a59ad9cfdaf3a94a58d44b372070c7875
Test-Parameters: forjanitoronly
DDN-bug-id: EX-6269
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Signed-off-by: Marc Vef <mvef@whamcloud.com>
Change-Id: I18943352e25ed9d5fe82442df9f00a7ef388f242
68374
master
J ✗2B ✗T –R 0/2
LU-10026 csdc: store compression info in FID EA
reviewing Marc Vef · build failure (#130348)
2 unique failures
csdc
1 unresolved
M +37 −65
68d
LU-10026 csdc: store compression info in FID EA
reviewing Marc Vef · build failure (#130348)
2 unique failures
csdc
1 unresolved
M +37 −65
68d
build failure (#130348)
janitor: 2 test failures unique to this patch — sanity-pfl@ldiskfs+DNE:test_100b, sanity-quota@ldiskfs+DNE:test_80
1 unresolved thread(s) await your reply — last from Marc Vef
janitor flagged test failures unique to this patch — full janitor results
| unique failing test | history |
|---|---|
| sanity-pfl@ldiskfs+DNE:test_100b | seen in 4 other reviews |
| sanity-quota@ldiskfs+DNE:test_80 | seen in 73 other reviews |
build #130348 FAILURE
threads: 1 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Marc Vef patchset comment — [Marc Bot] upstream remarks for reference:
Marc Vef
[Marc Bot] upstream remarks for reference: Applied cleanly. Note for reviewers: this changes where the PFID EA is stored for small inodes (no longer embedded in LMA for <=256-byte inodes) - needs interop/lfsck review on master.
tags: csdc
owner Marc Vef · uploader Marc Vef · PS1 uploaded 70d ago · NEW · open in Gerrit ↗
commit message
LU-10026 csdc: store compression info in FID EA Store compression information in OST-object's FID EA, and lfsck could use it to recover the MDT-object layout EA from orphan OST-object(s). 2.15 Lustre may embed PFID and layout stripe info in LMA EA, this patch would clear them from LMA EA and store them with compression info directly into FID EA thereafter. Test-Parameters: forjanitoronly DDN-bug-id: EX-8038 Signed-off-by: Bobi Jam <bobijam@whamcloud.com> Signed-off-by: Marc Vef <mvef@whamcloud.com> Change-Id: Iacac04601b73f85d9bc057b8dd34a5004248dac4
66612
master
J !B ✗T –R 0/2
LU-10026 csdc: sending compression info to server
reviewing Marc Vef · build failure (#130320)
csdc
4 unresolved
M +100 −13
68d
LU-10026 csdc: sending compression info to server
reviewing Marc Vef · build failure (#130320)
csdc
4 unresolved
M +100 −13
68d
build failure (#130320)
4 unresolved thread(s) await your reply — last from Gerrit AI review for Lustre
janitor run: 11 failing config(s), none unique to this patch — janitor results
build #130320 FAILURE
patchsets:
PS1 06-11
PS2 08-25
PS3 08-26
threads: 4 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Gerrit AI review for Lustre COMMIT_MSG:12 — (minor) This is an on-wire change: the client now fills bytes in the obdo (formerly o_padding_4) that are sent to the OST/MDS. Test-Paramete
Gerrit AI review for Lustre
(minor) This is an on-wire change: the client now fills bytes in the obdo (formerly o_padding_4) that are sent to the OST/MDS. Test-Parameters: forjanitoronly doesn't exercise interoperability. Consider requesting old-server/new-client and new-server/old-client runs with serverjob/serverbuildno and clientjob/clientbuildno so the padding-reuse stays wire-compatible with unpatched peers.
reply Marc Vef patchset comment — [Marc Bot] upstream remarks for reference:
Marc Vef
[Marc Bot] upstream remarks for reference: Rebase notes: kept the base's comment wording for the chunk-bits field (2^(16+chunk_lum_bits)); the lov_lsm2layout() wrapper is added alongside the base's compr_name_from_type() helper in lov_internal.h.
reply Gerrit AI review for Lustre lustre_user.h:1128 — (minor) This comment reword looks unrelated to sending compression info to the server; is it meant to be in this patch? Also the code comput
Gerrit AI review for Lustre
(minor) This comment reword looks unrelated to sending compression info to the server; is it meant to be in this patch? Also the code computes the chunk size with COMPR_CHUNK_MIN_BITS (COMPR_GET_CHUNK_SIZE()), not LOV_MIN_STRIPE_BITS; they happen to both be 16, but referencing the constant the code actually uses would be clearer.
reply Gerrit AI review for Lustre lov_internal.h:408 — This isn't a bug, but after this patch lov_lsm2layout() has no remaining callers (both lov_io.c and lovsub_object.c now call lov_lsm2layout2
Gerrit AI review for Lustre
This isn't a bug, but after this patch lov_lsm2layout() has no remaining callers (both lov_io.c and lovsub_object.c now call lov_lsm2layout2()). Folding the olc parameter into lov_lsm2layout() and updating those two call sites would avoid the version-suffixed name and the now-dead wrapper.
tags: csdc
owner Marc Vef · uploader Marc Vef · PS3 uploaded 70d ago · NEW · open in Gerrit ↗
commit message
LU-10026 csdc: sending compression info to server Client fills in layout compression info into obdo and passes it to server. Test-Parameters: forjanitoronly Signed-off-by: Bobi Jam <bobijam@whamcloud.com> Signed-off-by: Marc Vef <mvef@whamcloud.com> Change-Id: Ieb5d7b3609da41f35f8622ed6116f19ce7567ddb
68380
master
J !B ✗T –R 0/2
LU-10026 csdc: exponential backoff of incompressiblity check
reviewing Marc Vef · build failure (#130354)
csdc
1 unresolved
M +144 −90
69d
LU-10026 csdc: exponential backoff of incompressiblity check
reviewing Marc Vef · build failure (#130354)
csdc
1 unresolved
M +144 −90
69d
build failure (#130354)
1 unresolved thread(s) await your reply — last from Marc Vef
janitor run: 8 failing config(s), none unique to this patch — janitor results
build #130354 FAILURE
threads: 1 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Marc Vef patchset comment — [Marc Bot] upstream remarks for reference:
Marc Vef
[Marc Bot] upstream remarks for reference: Chunk-bits field naming follows the series (llc_compr_chunk_lum_bits).
tags: csdc
owner Marc Vef · uploader Marc Vef · PS1 uploaded 70d ago · NEW · open in Gerrit ↗
commit message
LU-10026 csdc: exponential backoff of incompressiblity check
If a file is incompressible and after a round of compressibility
check, if it remains incompressible, this patch would doubles the
skip bytes before running into another round of compressiblity
check.
This patch adds a state machine for update_compression_info(), the
states could be CS_INCOMPR, CS_COMPR, CS_CHECK, CS_CHECK_INC.
CS_INCOMPR -- file is not compressible
CS_COMPR -- file is compressible
CS_CHECK -- was in CS_COMPR, is now under check phase
CS_CHECK_INC -- was in CS_INCOMPR, is now under check phase
state transition:
INCOMPR --> INCOMPR : skip bytes has not been passed
INCOMPR --> CHECK_INC : skip bytes has been reached, in check phase
COMPR --> CHECK : in check phase, checked bytes has not been
reached
CHECK* --> CHECK* : in check phase, checked bytes has not been
reached
CHECK*/COMPR
--> COMPR : file is determined to be compressible
CHECK/COMPR
--> INCOMPR : file is determined to be incompressible, reset
the skip bytes check length
CHECK_INC --> INCOMPR : file is determined to be incompressible,
double the skip bytes check length
====
Test with 4 OSTs system, target file layout is set as:
lfs setstripe -Eeof -c-1 -Z lz4 --compress-chunk=64 $tf
and src file is 336M bz2 file, using "dd if=$src of=$tf bs=4M" copy
this bz2 file to target file.
w/o the patch, copy uses about 7 seconds
** start 1724216088 **
84+1 records in
84+1 records out
352625400 bytes (353 MB, 336 MiB) copied, 3.76366 s, 93.7 MB/s
** end 1724216095 **
...7 seconds
w/ the patch, copy uses about 4 seconds
** start 1724215237 **
84+1 records in
84+1 records out
352625400 bytes (353 MB, 336 MiB) copied, 2.07946 s, 170 MB/s
** end 1724215241 **
...4 seconds
Test-Parameters: forjanitoronly
DDN-bug-id: EX-8355
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Signed-off-by: Marc Vef <mvef@whamcloud.com>
Change-Id: I42105d3e137bf50897ff5c67654ca33552b23102
68379
master
J !B ✗T –R 0/2
LU-10026 utils: return error on invalid compress level setting
reviewing Marc Vef · build failure (#130353)
csdc
1 unresolved
S +11 −4
69d
LU-10026 utils: return error on invalid compress level setting
reviewing Marc Vef · build failure (#130353)
csdc
1 unresolved
S +11 −4
69d
build failure (#130353)
1 unresolved thread(s) await your reply — last from Marc Vef
janitor run: 7 failing config(s), none unique to this patch — janitor results
build #130353 FAILURE
threads: 1 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Marc Vef patchset comment — [Marc Bot] upstream remarks for reference:
Marc Vef
[Marc Bot] upstream remarks for reference: - The strtoul/end-pointer validation this patch adds was already carried (in stricter form) by the earlier level-handling patches of this series; those hunks were dropped. - The parse-time rewrite of low lz4 levels to the lz4fast default was removed here (matching the original series' final behaviour): the stored level is kept and the compression engine falls back to lz4fast when allocating the compressor. This also makes the negotiated-type test lists in sanity-pfl roundtrip correctly. - The new negative test was renamed test_1013a -> test_1013c: 1013a already exists (type negotiation test); the duplicate name would have silently shadowed it (latent issue in the original series).
tags: csdc
owner Marc Vef · uploader Marc Vef · PS1 uploaded 70d ago · NEW · open in Gerrit ↗
commit message
LU-10026 utils: return error on invalid compress level setting lfs setstripe -Z <compress_type>:<compress_level> does not report error on invalid <compress_level>. An explicit low level for the lz4 type (below the lz4hc minimum) is no longer silently rewritten to the lz4fast default at parse time; the stored level is kept and the compression engine falls back to lz4fast for such levels when allocating the compressor. Test-Parameters: forjanitoronly DDN-bug-id: EX-10186 Signed-off-by: Bobi Jam <bobijam@whamcloud.com> Signed-off-by: Marc Vef <mvef@whamcloud.com> Change-Id: Ie794a6d4cf208a9c66d1d179c157fee756477aee
66611
master
J !B ✗T –R 0/2
LU-10026 lfs: migrate compressed file without stripe info
reviewing Marc Vef · build failure (#130319)
csdc
2 unresolved
M +76 −14
69d
LU-10026 lfs: migrate compressed file without stripe info
reviewing Marc Vef · build failure (#130319)
csdc
2 unresolved
M +76 −14
69d
build failure (#130319)
2 unresolved thread(s) await your reply — last from Gerrit AI review for Lustre
janitor run: 4 failing config(s), none unique to this patch — janitor results
build #130319 FAILURE
patchsets:
PS1 06-11
PS2 08-25
PS3 08-26
threads: 2 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Gerrit AI review for Lustre COMMIT_MSG — (minor) The diff also touches Documentation/man1/lfs-mirror-extend.1 (documenting compression options for SETSTRIPE_OPTIONS), which the mess
Gerrit AI review for Lustre
(minor) The diff also touches Documentation/man1/lfs-mirror-extend.1 (documenting compression options for SETSTRIPE_OPTIONS), which the message doesn't mention and which is unrelated to the migrate fix. Is that hunk meant to be part of this patch, or should it be split out / called out in the body?
reply Gerrit AI review for Lustre liblustreapi_layout.c:2166 — (minor) This prints `fd`, which is always -1 on this path, so the message reads "Cannot open file X: -1" with no useful detail. The error is
Gerrit AI review for Lustre
(minor) This prints `fd`, which is always -1 on this path, so the message reads "Cannot open file X: -1" with no useful detail. The error is in errno from open() – strerror(errno) would be the informative value. Also note the caller (lfs_migrate/lfs.c) already emits its own llapi_error() when this returns < 0, so this adds a duplicate line. Using llapi_error(LLAPI_MSG_ERROR, errno, ...) here (as the ENOSPC path below does) would decode errno and respect the message level instead of writing to stderr unconditionally.
tags: csdc
owner Marc Vef · uploader Marc Vef · PS3 uploaded 70d ago · NEW · open in Gerrit ↗
commit message
LU-10026 lfs: migrate compressed file without stripe info lfs migrate file without specifying stripe info will get layout info from the file as the target layout template, and llapi_layout_get_by_xattr() tries to convert LOV_PATTERN_* values to user scope LLAPI_LAYOUT_* values, while LOV_PATTERN_COMPRESS is missed in this conversion. This patch add a function llapi_pattern_from_lov() to handle this conversion specifically. This patch also add more error messages for llapi_layout_file_open(). Test-Parameters: forjanitoronly Signed-off-by: Bobi Jam <bobijam@whamcloud.com> Signed-off-by: Marc Vef <mvef@whamcloud.com> Change-Id: I49a43cc7761cd2baed7a5da7d4e7cff2152ff9bb
66615
master
J ✗1B ✗T –R 0/2
LU-10026 csdc: prohibit set compression upon encrypted file
reviewing Marc Vef · build failure (#130322)
1 unique failure
csdc
1 unresolved
L +247 −35
69d
LU-10026 csdc: prohibit set compression upon encrypted file
reviewing Marc Vef · build failure (#130322)
1 unique failure
csdc
1 unresolved
L +247 −35
69d
build failure (#130322)
janitor: 1 test failure unique to this patch — conf-sanity4@zfs:test_123aj
1 unresolved thread(s) await your reply — last from Marc Vef
janitor flagged test failures unique to this patch — full janitor results
| unique failing test | history |
|---|---|
| conf-sanity4@zfs:test_123aj | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
build #130322 FAILURE
patchsets:
PS1 06-11
PS2 08-25
PS3 08-26
threads: 1 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Marc Vef patchset comment — [Marc Bot] upstream remarks for reference:
Marc Vef
[Marc Bot] upstream remarks for reference: Rebase note: kept the base's newer compression-parameter assignment block in lod_use_defined_striping() (gated on LOV_PATTERN_COMPRESS, with the extension-component chunk-adjustment deferral); this patch's encryption checks and attr threading apply on top unchanged.
tags: csdc
owner Marc Vef · uploader Marc Vef · PS3 uploaded 70d ago · NEW · open in Gerrit ↗
commit message
LU-10026 csdc: prohibit set compression upon encrypted file Setting compression layout component upon encrypted file is not allowed for now. This patch add this check on MDS in creating file with layout, adding/merging new mirror to existing file. Test-Parameters: forjanitoronly Test-Parameters: testlist=sanity-sec env=ONLY=67,PTLDEBUG=-1 Signed-off-by: Bobi Jam <bobijam@whamcloud.com> Signed-off-by: Marc Vef <mvef@whamcloud.com> Change-Id: I60d9f4bfce3a498f1eb3994c6276afb9d89c99a7
66266
master
J !B ✗T –R 0/2
LU-10026 osc: clear oi_write_osclock in lock fini func
cc Marc Vef · build failure (#130263)
csdc
S +12 −4
69d
LU-10026 osc: clear oi_write_osclock in lock fini func
cc Marc Vef · build failure (#130263)
csdc
S +12 −4
69d
janitor run: 3 failing config(s), none unique to this patch — janitor results
build #130263 FAILURE
patchsets:
PS1 05-28
PS2 06-11
PS3 06-11
PS4 08-25
tags: csdc
owner Marc Vef · uploader Marc Vef · PS4 uploaded 71d ago · NEW · open in Gerrit ↗
commit message
LU-10026 osc: clear oi_write_osclock in lock fini func Move osc_io::oi_write_osclock clearance in osc_lock_fini() as it's set in osc_lock_init(). Compression IO could possibly expand lock region and osc_lock_set_writer() could access a osc_io that is not accessed in osc_io_iter_init(), so that osc_io_rw_iter_fini() miss clearing osc_io's oi_writer_osclock. This patch moves the oi_write_osclock clearance in lock fini function to match its creation in osc_lock_init(). Test-Parameters: forjanitoronly Signed-off-by: Bobi Jam <bobijam@whamcloud.com> Signed-off-by: Marc Vef <mvef@whamcloud.com> Change-Id: Ied42f5befc1abd76aa10a7666eadb9a58e1f1783
68351
master
J ✗2B ✗T –R 0/2
LU-10026 llite: don't queue async IO page for inode in freeing
cc Marc Vef · build failure (#130329)
2 unique failures
csdc
1 unresolved
S +19 −0
70d
LU-10026 llite: don't queue async IO page for inode in freeing
cc Marc Vef · build failure (#130329)
2 unique failures
csdc
1 unresolved
S +19 −0
70d
build failure (#130329)
janitor: 2 test failures unique to this patch — runtests@ldiskfs+DNE:test_1, runtests-ssk@ldiskfs+SharedKey:test_1
1 unresolved thread(s) await your reply — last from Marc Vef
janitor flagged test failures unique to this patch — full janitor results
| unique failing test | history |
|---|---|
| runtests@ldiskfs+DNE:test_1 | seen in 5 other reviews |
| runtests-ssk@ldiskfs+SharedKey:test_1 | seen in 8 other reviews |
build #130329 FAILURE
patchsets:
PS1 08-25
PS2 08-26
threads: 1 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Marc Vef patchset comment — [Marc Bot] upstream remarks for reference:
Marc Vef
[Marc Bot] upstream remarks for reference:
Port notes:
- Registered as .cio_commit_async with the current signature (the
enum cl_io_priority argument was added upstream), next to master's
renamed .cio_read_ahead_prep hook.
- Reviewer note: master meanwhile carries LU-17364 ("discard un-flushable
pages on evicted inode teardown"), which addresses the same teardown
crash from another angle; this patch is kept as an additional guard and
may be droppable after evaluation.
tags: csdc
owner Marc Vef · uploader Marc Vef · PS2 uploaded 70d ago · NEW · open in Gerrit ↗
commit message
LU-10026 llite: don't queue async IO page for inode in freeing
When inode is being freed, do not try to queue async IO pages as
there is a race window between ll_delete_inode() and
ll_truncate_inode_pages_final(), and the queued async IO pages
cannot be teardown.
(osc_page.c:182:osc_page_delete()) Trying to teardown failed: -16
(osc_page.c:184:osc_page_delete()) ASSERTION( 0 ) failed:
(osc_page.c:184:osc_page_delete()) LBUG
lbug_with_loc+0x64/0xb0 [libcfs]
osc_page_delete+0x290/0x574 [osc]
cl_page_delete0+0xb8/0x404 [obdclass]
cl_page_delete+0x64/0x22c [obdclass]
ll_invalidate_folio+0x114/0x2a0 [lustre]
truncate_cleanup_folio+0x6c/0xf0
truncate_inode_pages_range+0xf8/0x4e0
truncate_inode_pages_final+0x54/0x80
ll_truncate_inode_pages_final+0x40/0x520 [lustre]
ll_delete_inode+0x68/0x25c [lustre]
evict+0xb8/0x1a0
Test-Parameters: forjanitoronly
DDN-bug-id: EX-11006
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Signed-off-by: Marc Vef <mvef@whamcloud.com>
Change-Id: If655a89faf6f979167c05c91c7b52a6c49a7884b
68399
master
J –B ✗T –R -1/2−
LU-10026 tests: sanity-compr/1000d failure for ARM client
reviewing Marc Vef · build failure (#130371)
csdc
S +9 −7
70d
LU-10026 tests: sanity-compr/1000d failure for ARM client
reviewing Marc Vef · build failure (#130371)
csdc
S +9 −7
70d
build #130371 FAILURE
tags: csdc
owner Marc Vef · uploader Marc Vef · PS1 uploaded 70d ago · NEW · open in Gerrit ↗
commit message
LU-10026 tests: sanity-compr/1000d failure for ARM client aarch64 has 64K page size and compression chunk size could be adjusted upward if it's original setting value is equal to page size, so the test should be refined to get the actual chunk size be set. Test-Parameters: forjanitoronly DDN-bug-id: EX-7536 Signed-off-by: Bobi Jam <bobijam@whamcloud.com> Signed-off-by: Marc Vef <mvef@whamcloud.com> Change-Id: Ide2f91e255ba886f9c1e18d1e1fe89c589f3bca1
68373
master
J –B ✗T –R +0/2−
LU-10026 csdc: stop compressing incompressible file data
reviewing Marc Vef · build failure (#130347)
csdc
2 unresolved
L +413 −17
70d
LU-10026 csdc: stop compressing incompressible file data
reviewing Marc Vef · build failure (#130347)
csdc
2 unresolved
L +413 −17
70d
build failure (#130347)
2 unresolved thread(s) await your reply — last from Marc Vef
build #130347 FAILURE
reviews:
Alex Zhuravlev +1
threads: 2 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Marc Vef patchset comment — [Marc Bot] upstream remarks for reference:
Marc Vef
[Marc Bot] upstream remarks for reference: ci_incompressible placed in the relocated cl_io bitfield next to ci_size_extend_compression; test_1021 gate converted to compression_supported.
reply Misc Code Checks Robot (Gatekeeper helper) osc_io.c:566 — error: osc_io_iter_init():'osc' dereferencing possible ERR_PTR()
Misc Code Checks Robot (Gatekeeper helper)
error: osc_io_iter_init():'osc' dereferencing possible ERR_PTR()
tags: csdc
owner Marc Vef · uploader Marc Vef · PS1 uploaded 70d ago · NEW · open in Gerrit ↗
commit message
LU-10026 csdc: stop compressing incompressible file data The reduced_ratio (original_size/compress_reduced_size) represents the minimum fraction of pages that are compressed out of each chunk, namely the compressed chunk needs to shrink by at least 1/reduced_ratio blocks for it to be "compressible". Let size compression_ratio be defined as original_size/after_compression_size, so reduced_ratio = compression_ratio / (compression_ratio - 1) and we set its default value to 16, equivalent to 1.07 of compression ratio (i.e. needs to shrink at least one 4KB block out of each 64KB chunk). After every compress_check_bytes of data being compressed, file's compressibility would be re-calculated based on average compress_reduced and average compress_orig data size. Stop compressing file data if it is deemed to be incompressible, and after compress_skip_bytes data have been written uncompressed , retry the file compressibility check. compress_reduced_ratio, compress_check_bytes, compress_skip_bytes are tunable parameters: osc.*.compress_reduced_ratio osc.*.compress_check_bytes osc.*.compress_skip_bytes their default values are 16, 1M and 32M respectively. tests: use /dev/zero as compressible source in test 1021 as hdf file has few incompressible chunks and this breaks the test infrequently. DDN-bug-id: EX-10857 Was-Change-Id: Iba29d9e654a245d3c0cbb14a8b7dbb9f847f52d5 Test-Parameters: forjanitoronly DDN-bug-id: EX-8355 Signed-off-by: Alex Zhuravlev <bzzz@whamcloud.com> Signed-off-by: Bobi Jam <bobijam@whamcloud.com> Signed-off-by: Marc Vef <mvef@whamcloud.com> Change-Id: I4ce3d752c67f18ba7b100c72a2bb61a91258c6e8
68405
master
J !B ✗T –R 0/2
LU-10026 cdsc: update layout compressibility
reviewing Marc Vef · build failure (#130377)
csdc
4 unresolved
L +335 −54
70d
LU-10026 cdsc: update layout compressibility
reviewing Marc Vef · build failure (#130377)
csdc
4 unresolved
L +335 −54
70d
build failure (#130377)
4 unresolved thread(s) await your reply — last from Marc Vef
janitor run: 3 failing config(s), none unique to this patch — janitor results
build #130377 FAILURE
no vote yet: Alex Zhuravlev
threads: 4 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Marc Vef patchset comment — [Marc Bot] upstream remarks for reference:
Marc Vef
[Marc Bot] upstream remarks for reference: - OBD_CONNECT2_UPDATE_LAYOUT was already reserved on master at the same bit; only the MDT_CONNECT_SUPPORTED2 and client connect lists needed the addition. - ci_need_change_layout added to the current cl_io bitfield; CAT_COMPRESSIBLE handling merged into the current vvp_attr_update(). - mdd_layout_update_pccro was renamed/extended per the patch on the current (retry-aware) master form. - FORMATTED_BUF_LEN (used by the new getstripe formatting) is defined locally - the source branch carries it from an unrelated change. - test_1021 layout-flag assertions applied unconditionally (the original wrapped them in version gates).
reply Misc Code Checks Robot (Gatekeeper helper) vvp_io.c:297 — error: vvp_layout_minor_change():'vob' dereferencing possible ERR_PTR()
Misc Code Checks Robot (Gatekeeper helper)
error: vvp_layout_minor_change():'vob' dereferencing possible ERR_PTR()
reply Misc Code Checks Robot (Gatekeeper helper) vvp_io.c:429 — error: vvp_io_fini():'vob' dereferencing possible ERR_PTR()
Misc Code Checks Robot (Gatekeeper helper)
error: vvp_io_fini():'vob' dereferencing possible ERR_PTR()
reply Misc Code Checks Robot (Gatekeeper helper) vvp_io.c:1973 — error: vvp_io_init():'vob' dereferencing possible ERR_PTR()
Misc Code Checks Robot (Gatekeeper helper)
error: vvp_io_init():'vob' dereferencing possible ERR_PTR()
tags: csdc
owner Marc Vef · uploader Marc Vef · PS1 uploaded 70d ago · NEW · open in Gerrit ↗
commit message
LU-10026 cdsc: update layout compressibility When compressing write changes the file's compressibility, it updates the file layout flags so that its compressibility persists. lod: reset la_attr at declare to avoid unplanned local attributes update during minor layout change. DDN-bug-id: EX-10786 Was-Change-Id: I093efeb9cf110adfe6a7590091e60b1e9f1eb9ed Test-Parameters: forjanitoronly DDN-bug-id: EX-8355 Signed-off-by: Alex Zhuravlev <bzzz@whamcloud.com> Signed-off-by: Bobi Jam <bobijam@whamcloud.com> Signed-off-by: Marc Vef <mvef@whamcloud.com> Change-Id: Ia2964817d1b5fee2d84ef15e9f1036882d70adb2
66284
master
J –B ✗T –R -1/2−
LU-10026 csdc: handle data compression on MDT
reviewing Marc Vef · build failure (#130318)
csdc
4 unresolved
S +39 −1
70d
LU-10026 csdc: handle data compression on MDT
reviewing Marc Vef · build failure (#130318)
csdc
4 unresolved
S +39 −1
70d
build failure (#130318)
4 unresolved thread(s) await your reply — last from Gerrit AI review for Lustre
build #130318 FAILURE
patchsets:
PS3 06-11
PS4 06-11
PS5 06-11
PS6 08-25
PS7 08-26
+2 earlier
PS1 05-28 PS2 06-11threads: 4 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Gerrit AI review for Lustre COMMIT_MSG:9 — (minor) The body explains the DoM+compress block, but two hunks pull the other way and aren't mentioned: lov_pattern_available() gains LOV_P
Gerrit AI review for Lustre
(minor) The body explains the DoM+compress block, but two hunks pull the other way and aren't mentioned: lov_pattern_available() gains LOV_PATTERN_MDT | LOV_PATTERN_COMPRESS, and llapi_pattern_to_lov() gains MDT|COMPRESS and RAID0|COMPRESS cases. Both make the combination more acceptable, not less. Could the message cover why they belong in a patch whose stated purpose is to disallow it?
reply Gerrit AI review for Lustre lustre_user.h:837 — (defect) This makes the server accept an MDT|COMPRESS component (lod_lov.c / lov_ea.c call lov_pattern_available()), yet lov_pattern_support
Gerrit AI review for Lustre
(defect) This makes the server accept an MDT|COMPRESS component (lod_lov.c / lov_ea.c call lov_pattern_available()), yet lov_pattern_supported() still excludes it, so client IO marks such an entry invalid (lov_object.c sets lle_valid = 0). The only guard against creating it lives in lfs.c; a liblustreapi caller doing llapi_layout_pattern_set(MDT) + llapi_layout_compress_set() bypasses that and produces a layout the server stores but IO cannot use. If DoM+compress is unsupported, should the block live in the library/server rather than only the CLI?
reply Gerrit AI review for Lustre lfs.c:3459 — (defect) errno is set to a negative value here; every other error path in comp_args_to_layout() uses errno = EINVAL. A negative errno breaks
Gerrit AI review for Lustre
(defect) errno is set to a negative value here; every other error path in comp_args_to_layout() uses errno = EINVAL. A negative errno breaks strerror(errno)/perror on this -1 return. Should be errno = EINVAL.
reply Gerrit AI review for Lustre liblustreapi_layout.c:831 — (minor) These two cases look unreachable. The COMPRESS bit never reaches llc_pattern: llapi_layout_pattern_set() rejects any pattern carryin
Gerrit AI review for Lustre
(minor) These two cases look unreachable. The COMPRESS bit never reaches llc_pattern: llapi_layout_pattern_set() rejects any pattern carrying it, and llapi_layout_from_lum() stores compression in llc_compr_type, not the pattern. The bit is OR'd into lmm_pattern separately in llapi_layout_to_lum() (blob->lmm_pattern |= LOV_PATTERN_COMPRESS). Was a real caller intended, or can these be dropped?
tags: csdc
owner Marc Vef · uploader Marc Vef · PS7 uploaded 70d ago · NEW · open in Gerrit ↗
commit message
LU-10026 csdc: handle data compression on MDT Do not support setting data compression component on DoM until data compression on MDT implemented. DDN-bug-id: EX-7806 Was-Change-Id: I3794460140f08a073377c418dd56e7dda907d96d Test-Parameters: forjanitoronly Signed-off-by: Bobi Jam <bobijam@whamcloud.com> Signed-off-by: Marc Vef <mvef@whamcloud.com> Change-Id: I8b5c4d5fd18033e796b1c7555c37251e4f7f9a49
65762
master
J ✗1B ✓T ✗1R 0/2
LU-10026 csdc: prefer uncompressed mirror for read and write
reviewing Marc Vef · janitor: 1 test failure unique to this patch — sanity3@zfs:test_907
1 unique failure
csdc
4 unresolved
L +213 −47
74d
LU-10026 csdc: prefer uncompressed mirror for read and write
reviewing Marc Vef · janitor: 1 test failure unique to this patch — sanity3@zfs:test_907
1 unique failure
csdc
4 unresolved
L +213 −47
74d
janitor: 1 test failure unique to this patch — sanity3@zfs:test_907
enforced failed: review-dne-selinux-ssk-part-2
4 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 |
|---|---|
| sanity3@zfs:test_907 | seen in 57 other reviews |
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-selinux-ssk-part-2 | RHEL 8.10 / x86_64 | ran 7 tests. 1 tests failed: sanity-sec. | session |
build #129912 SUCCESS · tests all Maloo sessions
no vote yet: James Simmons, Andreas Dilger, Artem Blagodarenko
patchsets:
PS8 08-19 Artem Blagodarenko
PS9 08-19 Artem Blagodarenko
PS10 08-20 Artem Blagodarenko
PS11 08-20 Artem Blagodarenko
PS12 08-21 Artem Blagodarenko
+7 earlier
PS1 05-08 PS2 05-28 PS3 05-28 PS4 06-11 PS5 06-11 PS6 07-27 Artem Blagodarenko PS7 07-28 Artem Blagodarenkothreads: 4 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Gerrit AI review for Lustre lod_lov.c:622 — This bonus is added once per allocated stripe, which is exactly the weight the OS_STATFS_NONROT bonus a few lines above uses, so the two can
Gerrit AI review for Lustre
This bonus is added once per allocated stripe, which is exactly the weight the OS_STATFS_NONROT bonus a few lines above uses, so the two can cancel out.
Two mirrors, no LCME_FL_PREF_WR anywhere, one stripe each:
mirror 0: compressed, stripe on a NONROT OST -> pref = 1
mirror 1: uncompressed, stripe on a rotating OST -> pref = 1
lme_preference ties, so the `!found_preferred` fallback below keeps the lower index (`>` is strict) and sets lme_prefer on mirror 0. lod_primary_pick() then classifies mirror 0 as case B (preferred + compressed) and mirror 1 as case C, and B outranks C, so the write goes to the compressed mirror.
A wider compressed mirror wins outright rather than tying: 4 NONROT stripes compressed = 4 vs 1 NONROT stripe uncompressed = 2.
Mixed flash/disk mirrors are the case the non-rotational preference was added for, so this is not an exotic layout. Should the uncompressed bonus be on a different scale than the per-stripe NONROT count (or applied once per mirror) so it can't be traded away against OST speed?
The comment also says "mirror", but this sits in the per-stripe loop of one component.
reply Gerrit AI review for Lustre lod_object.c:8060 — (style) Not a bug, but this comment has a UTF-8 em dash in it; the rest of the tree is plain ASCII. A plain '-' would do.
Gerrit AI review for Lustre
(style) Not a bug, but this comment has a UTF-8 em dash in it; the rest of the tree is plain ASCII. A plain '-' would do.
reply Gerrit AI review for Lustre lod_object.c:8088 — Ranking B (preferred + compressed) above C (uncompressed) reads as "an explicit `lfs setstripe --flags=prefer` beats the compression heurist
Gerrit AI review for Lustre
Ranking B (preferred + compressed) above C (uncompressed) reads as "an explicit `lfs setstripe --flags=prefer` beats the compression heuristic". But lme_prefer is not only user intent: when no component carries LCME_FL_PREF_WR, lod_fill_mirrors() picks the highest lme_preference non-stale mirror and sets lme_prefer = 1 on it. So tier B is reachable on a file the user never flagged, and the heuristic ends up overriding its own compression preference. Should case B be restricted to mirrors that actually carry LCME_FL_PREF_WR, or should the synthesized preference be tracked separately from the user flag?
reply Gerrit AI review for Lustre lov_io.c:662 — (minor) ci_ndelay_tried > 0 means "not the first lov_io_mirror_init() for this env", which is broader than "this is an FLR error retry".
Gerrit AI review for Lustre
(minor) ci_ndelay_tried > 0 means "not the first lov_io_mirror_init() for this env", which is broader than "this is an FLR error retry".
ll_file_io_generic() restarts the io for reasons unrelated to mirror failure and preserves the counter:
partial_io -> io->ci_need_restart = 1 (file.c)
retried = io->ci_ndelay_tried; goto restart;
A single buffered read larger than max_io_bytes therefore takes the uncompressed mirror for the first chunk only; from the second chunk on ci_ndelay_tried is non-zero, lis_mirror_index has been advanced by one, and the first in-range mirror is accepted even when it is compressed. The layout-change restart in vvp_io_iter_init() has the same shape.
Would gating on something that only the -EAGAIN mirror-failover path sets (io->ci_tried_all_mirrors, or a dedicated flag set where cl_io_loop() retries) keep the failover fix without giving up the preference on ordinary io continuation?
tags: csdc
owner Marc Vef · uploader Artem Blagodarenko · PS12 uploaded 76d ago · NEW · open in Gerrit ↗
commit message
LU-10026 csdc: prefer uncompressed mirror for read and write When accessing a mirrored file with both compressed and uncompressed components, choose uncompressed components for read (lov_io.c). When writing to mirrored files with both compressed and uncompressed mirrors, prefer the uncompressed components to write; this is better for performance, more compatible with older clients, and better fits the model of compressing files after initial write. The write-side preference is implemented via lod_fill_mirrors() and lod_primary_pick() using a new lme_compressed flag. Note: the changes to lod_fill_mirrors() and lod_primary_pick() affect all FLR files, not only those with compressed mirrors. Plain FLR writes will also use the updated preferred-mirror selection logic. DDN-bug-id: EX-6510 Was-Change-Id: I62a117d5cc3d34e2c0c96d1a9ade8eef0a2d1291 Signed-off-by: Bobi Jam <bobijam@whamcloud.com> Signed-off-by: Artem Blagodarenko <ablagodarenko@gmail.com> Signed-off-by: Marc Vef <mvef@whamcloud.com> Change-Id: I043b27bd891c039901075a08c76630f8f0f9f182
65761
master
J !B ✓T ✗1R 0/2
LU-10026 utils: add 'lfs find' support for compressed file
reviewing Marc Vef · enforced failed: review-dne-selinux-ssk-part-2
csdc
9 unresolved
L +715 −67
74d
LU-10026 utils: add 'lfs find' support for compressed file
reviewing Marc Vef · enforced failed: review-dne-selinux-ssk-part-2
csdc
9 unresolved
L +715 −67
74d
enforced failed: review-dne-selinux-ssk-part-2
9 unresolved thread(s) await your reply — last from Gerrit AI review for Lustre
janitor run: 4 failing config(s), none unique to this patch — janitor results
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-selinux-ssk-part-2 | RHEL 8.10 / x86_64 | ran 7 tests. 1 tests failed: sanity-sec. | session |
build #129911 SUCCESS · tests all Maloo sessions
no vote yet: James Simmons, Andreas Dilger, Artem Blagodarenko
patchsets:
PS13 08-19 Artem Blagodarenko
PS14 08-19 Artem Blagodarenko
PS15 08-20 Artem Blagodarenko
PS16 08-20 Artem Blagodarenko
PS17 08-21 Artem Blagodarenko
+12 earlier
PS1 05-08 PS2 05-28 PS3 05-28 PS4 06-11 PS5 06-11 PS6 06-17 Artem Blagodarenko PS7 06-18 Artem Blagodarenko PS8 07-24 Artem Blagodarenko PS9 07-27 Artem Blagodarenko PS10 07-27 Andreas Dilger PS11 07-27 Andreas Dilger PS12 07-27 Andreas Dilgerthreads: 9 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Gerrit AI review for Lustre COMMIT_MSG:9 — (minor) The first three bullets read as new functionality, but `--comp-flags=[^]compress` and `--comp-flags=[^]nocompr` already work (LCME_F
Gerrit AI review for Lustre
(minor) The first three bullets read as new functionality, but `--comp-flags=[^]compress` and `--comp-flags=[^]nocompr` already work (LCME_FL_COMPRESS/LCME_FL_NOCOMPR are in comp_flags_table[]), and so does `-L compress` (LOV_PATTERN_COMPRESS is in lov_pattern_names[]). This patch documents them and adds test coverage rather than adding them. Could the wording say "document" for those three, so the message matches the diff?
reply Gerrit AI review for Lustre lustre_user.h:3278 — (style) COMPR_LEVEL_MAX is already defined with the same value earlier in this header, just after `enum ll_compr_type`, with a comment expla
Gerrit AI review for Lustre
(style) COMPR_LEVEL_MAX is already defined with the same value earlier in this header, just after `enum ll_compr_type`, with a comment explaining it. Two definitions can drift apart later; can this one be dropped?
reply Gerrit AI review for Lustre sanity-pfl.sh:3078 — (style) extra blank line. Also z1..z4 here, and `expect` in test_100d, are not declared `local`.
Gerrit AI review for Lustre
(style) extra blank line. Also z1..z4 here, and `expect` in test_100d, are not declared `local`.
reply Gerrit AI review for Lustre lfs.c:4637 — (style) not a bug, but `compress-chunk` already appears in this long_opts[] further down, so it is listed twice now. getopt_long takes the f
Gerrit AI review for Lustre
(style) not a bug, but `compress-chunk` already appears in this long_opts[] further down, so it is listed twice now. getopt_long takes the first match so it still works; `compr-chunk` looks like the only new alias actually needed here.
reply Gerrit AI review for Lustre lfs.c:8226 — (typo) this comment uses a UTF-8 em dash; the tree is otherwise plain ASCII. Same in the `%LZ` directory-branch comment in liblustreapi_pfin
Gerrit AI review for Lustre
(typo) this comment uses a UTF-8 em dash; the tree is otherwise plain ASCII. Same in the `%LZ` directory-branch comment in liblustreapi_pfind.c.
reply Gerrit AI review for Lustre lfs.c:8248 — (defect) atoi() cannot report a parse failure, so `--compr-level=abc` silently becomes level 0, and `--compr-level=+abc` becomes "level > 0"
Gerrit AI review for Lustre
(defect) atoi() cannot report a parse failure, so `--compr-level=abc` silently becomes level 0, and `--compr-level=+abc` becomes "level > 0", i.e. every compressed component. The unsigned range check above cannot catch it. `-Z gzip:abc` is rejected by llapi_parse_compress_type(), and the setstripe `--compress-level` path uses strtol() with an end-pointer check, so the three spellings of the same thing disagree. strtol() plus `*end != '\0'` here would line them up.
reply Gerrit AI review for Lustre liblustreapi_pfind.c:509 — (minor) This helper backs every numeric `lfs find` predicate, and the new exact-match branch only changes behaviour when `margin == 0`. `lfs
Gerrit AI review for Lustre
(minor) This helper backs every numeric `lfs find` predicate, and the new exact-match branch only changes behaviour when `margin == 0`. `lfs find -z N` with a plain number is such a caller: lfs.c does `fp_ext_size_units /= SEL_UNIT_SIZE`, so 1/1024 becomes 0, and an exact `-z` match that previously reported "no match" now matches. That may well be desirable, but it is a silent change to an unrelated option. The new compression predicates are the only callers passing margin 0; the rest pass 1 or a unit size, and with margin 1 this function already returns 1 on an exact match. Passing 1 there would avoid touching the shared helper, and would also make `--compr-level=-N` / `--compr-chunk=-N` mean "< N" like `-c -N`, `--size -N` and friends, rather than "<= N". The table above the function (rows 5 and 6, and the note about the interval `(limit - margin, limit]`) no longer describes the code either.
reply Gerrit AI review for Lustre liblustreapi_pfind.c:975 — (defect) Negation is handled differently for level/chunk than for type. `fp_exclude_compr_lvl` is passed into find_value_cmp() as `negopt`,
Gerrit AI review for Lustre
(defect) Negation is handled differently for level/chunk than for type. `fp_exclude_compr_lvl` is passed into find_value_cmp() as `negopt`, so `found_lvl` ends up meaning "some component does not match" instead of "no component matches", and the aggregation here then ignores the exclude flag entirely - unlike the fp_check_compr_type block just above.
For a file with two compressed components, level 3 and level 5:
lfs find ! --compr-level=3 dir
entry(lvl 5) makes find_value_cmp() return -1, negopt flips it to 1, found_lvl is set, and the file is reported - even though it does have a level-3 component. The equivalent `! --compr-type=gzip` on a gzip+lz4 file correctly does not match.
Should the level and chunk comparisons drop the negopt argument and be inverted here the same way type is?
reply Gerrit AI review for Lustre liblustreapi_pfind.c:1771 — (defect) `fp_lum_size` is the size common_param_init() allocated for the lmd buffer (>= XATTR_SIZE_MAX, 64KiB), not the length of the layout
Gerrit AI review for Lustre
(defect) `fp_lum_size` is the size common_param_init() allocated for the lmd buffer (>= XATTR_SIZE_MAX, 64KiB), not the length of the layout stored in it. For a non-composite lum, llapi_layout_get_by_xattr() never narrows that value, so llapi_layout_objects_in_lum() computes (65536 - 32) / 24 = 2729 objects and __llapi_comp_alloc() rejects it with EINVAL because 2729 > LOV_MAX_STRIPE_COUNT (2000). So this call fails for every plain V1/V3 file and always falls through to llapi_layout_get_by_path(); only composite layouts reach the new path, because the entry loop resets the size to `ent->lcme_size`. Passing the actual layout length instead would make the fast path work for non-PFL files too.
tags: csdc
owner Marc Vef · uploader Artem Blagodarenko · PS17 uploaded 76d ago · NEW · open in Gerrit ↗
commit message
LU-10026 utils: add 'lfs find' support for compressed file * Add "--comp-flags=[^]compress" to locate file with/without compressed components. * Add "--comp-flags=[^]nocompr" to locate file with/without setting component compress preference. * Add "[!] --layout=compress" to locate file with/without compressed components. * Add "[!] --compress-type=<compress-type>" to locate compressed file with/without specified compress algorithm. * Add "[!] --compress-level=[+-]<compress-level>" to locate compressed file with/without specified compress level. * Add "[!] --compress-chunk=[+-]<compress-chunk>" to locate compressed file with/without specified compress chunk in KiB. utils: add -Z option for 'lfs getstripe/find' Add support for "lfs getstripe -Z" to get the last instantiated component compression information. Add support for "lfs find -Z <type>[:[+-]<level>]" to keep consistent options with "lfs setstripe -Z". DDN-bug-id: EX-6856 Was-Change-Id: Ia5e2a2ea6937dc2b46e224cec808504a196b974c utils: logical AND for 'lfs find' compression exprs All search expressions provided to 'lfs find' must be combined as a logical AND. Fix newly added options for compression support, so that they comply with this logical AND. DDN-bug-id: EX-7714 Was-Change-Id: I3b28cd87c1d304df6d04753b413d46f5abcfe16e csdc: don't set compression layout when disabled When llite_enable_compression is disabled (lfs set_param llite.*.enable_compression=0), we should check it before sending it to MDS lest we get a file with compressed component which we cannot handle. DDN-bug-id: EX-7593 Was-Change-Id: Ib1e2123ffdb239c3e1401d682ae9c2c49e3f4a6f utils: support 'lfs find --printf %LZ' Add support for "lfs find --printf %LZ" to print the compression type:level of the last instantiated component of a file. DDN-bug-id: EX-6856 Was-Change-Id: Iaf1b6c031b06c70e7b5be51354697aa6bdcc9850 csdc: right error code in case compression is disabled Currently, if compression is disabled on a client the error message is confusing "Cannot set layout EA: Unknown error 524" Let's replace the error code from ENOTSUPP to EOPNOTSUPP, so error messages become more informative ctl get_param -n llite.*.enable_compression 0 lfs setstripe -i 0 -c 1 -E -1 -Z lz4 /mnt/lustre/foo.txt Cannot set layout EA: Operation not supported lfs setstripe: cannot create composite file '/mnt/lustre/foo.txt': Inappropriate ioctl for device This message could be even more informative, but this version is already much better. DDN-bug-id: EX-10577 Was-Change-Id: I7fd67d5d3d20bc7de169f35f6fa63b53f2bfe718 Signed-off-by: Bobi Jam <bobijam@whamcloud.com> Signed-off-by: Artem Blagodarenko <ablagodarenko@ddn.com> Signed-off-by: Marc Vef <mvef@whamcloud.com> Change-Id: Ic36946738c3463fd862aeca4ee2e2c2ed85eff84
57572
master
J !B ✓T ✓R -1/2−
LU-18592 lod: protect lod in-memory layout's change
mine needs rebase — checkpatch: cannot be cherry-picked
needs rebase
9 unresolved
M +80 −31
78d
LU-18592 lod: protect lod in-memory layout's change
mine needs rebase — checkpatch: cannot be cherry-picked
needs rebase
9 unresolved
M +80 −31
78d
needs rebase — checkpatch: cannot be cherry-picked
9 unresolved thread(s) await your reply — last from Gerrit AI review for Lustre
CI green — no vote yet from Qian Yingjin, Andreas Dilger, Lai Siyao, Patrick Farrell
janitor run: 1 failing config(s), none unique to this patch — janitor results
11 optional test failure(s) — informational
build #127622 SUCCESS · tests all Maloo sessions
no vote yet: Qian Yingjin, Andreas Dilger, Lai Siyao, Patrick Farrell
patchsets:
PS8 09-04
PS9 09-05
PS10 09-10
PS11 09-24
PS12 07-15
+7 earlier
PS1 12-23 PS2 12-23 PS3 01-03 PS4 01-10 PS5 02-14 Peter Jones PS6 02-28 PS7 08-22threads: 9 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Gerrit AI review for Lustre COMMIT_MSG:9 — The body explains why lod_layout_mutex is needed, but two hunks aren't accounted for:
Gerrit AI review for Lustre
The body explains why lod_layout_mutex is needed, but two hunks aren't accounted for: - `lo->ldo_flr_state = 0;` added to the plain-layout branch of lod_parse_striping() - the extra `!lo->ldo_is_composite ||` term in the lod_declare_update_extents() assertion Could the body say what each of those is for? As written the text reads as if the assertion should stop firing for plain layouts, but the code makes it fire more often (see the inline comment).
reply Gerrit AI review for Lustre COMMIT_MSG:18 — This fixes an LBUG, so it would help to carry a Fixes: tag. The assertion being hit was added by:
Gerrit AI review for Lustre
This fixes an LBUG, so it would help to carry a Fixes: tag. The assertion being hit was added by:
Fixes: ff5eb304fa37 ("LU-10070 lod: SEL: Implement basic spillover space")
That commit introduced lod_declare_update_extents() together with `if (lo->ldo_flr_state == LCM_FL_NONE) LASSERT(start_index == 0 && max_comp == lo->ldo_comp_cnt);` and the unlocked access to ldo_mirrors[]/ldo_comp_cnt that this change now serializes.
reply Gerrit AI review for Lustre lod_lov.c:1362 — The same reset looks missing in the other two places that build a plain in-core layout after freeing the old one:
Gerrit AI review for Lustre
The same reset looks missing in the other two places that build a plain in-core layout after freeing the old one: - lod_use_defined_striping() (lod_qos.c:2217) sets `mo->ldo_is_composite = 0` for LOV_MAGIC_V1/V3 with no ldo_flr_state reset - lod_qos_parse_config() (lod_qos.c:2557) does the same after lod_free_comp_entries() lod_free_comp_entries() clears ldo_mirrors, ldo_mirror_count and ldo_is_composite but not ldo_flr_state, so a composite-to-plain transition through either of those still leaves a stale value. lod_declare_layout_change() then dispatches on it, e.g. into lod_declare_update_rdonly() whose `LASSERT(lo->ldo_mirror_count > 0)` cannot hold for a plain layout. Should those get the same fix?
reply Gerrit AI review for Lustre lod_object.c:7591 — Adding `!lo->ldo_is_composite ||` widens the guard rather than narrowing it: `A || B` is true whenever `B` is true, so the LASSERT is now ev
Gerrit AI review for Lustre
Adding `!lo->ldo_is_composite ||` widens the guard rather than narrowing it: `A || B` is true whenever `B` is true, so the LASSERT is now evaluated in strictly more cases than before, and the plain-layout case (`ldo_is_composite == 0`) now always evaluates it.
The commit message says ldo_flr_state is only meaningful for a composite layout and that a plain file "could get into lod_declare_update_plain()->lod_declare_update_extents() and bump into this assertion", which reads like the intent was to exempt plain layouts:
if (lo->ldo_is_composite && lo->ldo_flr_state == LCM_FL_NONE)
With `||`, a plain file in the state that produced the LU-18592 LBUG (flr_state == LCM_FL_NONE, stale ldo_mirrors) still hits the same assertion. Which of the two is intended?
reply Gerrit AI review for Lustre lod_object.c:7785 — Changing `RETURN(-EALREADY)` into `GOTO(out_unlock, rc = -EALREADY)` also routes this through `out:`, so the -EALREADY case now calls lod_st
Gerrit AI review for Lustre
Changing `RETURN(-EALREADY)` into `GOTO(out_unlock, rc = -EALREADY)` also routes this through `out:`, so the -EALREADY case now calls lod_striping_free() and drops the cached layout. Previously it returned with the cache intact. mdd_layout_instantiate_component() turns -EALREADY into success, so every layout-write intent on an already-instantiated component now throws away the in-memory striping and forces a re-read of the LOV EA. Is that intended, or should this path skip the free?
reply Gerrit AI review for Lustre lod_object.c:8613 — This isn't a bug today, but making the unlock conditional on `rc` is fragile: `out:` is reached both by fall-through with the mutex already
Gerrit AI review for Lustre
This isn't a bug today, but making the unlock conditional on `rc` is fragile: `out:` is reached both by fall-through with the mutex already released (rc == 0) and by `GOTO(out, ...)` with it still held. It only works because every goto to `out:` happens to set rc != 0 -- a future `GOTO(out, rc = 0)`, or a `lod_declare_update_extents()` return of 0 being propagated, silently leaks the mutex. A dedicated `out_unlock:` label above `out_free:` (as was done in lod_declare_update_plain()) would make the lock state structural instead of value-dependent. Same shape in lod_declare_update_write_pending() and lod_declare_update_sync_pending().
reply Gerrit AI review for Lustre lod_object.c:8825 — This assignment to ldo_flr_state is still outside ldo_layout_mutex, but lod_declare_update_write_pending() now takes the mutex and then asse
Gerrit AI review for Lustre
This assignment to ldo_flr_state is still outside ldo_layout_mutex, but lod_declare_update_write_pending() now takes the mutex and then asserts on the value:
lod_declare_update_sync_pending() lod_striping_reload()
lo->ldo_flr_state = WRITE_PENDING mutex_lock(ldo_layout_mutex)
lod_parse_striping()
lo->ldo_flr_state = <from disk>
mutex_unlock()
lod_declare_update_write_pending()
mutex_lock(ldo_layout_mutex)
LASSERT(ldo_flr_state == LCM_FL_WRITE_PENDING) <- fires
Since this is the same class of problem the patch is fixing, should the state transition move inside the mutex (or the mutex be taken here and passed down)?
reply Gerrit AI review for Lustre lod_qos.c:1582 — This isn't a bug, but `layout_lcked` is spelled `layout_locked` in every sibling function (lod_check_and_reserve_ost(), lod_ost_alloc_rr(),
Gerrit AI review for Lustre
This isn't a bug, but `layout_lcked` is spelled `layout_locked` in every sibling function (lod_check_and_reserve_ost(), lod_ost_alloc_rr(), lod_ost_alloc_specific(), lod_qos_prep_create()). Worth making it consistent if the patch is refreshed.
reply Gerrit AI review for Lustre lod_qos.c:3138 — This is the one remaining caller passing `false`, and it leaves the two lock orders divergent:
Gerrit AI review for Lustre
This is the one remaining caller passing `false`, and it leaves the two lock orders divergent:
lod_prepare_create() -> lod_ost_alloc_{qos,rr}()
lq_rw_sem / ltd_rw_sem held
-> lod_comp_is_ost_used(..., false)
-> mutex_lock(ldo_layout_mutex)
lod_declare_update_plain() mutex_lock(ldo_layout_mutex)
-> lod_declare_instantiate_components()
-> lod_qos_prep_create(..., true)
-> lod_ost_alloc_qos() down_write(lq_rw_sem)
So ldo_layout_mutex is now above lq_rw_sem on the new paths and below it here. This isn't reachable as a hang today (the MDT holds the layout LDLM lock EX for both entry points on a given object), but it makes the ordering depend on an unrelated lock. Would it be cleaner to have lod_prepare_create() take ldo_layout_mutex too and pass `true` everywhere, so lod_obj_for_each_stripe() never has to acquire it as an inner lock?
Related: the new critical section now spans OST allocation, which includes a `down_write_killable()` with a 2s timer in lod_ost_alloc_qos() and lod_sub_declare_create() on OSP objects, so the per-object layout mutex is held far longer than before.
owner Zhenyu Xu · uploader Zhenyu Xu · PS12 uploaded 112d ago · NEW · open in Gerrit ↗
commit message
LU-18592 lod: protect lod in-memory layout's change The lod::ldo_flr_state is only meaningful for composite layout, while a plain file could get into lod_declare_update_plain()-> lod_declare_update_extents() and bump into this assertion. lod_declare_update_extents() ) ASSERTION(start_index == 0 && max_comp == lo->ldo_comp_cnt) And lod_declare_update_extents() would modify lod's layout, it needs lod_layout_mutex's protection for consistence. Signed-off-by: Bobi Jam <bobijam@whamcloud.com> Change-Id: I2b3d32b32efb88317c124a7975dfd9889333bc8a
59350
master
J !B ✓T ✗1R -1/1−
LU-19037 osc: initialize osc_object::oo_tree
mine enforced failed: review-dne-part-5
1 unresolved
XS +1 −0
89d
LU-19037 osc: initialize osc_object::oo_tree
mine enforced failed: review-dne-part-5
1 unresolved
XS +1 −0
89d
enforced failed: review-dne-part-5
Timothy Day voted -1
1 thread(s) waiting on others
janitor run: 1 failing config(s), none unique to this patch — janitor results
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-5 failed 2× | RHEL 9.5 / x86_64 | ran 5 tests. 1 tests failed: sanityn. | session |
1 optional test failure(s) — informational
build #114129 SUCCESS · tests all Maloo sessions
reviews:
Timothy Day -1
no vote yet: Qian Yingjin, Andreas Dilger, Patrick Farrell
patchsets:
PS5 05-27
PS6 05-27
PS7 06-03
PS8 06-06
PS9 06-10
+4 earlier
PS1 05-21 PS2 05-22 PS3 05-22 PS4 05-22threads: 0 need your reply · 1 waiting on others · 0 own notes · 0 bot
owner Zhenyu Xu · uploader Zhenyu Xu · PS9 uploaded 513d ago · NEW · backport · open in Gerrit ↗
commit message
LU-19037 osc: initialize osc_object::oo_tree Initialize the radix tree of osc_object::oo_tree. Lustre-change: https://review.whamcloud.com/59340 Lustre-commit: 1f4d2013929bd61f775e6c98a4122fe143b4242b Signed-off-by: Bobi Jam <bobijam@whamcloud.com> Reviewed-by: Andreas Dilger <adilger@whamcloud.com> Change-Id: I77a19cb08ccc52f4eb3457cd3367884b84624054
65013
master
J !B ✓T ✓R -1/2−
LU-20066 obdclass: cache obd_name in client_obd
mine needs rebase — checkpatch: cannot be cherry-picked
needs rebase
2 unresolved
S +15 −1
94d
LU-20066 obdclass: cache obd_name in client_obd
mine needs rebase — checkpatch: cannot be cherry-picked
needs rebase
2 unresolved
S +15 −1
94d
needs rebase — checkpatch: cannot be cherry-picked
2 unresolved thread(s) await your reply — last from Andreas Dilger
CI green, no reviews yet — add reviewers
janitor run: 4 failing config(s), none unique to this patch — janitor results
6 optional test failure(s) — informational
build #123263 SUCCESS · tests all Maloo sessions
threads: 2 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Andreas Dilger lustre_osc.h:738 — This could also crash if `cl_obd_name` is not allocated? It would be better to make this a static `char cl_obd_name[OBD_NAME_MAX]` buffer t
Andreas Dilger
This could also crash if `cl_obd_name` is not allocated? It would be better to make this a static `char cl_obd_name[OBD_NAME_MAX]` buffer to avoid that. There are 34 bytes of holes in `struct client_obd` that could be packed a bit better, and this struct is already 3640 bytes in size, so adding a bit more is not _quite_ going to push it over the 4096-byte size.
reply Andreas Dilger ldlm_lib.c:579 — (style) `obd_name` is a fixed-size buffer, why not use the same instead of allocating a separate buffer? Otherwise, it seems possible that
Andreas Dilger
(style) `obd_name` is a fixed-size buffer, why not use the same instead of allocating a separate buffer? Otherwise, it seems possible that the import is accessed without `cl_obd_name` being allocated and *that* will crash...
owner Zhenyu Xu · uploader Zhenyu Xu · PS1 uploaded 218d ago · NEW · open in Gerrit ↗
commit message
LU-20066 obdclass: cache obd_name in client_obd client_obd's cli_import could be freed when the obd is being cleaned up, while in shrinker, we need to print the obd_name, which could cause use after free. This patch adds a new field cli_obd_name to cache the obd_name to avoid use after free. Signed-off-by: Bobi Jam <bobijam@whamcloud.com> Change-Id: Ic0434b9facd5eb2ef4f5df56c871ea6c4d0d8dc1
58276
master
J ✓B ✓T ✓R -1/2−
LU-17771 debug: getstripe -r to recursively getstripe
mine needs rebase — checkpatch: cannot be cherry-picked
needs rebase
stalled 372d
2 unresolved
S +13 −12
372d
LU-17771 debug: getstripe -r to recursively getstripe
mine needs rebase — checkpatch: cannot be cherry-picked
needs rebase
stalled 372d
2 unresolved
S +13 −12
372d
needs rebase — checkpatch: cannot be cherry-picked
2 unresolved thread(s) await your reply — last from Arshad Hussain
CI green — no vote yet from Andreas Dilger
1 optional test failure(s) — informational
build #116925 SUCCESS · tests all Maloo sessions
no vote yet: Andreas Dilger
patchsets:
PS1 03-03
PS2 09-24 Arshad Hussain
PS3 09-24 Arshad Hussain
PS4 09-25 Arshad Hussain
threads: 2 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Arshad Hussain sanity.sh:7759 — We should check for error here '... || error "nnn"'
Arshad Hussain
We should check for error here '... || error "nnn"'
reply Arshad Hussain sanity.sh:7767 — This change is correct.
Arshad Hussain
This change is correct.
owner Zhenyu Xu · uploader Arshad Hussain · PS4 uploaded 406d ago · NEW · open in Gerrit ↗
commit message
LU-17771 debug: getstripe -r to recursively getstripe '-r' is the correct option to recursively get the stripe information under a directory. '-R' is for printing layout information without substituting the filesystem's default values for unspecified fields. Test-Parameters: trivial testlist=sanity env=ONLY=56s, ONLY_REPEAT=100 Signed-off-by: Bobi Jam <bobijam@whamcloud.com> Change-Id: Ib6ef3ddb431e5f33a070c6ea435b7821b8fabb9d
55547
master
J ✓B ✓T ✓R 0/2
LU-17981 test: replay-single/test_46 ineffective
mine 1 unresolved thread(s) await your reply — last from Andreas Dilger
stalled 384d
1 unresolved
XS +1 −1
384d
LU-17981 test: replay-single/test_46 ineffective
mine 1 unresolved thread(s) await your reply — last from Andreas Dilger
stalled 384d
1 unresolved
XS +1 −1
384d
1 unresolved thread(s) await your reply — last from Andreas Dilger
CI green — no vote yet from Andreas Dilger
build #108438 SUCCESS · tests all Maloo sessions
no vote yet: Andreas Dilger
patchsets:
PS1 06-27
PS2 09-11
PS3 10-22 Andreas Dilger
threads: 1 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Andreas Dilger replay-single.sh:1083 — (minor) it would be better to confirm that "FID" had something in it? Otherwise the "grep didn't find anything" is too easily broken.
Andreas Dilger
(minor) it would be better to confirm that "FID" had something in it? Otherwise the "grep didn't find anything" is too easily broken. Also, add a comment in the code where this "force closing file handle" message is printed to ensure it is not changed.
owner Zhenyu Xu · uploader Andreas Dilger · PS3 uploaded 743d ago · NEW · open in Gerrit ↗
commit message
LU-17981 test: replay-single/test_46 ineffective
Should pass path of the test file to "lfs path2fid" to make it
an effective test.
Fixes: c0fa0ba4a8 ("LU-12368 ptlrpc: make DEBUG_REQ messages consistent")
Test-Parameters: trivial testlist=replay-single env=ONLY=46
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: I8f7de367aee356e3d7db97f57a130c9b004f2942
54528
master
J !B ✓T ✗2R -1/2−
LU-17663 osc: extent find only care for write
mine enforced failed: review-ldiskfs
stalled 457d
S +4 −29
457d
LU-17663 osc: extent find only care for write
mine enforced failed: review-ldiskfs
stalled 457d
S +4 −29
457d
enforced failed: review-ldiskfs
Alexey Lyashkov voted -1
janitor run: 1 failing config(s), none unique to this patch — janitor results
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-ldiskfs | RHEL 8.9 / x86_64, RHEL 9.3 / x86_64 | ran 5 tests. 1 tests failed: sanity. | session |
| review-ldiskfs | RHEL 9.3 / x86_64 | ran 5 tests. 1 tests failed: sanity. | session |
2 optional test failure(s) — informational
build #108831 SUCCESS · tests all Maloo sessions
reviews:
Alexey Lyashkov -1
no vote yet: Qian Yingjin, Andreas Dilger, Patrick Farrell
patchsets:
PS1 03-22
PS2 07-31
PS3 09-18
PS4 11-05
owner Zhenyu Xu · uploader Zhenyu Xu · PS4 uploaded 729d ago · NEW · open in Gerrit ↗
commit message
LU-17663 osc: extent find only care for write
Don't use read lock in extent, read with different regions have
different compatible read locks.
Fixes: 67aca1fcc6 ("LU-16160 osc: take ldlm lock when queue sync pages")
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: Iceb05eb22744debc2e8122ef3ee451d149d79195
55918
master
J ✗1B ✓T …R 0/2
LU-17993 debug: to reveal page count issue
mine janitor: 1 test failure unique to this patch — sanity2@ldiskfs+DNE:test_398c
1 unique failure
stalled 457d
8 unresolved
M +79 −3
457d
LU-17993 debug: to reveal page count issue
mine janitor: 1 test failure unique to this patch — sanity2@ldiskfs+DNE:test_398c
1 unique failure
stalled 457d
8 unresolved
M +79 −3
457d
janitor: 1 test failure unique to this patch — sanity2@ldiskfs+DNE:test_398c
5 unresolved thread(s) await your reply — last from Oleg Drokin
build OK — testing in progress (typically 6–14h)
janitor flagged test failures unique to this patch — full janitor results
| unique failing test | history |
|---|---|
| sanity2@ldiskfs+DNE:test_398c | seen in 1 other review |
no vote yet: Qian Yingjin, Shaun Tancheff, Hongchao Zhang, Patrick Farrell
patchsets:
PS18 09-09 Hongchao Zhang
PS19 09-10 Hongchao Zhang
PS20 09-10 Hongchao Zhang
PS21 09-11 Hongchao Zhang
PS22 09-12 Hongchao Zhang
+17 earlier
PS1 08-02 PS2 08-05 PS3 08-07 PS4 08-08 PS5 08-29 Hongchao Zhang PS6 08-30 Hongchao Zhang PS7 08-30 Hongchao Zhang PS8 09-01 Hongchao Zhang PS9 09-02 Hongchao Zhang PS10 09-03 Hongchao Zhang PS11 09-03 Hongchao Zhang PS12 09-04 Hongchao Zhang PS13 09-04 Hongchao Zhang PS14 09-05 Hongchao Zhang PS15 09-05 Hongchao Zhang PS16 09-05 Hongchao Zhang PS17 09-09 Hongchao Zhangthreads: 5 need your reply · 0 waiting on others · 3 own notes · 0 bot
reply Oleg Drokin COMMIT_MSG:12 — since it looks like this patch will get refreshed eventually, please also fix this typo -> divide.
Oleg Drokin
since it looks like this patch will get refreshed eventually, please also fix this typo -> divide.
reply Shaun Tancheff file.c:2184 — truncate
Shaun Tancheff
truncate
note Zhenyu Xu rw26.c:387 — I have a doubt here, if the start of the 1st page is not page aligned, since @to most of time is PAGE_SIZE, so at each loop, the page is alw
Zhenyu Xu
I have a doubt here, if the start of the 1st page is not page aligned, since @to most of time is PAGE_SIZE, so at each loop, the page is always not page aligned as well, is it a glitch here?
Should @to be like this:
if (from != 0)
to = min(PAGE_SIZE - from, from + size);
else
to = min(PAGE, from + size);
and except the 1st/last page, all pages in the middle should always be aligned full page.
reply Shaun Tancheff rw26.c:386 — No changes here, code is correct as is.
Shaun Tancheff
No changes here, code is correct as is.
reply Patrick Farrell rw26.c:388 — Thanks, I can't reproduce that bug locally...
Patrick Farrell
Hmm, this looks correct - good catch... But it's blowing up, so probably something wrong I don't see.
Patrick Farrell
Wait, no. If from != 0, to is still "from + size". To is always from + size, except when it's outside of the page, in which case it's end-of-page/PAGE_SIZE.
Zhenyu Xu
right, I was wrong here.
Zhenyu Xu
I'm still investigating why visited page count does not match pv->ldp_count
Patrick Farrell
Thanks, I can't reproduce that bug locally...
note Zhenyu Xu cl_io.c:1383 — from here we can see that the end of the 1st page is page aligned.
Zhenyu Xu
from here we can see that the end of the 1st page is page aligned.
note Zhenyu Xu cl_io.c:1387 — and the end of the last page could be page unaligned.
Zhenyu Xu
and the end of the last page could be page unaligned.
reply Andreas Dilger sanity.sh:14393 — More importantly, for older servers the unaligned DIO should be handled gracefully in some manner, since applications running on newer clien
Shaun Tancheff
Can we do: unaligned_dio || skip "Need unaligned dio support" Instead of server version check?
Andreas Dilger
More importantly, for older servers the unaligned DIO should be handled gracefully in some manner, since applications running on newer clients will try this and we shouldn't allow them to crash the servers. Just skipping the test doesn't solve the interop problem. One option for UDIO is to expose the DIO alignment via statx, as XFS does. That will allow userspace applications to know what the DIO alignment requirements are, and applications that don't follow them can return EIO or other error directly (as they did befoer UDIO existed, instead of trying to emulate their way through the issues.
owner Zhenyu Xu · uploader Hongchao Zhang · PS22 uploaded 784d ago · NEW · open in Gerrit ↗
commit message
LU-17993 debug: to reveal page count issue as title Test-Parameters: fortestonly Test-Parameters: testlist=sanity env=ONLY=119h,ONLY_REPEAT=500 clientdistro=el8.8 serverdistro=el8.8 Signed-off-by: Hongchao Zhang <hongchao@whamcloud.com> Change-Id: Ia502400fb20603c369c34a3fb397a472cc3403c3
4954
master
J –B ✓T ✓R +1/2−
LU-2468 ldlm: shrinker path should not allocate memory
mine Oleg Drokin voted -1
stalled 457d
XS +1 −1
457d
LU-2468 ldlm: shrinker path should not allocate memory
mine Oleg Drokin voted -1
stalled 457d
XS +1 −1
457d
build #11747 SUCCESS
reviews:
Niu Yawei +1 · Oleg Drokin -1 · Fan Yong +1
no vote yet: Commit Reviewer
owner Zhenyu Xu · uploader Zhenyu Xu · PS2 uploaded 5051d ago · NEW · open in Gerrit ↗
commit message
LU-2468 ldlm: shrinker path should not allocate memory Found a glitch along the ldlm_shrink path, ldlm_pool_shrink()-> ldlm_cli_pool_shrink()-> ldlm_cancel_lru(ns, nr, LDLM_ASYNC, LDLM_CANCEL_SHRINK)-> ldlm_bl_to_thread_list(ns, NULL, &cancels, nr, LDLM_ASYNC)-> ldlm_bl_to_thread(ns, NULL, cancels, nr, LDLM_ASYNC)-> OBD_ALLOC(blwi, sizeof(*blwi)) Shrinker path should not allocate memory again. Signed-off-by: Bobi Jam <bobijam.xu@intel.com> Change-Id: I91a451303e636b94e74829a97e8c8305a95cfc9b
13042
master
J –B ✓T ✗0R +1/2
LU-5869 osc: handle ldlm_handle2lock() static analysis issue
mine Maloo voted -1 — tests failed (details on the change)
stalled 457d
XS +7 −0
457d
LU-5869 osc: handle ldlm_handle2lock() static analysis issue
mine Maloo voted -1 — tests failed (details on the change)
stalled 457d
XS +7 −0
457d
reviews:
Dmitry Eremin +1
owner Zhenyu Xu · uploader Zhenyu Xu · PS2 uploaded 4133d ago · NEW · open in Gerrit ↗
commit message
LU-5869 osc: handle ldlm_handle2lock() static analysis issue Even though ldlm_handle2lock() may return NULL, but ldlm_lock_match() will add a reference on the matched lock, we add an error path to handle this case. Signed-off-by: Bobi Jam <bobijam.xu@intel.com> Change-Id: I56c72129a2414468ee59320cfc1c29b5a72ce0c3
15390
master
J –B ✓T ✗0R 0/2
LU-4388 test: add sanity test case 118o
mine Maloo voted -1 — tests failed (details on the change)
stalled 457d
S +22 −2
457d
LU-4388 test: add sanity test case 118o
mine Maloo voted -1 — tests failed (details on the change)
stalled 457d
S +22 −2
457d
build #57410 SUCCESS
no vote yet: Jinshan Xiong
owner Zhenyu Xu · uploader Zhenyu Xu · PS2 uploaded 3025d ago · NEW · open in Gerrit ↗
commit message
LU-4388 test: add sanity test case 118o Add a sanity test case 118o to verify fsync issues OST_SYNC. Signed-off-by: Bobi Jam <bobijam@whamcloud.com> Change-Id: I4f40f0853934fd0b3e105efd76f0deeaddecb1af
15856
master
J –B ✓T ✗0R 0/2
LU-6960 utils: erase mgsnode param with tunefs.lustre
mine Maloo voted -1 — tests failed (details on the change)
stalled 457d
M +71 −1
457d
LU-6960 utils: erase mgsnode param with tunefs.lustre
mine Maloo voted -1 — tests failed (details on the change)
stalled 457d
M +71 −1
457d
owner Zhenyu Xu · uploader Zhenyu Xu · PS8 uploaded 3809d ago · NEW · open in Gerrit ↗
commit message
LU-6960 utils: erase mgsnode param with tunefs.lustre When we need to change MGS node, "tunefs.lustre --mgsnode" would only append to existing mgsnode params. This patch add a "--erase-mgsnode" parameter to wipe existing mgsnode and append mgsnode parameters afterwards. Signed-off-by: Bobi Jam <bobijam.xu@intel.com> Change-Id: I90799a0338e9f4a5f2a606388ea3dd0384ae703f
30928
master
J –B ✓T ✓R +0/2−
LU-10502 utils: redefine progname in lfs.c
reviewing Jian Yu · John Hammond voted -1
stalled 457d
L +353 −343
457d
LU-10502 utils: redefine progname in lfs.c
reviewing Jian Yu · John Hammond voted -1
stalled 457d
L +353 −343
457d
reviews:
Andreas Dilger +1 · John Hammond -1
no vote yet: Jinshan Xiong
owner Jian Yu · uploader Jian Yu · PS13 uploaded 3106d ago · NEW · open in Gerrit ↗
commit message
LU-10502 utils: redefine progname in lfs.c This patch redefines progname in lfs.c to fix the issue of address of a local variable is returned through global variable. The patch also standardizes some error messages in lfs.c to remove argv[0] because progname already contains the sub-command name. Change-Id: I3adf824dc3b27fbc7e90e94b5163137017baae31 Signed-off-by: Bobi Jam <bobijam.xu@intel.com> Signed-off-by: Jian Yu <jian.yu@intel.com>
32789
master
J –B ✗T –R +0/2−
LU-11118 llite: restrain initial read-ahead window length
mine build failure (#57148)
stalled 457d
S +11 −9
457d
LU-11118 llite: restrain initial read-ahead window length
mine build failure (#57148)
stalled 457d
S +11 −9
457d
build failure (#57148)
Andreas Dilger voted -1
build #57148 FAILURE
reviews:
Patrick Farrell +1 · Andreas Dilger -1
no vote yet: Rahul Deshmukh
owner Zhenyu Xu · uploader Zhenyu Xu · PS3 uploaded 3038d ago · NEW · open in Gerrit ↗
commit message
LU-11118 llite: restrain initial read-ahead window length Restrain the initial read-ahead window length to a reasonable value, no more than the file's size. Signed-off-by: Bobi Jam <bobijam@whamcloud.com> Change-Id: Ib0b5d62e57d847f36912020c8089b7b53ab7d618
33556
master
J !B ✓T ✗1R +1/2
LU-11600 obd: refactor cl_loi_list_lock
mine enforced failed: review-dne-zfs-part-1
stalled 457d
M +114 −105
457d
LU-11600 obd: refactor cl_loi_list_lock
mine enforced failed: review-dne-zfs-part-1
stalled 457d
M +114 −105
457d
janitor run: 1 failing config(s), none unique to this patch — janitor results
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-zfs-part-1 | RHEL 8.7/x86_64 | ran 4 tests. 1 tests failed: sanity. | session |
1 optional test failure(s) — informational
build #96060 SUCCESS · tests all Maloo sessions
reviews:
Andreas Dilger +1
no vote yet: Qian Yingjin, Shuichi Ihara, Neil Brown, Li Dongyang, Patrick Farrell, Sergey Cheremencev
patchsets:
PS4 11-15
PS5 11-16
PS6 11-30
PS7 07-04
owner Zhenyu Xu · uploader Zhenyu Xu · PS7 uploaded 1219d ago · NEW · open in Gerrit ↗
commit message
LU-11600 obd: refactor cl_loi_list_lock client_obd::cl_loi_list_lock is likely getting quite hot in the IO path. This patch split it into another client_obd::cl_grant_lock to protect the OSC grant counters for the small window where they are modified. Change-Id: I05573baeeaa9e400963ffd528df118bb67ae381c Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
49164
master
J !B ✓T ✗1R -1/2−
LU-16315 llite: invoke sync after write for synchorous write
mine enforced failed: review-zfs
stalled 457d
3 unresolved
M +89 −10
457d
LU-16315 llite: invoke sync after write for synchorous write
mine enforced failed: review-zfs
stalled 457d
3 unresolved
M +89 −10
457d
enforced failed: review-zfs
Li Xi voted -1
2 unresolved thread(s) await your reply — last from Li Xi
1 thread(s) waiting on others
janitor run: 3 failing config(s), none unique to this patch — janitor results
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-zfs | CentOS 8.5/x86_64 | ran 10 tests. 1 tests failed: replay-single. | session |
2 optional test failure(s) — informational
build #90835 SUCCESS · tests all Maloo sessions
reviews:
Li Xi -1
no vote yet: Qian Yingjin
patchsets:
PS4 11-17
PS5 11-17
PS6 11-17
PS7 11-17
PS8 11-24
+3 earlier
PS1 11-15 PS2 11-16 PS3 11-16threads: 2 need your reply · 1 waiting on others · 0 own notes · 0 bot
reply Li Xi COMMIT_MSG:9 — typo: write -> write
Li Xi
typo: write -> write
reply Li Xi sanity-pfl.sh:2518 — Will this "wait" for all dd to finish?
Li Xi
Will this "wait" for all dd to finish? As far as I tested, even dd blocked, wait will return without any problem. I think checking "ps aux | grep dd | grep oflag=sync | wc -l" would be better. And it is necessary to repeat this test for several times. This test can pass for several times (~3) sometimes, but repeating will always hit the stuck.
owner Zhenyu Xu · uploader Zhenyu Xu · PS8 uploaded 1442d ago · NEW · open in Gerrit ↗
commit message
LU-16315 llite: invoke sync after write for synchorous write
A sync write need perform sync after the wrile, while we shouldn't
start an nested clio in another one (they share the same clio
environment while the nested clio would be reset). And a deadlock
could be ensued as following call traces show:
thread1:
======================================================================
ll_layout_refresh+0x1b2/0x9c0 [lustre] // waiting for the update of
// the layout after ll_fsync
vvp_io_init+0x23f/0x3a0 [lustre]
cl_io_init0.isra.13+0xa8/0x170 [obdclass]
cl_sync_file_range+0x206/0x340 [lustre]
ll_fsync+0x57c/0x5e0 [lustre]
generic_write_sync+0x4f/0x70
vvp_io_write_start+0x8a6/0x1000 [lustre]
cl_io_start+0x75/0x130 [obdclass]
cl_io_loop+0xd4/0x1f0 [obdclass]
ll_file_io_generic+0x685/0xc70 [lustre]
ll_file_aio_write+0x308/0x470 [lustre]
ll_file_write+0xe3/0x1d0 [lustre]
vfs_write+0xc0/0x1f0
SyS_pwrite64+0x92/0xc0
system_call_fastpath+0x25/0x2a
======================================================================
thread2:
======================================================================
lov_layout_wait.isra.35+0x14a/0x260 [lov] // waiting for thread2 to be
// the only active IO upon
// the file, while thread1
// is working on the file
// at the same time
lov_conf_set+0x1b0/0xb30 [lov]
cl_conf_set+0x7c/0x150 [obdclass]
ll_layout_conf+0x82/0x420 [lustre]
ll_layout_refresh+0x7bf/0x9c0 [lustre]
vvp_io_init+0x23f/0x3a0 [lustre]
cl_io_init0.isra.13+0xa8/0x170 [obdclass]
cl_io_init+0x41/0x90 [obdclass]
cl_io_rw_init+0x113/0x220 [obdclass]
ll_file_io_generic+0x2e5/0xc70 [lustre]
ll_file_aio_write+0x308/0x470 [lustre]
ll_file_write+0xe3/0x1d0 [lustre]
vfs_write+0xc0/0x1f0
SyS_pwrite64+0x92/0xc0
system_call_fastpath+0x25/0x2a
======================================================================
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: Icac5296a269d7e428d2b934973ac2b80651e20fc
50310
master
J !B ✓T ✗2R 0/2
LU-14765 llite: update inode's block numbers in mirror split
mine enforced failed: review-dne-selinux-ssk-part-1, review-dne-selinux-ssk-part-2
stalled 457d
S +16 −8
457d
LU-14765 llite: update inode's block numbers in mirror split
mine enforced failed: review-dne-selinux-ssk-part-1, review-dne-selinux-ssk-part-2
stalled 457d
S +16 −8
457d
janitor run: 2 failing config(s), none unique to this patch — janitor results
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-selinux-ssk-part-1 | RHEL 8.8/x86_64 | ran 3 tests. 1 tests failed: sanity. | session |
| review-dne-selinux-ssk-part-2 | RHEL 8.8/x86_64 | ran 5 tests. 1 tests failed: sanity-sec. | session |
build #100507 SUCCESS · tests all Maloo sessions
no vote yet: Etienne AUJAMES, Andreas Dilger, Alex Zhuravlev
patchsets:
PS6 04-13
PS7 04-14
PS8 06-02
PS9 06-13 Andreas Dilger
PS10 11-26 Andreas Dilger
+5 earlier
PS1 03-16 PS2 03-16 PS3 03-16 PS4 03-16 PS5 03-31owner Zhenyu Xu · uploader Andreas Dilger · PS10 uploaded 1075d ago · NEW · open in Gerrit ↗
commit message
LU-14765 llite: update inode's block numbers in mirror split
In mirror split, MDT cannot know the exact number of blocks to be
freed, so it changes the SOM flag as SOM_FL_LAZY (0x4), this patch
adds a stat operation in llite when MDT has finished the mirror split
to fetch the inode's correct block numbers from all of its stripes.
This is sent to the MDS later on close and stored in LSOM xattr.
Fixes: a30750ad2c ("LU-14526 flr: mirror split downgrade SOM")
Test-Parameters: testlist=sanity-flr env=ONLY=44c,ONLY_REPEAT=100
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: Id9c0108e2cd230f3e68f97f06f3c08579930fd3c
39411
master
J !B ✓T ✗6R +2/2
LU-13794 util: changing comp-flags get stuck when OST is down
mine enforced failed: review-dne-part-1, review-dne-part-4, review-dne-zfs-part-1, review-dne-zfs-part-2, review-dne-zfs-part-4, review-zfs
stalled 464d
XS +0 −8
464d
LU-13794 util: changing comp-flags get stuck when OST is down
mine enforced failed: review-dne-part-1, review-dne-part-4, review-dne-zfs-part-1, review-dne-zfs-part-2, review-dne-zfs-part-4, review-zfs
stalled 464d
XS +0 −8
464d
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-1 | CentOS 7.0/x86_64 | ran 6 tests. 1 tests failed: sanityn. | session |
| review-dne-part-4 | RHEL 7.8/x86_64 | ran 10 tests. 1 tests failed: replay-single. | session |
| review-dne-zfs-part-1 | CentOS 7.0/x86_64 | ran 8 tests. 2 tests failed: sanityn, sanity. | session |
| review-dne-zfs-part-2 | CentOS 7.0/x86_64 | ran 11 tests. 1 tests failed: sanity-hsm. | session |
| review-dne-zfs-part-4 | RHEL 7.8/x86_64 | ran 10 tests. 1 tests failed: replay-single. | session |
| review-zfs crashed | RHEL 7.8/x86_64 | ran 10 tests. 1 tests failed: sanity-quota. %% THIS TEST SESSION CRASHED %% | session |
2 optional test failure(s) — informational
build #15730 SUCCESS
reviews:
Andreas Dilger +1 · Li Dongyang +1
owner Zhenyu Xu · uploader Zhenyu Xu · PS1 uploaded 2302d ago · NEW · open in Gerrit ↗
commit message
LU-13794 util: changing comp-flags get stuck when OST is down In scenario of trying to write a FLR file when a mirror is unavailable because some OST(s) serving the mirror is unavailable at the time, admin could set preferred mirror for the write choosing another healthy mirror. While the preference setting api llapi_layout_file_comp_set() is trying to flush data before setting the preference flag of the file's layout, the flush would trip over the unavailable OST(s) and hung the setting. Flushing data is not a necessary procedure in the component flag setting. Signed-off-by: Bobi Jam <bobijam@whamcloud.com> Change-Id: Id20a21dc693b6662df7773158c76f093f36ef9aa
40483
master
J ✗4B ✓T ✗6R +1/2
LU-14096 llog: proper release dt_object in llog_open_create()
mine janitor: 4 test failures unique to this patch — ost-pools@ldiskfs+DNE:test_15, ost-pools@ldiskfs+DNE:test_20, recovery-small@ldiskfs+DNE:test_18c +1 more
4 unique failures
stalled 464d
XS +1 −1
464d
LU-14096 llog: proper release dt_object in llog_open_create()
mine janitor: 4 test failures unique to this patch — ost-pools@ldiskfs+DNE:test_15, ost-pools@ldiskfs+DNE:test_20, recovery-small@ldiskfs+DNE:test_18c +1 more
4 unique failures
stalled 464d
XS +1 −1
464d
janitor: 4 test failures unique to this patch — ost-pools@ldiskfs+DNE:test_15, ost-pools@ldiskfs+DNE:test_20, recovery-small@ldiskfs+DNE:test_18c +1 more
enforced failed: review-dne-part-2, review-dne-part-3, review-dne-zfs-part-1, review-dne-zfs-part-2, review-dne-zfs-part-5, review-ldiskfs-arm
janitor flagged test failures unique to this patch — full janitor results
| unique failing test | history |
|---|---|
| ost-pools@ldiskfs+DNE:test_15 | seen in 11 other reviews |
| ost-pools@ldiskfs+DNE:test_20 | seen in 13 other reviews |
| recovery-small@ldiskfs+DNE:test_18c | seen in 4 other reviews |
| sanity2@zfs:test_398g | seen in 29 other reviews |
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-2 | RHEL 8.6/x86_64 | ran 9 tests. 1 tests failed: replay-dual. | session |
| review-dne-part-3 | RHEL 8.6/x86_64 | ran 3 tests. 1 tests failed: conf-sanity. | session |
| review-dne-zfs-part-1 | CentOS 8.5/x86_64 | ran 6 tests. 1 tests failed: sanity. | session |
| review-dne-zfs-part-2 | CentOS 8.5/x86_64 | ran 7 tests. 1 tests failed: replay-dual. | session |
| review-dne-zfs-part-5 | CentOS 8.5/x86_64 | ran 6 tests. 2 tests failed: sanityn, recovery-small. | session |
| review-ldiskfs-arm | RHEL 8.6/aarch64, RHEL 8.6/x86_64 | ran 6 tests. 1 tests failed: sanity-lnet. | session |
3 optional test failure(s) — informational
build #89881 SUCCESS · tests all Maloo sessions
reviews:
Arshad Hussain +1
no vote yet: Andreas Dilger
owner Zhenyu Xu · uploader Andreas Dilger · PS2 uploaded 1489d ago · NEW · open in Gerrit ↗
commit message
LU-14096 llog: proper release dt_object in llog_open_create() In the rare case when the device is set rdonly, llog_open_create() need to release the just opened llog_handle. Signed-off-by: Bobi Jam <bobijam@whamcloud.com> Change-Id: I3fe61a2ab0cc50f5336d04d8ee00d5280315aa7c
Mentions
0 waiting on you · 0 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.
No unanswered pings — nobody is waiting on a mention.
1 watched
69675
master
J –B ✓T ✗1R 0/2
LU-19344 llite: report EOF for read racing local append
mine enforced failed: review-dne-selinux-ssk-part-2
pw_haltpw_shepherd
16 unresolved
M +117 −0
1d
LU-19344 llite: report EOF for read racing local append
mine enforced failed: review-dne-selinux-ssk-part-2
pw_haltpw_shepherd
16 unresolved
M +117 −0
1d
enforced failed: review-dne-selinux-ssk-part-2
12 unresolved thread(s) await your reply — last from Gerrit AI review for Lustre
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-selinux-ssk-part-2 failed 4× | RHEL 8.10 / x86_64 | ran 7 tests. 1 tests failed: sanity-sec. | session |
build #134364 SUCCESS · tests all Maloo sessions
no vote yet: Alexey Lyashkov, Vitaly Fertman
patchsets:
PS1 10-14
PS2 10-23 Alexey Lyashkov
PS3 10-23 Alexey Lyashkov
PS4 10-23 Alexey Lyashkov
threads: 12 need your reply · 0 waiting on others · 4 own notes · 0 bot
reply Gerrit AI review for Lustre COMMIT_MSG:36 — (suggestion) LU-19344 is about the cached-read cost of file_read_confine_iter(), and 240cad9a0a quoted a 20-30% regression on 8k cached read
Gerrit AI review for Lustre
(suggestion) LU-19344 is about the cached-read cost of file_read_confine_iter(), and 240cad9a0a quoted a 20-30% regression on 8k cached reads. Since this patch brings the confinement back, and also moves cl_env_get() back in front of the cache read path, could the message include before/after numbers for that workload?
reply Gerrit AI review for Lustre COMMIT_MSG:43 — (minor) This list of what the CIT_MISC cl_io_init()/cl_io_fini() pair adds seems incomplete. For a CIT_MISC io without ci_ignore_layout, lov
Gerrit AI review for Lustre
(minor) This list of what the CIT_MISC cl_io_init()/cl_io_fini() pair adds seems incomplete. For a CIT_MISC io without ci_ignore_layout, lov_io_init_composite()/lov_io_init_empty() also do atomic_inc(&lov->lo_active_ios), and lov_io_fini() drops it. That pin is what keeps lov_conf_set() from running lov_layout_change() while the attributes are being read (see the inline comment in file_read_confine_iter()). Could the message mention this?
reply Gerrit AI review for Lustre COMMIT_MSG:56 — (minor) vvp_env_new_attr() already does memset(attr, 0, sizeof(*attr)) on the thread's shared cl_attr, so cat_kms is already 0 before the lo
Gerrit AI review for Lustre
(minor) vvp_env_new_attr() already does memset(attr, 0, sizeof(*attr)) on the thread's shared cl_attr, so cat_kms is already 0 before the lookup. This rationale doesn't seem to hold. If the patch is refreshed, the bullet (and the explicit assignment) could be dropped.
reply Gerrit AI review for Lustre COMMIT_MSG:16 — (minor) "bumped around a write by this client that publishes a larger size" doesn't seem to cover every such write. O_DIRECT writes never qu
Gerrit AI review for Lustre
(minor) "bumped around a write by this client that publishes a larger size" doesn't seem to cover every such write. O_DIRECT writes never queue pages, so vvp_io_write_commit() returns at `npages == 0` before either bump. Large buffered writes that do_file_write_iter() switches to DIO via ll_hybrid_bio_dio_switch_check() take the same path. So whether a racing reader at EOF gets EOF or the appended data depends on the write size. fallocate() and truncate-up don't bump either. If that's intended, could the message say which writes are covered? The counter also moves on every buffered commit, including overwrites that don't change the size, not only on writes that publish a larger size.
reply Gerrit AI review for Lustre COMMIT_MSG:32 — (minor) If this is a fix, the behaviour it restores was removed by 240cad9a0a, which also dropped the original 251b with the rationale that
Gerrit AI review for Lustre
(minor) If this is a fix, the behaviour it restores was removed by 240cad9a0a, which also dropped the original 251b with the rationale that "The read after the write should never return an end-of-file (EOF)". Should the message carry
Fixes: 240cad9a0a ("LU-19344 llite: set read size correctly")
and explain why that rationale no longer holds?
reply Gerrit AI review for Lustre file.c:2537 — (minor) attr comes from vvp_env_new_attr(), which already zeroes the whole struct, so this assignment is redundant.
Gerrit AI review for Lustre
(minor) attr comes from vvp_env_new_attr(), which already zeroes the whole struct, so this assignment is redundant.
reply Gerrit AI review for Lustre file.c:2539 — (defect) Without the CIT_MISC io, what keeps the layout stable while this runs? lov_attr_get() uses LOV_2DISPATCH_NOLOCK and says "Layout is
Gerrit AI review for Lustre
(defect) Without the CIT_MISC io, what keeps the layout stable while this runs? lov_attr_get() uses LOV_2DISPATCH_NOLOCK and says "Layout is protected from changing by ongoing IO". Nothing on this path holds lo_type_guard or raises lo_active_ios, and the ll_layout_version_get() check above is only a snapshot.
A possible race on one client:
T1: read() -> file_read_confine_iter() -> cl_object_attr_get()
-> lov_attr_get_composite() walking lo_entries / lo_lsm
T2: layout lock revoked (e.g. PFL instantiation from another node),
then stat/write -> ll_layout_refresh() -> lov_conf_set():
lo_active_ios == 0 -> lov_layout_change()
-> lov_fini_composite() frees lo_entries and lo_lsm
lov_layout_change() doesn't take coh_attr_guard, so the spinlock held here doesn't exclude it either. Some existing callers have the same pattern (ll_readahead_handle_work(), ll_merge_attr() on the append path), but the old file_read_confine_iter() was pinned by its CIT_MISC io. This patch puts the unpinned lookup on every read() syscall. Would taking lov_conf_freeze()-style protection, or a lightweight lo_active_ios reference, avoid the race without the full cl_io_init() cost?
note Zhenyu Xu file.c:2347 — The new size becomes visible to a reader here, need to bump the lli_size_gen here. With the ll_file_io_generic() bump in place, the secon
Zhenyu Xu
The new size becomes visible to a reader here, need to bump the lli_size_gen here. With the ll_file_io_generic() bump in place, the second bump in vvp_io_write_commit() (after cl_io_commit_async() ) becomes redundant — the window now closes at ll_merge_attr() .
reply Gerrit AI review for Lustre file.c:2662 — (defect) Can this report EOF for data that was in the file before the read started?
Gerrit AI review for Lustre
(defect) Can this report EOF for data that was in the file before the read started?
`orig_size` is the client's cached i_size, not EOF. Since 240cad9a0a, vvp_prep_size() does `i_size_write(inode, kms)`, and kms can be lower than the real size. lli_size_gen also moves on any buffered commit on this client, including an overwrite that doesn't extend the file. Example:
node B: appends, file grows 1M -> 2M
node A, P1: cat reaches offset 1M (i_size == kms == 1M)
orig_ki_pos >= orig_size, gen == G
vvp_prep_size(): pos > kms -> glimpse -> 2M
copies 1M of node B's data
node A, P2: overwrites offset 0 -> vvp_io_write_commit() -> gen G+2
node A, P1: gen changed -> revert, return 0
cat stops at 1M even though node B's data was there before the read was issued. That contradicts the comment above, which says "A larger size discovered from another node during the read ... is returned normally" (commit message lines 30-31 say the same). Would it be safer to take the EOF baseline from a validated size (a glimpse, or kms under the lock), and to bump the counter only when a commit actually raises kms?
note Zhenyu Xu file.c:2668 — iov_iter_revert(to, result) assumes result is exactly the amount the iter was advanced. For the fast-read path that holds; for ll_file_io
Zhenyu Xu
iov_iter_revert(to, result) assumes result is exactly the amount the iter was advanced. For the fast-read path that holds; for ll_file_io_generic() (which can restart and internally rewind/reexpand the iter) it's less obvious. The code this replaced used the more forgiving iov_iter_truncate(to, 0) , which doesn't need to know the consumed count.
reply Gerrit AI review for Lustre file.c:2742 — (minor) This is bumped only before the write, but the tiny-write size reaches the inode after __generic_file_write_iter(), through ll_merge_
Gerrit AI review for Lustre
(minor) This is bumped only before the write, but the tiny-write size reaches the inode after __generic_file_write_iter(), through ll_merge_attr() below. A reader whose snapshot falls between this increment and ll_merge_attr() sees the new generation with the old i_size, and can then return the appended bytes. vvp_io_write_commit() bumps after the commit to avoid exactly this. Should there be a matching increment after ll_merge_attr() here?
reply Gerrit AI review for Lustre llite_internal.h:256 — (minor) If the patch is refreshed: "similar as i_version" reads oddly ("similar to i_version"?). Also, the counter is bumped on every buffer
Gerrit AI review for Lustre
(minor) If the patch is refreshed: "similar as i_version" reads oddly ("similar to i_version"?). Also, the counter is bumped on every buffered write commit and tiny write, not only on writes that make a larger size visible, so "Bumped around a write ... that makes a larger file size visible" overstates it.
tags: pw_halt pw_shepherd
owner Zhenyu Xu · uploader Alexey Lyashkov · PS4 uploaded 13d ago · NEW · open in Gerrit ↗
commit message
LU-19344 llite: report EOF for read racing local append A read issued at EOF must report EOF even if the file grows while it is in flight. i_size cannot express this: osc_page_touch_at() raises kms and the inode size as soon as the pages enter the cache, so a paused reader resumes with the appended data already visible. A glimpse cannot help either, since the client holding the extent lock owns the kms. Add a per inode counter, lli_size_gen, bumped around a write by this client that publishes a larger size: in vvp_io_write_commit() on both sides of cl_io_commit_async(), which raises kms page by page, and in ll_do_tiny_write(), which can extend the file inside an already dirty page. do_file_read_iter() snapshots i_size and the counter on entry and rechecks at the end; if the read started at or beyond the snapshotted EOF and the counter moved, ki_pos is restored, the iter reverted and 0 returned. The counter is advisory. It is not ordered against the size store and is per inode rather than per range, so it can move for an unrelated local write and a reader can still miss a write committing in the window between the two bumps. The counter moves only for local writes, so a size learned from another node is still returned normally. Signed-off-by: Alexey Lyashkov <alexey.lyashkov@hpe.com> Change-Id: I2f30aa9317dfe6e3f57d3b4a21537217921d9a82
35 open
▶Failed / broken
(20)
69675
master
J –B ✓T ✗1R 0/2
LU-19344 llite: report EOF for read racing local append
enforced failed: review-dne-selinux-ssk-part-2
pw_haltpw_shepherd
16 unresolved
M +117 −0
1d
LU-19344 llite: report EOF for read racing local append
enforced failed: review-dne-selinux-ssk-part-2
pw_haltpw_shepherd
16 unresolved
M +117 −0
1d
enforced failed: review-dne-selinux-ssk-part-2
12 unresolved thread(s) await your reply — last from Gerrit AI review for Lustre
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-selinux-ssk-part-2 failed 4× | RHEL 8.10 / x86_64 | ran 7 tests. 1 tests failed: sanity-sec. | session |
build #134364 SUCCESS · tests all Maloo sessions
no vote yet: Alexey Lyashkov, Vitaly Fertman
patchsets:
PS1 10-14
PS2 10-23 Alexey Lyashkov
PS3 10-23 Alexey Lyashkov
PS4 10-23 Alexey Lyashkov
threads: 12 need your reply · 0 waiting on others · 4 own notes · 0 bot
reply Gerrit AI review for Lustre COMMIT_MSG:36 — (suggestion) LU-19344 is about the cached-read cost of file_read_confine_iter(), and 240cad9a0a quoted a 20-30% regression on 8k cached read
Gerrit AI review for Lustre
(suggestion) LU-19344 is about the cached-read cost of file_read_confine_iter(), and 240cad9a0a quoted a 20-30% regression on 8k cached reads. Since this patch brings the confinement back, and also moves cl_env_get() back in front of the cache read path, could the message include before/after numbers for that workload?
reply Gerrit AI review for Lustre COMMIT_MSG:43 — (minor) This list of what the CIT_MISC cl_io_init()/cl_io_fini() pair adds seems incomplete. For a CIT_MISC io without ci_ignore_layout, lov
Gerrit AI review for Lustre
(minor) This list of what the CIT_MISC cl_io_init()/cl_io_fini() pair adds seems incomplete. For a CIT_MISC io without ci_ignore_layout, lov_io_init_composite()/lov_io_init_empty() also do atomic_inc(&lov->lo_active_ios), and lov_io_fini() drops it. That pin is what keeps lov_conf_set() from running lov_layout_change() while the attributes are being read (see the inline comment in file_read_confine_iter()). Could the message mention this?
reply Gerrit AI review for Lustre COMMIT_MSG:56 — (minor) vvp_env_new_attr() already does memset(attr, 0, sizeof(*attr)) on the thread's shared cl_attr, so cat_kms is already 0 before the lo
Gerrit AI review for Lustre
(minor) vvp_env_new_attr() already does memset(attr, 0, sizeof(*attr)) on the thread's shared cl_attr, so cat_kms is already 0 before the lookup. This rationale doesn't seem to hold. If the patch is refreshed, the bullet (and the explicit assignment) could be dropped.
reply Gerrit AI review for Lustre COMMIT_MSG:16 — (minor) "bumped around a write by this client that publishes a larger size" doesn't seem to cover every such write. O_DIRECT writes never qu
Gerrit AI review for Lustre
(minor) "bumped around a write by this client that publishes a larger size" doesn't seem to cover every such write. O_DIRECT writes never queue pages, so vvp_io_write_commit() returns at `npages == 0` before either bump. Large buffered writes that do_file_write_iter() switches to DIO via ll_hybrid_bio_dio_switch_check() take the same path. So whether a racing reader at EOF gets EOF or the appended data depends on the write size. fallocate() and truncate-up don't bump either. If that's intended, could the message say which writes are covered? The counter also moves on every buffered commit, including overwrites that don't change the size, not only on writes that publish a larger size.
reply Gerrit AI review for Lustre COMMIT_MSG:32 — (minor) If this is a fix, the behaviour it restores was removed by 240cad9a0a, which also dropped the original 251b with the rationale that
Gerrit AI review for Lustre
(minor) If this is a fix, the behaviour it restores was removed by 240cad9a0a, which also dropped the original 251b with the rationale that "The read after the write should never return an end-of-file (EOF)". Should the message carry
Fixes: 240cad9a0a ("LU-19344 llite: set read size correctly")
and explain why that rationale no longer holds?
reply Gerrit AI review for Lustre file.c:2537 — (minor) attr comes from vvp_env_new_attr(), which already zeroes the whole struct, so this assignment is redundant.
Gerrit AI review for Lustre
(minor) attr comes from vvp_env_new_attr(), which already zeroes the whole struct, so this assignment is redundant.
reply Gerrit AI review for Lustre file.c:2539 — (defect) Without the CIT_MISC io, what keeps the layout stable while this runs? lov_attr_get() uses LOV_2DISPATCH_NOLOCK and says "Layout is
Gerrit AI review for Lustre
(defect) Without the CIT_MISC io, what keeps the layout stable while this runs? lov_attr_get() uses LOV_2DISPATCH_NOLOCK and says "Layout is protected from changing by ongoing IO". Nothing on this path holds lo_type_guard or raises lo_active_ios, and the ll_layout_version_get() check above is only a snapshot.
A possible race on one client:
T1: read() -> file_read_confine_iter() -> cl_object_attr_get()
-> lov_attr_get_composite() walking lo_entries / lo_lsm
T2: layout lock revoked (e.g. PFL instantiation from another node),
then stat/write -> ll_layout_refresh() -> lov_conf_set():
lo_active_ios == 0 -> lov_layout_change()
-> lov_fini_composite() frees lo_entries and lo_lsm
lov_layout_change() doesn't take coh_attr_guard, so the spinlock held here doesn't exclude it either. Some existing callers have the same pattern (ll_readahead_handle_work(), ll_merge_attr() on the append path), but the old file_read_confine_iter() was pinned by its CIT_MISC io. This patch puts the unpinned lookup on every read() syscall. Would taking lov_conf_freeze()-style protection, or a lightweight lo_active_ios reference, avoid the race without the full cl_io_init() cost?
note Zhenyu Xu file.c:2347 — The new size becomes visible to a reader here, need to bump the lli_size_gen here. With the ll_file_io_generic() bump in place, the secon
Zhenyu Xu
The new size becomes visible to a reader here, need to bump the lli_size_gen here. With the ll_file_io_generic() bump in place, the second bump in vvp_io_write_commit() (after cl_io_commit_async() ) becomes redundant — the window now closes at ll_merge_attr() .
reply Gerrit AI review for Lustre file.c:2662 — (defect) Can this report EOF for data that was in the file before the read started?
Gerrit AI review for Lustre
(defect) Can this report EOF for data that was in the file before the read started?
`orig_size` is the client's cached i_size, not EOF. Since 240cad9a0a, vvp_prep_size() does `i_size_write(inode, kms)`, and kms can be lower than the real size. lli_size_gen also moves on any buffered commit on this client, including an overwrite that doesn't extend the file. Example:
node B: appends, file grows 1M -> 2M
node A, P1: cat reaches offset 1M (i_size == kms == 1M)
orig_ki_pos >= orig_size, gen == G
vvp_prep_size(): pos > kms -> glimpse -> 2M
copies 1M of node B's data
node A, P2: overwrites offset 0 -> vvp_io_write_commit() -> gen G+2
node A, P1: gen changed -> revert, return 0
cat stops at 1M even though node B's data was there before the read was issued. That contradicts the comment above, which says "A larger size discovered from another node during the read ... is returned normally" (commit message lines 30-31 say the same). Would it be safer to take the EOF baseline from a validated size (a glimpse, or kms under the lock), and to bump the counter only when a commit actually raises kms?
note Zhenyu Xu file.c:2668 — iov_iter_revert(to, result) assumes result is exactly the amount the iter was advanced. For the fast-read path that holds; for ll_file_io
Zhenyu Xu
iov_iter_revert(to, result) assumes result is exactly the amount the iter was advanced. For the fast-read path that holds; for ll_file_io_generic() (which can restart and internally rewind/reexpand the iter) it's less obvious. The code this replaced used the more forgiving iov_iter_truncate(to, 0) , which doesn't need to know the consumed count.
reply Gerrit AI review for Lustre file.c:2742 — (minor) This is bumped only before the write, but the tiny-write size reaches the inode after __generic_file_write_iter(), through ll_merge_
Gerrit AI review for Lustre
(minor) This is bumped only before the write, but the tiny-write size reaches the inode after __generic_file_write_iter(), through ll_merge_attr() below. A reader whose snapshot falls between this increment and ll_merge_attr() sees the new generation with the old i_size, and can then return the appended bytes. vvp_io_write_commit() bumps after the commit to avoid exactly this. Should there be a matching increment after ll_merge_attr() here?
reply Gerrit AI review for Lustre llite_internal.h:256 — (minor) If the patch is refreshed: "similar as i_version" reads oddly ("similar to i_version"?). Also, the counter is bumped on every buffer
Gerrit AI review for Lustre
(minor) If the patch is refreshed: "similar as i_version" reads oddly ("similar to i_version"?). Also, the counter is bumped on every buffered write commit and tiny write, not only on writes that make a larger size visible, so "Bumped around a write ... that makes a larger file size visible" overstates it.
tags: pw_halt pw_shepherd
owner Zhenyu Xu · uploader Alexey Lyashkov · PS4 uploaded 13d ago · NEW · open in Gerrit ↗
commit message
LU-19344 llite: report EOF for read racing local append A read issued at EOF must report EOF even if the file grows while it is in flight. i_size cannot express this: osc_page_touch_at() raises kms and the inode size as soon as the pages enter the cache, so a paused reader resumes with the appended data already visible. A glimpse cannot help either, since the client holding the extent lock owns the kms. Add a per inode counter, lli_size_gen, bumped around a write by this client that publishes a larger size: in vvp_io_write_commit() on both sides of cl_io_commit_async(), which raises kms page by page, and in ll_do_tiny_write(), which can extend the file inside an already dirty page. do_file_read_iter() snapshots i_size and the counter on entry and rechecks at the end; if the read started at or beyond the snapshotted EOF and the counter moved, ki_pos is restored, the iter reverted and 0 returned. The counter is advisory. It is not ordered against the size store and is per inode rather than per range, so it can move for an unrelated local write and a reader can still miss a write committing in the window between the two bumps. The counter moves only for local writes, so a size learned from another node is still returned normally. Signed-off-by: Alexey Lyashkov <alexey.lyashkov@hpe.com> Change-Id: I2f30aa9317dfe6e3f57d3b4a21537217921d9a82
50622
master
J !B ✓T ✗9R +1/2
LU-15834 lfs: mirror extend take current OSTs into account
enforced failed: review-dne-part-4, review-dne-subtest-change, review-dne-zfs-part-4, review-dne-zfs-part-5, review-dne-zfs-subtest-change, review-ldiskfs, review-ldiskfs-ubuntu
pw_shepherd
2 unresolved
L +538 −63
1d
LU-15834 lfs: mirror extend take current OSTs into account
enforced failed: review-dne-part-4, review-dne-subtest-change, review-dne-zfs-part-4, review-dne-zfs-part-5, review-dne-zfs-subtest-change, review-ldiskfs, review-ldiskfs-ubuntu
pw_shepherd
2 unresolved
L +538 −63
1d
enforced failed: review-dne-part-4, review-dne-subtest-change, review-dne-zfs-part-4, review-dne-zfs-part-5, review-dne-zfs-subtest-change, review-ldiskfs, review-ldiskfs-ubuntu
2 unresolved thread(s) await your reply — last from Ronnie Sahlberg
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: 2 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply 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.
reply 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 567d 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
58291
master
J –B ✓T ✗7R -1/2−
LU-18771 flr: allow merge mirrored layout
needs rebase — checkpatch: cannot be cherry-picked
needs rebase
pw_smallfix
5 unresolved
L +196 −72
1d
LU-18771 flr: allow merge mirrored layout
needs rebase — checkpatch: cannot be cherry-picked
needs rebase
pw_smallfix
5 unresolved
L +196 −72
1d
needs rebase — checkpatch: cannot be cherry-picked
enforced failed: custom-1001, review-dne-part-4, review-dne-zfs-part-4, review-dne-zfs-part-5, review-zfs
5 unresolved thread(s) await your reply — last from patrick bot
| failed enforced test | platform | detail | |
|---|---|---|---|
| custom-1001 | RHEL 9.7 / x86_64 | ran 4 tests. 1 tests failed: sanity-flr. | session |
| review-dne-part-4 | RHEL 9.7 / x86_64 | ran 9 tests. 2 tests failed: sanity-quota, sanity-flr. | session |
| review-dne-part-4 | RHEL 10.1 / x86_64 | ran 9 tests. 2 tests failed: sanity-quota, sanity-flr. | session |
| review-dne-zfs-part-4 | RHEL 9.8 / x86_64 | ran 9 tests. 2 tests failed: sanity-quota, sanity-flr. | session |
| review-dne-zfs-part-4 | RHEL 10.1 / x86_64 | ran 9 tests. 2 tests failed: sanity-quota, sanity-flr. | session |
| review-dne-zfs-part-5 | RHEL 9.7 / x86_64 | ran 5 tests. 1 tests failed: sanityn. | session |
| review-zfs | RHEL 8.10 / x86_64 | ran 8 tests. 2 tests failed: sanity-flr, sanity-quota. | session |
build #134321 SUCCESS · tests all Maloo sessions
no vote yet: Andreas Dilger
patchsets:
PS9 10-14 patrick bot
PS10 10-14 patrick bot
PS11 10-21 patrick bot
PS12 10-21 patrick bot
PS13 10-23 patrick bot
+8 earlier
PS1 03-04 PS2 03-05 PS3 03-06 PS4 03-25 PS5 04-17 PS6 05-05 Andreas Dilger PS7 06-01 PS8 08-12threads: 5 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply patrick bot lod_qos.c:806 — Patrick-Bot: Not changed. Whether the extra retry should apply only to the first component of mirrored layouts, or move to its own change, i
Gerrit AI review for Lustre
(minor) The new clause fires for the first component of every layout, not just mirrors - a plain or default-striped file also has `llc_extent.e_start == 0`. The practical effect shows up with default striping (LOD_USES_DEFAULT_STRIPE), where stripe_count_min is 3/4 of stripe_count: the allocator now escalates to speed 1 and 2 to fill the remaining quarter. At speed 2 lod_check_and_reserve_ost() stops honouring OS_STATFS_DEGRADED and stops calling lod_should_avoid_ost(), so first components can land on degraded OSTs and on OSTs already used by a conflicting mirror component. For an FLR patch that last one seems to work against the goal. Was the intent to limit this to mirrored layouts?
patrick bot
Patrick-Bot: Not changed. Whether the extra retry should apply only to the first component of mirrored layouts, or move to its own change, is a design decision for the patch owner.
reply patrick bot lfs.c:2286 — Patrick-Bot: Done in patchset 10: a failure to get the mirror count now fails the extend. Leaving this thread open for a related problem in
Gerrit AI review for Lustre
(minor) The return value is not checked, and `rc` is overwritten by the migrate_open_files() call below. If llapi_layout_mirror_count_get() ever fails, `mirror_cnt` stays 0 and the multi-mirror handling is silently skipped.
patrick bot
Patrick-Bot: Done in patchset 10: a failure to get the mirror count now fails the extend. Leaving this thread open for a related problem in the same hunk. Clearing resync for a multi-mirror merge makes lfs set LL_LEASE_ALLOW_STALE, and since LU-18746 llite refuses that with EOPNOTSUPP unless the client has llite_enable_flr_ec=1. That parameter defaults to 0. So every extend that adds more than one mirror fails on a default client, as in sanity-flr 0d, 0e, 0f, 0m and 44d on rocky9 ldiskfs. With llite_enable_flr_ec=1 those tests pass. test-framework does not set it either: it sets MODOPTS_LLITE, but load_module reads MODOPTS_LUSTRE for the llite module. How the merge should mark the new mirrors stale without needing FLR EC is for the patch owner to decide.
reply patrick bot lfs.c:2453 — Patrick-Bot: Not changed. Rejecting a mixed list would break sanity-flr test_0d, which runs 'lfs mirror extend -N -S 4M -N -f $tf-2 $tf-1' a
Gerrit AI review for Lustre
(minor) This picks the whole strategy from the first list entry only. Previously each entry was dispatched on its own `m_file`. With `lfs mirror extend -N -f victim -N2 -c1 FILE` the loop now calls mirror_extend_file() for the second entry too, with `victim_file == NULL`, which turns into `open(NULL, ...)` and an EFAULT. The man page does say -f cannot be combined with SETSTRIPE_OPTIONS, but nothing enforces it for extend (mirror_create_sanity_check() is only called from mirror_create()). Should mirror_extend() reject a mixed list up front?
patrick bot
Patrick-Bot: Not changed. Rejecting a mixed list would break sanity-flr test_0d, which runs 'lfs mirror extend -N -S 4M -N -f $tf-2 $tf-1' and expects it to succeed. Handling the -f entries one by one and merging the rest changes the order mirrors are added in, so this is left for the patch owner.
reply Gerrit AI review for Lustre lfs.c:2368 — (minor) When more than one mirror is added, the data is now copied by lfs_mirror_resync_file(). That function always opens the file with O_D
Gerrit AI review for Lustre
(minor) When more than one mirror is added, the data is now copied by lfs_mirror_resync_file(). That function always opens the file with O_DIRECT, so 'lfs mirror extend -D|--non-direct -N2 FILE' silently ignores -D. Before this change, each mirror was copied by migrate_nonblock() on descriptors that migrate_open_files() opened according to LLAPI_MIGRATION_NONDIRECT. The single-mirror path still honours -D, so the option now behaves differently depending on how many mirrors are added. If the patch is refreshed, could migration_flags be passed down to the resync, or could the man page say that -D only applies to single-mirror extends?
reply patrick bot liblustreapi.c:2451 — Patrick-Bot: Not changed. Keeping, splitting out or dropping the hex lcme_id output is for the patch owner to decide. If it stays, the examp
Gerrit AI review for Lustre
(minor) This changes `lfs getstripe` output for every composite file, and it looks unrelated to the mirror-merge work.
A couple of things go stale with it: the worked example in the comment above this function still shows `- lcme_id: 1`, and Documentation/ec.txt shows decimal ids too. Test suites also scrape this field (`awk '/lcme_id/{print $2}'` in sanity-flr.sh and sanity-ec.sh).
If the hex form is wanted, could it go in its own patch together with the doc updates?
patrick bot
Patrick-Bot: Not changed. Keeping, splitting out or dropping the hex lcme_id output is for the patch owner to decide. If it stays, the example in the comment above and Documentation/ec.txt need updating too.
tags: pw_smallfix
owner Zhenyu Xu · uploader patrick bot · PS13 uploaded 13d ago · NEW · open in Gerrit ↗
commit message
LU-18771 flr: allow merge mirrored layout This patch prepares a merge victim llapi_layout to contain all mirrors, and mark them as stale mirrors. On MDS, LOD accepts it for merge. After the stale mirrors have been merged, a resync will update the content into the newly merged mirrors. A victim holding its own EC data/parity pair is refused for now, as renumbering its mirrors would break the links between them. The layout check on the merged victim accepts the nocompr mirror flag, so 'lfs mirror extend -N --flags=nocompr' works. The DoM first component of each merged victim mirror is marked stale, as its data is only in the victim MDT object. Test-Parameters: testlist=sanity-flr,sanity-ec Signed-off-by: Bobi Jam <bobijam@whamcloud.com> Change-Id: I37b8eb18c5b8d3f099bc3d76ed0e4215790f61f0
57083
master
J !B ✓T ✗2R -1/2−
LU-18466 lod: make sure layout gen changed under lock
needs rebase — checkpatch: cannot be cherry-picked
needs rebase
1 unresolved
L +231 −136
4d
LU-18466 lod: make sure layout gen changed under lock
needs rebase — checkpatch: cannot be cherry-picked
needs rebase
1 unresolved
L +231 −136
4d
needs rebase — checkpatch: cannot be cherry-picked
enforced failed: review-dne-part-7, review-dne-zfs-part-7
1 thread(s) waiting on others
janitor run: 2 failing config(s), none unique to this patch — janitor results
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-7 | RHEL 9.5 / x86_64 | ran 5 tests. 1 tests failed: sanity-pcc. | session |
| review-dne-zfs-part-7 | RHEL 8.10 / x86_64 | ran 5 tests. 1 tests failed: sanity-scrub. | session |
build #116939 SUCCESS · tests all Maloo sessions
no vote yet: Qian Yingjin, Lai Siyao, Andreas Dilger, Alex Zhuravlev, Oleg Drokin
patchsets:
PS24 06-30
PS25 07-03
PS26 09-19
PS27 09-19 Janitor Bot
PS28 09-25 Janitor Bot
+23 earlier
PS1 11-20 PS2 11-21 PS3 11-28 PS4 11-28 PS5 11-29 PS6 11-30 PS7 12-05 PS8 12-18 PS9 01-11 PS10 01-11 PS11 03-12 Andreas Dilger PS12 03-13 PS13 03-17 PS14 03-28 PS15 03-29 PS16 04-03 PS17 04-03 PS18 04-09 PS19 04-10 PS20 04-23 PS21 05-09 PS22 05-21 PS23 06-17threads: 0 need your reply · 1 waiting on others · 0 own notes · 0 bot
owner Zhenyu Xu · uploader Janitor Bot · PS28 uploaded 405d ago · NEW · open in Gerrit ↗
commit message
LU-18466 lod: make sure layout gen changed under lock
In transaction declaration phase, LOD layer should not change
lod_layout_gen as there is no object lock protecting it so that
its layout gen can be changed by another transaction.
This patch adds lti_layout_gen_save/lti_layout_gen_dst array to save
the layout gen before/after values, and during the transaction
execution phase with the lod object been protected with
lod_write_lock(), we would check the lod_object's layout gen, if
it keeps its value equals to lti_layout_gen_save, we'd update it to
lti_layout_gen_dst of the lod_object; if it has been changed by
others, we'd return -EAGAIN, so that MDD can retry the transaction.
This patch also fixes a glitch in mdd_xattr_set(), it needs to check
the return code for retry.
Fixes: d5ab62af24 ("LU-17048 mdd: protect layout change in MDD layer")
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: I6e7edabaac8f1d43d799b5ab3e2ec527d152fa55
56847
master
J –B ✓T ✗7R 0/2
LU-18332 lfs: migrate to mirrored file
enforced failed: review-dne-part-3, review-dne-part-4, review-dne-zfs-part-1, review-dne-zfs-part-4, review-zfs
pw_smallfixpw_halt
8 unresolved
M +221 −6
6d
LU-18332 lfs: migrate to mirrored file
enforced failed: review-dne-part-3, review-dne-part-4, review-dne-zfs-part-1, review-dne-zfs-part-4, review-zfs
pw_smallfixpw_halt
8 unresolved
M +221 −6
6d
enforced failed: review-dne-part-3, review-dne-part-4, review-dne-zfs-part-1, review-dne-zfs-part-4, review-zfs
8 unresolved thread(s) await your reply — last from Gerrit AI review for Lustre
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-3 | RHEL 9.8 / x86_64 | ran 3 tests. 1 tests failed: conf-sanity. | session |
| review-dne-part-4 | RHEL 9.7 / x86_64 | ran 9 tests. 2 tests failed: sanity-quota, sanity-flr. | session |
| review-dne-part-4 | RHEL 10.1 / x86_64 | ran 9 tests. 2 tests failed: sanity-quota, sanity-flr. | session |
| review-dne-zfs-part-1 | RHEL 9.8 / x86_64 | ran 3 tests. 1 tests failed: sanity. | session |
| review-dne-zfs-part-4 | RHEL 9.8 / x86_64 | ran 9 tests. 2 tests failed: sanity-quota, sanity-flr. | session |
| review-dne-zfs-part-4 | RHEL 10.1 / x86_64 | ran 9 tests. 2 tests failed: sanity-quota, sanity-flr. | session |
| review-zfs | RHEL 8.10 / x86_64 | ran 8 tests. 2 tests failed: sanity-flr, sanity-quota. | session |
build #133892 SUCCESS · tests all Maloo sessions
no vote yet: Patrick Farrell
patchsets:
PS15 04-17
PS16 08-12
PS17 10-14 patrick bot
PS18 10-16 patrick bot
PS19 10-17 patrick bot
+14 earlier
PS1 11-01 PS2 11-02 PS3 11-02 PS4 02-10 PS5 02-26 PS6 02-26 PS7 02-27 PS8 02-27 PS9 02-28 PS10 03-03 PS11 03-03 PS12 03-04 PS13 03-05 PS14 03-06threads: 8 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Gerrit AI review for Lustre sanity-flr.sh:3434 — (style) Carrying this forward from patchset 6, where it was asked whether these cases should be split into separate 63a/b/c/d subtests. test
Gerrit AI review for Lustre
(style) Carrying this forward from patchset 6, where it was asked whether these cases should be split into separate 63a/b/c/d subtests. test_63 still runs all four migrations in one subtest, so a failure in one hides the others and the cases can't be run on their own.
reply Gerrit AI review for Lustre sanity-flr.sh:3435 — (defect) The test needs two things on the MDS: the mdt_enable_flr_ec module parameter, which came with LU-12187 in 2.17.51, and the stale-mi
Gerrit AI review for Lustre
(defect) The test needs two things on the MDS: the mdt_enable_flr_ec module parameter, which came with LU-12187 in 2.17.51, and the stale-mirror merge support from LU-18771. A 2.16.52-70 gate lets in a released 2.17.0 MDS, which has neither. On that MDS, `cat /sys/module/mdt/parameters/mdt_enable_flr_ec` fails and the test errors out with "cannot read FLR_EC setting" instead of skipping. Should the gate use the 3-component version that includes LU-18771? The skip message should then say why the version is needed, e.g. "need MDS with stale mirror merge support".
reply Gerrit AI review for Lustre lfs.c:3392 — (style) This isn't a bug, but several err_str values here end in "\n" (this one, plus "cannot get layout\n", "cannot get mirror count\n", th
Gerrit AI review for Lustre
(style) This isn't a bug, but several err_str values here end in "\n" (this one, plus "cannot get layout\n", "cannot get mirror count\n", the comp_use/mirror id ones and "cannot delete mirror\n"). The final fprintf() appends ": %s\n", so the strerror text ends up on its own line. Also, mirror_merge(), mirror_extend_layout(), lfs_mirror_resync_file() and mirror_split() already print their own errors, so every failure is reported twice. If the patch is refreshed, consider dropping the newlines and the duplicate messages.
reply Gerrit AI review for Lustre lfs.c:3457 — (defect) Can this destroy the only up-to-date copy of the data? lfs_mirror_resync_file() releases its lease before the purge loop starts, an
Gerrit AI review for Lustre
(defect) Can this destroy the only up-to-date copy of the data? lfs_mirror_resync_file() releases its lease before the purge loop starts, and nothing (group lock or lease) stops writers from that point until mirror_split() runs. If the file is written in that window, the MDS picks a primary mirror (possibly an original one) and marks the new mirrors stale. mirror_split(MF_DESTROY) then removes the original. mdd_split_ea() only refuses when no *data* mirror would remain, and stale data mirrors still count. So the file ends up with only stale mirrors, and the write is lost. The `lfs mirror delete` path checks last_non_stale_mirror() and resyncs before splitting. Should each split here do the same check, or should the whole extend/resync/purge sequence run under a lease or group lock like lfs_migrate() does in its default blocking mode?
reply Gerrit AI review for Lustre lfs.c:3474 — (style) This isn't a bug, but free() and llapi_layout_free() both accept NULL, so the `if (ioc)` / `if (m_layout)` / `if (f_layout)` checks
Gerrit AI review for Lustre
(style) This isn't a bug, but free() and llapi_layout_free() both accept NULL, so the `if (ioc)` / `if (m_layout)` / `if (f_layout)` checks can go if the patch is refreshed.
reply Gerrit AI review for Lustre lfs.c:5592 — (defect) Now that migrate goes through the mirror path, how is `-N=COUNT` (mirror_total_mode) meant to work? The block below subtracts the f
Gerrit AI review for Lustre
(defect) Now that migrate goes through the mirror path, how is `-N=COUNT` (mirror_total_mode) meant to work? The block below subtracts the file's existing mirror count, but lfs_migrate_to_mirror() then purges all of those original mirrors. For a file with 2 mirrors: - `lfs migrate -N=4` creates 2 new mirrors and deletes the old 2, leaving 2 mirrors instead of 4. - `-N=3` gives mirror_count 1, so it falls back to plain lfs_migrate(). - `-N=2` prints "no new mirrors will be created" and then runs lfs_migrate() anyway. Should `=COUNT` be rejected for migrate, or treated as the absolute target count?
reply Gerrit AI review for Lustre lfs.c:6473 — (style) This isn't a bug, but this block-local `int mirror_count` shadows the function-scope `mirror_count` that the -N parsing sets just ab
Gerrit AI review for Lustre
(style) This isn't a bug, but this block-local `int mirror_count` shadows the function-scope `mirror_count` that the -N parsing sets just above. If the patch is refreshed, a distinct name such as `total_mirrors` would make it clear which count the `> 1` check uses.
reply Gerrit AI review for Lustre lfs.c:6540 — (defect) With a single mirror (`-N` or `-N1`), mirror_count is 1, so this falls through to lfs_migrate() with `param`/`layout`. With -N, tho
Gerrit AI review for Lustre
(defect) With a single mirror (`-N` or `-N1`), mirror_count is 1, so this falls through to lfs_migrate() with `param`/`layout`. With -N, though, every -E component was built into `mirror_list->m_layout` (lpp points there), and `layout` is still NULL. So `lfs migrate -N -E2M -Eeof -c-1 file` builds `param` from the last component's args and migrates to a plain, non-composite layout. The [0,2M) component and any --flags are dropped without a warning. The new test step "migrate to 1 mirror w/ 2 components" only compares checksums, so it passes even though no component layout is created. Should the single-mirror case also go through lfs_migrate_to_mirror(), or pass `mirror_list->m_layout` to lfs_migrate()? And should the test check verify_comp_count for that step?
tags: pw_smallfix pw_halt
owner Zhenyu Xu · uploader patrick bot · PS19 uploaded 18d ago · NEW · open in Gerrit ↗
commit message
LU-18332 lfs: migrate to mirrored file This patch makes "lfs migrate" accept -N options to migrate to a mirrored layout. It first merges new mirrors to the original file, then resync the contents to all the new mirrors, and last purges the original mirrors from the file. The migration test enables FLR_EC on the client and every MDT while it runs, as stale mirror merging requires both. Signed-off-by: Bobi Jam <bobijam@whamcloud.com> Change-Id: Ie81e6120260a7406b8f8c8e57ba085666c25587a Assisted-by: Codex:gpt-6.1-sol Signed-off-by: Patrick Farrell <patrick@thelustrecollective.com>
57572
master
J !B ✓T ✓R -1/2−
LU-18592 lod: protect lod in-memory layout's change
needs rebase — checkpatch: cannot be cherry-picked
needs rebase
9 unresolved
M +80 −31
78d
LU-18592 lod: protect lod in-memory layout's change
needs rebase — checkpatch: cannot be cherry-picked
needs rebase
9 unresolved
M +80 −31
78d
needs rebase — checkpatch: cannot be cherry-picked
9 unresolved thread(s) await your reply — last from Gerrit AI review for Lustre
CI green — no vote yet from Qian Yingjin, Andreas Dilger, Lai Siyao, Patrick Farrell
janitor run: 1 failing config(s), none unique to this patch — janitor results
11 optional test failure(s) — informational
build #127622 SUCCESS · tests all Maloo sessions
no vote yet: Qian Yingjin, Andreas Dilger, Lai Siyao, Patrick Farrell
patchsets:
PS8 09-04
PS9 09-05
PS10 09-10
PS11 09-24
PS12 07-15
+7 earlier
PS1 12-23 PS2 12-23 PS3 01-03 PS4 01-10 PS5 02-14 Peter Jones PS6 02-28 PS7 08-22threads: 9 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Gerrit AI review for Lustre COMMIT_MSG:9 — The body explains why lod_layout_mutex is needed, but two hunks aren't accounted for:
Gerrit AI review for Lustre
The body explains why lod_layout_mutex is needed, but two hunks aren't accounted for: - `lo->ldo_flr_state = 0;` added to the plain-layout branch of lod_parse_striping() - the extra `!lo->ldo_is_composite ||` term in the lod_declare_update_extents() assertion Could the body say what each of those is for? As written the text reads as if the assertion should stop firing for plain layouts, but the code makes it fire more often (see the inline comment).
reply Gerrit AI review for Lustre COMMIT_MSG:18 — This fixes an LBUG, so it would help to carry a Fixes: tag. The assertion being hit was added by:
Gerrit AI review for Lustre
This fixes an LBUG, so it would help to carry a Fixes: tag. The assertion being hit was added by:
Fixes: ff5eb304fa37 ("LU-10070 lod: SEL: Implement basic spillover space")
That commit introduced lod_declare_update_extents() together with `if (lo->ldo_flr_state == LCM_FL_NONE) LASSERT(start_index == 0 && max_comp == lo->ldo_comp_cnt);` and the unlocked access to ldo_mirrors[]/ldo_comp_cnt that this change now serializes.
reply Gerrit AI review for Lustre lod_lov.c:1362 — The same reset looks missing in the other two places that build a plain in-core layout after freeing the old one:
Gerrit AI review for Lustre
The same reset looks missing in the other two places that build a plain in-core layout after freeing the old one: - lod_use_defined_striping() (lod_qos.c:2217) sets `mo->ldo_is_composite = 0` for LOV_MAGIC_V1/V3 with no ldo_flr_state reset - lod_qos_parse_config() (lod_qos.c:2557) does the same after lod_free_comp_entries() lod_free_comp_entries() clears ldo_mirrors, ldo_mirror_count and ldo_is_composite but not ldo_flr_state, so a composite-to-plain transition through either of those still leaves a stale value. lod_declare_layout_change() then dispatches on it, e.g. into lod_declare_update_rdonly() whose `LASSERT(lo->ldo_mirror_count > 0)` cannot hold for a plain layout. Should those get the same fix?
reply Gerrit AI review for Lustre lod_object.c:7591 — Adding `!lo->ldo_is_composite ||` widens the guard rather than narrowing it: `A || B` is true whenever `B` is true, so the LASSERT is now ev
Gerrit AI review for Lustre
Adding `!lo->ldo_is_composite ||` widens the guard rather than narrowing it: `A || B` is true whenever `B` is true, so the LASSERT is now evaluated in strictly more cases than before, and the plain-layout case (`ldo_is_composite == 0`) now always evaluates it.
The commit message says ldo_flr_state is only meaningful for a composite layout and that a plain file "could get into lod_declare_update_plain()->lod_declare_update_extents() and bump into this assertion", which reads like the intent was to exempt plain layouts:
if (lo->ldo_is_composite && lo->ldo_flr_state == LCM_FL_NONE)
With `||`, a plain file in the state that produced the LU-18592 LBUG (flr_state == LCM_FL_NONE, stale ldo_mirrors) still hits the same assertion. Which of the two is intended?
reply Gerrit AI review for Lustre lod_object.c:7785 — Changing `RETURN(-EALREADY)` into `GOTO(out_unlock, rc = -EALREADY)` also routes this through `out:`, so the -EALREADY case now calls lod_st
Gerrit AI review for Lustre
Changing `RETURN(-EALREADY)` into `GOTO(out_unlock, rc = -EALREADY)` also routes this through `out:`, so the -EALREADY case now calls lod_striping_free() and drops the cached layout. Previously it returned with the cache intact. mdd_layout_instantiate_component() turns -EALREADY into success, so every layout-write intent on an already-instantiated component now throws away the in-memory striping and forces a re-read of the LOV EA. Is that intended, or should this path skip the free?
reply Gerrit AI review for Lustre lod_object.c:8613 — This isn't a bug today, but making the unlock conditional on `rc` is fragile: `out:` is reached both by fall-through with the mutex already
Gerrit AI review for Lustre
This isn't a bug today, but making the unlock conditional on `rc` is fragile: `out:` is reached both by fall-through with the mutex already released (rc == 0) and by `GOTO(out, ...)` with it still held. It only works because every goto to `out:` happens to set rc != 0 -- a future `GOTO(out, rc = 0)`, or a `lod_declare_update_extents()` return of 0 being propagated, silently leaks the mutex. A dedicated `out_unlock:` label above `out_free:` (as was done in lod_declare_update_plain()) would make the lock state structural instead of value-dependent. Same shape in lod_declare_update_write_pending() and lod_declare_update_sync_pending().
reply Gerrit AI review for Lustre lod_object.c:8825 — This assignment to ldo_flr_state is still outside ldo_layout_mutex, but lod_declare_update_write_pending() now takes the mutex and then asse
Gerrit AI review for Lustre
This assignment to ldo_flr_state is still outside ldo_layout_mutex, but lod_declare_update_write_pending() now takes the mutex and then asserts on the value:
lod_declare_update_sync_pending() lod_striping_reload()
lo->ldo_flr_state = WRITE_PENDING mutex_lock(ldo_layout_mutex)
lod_parse_striping()
lo->ldo_flr_state = <from disk>
mutex_unlock()
lod_declare_update_write_pending()
mutex_lock(ldo_layout_mutex)
LASSERT(ldo_flr_state == LCM_FL_WRITE_PENDING) <- fires
Since this is the same class of problem the patch is fixing, should the state transition move inside the mutex (or the mutex be taken here and passed down)?
reply Gerrit AI review for Lustre lod_qos.c:1582 — This isn't a bug, but `layout_lcked` is spelled `layout_locked` in every sibling function (lod_check_and_reserve_ost(), lod_ost_alloc_rr(),
Gerrit AI review for Lustre
This isn't a bug, but `layout_lcked` is spelled `layout_locked` in every sibling function (lod_check_and_reserve_ost(), lod_ost_alloc_rr(), lod_ost_alloc_specific(), lod_qos_prep_create()). Worth making it consistent if the patch is refreshed.
reply Gerrit AI review for Lustre lod_qos.c:3138 — This is the one remaining caller passing `false`, and it leaves the two lock orders divergent:
Gerrit AI review for Lustre
This is the one remaining caller passing `false`, and it leaves the two lock orders divergent:
lod_prepare_create() -> lod_ost_alloc_{qos,rr}()
lq_rw_sem / ltd_rw_sem held
-> lod_comp_is_ost_used(..., false)
-> mutex_lock(ldo_layout_mutex)
lod_declare_update_plain() mutex_lock(ldo_layout_mutex)
-> lod_declare_instantiate_components()
-> lod_qos_prep_create(..., true)
-> lod_ost_alloc_qos() down_write(lq_rw_sem)
So ldo_layout_mutex is now above lq_rw_sem on the new paths and below it here. This isn't reachable as a hang today (the MDT holds the layout LDLM lock EX for both entry points on a given object), but it makes the ordering depend on an unrelated lock. Would it be cleaner to have lod_prepare_create() take ldo_layout_mutex too and pass `true` everywhere, so lod_obj_for_each_stripe() never has to acquire it as an inner lock?
Related: the new critical section now spans OST allocation, which includes a `down_write_killable()` with a 2s timer in lod_ost_alloc_qos() and lod_sub_declare_create() on OSP objects, so the per-object layout mutex is held far longer than before.
owner Zhenyu Xu · uploader Zhenyu Xu · PS12 uploaded 112d ago · NEW · open in Gerrit ↗
commit message
LU-18592 lod: protect lod in-memory layout's change The lod::ldo_flr_state is only meaningful for composite layout, while a plain file could get into lod_declare_update_plain()-> lod_declare_update_extents() and bump into this assertion. lod_declare_update_extents() ) ASSERTION(start_index == 0 && max_comp == lo->ldo_comp_cnt) And lod_declare_update_extents() would modify lod's layout, it needs lod_layout_mutex's protection for consistence. Signed-off-by: Bobi Jam <bobijam@whamcloud.com> Change-Id: I2b3d32b32efb88317c124a7975dfd9889333bc8a
59350
master
J !B ✓T ✗1R -1/1−
LU-19037 osc: initialize osc_object::oo_tree
enforced failed: review-dne-part-5
1 unresolved
XS +1 −0
89d
LU-19037 osc: initialize osc_object::oo_tree
enforced failed: review-dne-part-5
1 unresolved
XS +1 −0
89d
enforced failed: review-dne-part-5
Timothy Day voted -1
1 thread(s) waiting on others
janitor run: 1 failing config(s), none unique to this patch — janitor results
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-5 failed 2× | RHEL 9.5 / x86_64 | ran 5 tests. 1 tests failed: sanityn. | session |
1 optional test failure(s) — informational
build #114129 SUCCESS · tests all Maloo sessions
reviews:
Timothy Day -1
no vote yet: Qian Yingjin, Andreas Dilger, Patrick Farrell
patchsets:
PS5 05-27
PS6 05-27
PS7 06-03
PS8 06-06
PS9 06-10
+4 earlier
PS1 05-21 PS2 05-22 PS3 05-22 PS4 05-22threads: 0 need your reply · 1 waiting on others · 0 own notes · 0 bot
owner Zhenyu Xu · uploader Zhenyu Xu · PS9 uploaded 513d ago · NEW · backport · open in Gerrit ↗
commit message
LU-19037 osc: initialize osc_object::oo_tree Initialize the radix tree of osc_object::oo_tree. Lustre-change: https://review.whamcloud.com/59340 Lustre-commit: 1f4d2013929bd61f775e6c98a4122fe143b4242b Signed-off-by: Bobi Jam <bobijam@whamcloud.com> Reviewed-by: Andreas Dilger <adilger@whamcloud.com> Change-Id: I77a19cb08ccc52f4eb3457cd3367884b84624054
65013
master
J !B ✓T ✓R -1/2−
LU-20066 obdclass: cache obd_name in client_obd
needs rebase — checkpatch: cannot be cherry-picked
needs rebase
2 unresolved
S +15 −1
94d
LU-20066 obdclass: cache obd_name in client_obd
needs rebase — checkpatch: cannot be cherry-picked
needs rebase
2 unresolved
S +15 −1
94d
needs rebase — checkpatch: cannot be cherry-picked
2 unresolved thread(s) await your reply — last from Andreas Dilger
CI green, no reviews yet — add reviewers
janitor run: 4 failing config(s), none unique to this patch — janitor results
6 optional test failure(s) — informational
build #123263 SUCCESS · tests all Maloo sessions
threads: 2 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Andreas Dilger lustre_osc.h:738 — This could also crash if `cl_obd_name` is not allocated? It would be better to make this a static `char cl_obd_name[OBD_NAME_MAX]` buffer t
Andreas Dilger
This could also crash if `cl_obd_name` is not allocated? It would be better to make this a static `char cl_obd_name[OBD_NAME_MAX]` buffer to avoid that. There are 34 bytes of holes in `struct client_obd` that could be packed a bit better, and this struct is already 3640 bytes in size, so adding a bit more is not _quite_ going to push it over the 4096-byte size.
reply Andreas Dilger ldlm_lib.c:579 — (style) `obd_name` is a fixed-size buffer, why not use the same instead of allocating a separate buffer? Otherwise, it seems possible that
Andreas Dilger
(style) `obd_name` is a fixed-size buffer, why not use the same instead of allocating a separate buffer? Otherwise, it seems possible that the import is accessed without `cl_obd_name` being allocated and *that* will crash...
owner Zhenyu Xu · uploader Zhenyu Xu · PS1 uploaded 218d ago · NEW · open in Gerrit ↗
commit message
LU-20066 obdclass: cache obd_name in client_obd client_obd's cli_import could be freed when the obd is being cleaned up, while in shrinker, we need to print the obd_name, which could cause use after free. This patch adds a new field cli_obd_name to cache the obd_name to avoid use after free. Signed-off-by: Bobi Jam <bobijam@whamcloud.com> Change-Id: Ic0434b9facd5eb2ef4f5df56c871ea6c4d0d8dc1
58276
master
J ✓B ✓T ✓R -1/2−
LU-17771 debug: getstripe -r to recursively getstripe
needs rebase — checkpatch: cannot be cherry-picked
needs rebase
stalled 372d
2 unresolved
S +13 −12
372d
LU-17771 debug: getstripe -r to recursively getstripe
needs rebase — checkpatch: cannot be cherry-picked
needs rebase
stalled 372d
2 unresolved
S +13 −12
372d
needs rebase — checkpatch: cannot be cherry-picked
2 unresolved thread(s) await your reply — last from Arshad Hussain
CI green — no vote yet from Andreas Dilger
1 optional test failure(s) — informational
build #116925 SUCCESS · tests all Maloo sessions
no vote yet: Andreas Dilger
patchsets:
PS1 03-03
PS2 09-24 Arshad Hussain
PS3 09-24 Arshad Hussain
PS4 09-25 Arshad Hussain
threads: 2 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Arshad Hussain sanity.sh:7759 — We should check for error here '... || error "nnn"'
Arshad Hussain
We should check for error here '... || error "nnn"'
reply Arshad Hussain sanity.sh:7767 — This change is correct.
Arshad Hussain
This change is correct.
owner Zhenyu Xu · uploader Arshad Hussain · PS4 uploaded 406d ago · NEW · open in Gerrit ↗
commit message
LU-17771 debug: getstripe -r to recursively getstripe '-r' is the correct option to recursively get the stripe information under a directory. '-R' is for printing layout information without substituting the filesystem's default values for unspecified fields. Test-Parameters: trivial testlist=sanity env=ONLY=56s, ONLY_REPEAT=100 Signed-off-by: Bobi Jam <bobijam@whamcloud.com> Change-Id: Ib6ef3ddb431e5f33a070c6ea435b7821b8fabb9d
54528
master
J !B ✓T ✗2R -1/2−
LU-17663 osc: extent find only care for write
enforced failed: review-ldiskfs
stalled 457d
S +4 −29
457d
LU-17663 osc: extent find only care for write
enforced failed: review-ldiskfs
stalled 457d
S +4 −29
457d
enforced failed: review-ldiskfs
Alexey Lyashkov voted -1
janitor run: 1 failing config(s), none unique to this patch — janitor results
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-ldiskfs | RHEL 8.9 / x86_64, RHEL 9.3 / x86_64 | ran 5 tests. 1 tests failed: sanity. | session |
| review-ldiskfs | RHEL 9.3 / x86_64 | ran 5 tests. 1 tests failed: sanity. | session |
2 optional test failure(s) — informational
build #108831 SUCCESS · tests all Maloo sessions
reviews:
Alexey Lyashkov -1
no vote yet: Qian Yingjin, Andreas Dilger, Patrick Farrell
patchsets:
PS1 03-22
PS2 07-31
PS3 09-18
PS4 11-05
owner Zhenyu Xu · uploader Zhenyu Xu · PS4 uploaded 729d ago · NEW · open in Gerrit ↗
commit message
LU-17663 osc: extent find only care for write
Don't use read lock in extent, read with different regions have
different compatible read locks.
Fixes: 67aca1fcc6 ("LU-16160 osc: take ldlm lock when queue sync pages")
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: Iceb05eb22744debc2e8122ef3ee451d149d79195
55918
master
J ✗1B ✓T …R 0/2
LU-17993 debug: to reveal page count issue
janitor: 1 test failure unique to this patch — sanity2@ldiskfs+DNE:test_398c
1 unique failure
stalled 457d
8 unresolved
M +79 −3
457d
LU-17993 debug: to reveal page count issue
janitor: 1 test failure unique to this patch — sanity2@ldiskfs+DNE:test_398c
1 unique failure
stalled 457d
8 unresolved
M +79 −3
457d
janitor: 1 test failure unique to this patch — sanity2@ldiskfs+DNE:test_398c
5 unresolved thread(s) await your reply — last from Oleg Drokin
build OK — testing in progress (typically 6–14h)
janitor flagged test failures unique to this patch — full janitor results
| unique failing test | history |
|---|---|
| sanity2@ldiskfs+DNE:test_398c | seen in 1 other review |
no vote yet: Qian Yingjin, Shaun Tancheff, Hongchao Zhang, Patrick Farrell
patchsets:
PS18 09-09 Hongchao Zhang
PS19 09-10 Hongchao Zhang
PS20 09-10 Hongchao Zhang
PS21 09-11 Hongchao Zhang
PS22 09-12 Hongchao Zhang
+17 earlier
PS1 08-02 PS2 08-05 PS3 08-07 PS4 08-08 PS5 08-29 Hongchao Zhang PS6 08-30 Hongchao Zhang PS7 08-30 Hongchao Zhang PS8 09-01 Hongchao Zhang PS9 09-02 Hongchao Zhang PS10 09-03 Hongchao Zhang PS11 09-03 Hongchao Zhang PS12 09-04 Hongchao Zhang PS13 09-04 Hongchao Zhang PS14 09-05 Hongchao Zhang PS15 09-05 Hongchao Zhang PS16 09-05 Hongchao Zhang PS17 09-09 Hongchao Zhangthreads: 5 need your reply · 0 waiting on others · 3 own notes · 0 bot
reply Oleg Drokin COMMIT_MSG:12 — since it looks like this patch will get refreshed eventually, please also fix this typo -> divide.
Oleg Drokin
since it looks like this patch will get refreshed eventually, please also fix this typo -> divide.
reply Shaun Tancheff file.c:2184 — truncate
Shaun Tancheff
truncate
note Zhenyu Xu rw26.c:387 — I have a doubt here, if the start of the 1st page is not page aligned, since @to most of time is PAGE_SIZE, so at each loop, the page is alw
Zhenyu Xu
I have a doubt here, if the start of the 1st page is not page aligned, since @to most of time is PAGE_SIZE, so at each loop, the page is always not page aligned as well, is it a glitch here?
Should @to be like this:
if (from != 0)
to = min(PAGE_SIZE - from, from + size);
else
to = min(PAGE, from + size);
and except the 1st/last page, all pages in the middle should always be aligned full page.
reply Shaun Tancheff rw26.c:386 — No changes here, code is correct as is.
Shaun Tancheff
No changes here, code is correct as is.
reply Patrick Farrell rw26.c:388 — Thanks, I can't reproduce that bug locally...
Patrick Farrell
Hmm, this looks correct - good catch... But it's blowing up, so probably something wrong I don't see.
Patrick Farrell
Wait, no. If from != 0, to is still "from + size". To is always from + size, except when it's outside of the page, in which case it's end-of-page/PAGE_SIZE.
Zhenyu Xu
right, I was wrong here.
Zhenyu Xu
I'm still investigating why visited page count does not match pv->ldp_count
Patrick Farrell
Thanks, I can't reproduce that bug locally...
note Zhenyu Xu cl_io.c:1383 — from here we can see that the end of the 1st page is page aligned.
Zhenyu Xu
from here we can see that the end of the 1st page is page aligned.
note Zhenyu Xu cl_io.c:1387 — and the end of the last page could be page unaligned.
Zhenyu Xu
and the end of the last page could be page unaligned.
reply Andreas Dilger sanity.sh:14393 — More importantly, for older servers the unaligned DIO should be handled gracefully in some manner, since applications running on newer clien
Shaun Tancheff
Can we do: unaligned_dio || skip "Need unaligned dio support" Instead of server version check?
Andreas Dilger
More importantly, for older servers the unaligned DIO should be handled gracefully in some manner, since applications running on newer clients will try this and we shouldn't allow them to crash the servers. Just skipping the test doesn't solve the interop problem. One option for UDIO is to expose the DIO alignment via statx, as XFS does. That will allow userspace applications to know what the DIO alignment requirements are, and applications that don't follow them can return EIO or other error directly (as they did befoer UDIO existed, instead of trying to emulate their way through the issues.
owner Zhenyu Xu · uploader Hongchao Zhang · PS22 uploaded 784d ago · NEW · open in Gerrit ↗
commit message
LU-17993 debug: to reveal page count issue as title Test-Parameters: fortestonly Test-Parameters: testlist=sanity env=ONLY=119h,ONLY_REPEAT=500 clientdistro=el8.8 serverdistro=el8.8 Signed-off-by: Hongchao Zhang <hongchao@whamcloud.com> Change-Id: Ia502400fb20603c369c34a3fb397a472cc3403c3
13042
master
J –B ✓T ✗0R +1/2
LU-5869 osc: handle ldlm_handle2lock() static analysis issue
Maloo voted -1 — tests failed (details on the change)
stalled 457d
XS +7 −0
457d
LU-5869 osc: handle ldlm_handle2lock() static analysis issue
Maloo voted -1 — tests failed (details on the change)
stalled 457d
XS +7 −0
457d
reviews:
Dmitry Eremin +1
owner Zhenyu Xu · uploader Zhenyu Xu · PS2 uploaded 4133d ago · NEW · open in Gerrit ↗
commit message
LU-5869 osc: handle ldlm_handle2lock() static analysis issue Even though ldlm_handle2lock() may return NULL, but ldlm_lock_match() will add a reference on the matched lock, we add an error path to handle this case. Signed-off-by: Bobi Jam <bobijam.xu@intel.com> Change-Id: I56c72129a2414468ee59320cfc1c29b5a72ce0c3
15390
master
J –B ✓T ✗0R 0/2
LU-4388 test: add sanity test case 118o
Maloo voted -1 — tests failed (details on the change)
stalled 457d
S +22 −2
457d
LU-4388 test: add sanity test case 118o
Maloo voted -1 — tests failed (details on the change)
stalled 457d
S +22 −2
457d
build #57410 SUCCESS
no vote yet: Jinshan Xiong
owner Zhenyu Xu · uploader Zhenyu Xu · PS2 uploaded 3025d ago · NEW · open in Gerrit ↗
commit message
LU-4388 test: add sanity test case 118o Add a sanity test case 118o to verify fsync issues OST_SYNC. Signed-off-by: Bobi Jam <bobijam@whamcloud.com> Change-Id: I4f40f0853934fd0b3e105efd76f0deeaddecb1af
15856
master
J –B ✓T ✗0R 0/2
LU-6960 utils: erase mgsnode param with tunefs.lustre
Maloo voted -1 — tests failed (details on the change)
stalled 457d
M +71 −1
457d
LU-6960 utils: erase mgsnode param with tunefs.lustre
Maloo voted -1 — tests failed (details on the change)
stalled 457d
M +71 −1
457d
owner Zhenyu Xu · uploader Zhenyu Xu · PS8 uploaded 3809d ago · NEW · open in Gerrit ↗
commit message
LU-6960 utils: erase mgsnode param with tunefs.lustre When we need to change MGS node, "tunefs.lustre --mgsnode" would only append to existing mgsnode params. This patch add a "--erase-mgsnode" parameter to wipe existing mgsnode and append mgsnode parameters afterwards. Signed-off-by: Bobi Jam <bobijam.xu@intel.com> Change-Id: I90799a0338e9f4a5f2a606388ea3dd0384ae703f
32789
master
J –B ✗T –R +0/2−
LU-11118 llite: restrain initial read-ahead window length
build failure (#57148)
stalled 457d
S +11 −9
457d
LU-11118 llite: restrain initial read-ahead window length
build failure (#57148)
stalled 457d
S +11 −9
457d
build failure (#57148)
Andreas Dilger voted -1
build #57148 FAILURE
reviews:
Patrick Farrell +1 · Andreas Dilger -1
no vote yet: Rahul Deshmukh
owner Zhenyu Xu · uploader Zhenyu Xu · PS3 uploaded 3038d ago · NEW · open in Gerrit ↗
commit message
LU-11118 llite: restrain initial read-ahead window length Restrain the initial read-ahead window length to a reasonable value, no more than the file's size. Signed-off-by: Bobi Jam <bobijam@whamcloud.com> Change-Id: Ib0b5d62e57d847f36912020c8089b7b53ab7d618
33556
master
J !B ✓T ✗1R +1/2
LU-11600 obd: refactor cl_loi_list_lock
enforced failed: review-dne-zfs-part-1
stalled 457d
M +114 −105
457d
LU-11600 obd: refactor cl_loi_list_lock
enforced failed: review-dne-zfs-part-1
stalled 457d
M +114 −105
457d
janitor run: 1 failing config(s), none unique to this patch — janitor results
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-zfs-part-1 | RHEL 8.7/x86_64 | ran 4 tests. 1 tests failed: sanity. | session |
1 optional test failure(s) — informational
build #96060 SUCCESS · tests all Maloo sessions
reviews:
Andreas Dilger +1
no vote yet: Qian Yingjin, Shuichi Ihara, Neil Brown, Li Dongyang, Patrick Farrell, Sergey Cheremencev
patchsets:
PS4 11-15
PS5 11-16
PS6 11-30
PS7 07-04
owner Zhenyu Xu · uploader Zhenyu Xu · PS7 uploaded 1219d ago · NEW · open in Gerrit ↗
commit message
LU-11600 obd: refactor cl_loi_list_lock client_obd::cl_loi_list_lock is likely getting quite hot in the IO path. This patch split it into another client_obd::cl_grant_lock to protect the OSC grant counters for the small window where they are modified. Change-Id: I05573baeeaa9e400963ffd528df118bb67ae381c Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
49164
master
J !B ✓T ✗1R -1/2−
LU-16315 llite: invoke sync after write for synchorous write
enforced failed: review-zfs
stalled 457d
3 unresolved
M +89 −10
457d
LU-16315 llite: invoke sync after write for synchorous write
enforced failed: review-zfs
stalled 457d
3 unresolved
M +89 −10
457d
enforced failed: review-zfs
Li Xi voted -1
2 unresolved thread(s) await your reply — last from Li Xi
1 thread(s) waiting on others
janitor run: 3 failing config(s), none unique to this patch — janitor results
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-zfs | CentOS 8.5/x86_64 | ran 10 tests. 1 tests failed: replay-single. | session |
2 optional test failure(s) — informational
build #90835 SUCCESS · tests all Maloo sessions
reviews:
Li Xi -1
no vote yet: Qian Yingjin
patchsets:
PS4 11-17
PS5 11-17
PS6 11-17
PS7 11-17
PS8 11-24
+3 earlier
PS1 11-15 PS2 11-16 PS3 11-16threads: 2 need your reply · 1 waiting on others · 0 own notes · 0 bot
reply Li Xi COMMIT_MSG:9 — typo: write -> write
Li Xi
typo: write -> write
reply Li Xi sanity-pfl.sh:2518 — Will this "wait" for all dd to finish?
Li Xi
Will this "wait" for all dd to finish? As far as I tested, even dd blocked, wait will return without any problem. I think checking "ps aux | grep dd | grep oflag=sync | wc -l" would be better. And it is necessary to repeat this test for several times. This test can pass for several times (~3) sometimes, but repeating will always hit the stuck.
owner Zhenyu Xu · uploader Zhenyu Xu · PS8 uploaded 1442d ago · NEW · open in Gerrit ↗
commit message
LU-16315 llite: invoke sync after write for synchorous write
A sync write need perform sync after the wrile, while we shouldn't
start an nested clio in another one (they share the same clio
environment while the nested clio would be reset). And a deadlock
could be ensued as following call traces show:
thread1:
======================================================================
ll_layout_refresh+0x1b2/0x9c0 [lustre] // waiting for the update of
// the layout after ll_fsync
vvp_io_init+0x23f/0x3a0 [lustre]
cl_io_init0.isra.13+0xa8/0x170 [obdclass]
cl_sync_file_range+0x206/0x340 [lustre]
ll_fsync+0x57c/0x5e0 [lustre]
generic_write_sync+0x4f/0x70
vvp_io_write_start+0x8a6/0x1000 [lustre]
cl_io_start+0x75/0x130 [obdclass]
cl_io_loop+0xd4/0x1f0 [obdclass]
ll_file_io_generic+0x685/0xc70 [lustre]
ll_file_aio_write+0x308/0x470 [lustre]
ll_file_write+0xe3/0x1d0 [lustre]
vfs_write+0xc0/0x1f0
SyS_pwrite64+0x92/0xc0
system_call_fastpath+0x25/0x2a
======================================================================
thread2:
======================================================================
lov_layout_wait.isra.35+0x14a/0x260 [lov] // waiting for thread2 to be
// the only active IO upon
// the file, while thread1
// is working on the file
// at the same time
lov_conf_set+0x1b0/0xb30 [lov]
cl_conf_set+0x7c/0x150 [obdclass]
ll_layout_conf+0x82/0x420 [lustre]
ll_layout_refresh+0x7bf/0x9c0 [lustre]
vvp_io_init+0x23f/0x3a0 [lustre]
cl_io_init0.isra.13+0xa8/0x170 [obdclass]
cl_io_init+0x41/0x90 [obdclass]
cl_io_rw_init+0x113/0x220 [obdclass]
ll_file_io_generic+0x2e5/0xc70 [lustre]
ll_file_aio_write+0x308/0x470 [lustre]
ll_file_write+0xe3/0x1d0 [lustre]
vfs_write+0xc0/0x1f0
SyS_pwrite64+0x92/0xc0
system_call_fastpath+0x25/0x2a
======================================================================
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: Icac5296a269d7e428d2b934973ac2b80651e20fc
50310
master
J !B ✓T ✗2R 0/2
LU-14765 llite: update inode's block numbers in mirror split
enforced failed: review-dne-selinux-ssk-part-1, review-dne-selinux-ssk-part-2
stalled 457d
S +16 −8
457d
LU-14765 llite: update inode's block numbers in mirror split
enforced failed: review-dne-selinux-ssk-part-1, review-dne-selinux-ssk-part-2
stalled 457d
S +16 −8
457d
janitor run: 2 failing config(s), none unique to this patch — janitor results
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-selinux-ssk-part-1 | RHEL 8.8/x86_64 | ran 3 tests. 1 tests failed: sanity. | session |
| review-dne-selinux-ssk-part-2 | RHEL 8.8/x86_64 | ran 5 tests. 1 tests failed: sanity-sec. | session |
build #100507 SUCCESS · tests all Maloo sessions
no vote yet: Etienne AUJAMES, Andreas Dilger, Alex Zhuravlev
patchsets:
PS6 04-13
PS7 04-14
PS8 06-02
PS9 06-13 Andreas Dilger
PS10 11-26 Andreas Dilger
+5 earlier
PS1 03-16 PS2 03-16 PS3 03-16 PS4 03-16 PS5 03-31owner Zhenyu Xu · uploader Andreas Dilger · PS10 uploaded 1075d ago · NEW · open in Gerrit ↗
commit message
LU-14765 llite: update inode's block numbers in mirror split
In mirror split, MDT cannot know the exact number of blocks to be
freed, so it changes the SOM flag as SOM_FL_LAZY (0x4), this patch
adds a stat operation in llite when MDT has finished the mirror split
to fetch the inode's correct block numbers from all of its stripes.
This is sent to the MDS later on close and stored in LSOM xattr.
Fixes: a30750ad2c ("LU-14526 flr: mirror split downgrade SOM")
Test-Parameters: testlist=sanity-flr env=ONLY=44c,ONLY_REPEAT=100
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: Id9c0108e2cd230f3e68f97f06f3c08579930fd3c
39411
master
J !B ✓T ✗6R +2/2
LU-13794 util: changing comp-flags get stuck when OST is down
enforced failed: review-dne-part-1, review-dne-part-4, review-dne-zfs-part-1, review-dne-zfs-part-2, review-dne-zfs-part-4, review-zfs
stalled 464d
XS +0 −8
464d
LU-13794 util: changing comp-flags get stuck when OST is down
enforced failed: review-dne-part-1, review-dne-part-4, review-dne-zfs-part-1, review-dne-zfs-part-2, review-dne-zfs-part-4, review-zfs
stalled 464d
XS +0 −8
464d
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-1 | CentOS 7.0/x86_64 | ran 6 tests. 1 tests failed: sanityn. | session |
| review-dne-part-4 | RHEL 7.8/x86_64 | ran 10 tests. 1 tests failed: replay-single. | session |
| review-dne-zfs-part-1 | CentOS 7.0/x86_64 | ran 8 tests. 2 tests failed: sanityn, sanity. | session |
| review-dne-zfs-part-2 | CentOS 7.0/x86_64 | ran 11 tests. 1 tests failed: sanity-hsm. | session |
| review-dne-zfs-part-4 | RHEL 7.8/x86_64 | ran 10 tests. 1 tests failed: replay-single. | session |
| review-zfs crashed | RHEL 7.8/x86_64 | ran 10 tests. 1 tests failed: sanity-quota. %% THIS TEST SESSION CRASHED %% | session |
2 optional test failure(s) — informational
build #15730 SUCCESS
reviews:
Andreas Dilger +1 · Li Dongyang +1
owner Zhenyu Xu · uploader Zhenyu Xu · PS1 uploaded 2302d ago · NEW · open in Gerrit ↗
commit message
LU-13794 util: changing comp-flags get stuck when OST is down In scenario of trying to write a FLR file when a mirror is unavailable because some OST(s) serving the mirror is unavailable at the time, admin could set preferred mirror for the write choosing another healthy mirror. While the preference setting api llapi_layout_file_comp_set() is trying to flush data before setting the preference flag of the file's layout, the flush would trip over the unavailable OST(s) and hung the setting. Flushing data is not a necessary procedure in the component flag setting. Signed-off-by: Bobi Jam <bobijam@whamcloud.com> Change-Id: Id20a21dc693b6662df7773158c76f093f36ef9aa
40483
master
J ✗4B ✓T ✗6R +1/2
LU-14096 llog: proper release dt_object in llog_open_create()
janitor: 4 test failures unique to this patch — ost-pools@ldiskfs+DNE:test_15, ost-pools@ldiskfs+DNE:test_20, recovery-small@ldiskfs+DNE:test_18c +1 more
4 unique failures
stalled 464d
XS +1 −1
464d
LU-14096 llog: proper release dt_object in llog_open_create()
janitor: 4 test failures unique to this patch — ost-pools@ldiskfs+DNE:test_15, ost-pools@ldiskfs+DNE:test_20, recovery-small@ldiskfs+DNE:test_18c +1 more
4 unique failures
stalled 464d
XS +1 −1
464d
janitor: 4 test failures unique to this patch — ost-pools@ldiskfs+DNE:test_15, ost-pools@ldiskfs+DNE:test_20, recovery-small@ldiskfs+DNE:test_18c +1 more
enforced failed: review-dne-part-2, review-dne-part-3, review-dne-zfs-part-1, review-dne-zfs-part-2, review-dne-zfs-part-5, review-ldiskfs-arm
janitor flagged test failures unique to this patch — full janitor results
| unique failing test | history |
|---|---|
| ost-pools@ldiskfs+DNE:test_15 | seen in 11 other reviews |
| ost-pools@ldiskfs+DNE:test_20 | seen in 13 other reviews |
| recovery-small@ldiskfs+DNE:test_18c | seen in 4 other reviews |
| sanity2@zfs:test_398g | seen in 29 other reviews |
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-2 | RHEL 8.6/x86_64 | ran 9 tests. 1 tests failed: replay-dual. | session |
| review-dne-part-3 | RHEL 8.6/x86_64 | ran 3 tests. 1 tests failed: conf-sanity. | session |
| review-dne-zfs-part-1 | CentOS 8.5/x86_64 | ran 6 tests. 1 tests failed: sanity. | session |
| review-dne-zfs-part-2 | CentOS 8.5/x86_64 | ran 7 tests. 1 tests failed: replay-dual. | session |
| review-dne-zfs-part-5 | CentOS 8.5/x86_64 | ran 6 tests. 2 tests failed: sanityn, recovery-small. | session |
| review-ldiskfs-arm | RHEL 8.6/aarch64, RHEL 8.6/x86_64 | ran 6 tests. 1 tests failed: sanity-lnet. | session |
3 optional test failure(s) — informational
build #89881 SUCCESS · tests all Maloo sessions
reviews:
Arshad Hussain +1
no vote yet: Andreas Dilger
owner Zhenyu Xu · uploader Andreas Dilger · PS2 uploaded 1489d ago · NEW · open in Gerrit ↗
commit message
LU-14096 llog: proper release dt_object in llog_open_create() In the rare case when the device is set rdonly, llog_open_create() need to release the just opened llog_handle. Signed-off-by: Bobi Jam <bobijam@whamcloud.com> Change-Id: I3fe61a2ab0cc50f5336d04d8ee00d5280315aa7c
▶Review feedback — your turn
(3)
68778
master
J !B ✓T ✓R +1/2
LU-20703 llite: limit readahead window by the readahead budget
3 unresolved thread(s) await your reply — last from Gerrit AI review for Lustre
3 unresolved
M +84 −5
43d
LU-20703 llite: limit readahead window by the readahead budget
3 unresolved thread(s) await your reply — last from Gerrit AI review for Lustre
3 unresolved
M +84 −5
43d
3 unresolved thread(s) await your reply — last from Gerrit AI review for Lustre
no vote yet from Qian Yingjin, Li Dongyang
janitor run: 4 failing config(s), none unique to this patch — janitor results
build #131763 SUCCESS · tests all Maloo sessions
reviews:
Xiyang Wang +1
no vote yet: Qian Yingjin, Li Dongyang
patchsets:
PS1 09-10
PS2 09-15
threads: 3 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Gerrit AI review for Lustre rw.c:1288 — (minor) The comment above the block still says the readahead goes "up to ra_max_pages_per_file", and the CDEBUG below prints ra_max_read_ahe
Gerrit AI review for Lustre
(minor) The comment above the block still says the readahead goes "up to ra_max_pages_per_file", and the CDEBUG below prints ra_max_read_ahead_whole_pages and ra_max_pages_per_file. Neither is the limit any more. If the patch is refreshed, could the comment name the effective limit and the trace print ra_max_window_pages(ra) (or ra_max_pages) so the dump matches what the window is actually clamped to?
reply Gerrit AI review for Lustre rw.c:1309 — (defect) Capping this window makes it possible for ras_whole_file_read to be true while the window no longer covers the file, and nothing re
Gerrit AI review for Lustre
(defect) Capping this window makes it possible for ras_whole_file_read to be true while the window no longer covers the file, and nothing recovers from that.
The entry test is kms_pages <= ra_max_read_ahead_whole_pages, but the window is now min(ra_max_window_pages(ra), ra_max_read_ahead_whole_pages). max_read_ahead_whole_mb is only clamped against ra_max_pages_per_file and max_read_ahead_mb is not clamped against it at all, so ra_max_pages < kms_pages <= ra_max_read_ahead_whole_pages is reachable: with brw_size=16M (whole = 16M) and max_read_ahead_mb=8, a 12M file on its second read gets ras_whole_file_read = true and a 8M window.
From there ll_readahead() takes end_idx = ras_window_start_idx + ras_window_pages - 1 and only stretches it far enough to cover the current read, ras_update() returns early on ras_whole_file_read so the window is never grown or moved, and this function resets ras_next_readahead_idx to 0 on every read() while the whole-file test keeps matching. The readahead frontier can never pass ra_max_pages, and the tail of the file is read a page per RPC for the life of the fd.
Before the patch the window was ra_max_read_ahead_whole_pages >= kms_pages, so the frontier walked to EOF: ll_ra_count_get() clamped each reservation to the remaining budget, and cached pages return 1 from ll_read_ahead_page() without consuming any reservation.
Would folding the budget into the entry test fix it, so the normal detector keeps running when the budget cannot cover the file?
if (kms_pages && kms_pages <= min(ra->ra_max_read_ahead_whole_pages,
ra_max_window_pages(ra))) {
reply Gerrit AI review for Lustre sanity.sh:13358 — (suggestion) This was raised on patchset 1 and the pass criterion is unchanged: 101d still passes or fails on two dd wall-clock numbers, whi
Gerrit AI review for Lustre
(suggestion) This was raised on patchset 1 and the pass criterion is unchanged: 101d still passes or fails on two dd wall-clock numbers, which is what makes it flaky in the first place. Now that the patch makes the async gate reachable, the new instrumentation already reads the values that would make this deterministic. Could the test also assert on them unconditionally, e.g. llite.*.read_ahead_stats async_readahead > 0, or that the osc.*.rpc_stats read histogram is not dominated by 1-page RPCs? That would fail for the LU-20703 reason rather than for timing noise.
owner Zhenyu Xu · uploader Zhenyu Xu · PS2 uploaded 51d ago · NEW · open in Gerrit ↗
commit message
LU-20703 llite: limit readahead window by the readahead budget
The per-file readahead window is capped by ra_max_pages_per_file,
independently of the global readahead budget ra_max_pages
(llite.*.max_read_ahead_mb). When the budget is set below the
per-file window (e.g. sanity/101d sets max_read_ahead_mb=40 while
max_read_ahead_per_file_mb=64 on a 64K-page client), the readahead
window target exceeds the whole readahead budget, and then:
* the async readahead gate in kickoff_async_readahead() is never
satisfied: the throttle defaults to ra_max_pages_per_file, so
the gate only opens at the maximal window, but a cache miss
runs ras_reset() and drops the window back to 0, and it takes
ra_max_pages_per_file / ras_rpc_pages growth steps to climb
back;
* every cache miss runs a synchronous readahead walk that reserves
the whole remaining budget and holds it until its read RPCs
complete;
* while the budget is in flight the reader catches up with the
readahead frontier, and further misses can only reserve one page
via the pages_min override, degenerating into a storm of one-page
(64KB) read RPCs plus per-miss readahead state and lock-match
overhead, making the readahead-enabled read slower than the
readahead-disabled one: "readahead 22.8092s > no-readahead
10.3606s (80M)".
Limit the effective per-file readahead window by the readahead
budget with a new helper ra_max_window_pages(), and use it where
the window growth is capped (ras_stride_increase_window(),
ras_increase_window()), where the whole-file-read window is
initialized (ll_ras_enter()) and in the async readahead gate
(kickoff_async_readahead()). The stored tunables are unchanged,
so raising max_read_ahead_mb again restores the original behavior.
The window grows in ras_rpc_pages steps once it reaches one RPC
(ras_increase_window() aligns every step), so it tops out at
ra_max_window_pages() rounded down to the RPC size. Round the
async readahead throttle down to the same granularity, otherwise
it can exceed every value the window can take and async readahead
never fires (e.g. brw_size=16 on a 64K-page client with
max_read_ahead_mb=40: window tops out at 512 pages, throttle is
640). Throttles below one RPC are left unaligned, since such
windows are still reachable via the sub-RPC window in
ras_increase_window().
Also add opt-in (DEBUG_101D=1, or DEBUG_101D=trace to also capture
the D_READA trace) instrumentation to sanity/101d, which dumps the
readahead parameters, readahead stats and read RPC size histogram
around the measured reads, and restores the debug mask via
debugsave()/debugrestore() when tracing.
Assisted-by: Augment Agent:GLM 5.3 Flash
Test-Parameters: testlist=sanity.sh env=ONLY=101d,ONLY_REPEAT=50 clientdistro=rocky9.5 clientarch=aarch64
Fixes: c2791674260b ("LU-12043 llite: improve single-thread read performance")
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: I01818568c4cba4ff40bee0b725f7e7dcf0bc9063
55547
master
J ✓B ✓T ✓R 0/2
LU-17981 test: replay-single/test_46 ineffective
1 unresolved thread(s) await your reply — last from Andreas Dilger
stalled 384d
1 unresolved
XS +1 −1
384d
LU-17981 test: replay-single/test_46 ineffective
1 unresolved thread(s) await your reply — last from Andreas Dilger
stalled 384d
1 unresolved
XS +1 −1
384d
1 unresolved thread(s) await your reply — last from Andreas Dilger
CI green — no vote yet from Andreas Dilger
build #108438 SUCCESS · tests all Maloo sessions
no vote yet: Andreas Dilger
patchsets:
PS1 06-27
PS2 09-11
PS3 10-22 Andreas Dilger
threads: 1 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Andreas Dilger replay-single.sh:1083 — (minor) it would be better to confirm that "FID" had something in it? Otherwise the "grep didn't find anything" is too easily broken.
Andreas Dilger
(minor) it would be better to confirm that "FID" had something in it? Otherwise the "grep didn't find anything" is too easily broken. Also, add a comment in the code where this "force closing file handle" message is printed to ensure it is not changed.
owner Zhenyu Xu · uploader Andreas Dilger · PS3 uploaded 743d ago · NEW · open in Gerrit ↗
commit message
LU-17981 test: replay-single/test_46 ineffective
Should pass path of the test file to "lfs path2fid" to make it
an effective test.
Fixes: c0fa0ba4a8 ("LU-12368 ptlrpc: make DEBUG_REQ messages consistent")
Test-Parameters: trivial testlist=replay-single env=ONLY=46
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: I8f7de367aee356e3d7db97f57a130c9b004f2942
4954
master
J –B ✓T ✓R +1/2−
LU-2468 ldlm: shrinker path should not allocate memory
Oleg Drokin voted -1
stalled 457d
XS +1 −1
457d
LU-2468 ldlm: shrinker path should not allocate memory
Oleg Drokin voted -1
stalled 457d
XS +1 −1
457d
build #11747 SUCCESS
reviews:
Niu Yawei +1 · Oleg Drokin -1 · Fan Yong +1
no vote yet: Commit Reviewer
owner Zhenyu Xu · uploader Zhenyu Xu · PS2 uploaded 5051d ago · NEW · open in Gerrit ↗
commit message
LU-2468 ldlm: shrinker path should not allocate memory Found a glitch along the ldlm_shrink path, ldlm_pool_shrink()-> ldlm_cli_pool_shrink()-> ldlm_cancel_lru(ns, nr, LDLM_ASYNC, LDLM_CANCEL_SHRINK)-> ldlm_bl_to_thread_list(ns, NULL, &cancels, nr, LDLM_ASYNC)-> ldlm_bl_to_thread(ns, NULL, cancels, nr, LDLM_ASYNC)-> OBD_ALLOC(blwi, sizeof(*blwi)) Shrinker path should not allocate memory again. Signed-off-by: Bobi Jam <bobijam.xu@intel.com> Change-Id: I91a451303e636b94e74829a97e8c8305a95cfc9b
▶In CI
(4)
58253
master
J –B ✓T …R +2/2
LU-17531 lfs: add 'mirror extend --no-resync' option
build OK — testing in progress (typically 6–14h)
pw_smallfixpt_ecro
M +189 −4
48m
LU-17531 lfs: add 'mirror extend --no-resync' option
build OK — testing in progress (typically 6–14h)
pw_smallfixpt_ecro
M +189 −4
48m
reviews:
Marc Vef +1 · Andreas Dilger +1
no vote yet: Ronnie Sahlberg, Jian Yu, Patrick Farrell
patchsets:
PS21 10-28 patrick bot
PS22 10-30 patrick bot
PS23 10-31 patrick bot
PS24 11-01 patrick bot
PS25 11-04 Marc Vef
+20 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 bot PS20 10-28 patrick bottags: pw_smallfix pt_ecro
owner Zhenyu Xu · uploader Marc Vef · PS25 uploaded 16h 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
70067
master
J –B ✓T ↻R +3/2
LU-20690 ec: copy parity in 1+N recovery reads
review-dne-part-5 failed — auto-retest in flight (often self-heals)
pw_shepherd218_review_prioritypt_ecro
1 unresolved
M +87 −14
53m
LU-20690 ec: copy parity in 1+N recovery reads
review-dne-part-5 failed — auto-retest in flight (often self-heals)
pw_shepherd218_review_prioritypt_ecro
1 unresolved
M +87 −14
53m
review-dne-part-5 failed — auto-retest in flight (often self-heals)
1 reviewer comment(s) to address if a respin is needed — last from Andreas Dilger
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-5 retesting crashed | RHEL 10.2 / x86_64 | ran 5 tests. 1 tests failed: sanityn. %% THIS TEST SESSION CRASHED %% | session |
build #135384 SUCCESS · tests all Maloo sessions
reviews:
Keguang Xu +1 · Ronnie Sahlberg +1 · Andreas Dilger +1
no vote yet: Marc Vef
patchsets:
PS1 10-27
PS2 11-03 Andreas Dilger
PS3 11-04 Andreas Dilger
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: pw_shepherd 218_review_priority pt_ecro
owner Zhenyu Xu · uploader Andreas Dilger · PS3 uploaded 1d 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
66481
master
J –B ✓T …R +2/2
LU-12669 ec: fix EC recovery read for encrypted files
build OK — testing in progress (typically 6–14h)
ec2
pt_ecro218_review_blocker
L +344 −29
8h
LU-12669 ec: fix EC recovery read for encrypted files
build OK — testing in progress (typically 6–14h)
ec2
pt_ecro218_review_blocker
L +344 −29
8h
reviews:
Keguang Xu +1 · Andreas Dilger +1
no vote yet: Marc Vef
patchsets:
PS21 08-19
PS22 08-20
PS23 10-08 Andreas Dilger
PS24 10-28 Andreas Dilger
PS25 11-04 Andreas Dilger
+20 earlier
PS1 06-05 PS2 06-06 PS3 06-06 PS4 06-06 PS5 06-07 PS6 06-08 PS7 06-11 PS8 06-11 PS9 06-11 PS10 06-12 PS11 06-30 PS12 07-16 Marc Vef PS13 07-26 Marc Vef PS14 07-26 Marc Vef PS15 08-01 Marc Vef PS16 08-10 Keguang Xu PS17 08-10 PS18 08-10 PS19 08-11 PS20 08-11your previous vote: -1 on PS24 (2026-11-02 10:01) — now at PS25
tags: pt_ecro 218_review_blocker
owner Zhenyu Xu · uploader Andreas Dilger · PS25 uploaded 11h ago · NEW · open in Gerrit ↗
commit message
LU-12669 ec: fix EC recovery read for encrypted files
The parity of an encrypted file is computed from its data as stored
on the OSTs, but an EC recovery read rebuilds a stripe from data
pages that OSC has already decrypted, together with the parity as
stored, and returns garbage.
Rebuild the stripe from the data as stored instead: have OSC leave
the data pages read for the recovery encrypted and not uptodate,
rebuild the missing pages from them and the parity, then decrypt the
pages read and rebuilt. Leave each all-zero encryption unit (a hole)
as it is, including one followed by data in a page larger than the
unit. A data page already in the page cache holds the plaintext, so
read the stripe again from the OST for the positions being rebuilt,
rather than encrypting the plaintext, which cannot recreate the
stored data of a hole. Without the key, leave the pages encrypted,
as a normal read does. Keep these pages out of extents that OSC
decrypts, and send the encryption flag with the parity reads. If
the recovery fails, delete the data pages that were not decrypted,
so that a readahead page does not later return the ciphertext.
Add sanity-ec test_56a to recover an encrypted file with a hole in
a surviving stripe, both from the OSTs and with that stripe cached.
Fixes: 783c13bb0b8f ("LU-12669 ec: recover data from parity")
Signed-off-by: Bobi Jam <bobijam@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: Ida4722d05d79bcbee4e680e75e94b005579adcac
36513
master
J ✓B ✓T …R 0/2
LU-12864 test: enable unstable check accounting in test
build OK — testing in progress (typically 6–14h)
stalled 464d
S +16 −6
464d
LU-12864 test: enable unstable check accounting in test
build OK — testing in progress (typically 6–14h)
stalled 464d
S +16 −6
464d
no vote yet: Andreas Dilger
owner Zhenyu Xu · uploader Minh Diep · PS3 uploaded 1639d ago · NEW · open in Gerrit ↗
commit message
LU-12864 test: enable unstable check accounting in test Enable unstable check accounting in sanity-benchmark test_iozone to verify whether unstable check accounting could prohibit client pinning too much memory for writing. Test-Parameters: fortestonly testlist=sanity-benchmark envdefinitions=ONLY=iozone Signed-off-by: Bobi Jam <bobijam@whamcloud.com> Change-Id: I4cc7cfead8709380ad01c90bc0be9108dbe8b3f0
▶Needs reviewers
(2)
54384
master
J –B ✓T ✓R -1/2−
LU-16489 test: loop lustre_rsync until no new changelog record
CI green — no vote yet from Andreas Dilger
stalled 457d
M +75 −12
457d
LU-16489 test: loop lustre_rsync until no new changelog record
CI green — no vote yet from Andreas Dilger
stalled 457d
M +75 −12
457d
build #103627 SUCCESS · tests all Maloo sessions
no vote yet: Andreas Dilger
patchsets:
PS1 03-14
PS2 03-20
PS3 03-25
PS4 03-28
PS5 03-28
owner Zhenyu Xu · uploader Zhenyu Xu · PS5 uploaded 951d ago · NEW · open in Gerrit ↗
commit message
LU-16489 test: loop lustre_rsync until no new changelog record In lustre-rsync-test.sh, after requesting dbench stop we'd loop running lustre_rsync until no new changelog records are added. Test-Parameters: trivial testlist=lustre-rsync-test Signed-off-by: Bobi Jam <bobijam@whamcloud.com> Change-Id: I0e303a91834c58a4a288167b97b8167389c396ce
48007
master
J ✗5B ✓T ✓R 0/2
LU-16033 llite: refine ll_use_fast_io() for stride mode
CI green — no vote yet from Qian Yingjin, Patrick Farrell
stalled 457d
M +106 −40
457d
LU-16033 llite: refine ll_use_fast_io() for stride mode
CI green — no vote yet from Qian Yingjin, Patrick Farrell
stalled 457d
M +106 −40
457d
janitor flagged test failures unique to this patch — superseded (tests have since passed) — full janitor results
| unique failing test | history |
|---|---|
| conf-sanity2@zfs:test_38 | seen in 3 other reviews |
| conf-sanity2@zfs:test_39 | seen in 7 other reviews |
| conf-sanity2@zfs:test_40 | seen in 7 other reviews |
| conf-sanity2@zfs:test_41a | seen in 5 other reviews |
| sanity-lfsck@ldiskfs+DNE:test_18e | seen in 3 other reviews |
1 optional test failure(s) — informational
build #88814 SUCCESS · tests all Maloo sessions
no vote yet: Qian Yingjin, Patrick Farrell
patchsets:
PS1 07-21
PS2 08-05
owner Zhenyu Xu · uploader Zhenyu Xu · PS2 uploaded 1553d ago · NEW · open in Gerrit ↗
commit message
LU-16033 llite: refine ll_use_fast_io() for stride mode This patch refines ll_use_fast_io() to detect whether current readahead window allows issuing readahead RPC for stride mode. Signed-off-by: Bobi Jam <bobijam@whamcloud.com> Change-Id: Id49d947a0433f94bc7b63fe4d528d7c32b7b789f
▶Waiting on reviewers
(3)
69479
master
J –B ✓T ✓R +1/2
LU-20885 llite: use delay RPC for glimpse after all mirrors
no vote yet from Qian Yingjin, Marc Vef
S +15 −2
21d
LU-20885 llite: use delay RPC for glimpse after all mirrors
no vote yet from Qian Yingjin, Marc Vef
S +15 −2
21d
build #133021 SUCCESS · tests all Maloo sessions
reviews:
Andreas Dilger +1
no vote yet: Qian Yingjin, Marc Vef
owner Zhenyu Xu · uploader Zhenyu Xu · PS1 uploaded 28d ago · NEW · open in Gerrit ↗
commit message
LU-20885 llite: use delay RPC for glimpse after all mirrors
__cl_glimpse_size() retries a glimpse while fast-switching FLR
mirrors, and forces io->ci_ndelay = 1 on every iteration so that the
glimpse lock is enqueued with a non-delay RPC (LDLM_FL_NDELAY). When
the OST import is not connected, osc_lock_upcall() turns the enqueue
failure into -EAGAIN so the caller can try the next mirror.
Commit 4468f6c9d924 ("LU-16025 llite: adjust read count as file got
truncated") bounded that retry loop with ci_tried_all_mirrors to avoid
an endless restart on a concurrent truncate. But once
ci_tried_all_mirrors is set the loop gives up and returns -EAGAIN to
userspace while io->ci_ndelay is still forced to 1, so the glimpse
never gets a chance to use a delay RPC that waits for the import to
reconnect. Right after a client remount the OST imports are still
connecting, so a stat() on an FLR file fails with EAGAIN after only a
few mirror rounds instead of waiting for the connection, e.g. in
sanity-flr test_44d.
Stop forcing non-delay RPCs once all mirrors have been tried, and
allow one more restart so the glimpse is retried with a delay RPC
(ci_ndelay == 0) that waits for the imports to reconnect. The
LU-16025 bound is kept: a delay RPC no longer returns the ndelay
-EAGAIN, so the loop still terminates on a concurrent truncate.
Test-Parameters: testlist=sanity-flr env=ONLY=44d,ONLY_REPEAT=10
Fixes: 4468f6c9d924 ("LU-16025 llite: adjust read count as file got truncated")
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Assisted-by: Augment Agent:DeepSeek V4.1 Flash
Change-Id: I22bdf5384e3936aa6d6e606010e8e1e43c049707
10427
master
J –B ✓T ✓R 0/2
LU-2522 ptlrpc: add more request flags in log
stalled 457d
S +37 −10
457d
LU-2522 ptlrpc: add more request flags in log
stalled 457d
S +37 −10
457d
no vote yet: Amir Shehata
owner Zhenyu Xu · uploader Zhenyu Xu · PS3 uploaded 3850d ago · NEW · open in Gerrit ↗
commit message
LU-2522 ptlrpc: add more request flags in log Add request::rq_receiving_reply and ::rq_req_unlinked and ::rq_reply_unlinked status in its log message to help debug the issue. Signed-off-by: Bobi Jam <bobijam.xu@intel.com> Change-Id: I694a59b83d9923c968843ceb21e150e3551d9507
16814
master
J –B ✓T ✓R 0/2
LU-7287 clio: osc_cache_shrink_scan() unsafe
stalled 457d
S +10 −10
457d
LU-7287 clio: osc_cache_shrink_scan() unsafe
stalled 457d
S +10 −10
457d
no vote yet: Andreas Dilger, Alex Zhuravlev
owner Zhenyu Xu · uploader Zhenyu Xu · PS5 uploaded 3613d ago · NEW · open in Gerrit ↗
commit message
LU-7287 clio: osc_cache_shrink_scan() unsafe In osc_cache_shrink_scan(), the stop_anchor could be removed from the list, and results in a infinite scan loop. This patch adds shrink osc device counter and makes osc_cache_shrink_scan() stops when enough osc device has been scanned. Signed-off-by: Bobi Jam <bobijam.xu@intel.com> Change-Id: Id70d5df990fc6a8f27ac71ac9defd04a5cd4b765
▶Ready to land
(3)
69680
master
J –B ✓T ✓R +2/2
LU-20935 osc: fix decryption of a page with a sub-page hole
all green — ready to land (not in master-next yet)
pw_shepherd
3 unresolved
M +45 −20
11h
LU-20935 osc: fix decryption of a page with a sub-page hole
all green — ready to land (not in master-next yet)
pw_shepherd
3 unresolved
M +45 −20
11h
all green — ready to land (not in master-next yet)
3 reviewer comment(s) to address if a respin is needed — last from Andreas Dilger
build #133819 SUCCESS · tests all Maloo sessions
reviews:
Andreas Dilger +1 · Sebastien Buisson +1
no vote yet: Artem Blagodarenko, Patrick Farrell
patchsets:
PS1 10-14
PS2 10-15
PS3 10-16
threads: 3 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Andreas Dilger file.c:573 — (style) 82 columns, flagged by checkpatch on each patchset. Something like:
Andreas Dilger
(style) 82 columns, flagged by checkpatch on each patchset. Something like:
```
if (is_empty_folio(folio, pgno, offs, unit)) {
```
with a local "const unsigned int unit = LUSTRE_ENCRYPTION_UNIT_SIZE;" would also shorten the decrypt call below.
reply Andreas Dilger osc_request.c:2381 — (suggestion) This loop and its comment are now repeated in osc, DoM (file.c) and, with 66481 ("LU-12669 ec: fix EC recovery read for encrypt
Andreas Dilger
(suggestion) This loop and its comment are now repeated in osc, DoM (file.c) and, with 66481 ("LU-12669 ec: fix EC recovery read for encrypted files"), in lov_io.c for EC recovery. A static inline in lustre_crypto.h, e.g.
```
static inline int ll_decrypt_pagecache_folio(struct folio *folio, size_t pgno)
```
that decrypts each non-empty unit and clears PagePrivate2 only when the whole page is empty, could replace the page-cache copies so a later change to the hole handling can't miss one. Fine as a follow-up if you prefer to keep this patch as is.
reply Andreas Dilger sanity-sec.sh:5992 — (suggestion) Moving the punch from unit 1 to unit 0 drops the mid-page hole case that actually failed on the 64KiB clients in master-next (d
Andreas Dilger
(suggestion) Moving the punch from unit 1 to unit 0 drops the mid-page hole case that actually failed on the 64KiB clients in master-next (data unit, hole, data units). Both pass with this patch on a 16KiB client, so it would be good to keep both, e.g. punch unit 0 and unit 2 and zero both in $reffile.
tags: pw_shepherd
owner Zhenyu Xu · uploader Zhenyu Xu · PS3 uploaded 20d ago · NEW · open in Gerrit ↗
commit message
LU-20935 osc: fix decryption of a page with a sub-page hole
A client whose PAGE_SIZE is larger than
LUSTRE_ENCRYPTION_UNIT_SIZE (4KB), for instance aarch64
with 64KB pages, could read a file with a hole smaller
than a page and get back ciphertext: the units after the
hole were returned to userspace still encrypted.
osc_brw_fini_request() decrypts a page one encryption unit
at a time and stopped at the first all-zero unit, on the
assumption that a zero unit means the whole page is a hole.
A punch hole only has to be aligned to
LUSTRE_ENCRYPTION_UNIT_SIZE, so on a 64KB page it can zero
a single unit in the middle of the page and leave the
following units as valid ciphertext. Those units were never
decrypted.
This is not specific to a punch done by the same client. A
sparse write from a 4KB-page client does it too: it writes
one file page and leaves the units before it unallocated on
the OST, because osc_brw_prep_request() widens an encrypted
write to start at the writer's own page boundary. A
64KB-page client reading that range then sees a hole
followed by data and hits the same break. The loop
predates the rejection of unaligned punches.
Skip the zero unit (leave it as zeros) and keep decrypting
the rest of the page.
This also changes ll_io_zero_page() for a page whose first
unit is a hole and whose later units hold data. Such a page
no longer clears PagePrivate2, so an encrypted truncate that
lands inside it now zeroes and rewrites the page, instead of
skipping that step and leaving the page cached with none of
its units decrypted. PagePrivate2 is still cleared when the
whole page is a hole, so that case is unchanged.
The same loop is fixed in do_dom_read_folio() for the DoM
read path and in the PCC-RO read path in pcc.c.
Test-Parameters: testlist=sanity-sec env=ONLY=48c clientarch=aarch64 clientdistro=rocky9.5
Fixes: ac5fcdce025b ("LU-12275 sec: encryption with different client PAGE_SIZE")
Fixes: 9e37963fa0 ("LU-10499 sec: support of PCC-RO for encrypted files")
Assisted-by: Augment Agent:DeepSeek V4.1 Flash
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: I98c0e8ad6a4e8118d5b9241576995e411ee16273
69614
master
J –B ✓T ✓R +2/2
LU-20935 llite: reject unaligned punch on encrypted files
all green — queued for landing (master-next)
pw_shepherd
master-next
2 unresolved
M +68 −0
11h
LU-20935 llite: reject unaligned punch on encrypted files
all green — queued for landing (master-next)
pw_shepherd
master-next
2 unresolved
M +68 −0
11h
all green — queued for landing (master-next)
2 reviewer comment(s) to address if a respin is needed — last from Oleg Drokin
build #133757 SUCCESS · tests all Maloo sessions
reviews:
Keguang Xu +1 · Sebastien Buisson +1
no vote yet: Oleg Drokin
patchsets:
PS1 10-12
PS2 10-14
PS3 10-15
threads: 2 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Oleg Drokin patchset comment — sanity-sec test_48c, added by this patch, fails on an aarch64 64KiB PAGE_SIZE
Oleg Drokin
sanity-sec test_48c, added by this patch, fails on an aarch64 64KiB PAGE_SIZE
client in lustre-master-next 1020 ("aligned punch corrupted file"), while it
passes on all 56 x86_64 sessions:
https://testing.whamcloud.com/test_sets/ca88e97b-1aa8-4d19-8042-a44ab2eee271
The aligned 4KiB punch lands inside a single 64KiB page, which needs the
sub-page hole decryption fix in 69680, and 69680 is not in this -next build.
Please make this change depend on 69680, or skip 48c when PAGE_SIZE > 4096
until 69680 lands.
reply Keguang Xu sanity-sec.sh:5995 — could use stack_trap to remove these files? if a refresh later needed
Keguang Xu
could use stack_trap to remove these files? if a refresh later needed
tags: pw_shepherd
owner Zhenyu Xu · uploader Zhenyu Xu · PS3 uploaded 21d ago · NEW · open in Gerrit ↗
commit message
LU-20935 llite: reject unaligned punch on encrypted files
An encrypted file is stored on the OST as ciphertext, one whole
LUSTRE_ENCRYPTION_UNIT_SIZE (4KB) encryption unit at a time, and the
client encrypts and decrypts a whole unit at once. ll_fallocate()
already refuses FALLOC_FL_COLLAPSE_RANGE, FALLOC_FL_INSERT_RANGE and
FALLOC_FL_ZERO_RANGE on encrypted files (LU-12275), but it still
forwarded fallocate(FALLOC_FL_PUNCH_HOLE) with an offset or length
that is not aligned to the encryption unit to the OST.
For such a partial-unit punch the OST only clears the requested byte
sub-range of the ciphertext unit and leaves the rest of the unit
intact. A later read decrypts the whole unit, so a partially zeroed
ciphertext unit decrypts to garbage: both the punched bytes and the
bytes around them are silently corrupted on disk, and the corruption
is visible from another client that has the key. Page-aligned punches
are unaffected.
Refuse a punch that is not aligned to LUSTRE_ENCRYPTION_UNIT_SIZE on
an encrypted file with -EOPNOTSUPP, instead of corrupting the file.
Add sanity-sec test_48c to check that an unaligned punch is refused
and leaves the file unchanged, and that an aligned punch zeroes
exactly the requested encryption unit and no more.
Test-Parameters: testlist=sanity-sec env=ONLY=48c
Fixes: cb037f305c ("LU-14160 fallocate: Add punch mode to fallocate")
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: Ieaf7c3d2dbdc4303744dc6b2f4c808e53124bc40
55851
b2_15
J !B ✓T ✓R +1/1
LU-15486 lod: mirroring a plain file in mirrored-layout dir
all green — ready to land (not in b2_15-next yet)
LTS15
stalled 814d
S +36 −1
814d
LU-15486 lod: mirroring a plain file in mirrored-layout dir
all green — ready to land (not in b2_15-next yet)
LTS15
stalled 814d
S +36 −1
814d
janitor run: 1 failing config(s), none unique to this patch — janitor results
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-zfs-part-2 | RHEL 8.9/x86_64 | ran 7 tests. 1 tests failed: replay-dual. | session |
| review-dne-zfs-part-4 | RHEL 8.9/x86_64 | ran 9 tests. 1 tests failed: sanity-quota. | session |
2 optional test failure(s) — informational
build #106765 SUCCESS · tests all Maloo sessions
reviews:
Andreas Dilger +1
no vote yet: Alex Zhuravlev, Oleg Drokin
patchsets:
PS1 07-24
PS2 07-29
owner Zhenyu Xu · uploader Zhenyu Xu · PS2 uploaded 829d ago · NEW · backport · open in Gerrit ↗
commit message
LU-15486 lod: mirroring a plain file in mirrored-layout dir
If a file does not have a mirror in a directory with a default FLR
mirror, then "lfs mirror extend" on the file fails with
"cannot create volatile file: Invalid argument".
This comes from the the non-striped file layout generated from
LOD inheriting its FLR state from the default FLR while it contains
no mirror in it, and lov_init_composite() will complain about it.
if (equi(flr_state == LCM_FL_NONE, comp->lo_mirror_count > 1))
RETURN(-EINVAL);
Lustre-change: https://review.whamcloud.com/46517
Lustre-commit: 8005a374cac2ba726a88cec3c1bb331fc96153a1
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: I5e849acb2327ce735d0008271bfd48fa7293161c
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Reviewed-by: Alex Zhuravlev <bzzz@whamcloud.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
▶Parked (WIP / self-blocked)
(0)
nothing here right now
Carrying — uploaded by me, owned by others
32 open▶Failed / broken
(19)
65737
master
J –B ✓T ✗2R -1/2−
LU-10026 csdc: set compress component for file
cc Marc Vef · needs rebase — checkpatch: cannot be cherry-picked
needs rebase
csdc
14 unresolved
XL +1163 −16
14d
LU-10026 csdc: set compress component for file
cc Marc Vef · needs rebase — checkpatch: cannot be cherry-picked
needs rebase
csdc
14 unresolved
XL +1163 −16
14d
needs rebase — checkpatch: cannot be cherry-picked
enforced failed: custom-1001, review-dne-part-7
14 unresolved thread(s) await your reply — last from Gerrit AI review for Lustre
| failed enforced test | platform | detail | |
|---|---|---|---|
| custom-1001 | RHEL 9.7 / x86_64 | ran 3 tests. 1 tests failed: sanity-pfl. | session |
| review-dne-part-7 | RHEL 9.8 / x86_64 | ran 6 tests. 1 tests failed: sanity-pcc. | session |
build #132858 SUCCESS · tests all Maloo sessions
no vote yet: James Simmons, Roman Bolshakov, Andreas Dilger, Artem Blagodarenko
patchsets:
PS11 08-19 Artem Blagodarenko
PS12 08-20 Artem Blagodarenko
PS13 08-20 Artem Blagodarenko
PS14 08-21 Artem Blagodarenko
PS15 10-05 Roman Bolshakov
+10 earlier
PS1 05-07 PS2 05-07 PS3 05-28 PS4 05-28 PS5 06-11 PS6 06-11 PS7 06-16 Artem Blagodarenko PS8 06-16 Artem Blagodarenko PS9 07-24 Artem Blagodarenko PS10 08-19 Artem Blagodarenkothreads: 14 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Gerrit AI review for Lustre COMMIT_MSG:56 — (minor) The body doesn't mention the client-side gate added by squashing Ib1e2123ff: the new lustre_check_lov_user_md() and lustre_check_lov
Gerrit AI review for Lustre
(minor) The body doesn't mention the client-side gate added by squashing Ib1e2123ff: the new lustre_check_lov_user_md() and lustre_check_lov_comp_md_v1() in ptlrpc/pack_generic.c, and their calls from ll_lov_setstripe_ea_info() and ll_xattr_set(). These reject a compress layout when `llite.*.enable_compression=0`, which is a user-visible behaviour change. Could a short paragraph describing them be added?
reply Artem Blagodarenko patchset comment — Hi Andreas. Thanks for poining to this. I have reverted all fixed by Patchset 11 pushing wrong branch. I have reverted to Patchset 10 where
Andreas Dilger
@ablagodarenko@thelustrecollective.com it looks like the patches were rebased, but did not address any of the AI review comments? While we can't go overboard changing every detail of the patches, I think it does make sense to fix the code where possible so that we don't carry technical debt later.
Artem Blagodarenko
Hi Andreas. Thanks for poining to this. I have reverted all fixed by Patchset 11 pushing wrong branch. I have reverted to Patchset 10 where I addressed AI bot comments and fixed build.
reply Roman Bolshakov patchset comment — Squashed Ib1e2123ffdb239c3e1401d682ae9c2c49e3f4a6f into the change. I'll address a couple more comments in another push.
Roman Bolshakov
Squashed Ib1e2123ffdb239c3e1401d682ae9c2c49e3f4a6f into the change. I'll address a couple more comments in another push.
reply Andreas Dilger lfs-getstripe.1:331 — Should be fixed if patch is refreshed.
Gerrit AI review for Lustre
(minor) There is no `.TP` before this entry, so `--compress-type|--compr-type` and its description get folded into the `-z, --extension-size` paragraph above instead of starting their own tagged item. The two entries below it do have theirs.
Oleg Drokin
weird but in my man output it looks ok.
Artem Blagodarenko
The entry was missing its .TP in the troff source. Some man implementations are lenient and reflow correctly, but others fold the entry into the previous paragraph. Added .TP for correctness.
Artem Blagodarenko
Done. Added the missing .TP before the --compress-type|--compr-type entry.
Andreas Dilger
Should be fixed if patch is refreshed.
reply Gerrit AI review for Lustre llapi_layout_compress_set.3:105 — (minor) Neither of the two new man3 pages has an EXAMPLES section. Lustre llapi pages are expected to carry a short usage example showing th
Gerrit AI review for Lustre
(minor) Neither of the two new man3 pages has an EXAMPLES section. Lustre llapi pages are expected to carry a short usage example showing the required header and a realistic call.
reply Gerrit AI review for Lustre llapi_layout_compress_set.3:71 — (minor) This, and the matching EINVAL entry under ERRORS, says a `stripe_size` that is not a multiple of `chunk_size` is an error. llapi_lay
Gerrit AI review for Lustre
(minor) This, and the matching EINVAL entry under ERRORS, says a `stripe_size` that is not a multiple of `chunk_size` is an error. llapi_layout_compress_set() never fails for that: it decrements `log_bits` until the chunk divides the stripe and stores the smaller chunk (sanity-pfl test_100c expects 3*64KiB to become 128KiB). Similarly, gzip/lz4/lz4fast levels outside the listed ranges are clamped by their from_*_level() helpers, not rejected with EINVAL as the text above says (test_100c expects gzip:15 to read back as 9). If the patch is refreshed, could the page describe the rounding and clamping instead?
reply Gerrit AI review for Lustre llapi_parse_compress_type.3:62 — (minor) llapi_parse_compress_type() also returns -EINVAL - for a level that isn't a valid number or falls outside +/-COMPR_LEVEL_MAX - which
Gerrit AI review for Lustre
(minor) llapi_parse_compress_type() also returns -EINVAL - for a level that isn't a valid number or falls outside +/-COMPR_LEVEL_MAX - which neither RETURN VALUES nor ERRORS mentions. Mixing -1 with -Exxx returns in one function is also awkward for callers; would returning -EINVAL for the unknown-type case be more consistent?
reply Gerrit AI review for Lustre lustreapi.h:1457 — (minor) The 9 used as the lz4 default collides with a real level. from_lz4_level(10) returns 9, and to_lz4_level(9) returns 9 because 9 == L
Gerrit AI review for Lustre
(minor) The 9 used as the lz4 default collides with a real level. from_lz4_level(10) returns 9, and to_lz4_level(9) returns 9 because 9 == LZ4HC_DEFAULT_CLEVEL, so 'lfs setstripe -Z lz4:10' reports back as lz4:9 and level 10 can never be displayed - even though lfs-setstripe.1 documents 1-16 as the valid lz4 range.
reply Gerrit AI review for Lustre file.c:2838 — (defect) This gate runs only for regular files: ll_lov_setstripe_ea_info(), and the `lov.` branch in ll_xattr_set(). A directory default goe
Gerrit AI review for Lustre
(defect) This gate runs only for regular files: ll_lov_setstripe_ea_info(), and the `lov.` branch in ll_xattr_set(). A directory default goes through ll_setstripe_ea() -> ll_dir_setstripe() (and the LL_IOC_LOV_SETSTRIPE case in ll_dir_ioctl()), which never calls lustre_check_lov_user_md(). So on a client with `enable_compression=0`:
lfs setstripe -E eof -Z lz4 $dir # accepted
touch $dir/f # MDS instantiates a compress layout
This still produces a file the client can't handle. lsm_lmm_verify_v1v3() rejects it with "file compression not enabled", and the PS14 report shows a later unlink or stripe change hitting the lov_io_layout_at() LBUG. Should ll_dir_setstripe() apply the same check? Or, if allowing compressed defaults on a disabled client is intended, should the client reject the layout cleanly instead of asserting?
reply Gerrit AI review for Lustre xattr.c:425 — (defect) On this `lov.` path nothing validates `size` before lustre_check_lov_user_md() walks the entries. lustre_check_lov_comp_md_v1() rea
Gerrit AI review for Lustre
(defect) On this `lov.` path nothing validates `size` before lustre_check_lov_user_md() walks the entries. lustre_check_lov_comp_md_v1() reads `lcm_entry_count` and then up to 65535 `lcm_entries[]`, but the buffer here is only the `size` bytes copied in by the VFS.
The `lustre.` xattr namespace needs only write permission on the inode, so any file owner can trigger it:
setxattr(f, "lustre.lov.add", buf, 8, 0); /* buf starts with LOV_USER_MAGIC_COMP_V1 */
That reads lcm_entry_count past the end of an 8-byte allocation and keeps reading for up to ~3MB. KASAN reports it as slab-out-of-bounds. Before this patch, little-endian clients only read `lmm_magic` here.
The next change in the series ("utils: add 'lfs find' support for compressed file") adds a `size < need` check just above this call. Since this patch introduces the read, should that check move here? Passing `size` into lustre_check_lov_user_md(), the way lustre_swab_lov_user_md() takes one, would also let it validate the buffer itself.
reply Gerrit AI review for Lustre lod_qos.c:3191 — (minor) This applies the chunk adjustment to every component including extension ones, where llc_stripe_size holds the extension size rather
Gerrit AI review for Lustre
(minor) This applies the chunk adjustment to every component including extension ones, where llc_stripe_size holds the extension size rather than a real stripe size. lod_declare_layout_add() deliberately skips LCME_FL_EXTENSION components for exactly that reason, so the same input layout gets different chunk_lum_bits depending on whether it arrives via create or via --component-add. Should this site skip extension components as well? While there: the comment added in lod_declare_layout_add() says chunk adjustment is deferred until instantiation, but nothing calls lod_adjust_compr_chunk_size() on the instantiation path - the only three callers are here, lod_declare_layout_add() and lod_striping_from_default().
reply Gerrit AI review for Lustre pack_generic.c:2672 — (defect) -ENOTSUPP (524) is kernel-internal and has no userspace errno, so this reaches `lfs setstripe` through ioctl()/setxattr() as "Unkno
Gerrit AI review for Lustre
(defect) -ENOTSUPP (524) is kernel-internal and has no userspace errno, so this reaches `lfs setstripe` through ioctl()/setxattr() as "Unknown error 524". The erasure-coding check just above it in ll_lov_setstripe_ea_info() returns -EOPNOTSUPP for the same kind of rejection. Should this be -EOPNOTSUPP too? While here, a couple of nits: `rc` is never changed from 0, there's a double blank line after the EXPORT_SYMBOL(), and the default case in lustre_check_lov_user_md() logs "Invalid LOV magic" but still returns 0.
tags: csdc
owner Marc Vef · uploader Roman Bolshakov · PS15 uploaded 30d ago · NEW · open in Gerrit ↗
commit message
LU-10026 csdc: set compress component for file
Introduce per-component compression support for composite LOV layouts.
A new LCME_FL_COMPRESS component flag marks entries that carry
compress fields; the flag is set when the user supplies a compression
type via 'lfs setstripe -Z' and is propagated through the LOD and LOV
layers so that compressed components are distinguished from plain
ones.
LOD layer:
- lod_parse_striping(): read lcme_compr_type/lvl/chunk_lum_bits from
the user-supplied lov_comp_md_v1 when LOV_PATTERN_COMPRESS is set.
- lod_use_defined_striping(): likewise for pre-defined layouts.
- lod_get_default_lov_striping(): carry compress fields into the LOD
component when inheriting a default layout that includes
compression.
- lod_generate_lovea(): serialise llc_compr_* fields into the on-wire
lcm entry when LOV_PATTERN_COMPRESS is set.
- lod_adjust_compr_chunk_size(): new helper that rounds down the
requested chunk-size exponent so the chunk fits evenly within one
stripe and within one RPC (clamped to COMPR_CHUNK_MAX_BITS in the
following changes).
API / utils layer:
- 'lfs setstripe' gains --compress|-Z <type>[:<level>] and
--compress-chunk=<size> options to set the compression type, level,
and chunk size on a new component. Like -S and -c, -Z is inherited
by subsequent -E components unless overridden by another -Z.
Example:
$ lfs setstripe -Eeof -Z lz4:5 --compress-chunk=512 <file>
- 'lfs getstripe' gains --compress-type, --compress-level, and
--compress-chunk options to print individual compress parameters:
Example:
$ lfs getstripe <file>
lcme_compr_type: lz4
lcme_compr_lvl: 5
lcme_compr_chunk_kb: 512
lmm_pattern: raid0,compress
- llapi_layout_merge(): copy compress fields when merging layouts.
- Two new man3 pages: llapi_layout_compress_set.3 and
llapi_parse_compress_type.3.
Misc:
- dump_lsm() in lov_ea.c prints compress fields for debugging.
- compr_name_from_type() helper added in lov_internal.h and wired up
in dump_lsm() to print compression type names in debug output.
Test-Parameters: testlist=sanity-pfl serverversion=2.17
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Signed-off-by: Artem Blagodarenko <ablagodarenko@ddn.com>
Signed-off-by: Marc Vef <mvef@whamcloud.com>
Signed-off-by: Roman Bolshakov <rbolshakov@ddn.com>
Change-Id: Ife0382469cbc5099e0c6dc96534bb169ddeff61e
Was-Change-Id: Ib1e2123ffdb239c3e1401d682ae9c2c49e3f4a6f
68788
master
J ✓B ✗T –R 0/2
LU-10026 tests: compression component via --component-add
reviewing Marc Vef · build failure (#131544)
csdc
1 unresolved
S +15 −0
55d
LU-10026 tests: compression component via --component-add
reviewing Marc Vef · build failure (#131544)
csdc
1 unresolved
S +15 −0
55d
build failure (#131544)
1 unresolved thread(s) await your reply — last from Marc Vef
build #131544 FAILURE
threads: 1 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Marc Vef patchset comment — [Marc Bot] upstream remarks for reference:
Marc Vef
[Marc Bot] upstream remarks for reference: The lod fix this test was written for is already on master (90c093b7850, LU-17468); only the sanity-compr test_1a part was unlanded - ported under a new Change-Id with the original as Was-Change-Id.
tags: csdc
owner Marc Vef · uploader Marc Vef · PS1 uploaded 55d ago · NEW · open in Gerrit ↗
commit message
LU-10026 tests: compression component via --component-add
Add sanity-compr test_1a: create a file with a plain first component,
append a compressed component with "lfs setstripe --component-add
-Z gzip" and verify the added component carries the compression
type. This covers the compression branch of the component-add path
in lod_declare_layout_add().
The lod fix this test was written for is already on master as
commit 90c093b7850 ("LU-17468 lod: component add missed pattern
info"); only the test part is new here.
Test-Parameters: forjanitoronly
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Signed-off-by: Marc Vef <mvef@whamcloud.com>
Was-Change-Id: I7ad746a550f1afea54a6f5b68823a79a85a44082
Change-Id: I0624bf3f5f9c965f826e72656a8cd8198c5624fd
68389
master
J !B ✗T –R 0/2
LU-10026 csdc: inherit CSDC params unless overriden
reviewing Marc Vef · build failure (#130361)
csdc
1 unresolved
L +258 −25
68d
LU-10026 csdc: inherit CSDC params unless overriden
reviewing Marc Vef · build failure (#130361)
csdc
1 unresolved
L +258 −25
68d
build failure (#130361)
1 unresolved thread(s) await your reply — last from Marc Vef
janitor run: 7 failing config(s), none unique to this patch — janitor results
build #130361 FAILURE
threads: 1 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Marc Vef patchset comment — [Marc Bot] upstream remarks for reference:
Marc Vef
[Marc Bot] upstream remarks for reference:
- Rewritten onto the current naming: LL_COMPR_TYPE_SPEC_NONE = 9 added (MAX moves to 10); wire asserts extended accordingly (this tree carries LL_COMPR_TYPE_MAX asserts the original did not have).
- compr_type_table: the NONE row loses its name, SPEC_NONE row ("none") added before the MAX sentinel - the compress_type_2str()/parse helpers were already in the matching form.
- The inheritance-hint struct uses cd_compr_chunk_lum_bits with this series' lum-bits semantics (offset above COMPR_CHUNK_MIN_BITS - no +16 at use sites), and lod_adjust_compr_chunk_size() is called in its take-by-value/return-by-value form.
- lod_qos_parse_config: the convert_plain arm skips all lcme-derived assignments including fields this tree has that the original context did not (llc_mirror_link_id, llc_dstripe_count, llc_cstripe_count).
- SPEC_NONE clearing blocks in lod_parse_striping/lsm_unpackmd applied at the current field naming.
- test_1000d version gate converted to compression_supported.
tags: csdc
owner Marc Vef · uploader Marc Vef · PS1 uploaded 70d ago · NEW · open in Gerrit ↗
commit message
LU-10026 csdc: inherit CSDC params unless overriden If a parent directory has been set CSDC parameters, the file created under it needs to inherit the CSDC parameters unless another CSDC parameters or an empty CDSC has been specified for a component of the file. The file create method includes touch, setstripe a plain layout file, or setstripe a composite layout file. As "-Z none" would be used to set compression type to 0 and server would treat it as no CSDC parameters has been set, so "-Z none" can not be used to stop inherit parent directory's CSDC inheritance, so this patch introduces another compression type LL_COMPR_TYPE_SPEC_NONE to associate with "none" compresstion type, and it can be used to stop the CSDC inheritance from parent directories, when user uses "-Z none" to reset compression type, this patch would set the compression type to LL_COMPR_TYPE_SPEC_NONE. If we use patched new client to create a file with "-Z none" upon old servers, the old servers cannot recognize this new LL_COMPR_TYPE_SPEC_NONE compression type, and it just records the type as is in the layout. On old clients "lfs getstripe" will show "unknown" to the component's lcme_compr_type, and on new clients, "lfs getstripe" will show "none" to the lcme_compr_type. When we write data to this file, both clients work but with different behavior. On old client, with "unknown" compression type, it chooses a fallback algorithm to compress the data, twisting the original intention not to compress the component; while on new client, it will treat "none" component as uncompressed one as intended. Test-Parameters: forjanitoronly DDN-bug-id: EX-10201 Signed-off-by: Bobi Jam <bobijam@whamcloud.com> Signed-off-by: Marc Vef <mvef@whamcloud.com> Change-Id: Ibbdb3f6489cf7e19bfebe075bf88580f39ed79e4
68410
master
J !B ✗T –R 0/2
LU-10026 llite: issue compressiblity change in workqueue
reviewing Marc Vef · build failure (#130382)
csdc
3 unresolved
M +118 −56
68d
LU-10026 llite: issue compressiblity change in workqueue
reviewing Marc Vef · build failure (#130382)
csdc
3 unresolved
M +118 −56
68d
build failure (#130382)
3 unresolved thread(s) await your reply — last from Marc Vef
janitor run: 7 failing config(s), none unique to this patch — janitor results
build #130382 FAILURE
no vote yet: Artem Blagodarenko
threads: 3 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Marc Vef patchset comment — [Marc Bot] upstream remarks for reference:
Marc Vef
[Marc Bot] upstream remarks for reference: The test_1021 tweaks (sleeps, echo moves) re-applied against the unwrapped assertion blocks; ci_need_change_layout renamed as in the original.
reply Misc Code Checks Robot (Gatekeeper helper) vvp_io.c:292 — warn: vvp_layout_minor_change():passing zero to 'ERR_CAST'
Misc Code Checks Robot (Gatekeeper helper)
warn: vvp_layout_minor_change():passing zero to 'ERR_CAST'
reply Misc Code Checks Robot (Gatekeeper helper) vvp_io.c:294 — error: vvp_layout_minor_change():'vlcw' dereferencing possible ERR_PTR()
Misc Code Checks Robot (Gatekeeper helper)
error: vvp_layout_minor_change():'vlcw' dereferencing possible ERR_PTR()
tags: csdc
owner Marc Vef · uploader Marc Vef · PS1 uploaded 70d ago · NEW · open in Gerrit ↗
commit message
LU-10026 llite: issue compressiblity change in workqueue This patch uses kernel-global workqueue to handle the file's minor layout change RPC equest. At vvp_io_fini() when it find that the file's compressibility should be changed, it creates a work and insert the request to the kernel workqueue. This would prevent the layout minor change RPC issued from within an IO, and it could avoid the possible double lock the LOV conf lock. lov: replace switch compressibility The switch compressibility flag results in weird behavior - it tells us we are to flip what's there, but results in some very hard to read code. I *think* the existing code is probably correct in absence of race conditions, but an instruction to "flip" rather than set is very confusing and could easily do the wrong thing if there's a race which changes the compressibility value. Replace it with two explicit bit flags. DDN-bug-id: EX-10857 Was-Change-Id: I3b1d9f8d635e0bdbe67d5806127727a7264d26be Singed-off-by: Artem Blagodarenko <ablagodarenko@ddn.com> Test-Parameters: forjanitoronly DDN-bug-id: EX-10857 Signed-off-by: Patrick Farrell <pfarrell@whamcloud.com> Signed-off-by: Bobi Jam <bobijam@whamcloud.com> Signed-off-by: Artem Blagodarenko <ablagodarenko@ddn.com> Signed-off-by: Marc Vef <mvef@whamcloud.com> Change-Id: Ic4345b1387288ab11ce9061f40b056b07cb976bf
68368
master
J !B ✗T –R 0/2
LU-10026 csdc: tune allowed compression type on server
reviewing Marc Vef · build failure (#130343)
csdc
1 unresolved
L +258 −18
68d
LU-10026 csdc: tune allowed compression type on server
reviewing Marc Vef · build failure (#130343)
csdc
1 unresolved
L +258 −18
68d
build failure (#130343)
1 unresolved thread(s) await your reply — last from Marc Vef
janitor run: 8 failing config(s), none unique to this patch — janitor results
build #130343 FAILURE
threads: 1 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Marc Vef patchset comment — [Marc Bot] upstream remarks for reference:
Marc Vef
[Marc Bot] upstream remarks for reference: - The patch re-created a libcfs_string.h/.c pair to host string-mask helpers; master already provides cfs_str2mask()/cfs_mask2str() with u64 masks (lnet/libcfs/debug.c), so both files were dropped and the new compress_types stores call the existing helper (~0ULL masks). A hunk that narrowed the existing capability-mask store from ~0ULL to ~0 was dropped for the same reason. - mdt.*.compress_types and obdfilter.*.compress_types are implemented as sysfs attributes (the target-side procfs vars tables the original patch extended no longer exist on master). - The obd_compress_types mask enum / COMPRESS_NAMES use the series' type naming (lz4 for the HC type) and already include zstd, which is a valid layout type at this point in the series. - OST-side only, as in the original: OBD_CONNECT2_COMPRESS is advertised in OST_CONNECT_SUPPORTED2 and requested by the OSC; MDT enabling remains pending (test_1013b keeps its unconditional skip; its old-version negative-check block, meaningless on master, was dropped). - compression_supported() in test-framework.sh now probes the OSC import for the compressed_file connect flag instead of comparing versions. (The OSC import, not the MDC one, because MDT support is not enabled.) - test_1013a/b were placed before test_1015 (the tests they were anchored to arrive later in the series).
tags: csdc
owner Marc Vef · uploader Marc Vef · PS1 uploaded 70d ago · NEW · open in Gerrit ↗
commit message
LU-10026 csdc: tune allowed compression type on server
Use lctl get_param {mdt|obdfiler}.*.compress_types to list supported
compression types on server.
Use lctl set_param {mdt|obdfilter}.*.compress_types="+gzip-lzo" to
add gzip to and delete lzo from existing compression types on server.
Server will negotiate supported compression types with client in
ocd_compress_types and client import stats could show the negotiated
supported compression types in "lctl get_param {mdc|odc}.*.import"
connect_data section:
import:
....
connect_data:
....
compress_types: [ fast,best,gzip,lz4fast,lz4hc,lzo ]
The OST support for the connect flags is enabled in this patch, but
MDT enabling is pending unaligned compression support for DoM files.
test: refine sanity-compr.sh/test_0a
Only change and verify compression types negotiation between client
and OST0000.
DDN-bug-id: EX-9802
Was-Change-Id: I307f3826973f48791b7fbf4cdfa121401b059b0e
Was-Change-Id: Ic22685d2b21e872c01d90f2c3062b5d0d9b92ec2
test: sanity-compr.sh/test_0a failure
* move sanity-compr.sh test_0a/test_0b to test_1013a/test_1013b
* explicitly specify client's hostname to get client's negotiated
compression types, as test environtment could mount several clients
DDN-bug-id: EX-9802
Was-Change-Id: Ic091f55a59ad9cfdaf3a94a58d44b372070c7875
Test-Parameters: forjanitoronly
DDN-bug-id: EX-6269
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Signed-off-by: Marc Vef <mvef@whamcloud.com>
Change-Id: I18943352e25ed9d5fe82442df9f00a7ef388f242
68374
master
J ✗2B ✗T –R 0/2
LU-10026 csdc: store compression info in FID EA
reviewing Marc Vef · build failure (#130348)
2 unique failures
csdc
1 unresolved
M +37 −65
68d
LU-10026 csdc: store compression info in FID EA
reviewing Marc Vef · build failure (#130348)
2 unique failures
csdc
1 unresolved
M +37 −65
68d
build failure (#130348)
janitor: 2 test failures unique to this patch — sanity-pfl@ldiskfs+DNE:test_100b, sanity-quota@ldiskfs+DNE:test_80
1 unresolved thread(s) await your reply — last from Marc Vef
janitor flagged test failures unique to this patch — full janitor results
| unique failing test | history |
|---|---|
| sanity-pfl@ldiskfs+DNE:test_100b | seen in 4 other reviews |
| sanity-quota@ldiskfs+DNE:test_80 | seen in 73 other reviews |
build #130348 FAILURE
threads: 1 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Marc Vef patchset comment — [Marc Bot] upstream remarks for reference:
Marc Vef
[Marc Bot] upstream remarks for reference: Applied cleanly. Note for reviewers: this changes where the PFID EA is stored for small inodes (no longer embedded in LMA for <=256-byte inodes) - needs interop/lfsck review on master.
tags: csdc
owner Marc Vef · uploader Marc Vef · PS1 uploaded 70d ago · NEW · open in Gerrit ↗
commit message
LU-10026 csdc: store compression info in FID EA Store compression information in OST-object's FID EA, and lfsck could use it to recover the MDT-object layout EA from orphan OST-object(s). 2.15 Lustre may embed PFID and layout stripe info in LMA EA, this patch would clear them from LMA EA and store them with compression info directly into FID EA thereafter. Test-Parameters: forjanitoronly DDN-bug-id: EX-8038 Signed-off-by: Bobi Jam <bobijam@whamcloud.com> Signed-off-by: Marc Vef <mvef@whamcloud.com> Change-Id: Iacac04601b73f85d9bc057b8dd34a5004248dac4
66612
master
J !B ✗T –R 0/2
LU-10026 csdc: sending compression info to server
reviewing Marc Vef · build failure (#130320)
csdc
4 unresolved
M +100 −13
68d
LU-10026 csdc: sending compression info to server
reviewing Marc Vef · build failure (#130320)
csdc
4 unresolved
M +100 −13
68d
build failure (#130320)
4 unresolved thread(s) await your reply — last from Gerrit AI review for Lustre
janitor run: 11 failing config(s), none unique to this patch — janitor results
build #130320 FAILURE
patchsets:
PS1 06-11
PS2 08-25
PS3 08-26
threads: 4 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Gerrit AI review for Lustre COMMIT_MSG:12 — (minor) This is an on-wire change: the client now fills bytes in the obdo (formerly o_padding_4) that are sent to the OST/MDS. Test-Paramete
Gerrit AI review for Lustre
(minor) This is an on-wire change: the client now fills bytes in the obdo (formerly o_padding_4) that are sent to the OST/MDS. Test-Parameters: forjanitoronly doesn't exercise interoperability. Consider requesting old-server/new-client and new-server/old-client runs with serverjob/serverbuildno and clientjob/clientbuildno so the padding-reuse stays wire-compatible with unpatched peers.
reply Marc Vef patchset comment — [Marc Bot] upstream remarks for reference:
Marc Vef
[Marc Bot] upstream remarks for reference: Rebase notes: kept the base's comment wording for the chunk-bits field (2^(16+chunk_lum_bits)); the lov_lsm2layout() wrapper is added alongside the base's compr_name_from_type() helper in lov_internal.h.
reply Gerrit AI review for Lustre lustre_user.h:1128 — (minor) This comment reword looks unrelated to sending compression info to the server; is it meant to be in this patch? Also the code comput
Gerrit AI review for Lustre
(minor) This comment reword looks unrelated to sending compression info to the server; is it meant to be in this patch? Also the code computes the chunk size with COMPR_CHUNK_MIN_BITS (COMPR_GET_CHUNK_SIZE()), not LOV_MIN_STRIPE_BITS; they happen to both be 16, but referencing the constant the code actually uses would be clearer.
reply Gerrit AI review for Lustre lov_internal.h:408 — This isn't a bug, but after this patch lov_lsm2layout() has no remaining callers (both lov_io.c and lovsub_object.c now call lov_lsm2layout2
Gerrit AI review for Lustre
This isn't a bug, but after this patch lov_lsm2layout() has no remaining callers (both lov_io.c and lovsub_object.c now call lov_lsm2layout2()). Folding the olc parameter into lov_lsm2layout() and updating those two call sites would avoid the version-suffixed name and the now-dead wrapper.
tags: csdc
owner Marc Vef · uploader Marc Vef · PS3 uploaded 70d ago · NEW · open in Gerrit ↗
commit message
LU-10026 csdc: sending compression info to server Client fills in layout compression info into obdo and passes it to server. Test-Parameters: forjanitoronly Signed-off-by: Bobi Jam <bobijam@whamcloud.com> Signed-off-by: Marc Vef <mvef@whamcloud.com> Change-Id: Ieb5d7b3609da41f35f8622ed6116f19ce7567ddb
68380
master
J !B ✗T –R 0/2
LU-10026 csdc: exponential backoff of incompressiblity check
reviewing Marc Vef · build failure (#130354)
csdc
1 unresolved
M +144 −90
69d
LU-10026 csdc: exponential backoff of incompressiblity check
reviewing Marc Vef · build failure (#130354)
csdc
1 unresolved
M +144 −90
69d
build failure (#130354)
1 unresolved thread(s) await your reply — last from Marc Vef
janitor run: 8 failing config(s), none unique to this patch — janitor results
build #130354 FAILURE
threads: 1 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Marc Vef patchset comment — [Marc Bot] upstream remarks for reference:
Marc Vef
[Marc Bot] upstream remarks for reference: Chunk-bits field naming follows the series (llc_compr_chunk_lum_bits).
tags: csdc
owner Marc Vef · uploader Marc Vef · PS1 uploaded 70d ago · NEW · open in Gerrit ↗
commit message
LU-10026 csdc: exponential backoff of incompressiblity check
If a file is incompressible and after a round of compressibility
check, if it remains incompressible, this patch would doubles the
skip bytes before running into another round of compressiblity
check.
This patch adds a state machine for update_compression_info(), the
states could be CS_INCOMPR, CS_COMPR, CS_CHECK, CS_CHECK_INC.
CS_INCOMPR -- file is not compressible
CS_COMPR -- file is compressible
CS_CHECK -- was in CS_COMPR, is now under check phase
CS_CHECK_INC -- was in CS_INCOMPR, is now under check phase
state transition:
INCOMPR --> INCOMPR : skip bytes has not been passed
INCOMPR --> CHECK_INC : skip bytes has been reached, in check phase
COMPR --> CHECK : in check phase, checked bytes has not been
reached
CHECK* --> CHECK* : in check phase, checked bytes has not been
reached
CHECK*/COMPR
--> COMPR : file is determined to be compressible
CHECK/COMPR
--> INCOMPR : file is determined to be incompressible, reset
the skip bytes check length
CHECK_INC --> INCOMPR : file is determined to be incompressible,
double the skip bytes check length
====
Test with 4 OSTs system, target file layout is set as:
lfs setstripe -Eeof -c-1 -Z lz4 --compress-chunk=64 $tf
and src file is 336M bz2 file, using "dd if=$src of=$tf bs=4M" copy
this bz2 file to target file.
w/o the patch, copy uses about 7 seconds
** start 1724216088 **
84+1 records in
84+1 records out
352625400 bytes (353 MB, 336 MiB) copied, 3.76366 s, 93.7 MB/s
** end 1724216095 **
...7 seconds
w/ the patch, copy uses about 4 seconds
** start 1724215237 **
84+1 records in
84+1 records out
352625400 bytes (353 MB, 336 MiB) copied, 2.07946 s, 170 MB/s
** end 1724215241 **
...4 seconds
Test-Parameters: forjanitoronly
DDN-bug-id: EX-8355
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Signed-off-by: Marc Vef <mvef@whamcloud.com>
Change-Id: I42105d3e137bf50897ff5c67654ca33552b23102
68379
master
J !B ✗T –R 0/2
LU-10026 utils: return error on invalid compress level setting
reviewing Marc Vef · build failure (#130353)
csdc
1 unresolved
S +11 −4
69d
LU-10026 utils: return error on invalid compress level setting
reviewing Marc Vef · build failure (#130353)
csdc
1 unresolved
S +11 −4
69d
build failure (#130353)
1 unresolved thread(s) await your reply — last from Marc Vef
janitor run: 7 failing config(s), none unique to this patch — janitor results
build #130353 FAILURE
threads: 1 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Marc Vef patchset comment — [Marc Bot] upstream remarks for reference:
Marc Vef
[Marc Bot] upstream remarks for reference: - The strtoul/end-pointer validation this patch adds was already carried (in stricter form) by the earlier level-handling patches of this series; those hunks were dropped. - The parse-time rewrite of low lz4 levels to the lz4fast default was removed here (matching the original series' final behaviour): the stored level is kept and the compression engine falls back to lz4fast when allocating the compressor. This also makes the negotiated-type test lists in sanity-pfl roundtrip correctly. - The new negative test was renamed test_1013a -> test_1013c: 1013a already exists (type negotiation test); the duplicate name would have silently shadowed it (latent issue in the original series).
tags: csdc
owner Marc Vef · uploader Marc Vef · PS1 uploaded 70d ago · NEW · open in Gerrit ↗
commit message
LU-10026 utils: return error on invalid compress level setting lfs setstripe -Z <compress_type>:<compress_level> does not report error on invalid <compress_level>. An explicit low level for the lz4 type (below the lz4hc minimum) is no longer silently rewritten to the lz4fast default at parse time; the stored level is kept and the compression engine falls back to lz4fast for such levels when allocating the compressor. Test-Parameters: forjanitoronly DDN-bug-id: EX-10186 Signed-off-by: Bobi Jam <bobijam@whamcloud.com> Signed-off-by: Marc Vef <mvef@whamcloud.com> Change-Id: Ie794a6d4cf208a9c66d1d179c157fee756477aee
66611
master
J !B ✗T –R 0/2
LU-10026 lfs: migrate compressed file without stripe info
reviewing Marc Vef · build failure (#130319)
csdc
2 unresolved
M +76 −14
69d
LU-10026 lfs: migrate compressed file without stripe info
reviewing Marc Vef · build failure (#130319)
csdc
2 unresolved
M +76 −14
69d
build failure (#130319)
2 unresolved thread(s) await your reply — last from Gerrit AI review for Lustre
janitor run: 4 failing config(s), none unique to this patch — janitor results
build #130319 FAILURE
patchsets:
PS1 06-11
PS2 08-25
PS3 08-26
threads: 2 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Gerrit AI review for Lustre COMMIT_MSG — (minor) The diff also touches Documentation/man1/lfs-mirror-extend.1 (documenting compression options for SETSTRIPE_OPTIONS), which the mess
Gerrit AI review for Lustre
(minor) The diff also touches Documentation/man1/lfs-mirror-extend.1 (documenting compression options for SETSTRIPE_OPTIONS), which the message doesn't mention and which is unrelated to the migrate fix. Is that hunk meant to be part of this patch, or should it be split out / called out in the body?
reply Gerrit AI review for Lustre liblustreapi_layout.c:2166 — (minor) This prints `fd`, which is always -1 on this path, so the message reads "Cannot open file X: -1" with no useful detail. The error is
Gerrit AI review for Lustre
(minor) This prints `fd`, which is always -1 on this path, so the message reads "Cannot open file X: -1" with no useful detail. The error is in errno from open() – strerror(errno) would be the informative value. Also note the caller (lfs_migrate/lfs.c) already emits its own llapi_error() when this returns < 0, so this adds a duplicate line. Using llapi_error(LLAPI_MSG_ERROR, errno, ...) here (as the ENOSPC path below does) would decode errno and respect the message level instead of writing to stderr unconditionally.
tags: csdc
owner Marc Vef · uploader Marc Vef · PS3 uploaded 70d ago · NEW · open in Gerrit ↗
commit message
LU-10026 lfs: migrate compressed file without stripe info lfs migrate file without specifying stripe info will get layout info from the file as the target layout template, and llapi_layout_get_by_xattr() tries to convert LOV_PATTERN_* values to user scope LLAPI_LAYOUT_* values, while LOV_PATTERN_COMPRESS is missed in this conversion. This patch add a function llapi_pattern_from_lov() to handle this conversion specifically. This patch also add more error messages for llapi_layout_file_open(). Test-Parameters: forjanitoronly Signed-off-by: Bobi Jam <bobijam@whamcloud.com> Signed-off-by: Marc Vef <mvef@whamcloud.com> Change-Id: I49a43cc7761cd2baed7a5da7d4e7cff2152ff9bb
66615
master
J ✗1B ✗T –R 0/2
LU-10026 csdc: prohibit set compression upon encrypted file
reviewing Marc Vef · build failure (#130322)
1 unique failure
csdc
1 unresolved
L +247 −35
69d
LU-10026 csdc: prohibit set compression upon encrypted file
reviewing Marc Vef · build failure (#130322)
1 unique failure
csdc
1 unresolved
L +247 −35
69d
build failure (#130322)
janitor: 1 test failure unique to this patch — conf-sanity4@zfs:test_123aj
1 unresolved thread(s) await your reply — last from Marc Vef
janitor flagged test failures unique to this patch — full janitor results
| unique failing test | history |
|---|---|
| conf-sanity4@zfs:test_123aj | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
build #130322 FAILURE
patchsets:
PS1 06-11
PS2 08-25
PS3 08-26
threads: 1 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Marc Vef patchset comment — [Marc Bot] upstream remarks for reference:
Marc Vef
[Marc Bot] upstream remarks for reference: Rebase note: kept the base's newer compression-parameter assignment block in lod_use_defined_striping() (gated on LOV_PATTERN_COMPRESS, with the extension-component chunk-adjustment deferral); this patch's encryption checks and attr threading apply on top unchanged.
tags: csdc
owner Marc Vef · uploader Marc Vef · PS3 uploaded 70d ago · NEW · open in Gerrit ↗
commit message
LU-10026 csdc: prohibit set compression upon encrypted file Setting compression layout component upon encrypted file is not allowed for now. This patch add this check on MDS in creating file with layout, adding/merging new mirror to existing file. Test-Parameters: forjanitoronly Test-Parameters: testlist=sanity-sec env=ONLY=67,PTLDEBUG=-1 Signed-off-by: Bobi Jam <bobijam@whamcloud.com> Signed-off-by: Marc Vef <mvef@whamcloud.com> Change-Id: I60d9f4bfce3a498f1eb3994c6276afb9d89c99a7
66266
master
J !B ✗T –R 0/2
LU-10026 osc: clear oi_write_osclock in lock fini func
cc Marc Vef · build failure (#130263)
csdc
S +12 −4
69d
LU-10026 osc: clear oi_write_osclock in lock fini func
cc Marc Vef · build failure (#130263)
csdc
S +12 −4
69d
janitor run: 3 failing config(s), none unique to this patch — janitor results
build #130263 FAILURE
patchsets:
PS1 05-28
PS2 06-11
PS3 06-11
PS4 08-25
tags: csdc
owner Marc Vef · uploader Marc Vef · PS4 uploaded 71d ago · NEW · open in Gerrit ↗
commit message
LU-10026 osc: clear oi_write_osclock in lock fini func Move osc_io::oi_write_osclock clearance in osc_lock_fini() as it's set in osc_lock_init(). Compression IO could possibly expand lock region and osc_lock_set_writer() could access a osc_io that is not accessed in osc_io_iter_init(), so that osc_io_rw_iter_fini() miss clearing osc_io's oi_writer_osclock. This patch moves the oi_write_osclock clearance in lock fini function to match its creation in osc_lock_init(). Test-Parameters: forjanitoronly Signed-off-by: Bobi Jam <bobijam@whamcloud.com> Signed-off-by: Marc Vef <mvef@whamcloud.com> Change-Id: Ied42f5befc1abd76aa10a7666eadb9a58e1f1783
68351
master
J ✗2B ✗T –R 0/2
LU-10026 llite: don't queue async IO page for inode in freeing
cc Marc Vef · build failure (#130329)
2 unique failures
csdc
1 unresolved
S +19 −0
70d
LU-10026 llite: don't queue async IO page for inode in freeing
cc Marc Vef · build failure (#130329)
2 unique failures
csdc
1 unresolved
S +19 −0
70d
build failure (#130329)
janitor: 2 test failures unique to this patch — runtests@ldiskfs+DNE:test_1, runtests-ssk@ldiskfs+SharedKey:test_1
1 unresolved thread(s) await your reply — last from Marc Vef
janitor flagged test failures unique to this patch — full janitor results
| unique failing test | history |
|---|---|
| runtests@ldiskfs+DNE:test_1 | seen in 5 other reviews |
| runtests-ssk@ldiskfs+SharedKey:test_1 | seen in 8 other reviews |
build #130329 FAILURE
patchsets:
PS1 08-25
PS2 08-26
threads: 1 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Marc Vef patchset comment — [Marc Bot] upstream remarks for reference:
Marc Vef
[Marc Bot] upstream remarks for reference:
Port notes:
- Registered as .cio_commit_async with the current signature (the
enum cl_io_priority argument was added upstream), next to master's
renamed .cio_read_ahead_prep hook.
- Reviewer note: master meanwhile carries LU-17364 ("discard un-flushable
pages on evicted inode teardown"), which addresses the same teardown
crash from another angle; this patch is kept as an additional guard and
may be droppable after evaluation.
tags: csdc
owner Marc Vef · uploader Marc Vef · PS2 uploaded 70d ago · NEW · open in Gerrit ↗
commit message
LU-10026 llite: don't queue async IO page for inode in freeing
When inode is being freed, do not try to queue async IO pages as
there is a race window between ll_delete_inode() and
ll_truncate_inode_pages_final(), and the queued async IO pages
cannot be teardown.
(osc_page.c:182:osc_page_delete()) Trying to teardown failed: -16
(osc_page.c:184:osc_page_delete()) ASSERTION( 0 ) failed:
(osc_page.c:184:osc_page_delete()) LBUG
lbug_with_loc+0x64/0xb0 [libcfs]
osc_page_delete+0x290/0x574 [osc]
cl_page_delete0+0xb8/0x404 [obdclass]
cl_page_delete+0x64/0x22c [obdclass]
ll_invalidate_folio+0x114/0x2a0 [lustre]
truncate_cleanup_folio+0x6c/0xf0
truncate_inode_pages_range+0xf8/0x4e0
truncate_inode_pages_final+0x54/0x80
ll_truncate_inode_pages_final+0x40/0x520 [lustre]
ll_delete_inode+0x68/0x25c [lustre]
evict+0xb8/0x1a0
Test-Parameters: forjanitoronly
DDN-bug-id: EX-11006
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Signed-off-by: Marc Vef <mvef@whamcloud.com>
Change-Id: If655a89faf6f979167c05c91c7b52a6c49a7884b
68399
master
J –B ✗T –R -1/2−
LU-10026 tests: sanity-compr/1000d failure for ARM client
reviewing Marc Vef · build failure (#130371)
csdc
S +9 −7
70d
LU-10026 tests: sanity-compr/1000d failure for ARM client
reviewing Marc Vef · build failure (#130371)
csdc
S +9 −7
70d
build #130371 FAILURE
tags: csdc
owner Marc Vef · uploader Marc Vef · PS1 uploaded 70d ago · NEW · open in Gerrit ↗
commit message
LU-10026 tests: sanity-compr/1000d failure for ARM client aarch64 has 64K page size and compression chunk size could be adjusted upward if it's original setting value is equal to page size, so the test should be refined to get the actual chunk size be set. Test-Parameters: forjanitoronly DDN-bug-id: EX-7536 Signed-off-by: Bobi Jam <bobijam@whamcloud.com> Signed-off-by: Marc Vef <mvef@whamcloud.com> Change-Id: Ide2f91e255ba886f9c1e18d1e1fe89c589f3bca1
68373
master
J –B ✗T –R +0/2−
LU-10026 csdc: stop compressing incompressible file data
reviewing Marc Vef · build failure (#130347)
csdc
2 unresolved
L +413 −17
70d
LU-10026 csdc: stop compressing incompressible file data
reviewing Marc Vef · build failure (#130347)
csdc
2 unresolved
L +413 −17
70d
build failure (#130347)
2 unresolved thread(s) await your reply — last from Marc Vef
build #130347 FAILURE
reviews:
Alex Zhuravlev +1
threads: 2 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Marc Vef patchset comment — [Marc Bot] upstream remarks for reference:
Marc Vef
[Marc Bot] upstream remarks for reference: ci_incompressible placed in the relocated cl_io bitfield next to ci_size_extend_compression; test_1021 gate converted to compression_supported.
reply Misc Code Checks Robot (Gatekeeper helper) osc_io.c:566 — error: osc_io_iter_init():'osc' dereferencing possible ERR_PTR()
Misc Code Checks Robot (Gatekeeper helper)
error: osc_io_iter_init():'osc' dereferencing possible ERR_PTR()
tags: csdc
owner Marc Vef · uploader Marc Vef · PS1 uploaded 70d ago · NEW · open in Gerrit ↗
commit message
LU-10026 csdc: stop compressing incompressible file data The reduced_ratio (original_size/compress_reduced_size) represents the minimum fraction of pages that are compressed out of each chunk, namely the compressed chunk needs to shrink by at least 1/reduced_ratio blocks for it to be "compressible". Let size compression_ratio be defined as original_size/after_compression_size, so reduced_ratio = compression_ratio / (compression_ratio - 1) and we set its default value to 16, equivalent to 1.07 of compression ratio (i.e. needs to shrink at least one 4KB block out of each 64KB chunk). After every compress_check_bytes of data being compressed, file's compressibility would be re-calculated based on average compress_reduced and average compress_orig data size. Stop compressing file data if it is deemed to be incompressible, and after compress_skip_bytes data have been written uncompressed , retry the file compressibility check. compress_reduced_ratio, compress_check_bytes, compress_skip_bytes are tunable parameters: osc.*.compress_reduced_ratio osc.*.compress_check_bytes osc.*.compress_skip_bytes their default values are 16, 1M and 32M respectively. tests: use /dev/zero as compressible source in test 1021 as hdf file has few incompressible chunks and this breaks the test infrequently. DDN-bug-id: EX-10857 Was-Change-Id: Iba29d9e654a245d3c0cbb14a8b7dbb9f847f52d5 Test-Parameters: forjanitoronly DDN-bug-id: EX-8355 Signed-off-by: Alex Zhuravlev <bzzz@whamcloud.com> Signed-off-by: Bobi Jam <bobijam@whamcloud.com> Signed-off-by: Marc Vef <mvef@whamcloud.com> Change-Id: I4ce3d752c67f18ba7b100c72a2bb61a91258c6e8
68405
master
J !B ✗T –R 0/2
LU-10026 cdsc: update layout compressibility
reviewing Marc Vef · build failure (#130377)
csdc
4 unresolved
L +335 −54
70d
LU-10026 cdsc: update layout compressibility
reviewing Marc Vef · build failure (#130377)
csdc
4 unresolved
L +335 −54
70d
build failure (#130377)
4 unresolved thread(s) await your reply — last from Marc Vef
janitor run: 3 failing config(s), none unique to this patch — janitor results
build #130377 FAILURE
no vote yet: Alex Zhuravlev
threads: 4 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Marc Vef patchset comment — [Marc Bot] upstream remarks for reference:
Marc Vef
[Marc Bot] upstream remarks for reference: - OBD_CONNECT2_UPDATE_LAYOUT was already reserved on master at the same bit; only the MDT_CONNECT_SUPPORTED2 and client connect lists needed the addition. - ci_need_change_layout added to the current cl_io bitfield; CAT_COMPRESSIBLE handling merged into the current vvp_attr_update(). - mdd_layout_update_pccro was renamed/extended per the patch on the current (retry-aware) master form. - FORMATTED_BUF_LEN (used by the new getstripe formatting) is defined locally - the source branch carries it from an unrelated change. - test_1021 layout-flag assertions applied unconditionally (the original wrapped them in version gates).
reply Misc Code Checks Robot (Gatekeeper helper) vvp_io.c:297 — error: vvp_layout_minor_change():'vob' dereferencing possible ERR_PTR()
Misc Code Checks Robot (Gatekeeper helper)
error: vvp_layout_minor_change():'vob' dereferencing possible ERR_PTR()
reply Misc Code Checks Robot (Gatekeeper helper) vvp_io.c:429 — error: vvp_io_fini():'vob' dereferencing possible ERR_PTR()
Misc Code Checks Robot (Gatekeeper helper)
error: vvp_io_fini():'vob' dereferencing possible ERR_PTR()
reply Misc Code Checks Robot (Gatekeeper helper) vvp_io.c:1973 — error: vvp_io_init():'vob' dereferencing possible ERR_PTR()
Misc Code Checks Robot (Gatekeeper helper)
error: vvp_io_init():'vob' dereferencing possible ERR_PTR()
tags: csdc
owner Marc Vef · uploader Marc Vef · PS1 uploaded 70d ago · NEW · open in Gerrit ↗
commit message
LU-10026 cdsc: update layout compressibility When compressing write changes the file's compressibility, it updates the file layout flags so that its compressibility persists. lod: reset la_attr at declare to avoid unplanned local attributes update during minor layout change. DDN-bug-id: EX-10786 Was-Change-Id: I093efeb9cf110adfe6a7590091e60b1e9f1eb9ed Test-Parameters: forjanitoronly DDN-bug-id: EX-8355 Signed-off-by: Alex Zhuravlev <bzzz@whamcloud.com> Signed-off-by: Bobi Jam <bobijam@whamcloud.com> Signed-off-by: Marc Vef <mvef@whamcloud.com> Change-Id: Ia2964817d1b5fee2d84ef15e9f1036882d70adb2
66284
master
J –B ✗T –R -1/2−
LU-10026 csdc: handle data compression on MDT
reviewing Marc Vef · build failure (#130318)
csdc
4 unresolved
S +39 −1
70d
LU-10026 csdc: handle data compression on MDT
reviewing Marc Vef · build failure (#130318)
csdc
4 unresolved
S +39 −1
70d
build failure (#130318)
4 unresolved thread(s) await your reply — last from Gerrit AI review for Lustre
build #130318 FAILURE
patchsets:
PS3 06-11
PS4 06-11
PS5 06-11
PS6 08-25
PS7 08-26
+2 earlier
PS1 05-28 PS2 06-11threads: 4 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Gerrit AI review for Lustre COMMIT_MSG:9 — (minor) The body explains the DoM+compress block, but two hunks pull the other way and aren't mentioned: lov_pattern_available() gains LOV_P
Gerrit AI review for Lustre
(minor) The body explains the DoM+compress block, but two hunks pull the other way and aren't mentioned: lov_pattern_available() gains LOV_PATTERN_MDT | LOV_PATTERN_COMPRESS, and llapi_pattern_to_lov() gains MDT|COMPRESS and RAID0|COMPRESS cases. Both make the combination more acceptable, not less. Could the message cover why they belong in a patch whose stated purpose is to disallow it?
reply Gerrit AI review for Lustre lustre_user.h:837 — (defect) This makes the server accept an MDT|COMPRESS component (lod_lov.c / lov_ea.c call lov_pattern_available()), yet lov_pattern_support
Gerrit AI review for Lustre
(defect) This makes the server accept an MDT|COMPRESS component (lod_lov.c / lov_ea.c call lov_pattern_available()), yet lov_pattern_supported() still excludes it, so client IO marks such an entry invalid (lov_object.c sets lle_valid = 0). The only guard against creating it lives in lfs.c; a liblustreapi caller doing llapi_layout_pattern_set(MDT) + llapi_layout_compress_set() bypasses that and produces a layout the server stores but IO cannot use. If DoM+compress is unsupported, should the block live in the library/server rather than only the CLI?
reply Gerrit AI review for Lustre lfs.c:3459 — (defect) errno is set to a negative value here; every other error path in comp_args_to_layout() uses errno = EINVAL. A negative errno breaks
Gerrit AI review for Lustre
(defect) errno is set to a negative value here; every other error path in comp_args_to_layout() uses errno = EINVAL. A negative errno breaks strerror(errno)/perror on this -1 return. Should be errno = EINVAL.
reply Gerrit AI review for Lustre liblustreapi_layout.c:831 — (minor) These two cases look unreachable. The COMPRESS bit never reaches llc_pattern: llapi_layout_pattern_set() rejects any pattern carryin
Gerrit AI review for Lustre
(minor) These two cases look unreachable. The COMPRESS bit never reaches llc_pattern: llapi_layout_pattern_set() rejects any pattern carrying it, and llapi_layout_from_lum() stores compression in llc_compr_type, not the pattern. The bit is OR'd into lmm_pattern separately in llapi_layout_to_lum() (blob->lmm_pattern |= LOV_PATTERN_COMPRESS). Was a real caller intended, or can these be dropped?
tags: csdc
owner Marc Vef · uploader Marc Vef · PS7 uploaded 70d ago · NEW · open in Gerrit ↗
commit message
LU-10026 csdc: handle data compression on MDT Do not support setting data compression component on DoM until data compression on MDT implemented. DDN-bug-id: EX-7806 Was-Change-Id: I3794460140f08a073377c418dd56e7dda907d96d Test-Parameters: forjanitoronly Signed-off-by: Bobi Jam <bobijam@whamcloud.com> Signed-off-by: Marc Vef <mvef@whamcloud.com> Change-Id: I8b5c4d5fd18033e796b1c7555c37251e4f7f9a49
65762
master
J ✗1B ✓T ✗1R 0/2
LU-10026 csdc: prefer uncompressed mirror for read and write
reviewing Marc Vef · janitor: 1 test failure unique to this patch — sanity3@zfs:test_907
1 unique failure
csdc
4 unresolved
L +213 −47
74d
LU-10026 csdc: prefer uncompressed mirror for read and write
reviewing Marc Vef · janitor: 1 test failure unique to this patch — sanity3@zfs:test_907
1 unique failure
csdc
4 unresolved
L +213 −47
74d
janitor: 1 test failure unique to this patch — sanity3@zfs:test_907
enforced failed: review-dne-selinux-ssk-part-2
4 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 |
|---|---|
| sanity3@zfs:test_907 | seen in 57 other reviews |
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-selinux-ssk-part-2 | RHEL 8.10 / x86_64 | ran 7 tests. 1 tests failed: sanity-sec. | session |
build #129912 SUCCESS · tests all Maloo sessions
no vote yet: James Simmons, Andreas Dilger, Artem Blagodarenko
patchsets:
PS8 08-19 Artem Blagodarenko
PS9 08-19 Artem Blagodarenko
PS10 08-20 Artem Blagodarenko
PS11 08-20 Artem Blagodarenko
PS12 08-21 Artem Blagodarenko
+7 earlier
PS1 05-08 PS2 05-28 PS3 05-28 PS4 06-11 PS5 06-11 PS6 07-27 Artem Blagodarenko PS7 07-28 Artem Blagodarenkothreads: 4 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Gerrit AI review for Lustre lod_lov.c:622 — This bonus is added once per allocated stripe, which is exactly the weight the OS_STATFS_NONROT bonus a few lines above uses, so the two can
Gerrit AI review for Lustre
This bonus is added once per allocated stripe, which is exactly the weight the OS_STATFS_NONROT bonus a few lines above uses, so the two can cancel out.
Two mirrors, no LCME_FL_PREF_WR anywhere, one stripe each:
mirror 0: compressed, stripe on a NONROT OST -> pref = 1
mirror 1: uncompressed, stripe on a rotating OST -> pref = 1
lme_preference ties, so the `!found_preferred` fallback below keeps the lower index (`>` is strict) and sets lme_prefer on mirror 0. lod_primary_pick() then classifies mirror 0 as case B (preferred + compressed) and mirror 1 as case C, and B outranks C, so the write goes to the compressed mirror.
A wider compressed mirror wins outright rather than tying: 4 NONROT stripes compressed = 4 vs 1 NONROT stripe uncompressed = 2.
Mixed flash/disk mirrors are the case the non-rotational preference was added for, so this is not an exotic layout. Should the uncompressed bonus be on a different scale than the per-stripe NONROT count (or applied once per mirror) so it can't be traded away against OST speed?
The comment also says "mirror", but this sits in the per-stripe loop of one component.
reply Gerrit AI review for Lustre lod_object.c:8060 — (style) Not a bug, but this comment has a UTF-8 em dash in it; the rest of the tree is plain ASCII. A plain '-' would do.
Gerrit AI review for Lustre
(style) Not a bug, but this comment has a UTF-8 em dash in it; the rest of the tree is plain ASCII. A plain '-' would do.
reply Gerrit AI review for Lustre lod_object.c:8088 — Ranking B (preferred + compressed) above C (uncompressed) reads as "an explicit `lfs setstripe --flags=prefer` beats the compression heurist
Gerrit AI review for Lustre
Ranking B (preferred + compressed) above C (uncompressed) reads as "an explicit `lfs setstripe --flags=prefer` beats the compression heuristic". But lme_prefer is not only user intent: when no component carries LCME_FL_PREF_WR, lod_fill_mirrors() picks the highest lme_preference non-stale mirror and sets lme_prefer = 1 on it. So tier B is reachable on a file the user never flagged, and the heuristic ends up overriding its own compression preference. Should case B be restricted to mirrors that actually carry LCME_FL_PREF_WR, or should the synthesized preference be tracked separately from the user flag?
reply Gerrit AI review for Lustre lov_io.c:662 — (minor) ci_ndelay_tried > 0 means "not the first lov_io_mirror_init() for this env", which is broader than "this is an FLR error retry".
Gerrit AI review for Lustre
(minor) ci_ndelay_tried > 0 means "not the first lov_io_mirror_init() for this env", which is broader than "this is an FLR error retry".
ll_file_io_generic() restarts the io for reasons unrelated to mirror failure and preserves the counter:
partial_io -> io->ci_need_restart = 1 (file.c)
retried = io->ci_ndelay_tried; goto restart;
A single buffered read larger than max_io_bytes therefore takes the uncompressed mirror for the first chunk only; from the second chunk on ci_ndelay_tried is non-zero, lis_mirror_index has been advanced by one, and the first in-range mirror is accepted even when it is compressed. The layout-change restart in vvp_io_iter_init() has the same shape.
Would gating on something that only the -EAGAIN mirror-failover path sets (io->ci_tried_all_mirrors, or a dedicated flag set where cl_io_loop() retries) keep the failover fix without giving up the preference on ordinary io continuation?
tags: csdc
owner Marc Vef · uploader Artem Blagodarenko · PS12 uploaded 76d ago · NEW · open in Gerrit ↗
commit message
LU-10026 csdc: prefer uncompressed mirror for read and write When accessing a mirrored file with both compressed and uncompressed components, choose uncompressed components for read (lov_io.c). When writing to mirrored files with both compressed and uncompressed mirrors, prefer the uncompressed components to write; this is better for performance, more compatible with older clients, and better fits the model of compressing files after initial write. The write-side preference is implemented via lod_fill_mirrors() and lod_primary_pick() using a new lme_compressed flag. Note: the changes to lod_fill_mirrors() and lod_primary_pick() affect all FLR files, not only those with compressed mirrors. Plain FLR writes will also use the updated preferred-mirror selection logic. DDN-bug-id: EX-6510 Was-Change-Id: I62a117d5cc3d34e2c0c96d1a9ade8eef0a2d1291 Signed-off-by: Bobi Jam <bobijam@whamcloud.com> Signed-off-by: Artem Blagodarenko <ablagodarenko@gmail.com> Signed-off-by: Marc Vef <mvef@whamcloud.com> Change-Id: I043b27bd891c039901075a08c76630f8f0f9f182
65761
master
J !B ✓T ✗1R 0/2
LU-10026 utils: add 'lfs find' support for compressed file
reviewing Marc Vef · enforced failed: review-dne-selinux-ssk-part-2
csdc
9 unresolved
L +715 −67
74d
LU-10026 utils: add 'lfs find' support for compressed file
reviewing Marc Vef · enforced failed: review-dne-selinux-ssk-part-2
csdc
9 unresolved
L +715 −67
74d
enforced failed: review-dne-selinux-ssk-part-2
9 unresolved thread(s) await your reply — last from Gerrit AI review for Lustre
janitor run: 4 failing config(s), none unique to this patch — janitor results
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-selinux-ssk-part-2 | RHEL 8.10 / x86_64 | ran 7 tests. 1 tests failed: sanity-sec. | session |
build #129911 SUCCESS · tests all Maloo sessions
no vote yet: James Simmons, Andreas Dilger, Artem Blagodarenko
patchsets:
PS13 08-19 Artem Blagodarenko
PS14 08-19 Artem Blagodarenko
PS15 08-20 Artem Blagodarenko
PS16 08-20 Artem Blagodarenko
PS17 08-21 Artem Blagodarenko
+12 earlier
PS1 05-08 PS2 05-28 PS3 05-28 PS4 06-11 PS5 06-11 PS6 06-17 Artem Blagodarenko PS7 06-18 Artem Blagodarenko PS8 07-24 Artem Blagodarenko PS9 07-27 Artem Blagodarenko PS10 07-27 Andreas Dilger PS11 07-27 Andreas Dilger PS12 07-27 Andreas Dilgerthreads: 9 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Gerrit AI review for Lustre COMMIT_MSG:9 — (minor) The first three bullets read as new functionality, but `--comp-flags=[^]compress` and `--comp-flags=[^]nocompr` already work (LCME_F
Gerrit AI review for Lustre
(minor) The first three bullets read as new functionality, but `--comp-flags=[^]compress` and `--comp-flags=[^]nocompr` already work (LCME_FL_COMPRESS/LCME_FL_NOCOMPR are in comp_flags_table[]), and so does `-L compress` (LOV_PATTERN_COMPRESS is in lov_pattern_names[]). This patch documents them and adds test coverage rather than adding them. Could the wording say "document" for those three, so the message matches the diff?
reply Gerrit AI review for Lustre lustre_user.h:3278 — (style) COMPR_LEVEL_MAX is already defined with the same value earlier in this header, just after `enum ll_compr_type`, with a comment expla
Gerrit AI review for Lustre
(style) COMPR_LEVEL_MAX is already defined with the same value earlier in this header, just after `enum ll_compr_type`, with a comment explaining it. Two definitions can drift apart later; can this one be dropped?
reply Gerrit AI review for Lustre sanity-pfl.sh:3078 — (style) extra blank line. Also z1..z4 here, and `expect` in test_100d, are not declared `local`.
Gerrit AI review for Lustre
(style) extra blank line. Also z1..z4 here, and `expect` in test_100d, are not declared `local`.
reply Gerrit AI review for Lustre lfs.c:4637 — (style) not a bug, but `compress-chunk` already appears in this long_opts[] further down, so it is listed twice now. getopt_long takes the f
Gerrit AI review for Lustre
(style) not a bug, but `compress-chunk` already appears in this long_opts[] further down, so it is listed twice now. getopt_long takes the first match so it still works; `compr-chunk` looks like the only new alias actually needed here.
reply Gerrit AI review for Lustre lfs.c:8226 — (typo) this comment uses a UTF-8 em dash; the tree is otherwise plain ASCII. Same in the `%LZ` directory-branch comment in liblustreapi_pfin
Gerrit AI review for Lustre
(typo) this comment uses a UTF-8 em dash; the tree is otherwise plain ASCII. Same in the `%LZ` directory-branch comment in liblustreapi_pfind.c.
reply Gerrit AI review for Lustre lfs.c:8248 — (defect) atoi() cannot report a parse failure, so `--compr-level=abc` silently becomes level 0, and `--compr-level=+abc` becomes "level > 0"
Gerrit AI review for Lustre
(defect) atoi() cannot report a parse failure, so `--compr-level=abc` silently becomes level 0, and `--compr-level=+abc` becomes "level > 0", i.e. every compressed component. The unsigned range check above cannot catch it. `-Z gzip:abc` is rejected by llapi_parse_compress_type(), and the setstripe `--compress-level` path uses strtol() with an end-pointer check, so the three spellings of the same thing disagree. strtol() plus `*end != '\0'` here would line them up.
reply Gerrit AI review for Lustre liblustreapi_pfind.c:509 — (minor) This helper backs every numeric `lfs find` predicate, and the new exact-match branch only changes behaviour when `margin == 0`. `lfs
Gerrit AI review for Lustre
(minor) This helper backs every numeric `lfs find` predicate, and the new exact-match branch only changes behaviour when `margin == 0`. `lfs find -z N` with a plain number is such a caller: lfs.c does `fp_ext_size_units /= SEL_UNIT_SIZE`, so 1/1024 becomes 0, and an exact `-z` match that previously reported "no match" now matches. That may well be desirable, but it is a silent change to an unrelated option. The new compression predicates are the only callers passing margin 0; the rest pass 1 or a unit size, and with margin 1 this function already returns 1 on an exact match. Passing 1 there would avoid touching the shared helper, and would also make `--compr-level=-N` / `--compr-chunk=-N` mean "< N" like `-c -N`, `--size -N` and friends, rather than "<= N". The table above the function (rows 5 and 6, and the note about the interval `(limit - margin, limit]`) no longer describes the code either.
reply Gerrit AI review for Lustre liblustreapi_pfind.c:975 — (defect) Negation is handled differently for level/chunk than for type. `fp_exclude_compr_lvl` is passed into find_value_cmp() as `negopt`,
Gerrit AI review for Lustre
(defect) Negation is handled differently for level/chunk than for type. `fp_exclude_compr_lvl` is passed into find_value_cmp() as `negopt`, so `found_lvl` ends up meaning "some component does not match" instead of "no component matches", and the aggregation here then ignores the exclude flag entirely - unlike the fp_check_compr_type block just above.
For a file with two compressed components, level 3 and level 5:
lfs find ! --compr-level=3 dir
entry(lvl 5) makes find_value_cmp() return -1, negopt flips it to 1, found_lvl is set, and the file is reported - even though it does have a level-3 component. The equivalent `! --compr-type=gzip` on a gzip+lz4 file correctly does not match.
Should the level and chunk comparisons drop the negopt argument and be inverted here the same way type is?
reply Gerrit AI review for Lustre liblustreapi_pfind.c:1771 — (defect) `fp_lum_size` is the size common_param_init() allocated for the lmd buffer (>= XATTR_SIZE_MAX, 64KiB), not the length of the layout
Gerrit AI review for Lustre
(defect) `fp_lum_size` is the size common_param_init() allocated for the lmd buffer (>= XATTR_SIZE_MAX, 64KiB), not the length of the layout stored in it. For a non-composite lum, llapi_layout_get_by_xattr() never narrows that value, so llapi_layout_objects_in_lum() computes (65536 - 32) / 24 = 2729 objects and __llapi_comp_alloc() rejects it with EINVAL because 2729 > LOV_MAX_STRIPE_COUNT (2000). So this call fails for every plain V1/V3 file and always falls through to llapi_layout_get_by_path(); only composite layouts reach the new path, because the entry loop resets the size to `ent->lcme_size`. Passing the actual layout length instead would make the fast path work for non-PFL files too.
tags: csdc
owner Marc Vef · uploader Artem Blagodarenko · PS17 uploaded 76d ago · NEW · open in Gerrit ↗
commit message
LU-10026 utils: add 'lfs find' support for compressed file * Add "--comp-flags=[^]compress" to locate file with/without compressed components. * Add "--comp-flags=[^]nocompr" to locate file with/without setting component compress preference. * Add "[!] --layout=compress" to locate file with/without compressed components. * Add "[!] --compress-type=<compress-type>" to locate compressed file with/without specified compress algorithm. * Add "[!] --compress-level=[+-]<compress-level>" to locate compressed file with/without specified compress level. * Add "[!] --compress-chunk=[+-]<compress-chunk>" to locate compressed file with/without specified compress chunk in KiB. utils: add -Z option for 'lfs getstripe/find' Add support for "lfs getstripe -Z" to get the last instantiated component compression information. Add support for "lfs find -Z <type>[:[+-]<level>]" to keep consistent options with "lfs setstripe -Z". DDN-bug-id: EX-6856 Was-Change-Id: Ia5e2a2ea6937dc2b46e224cec808504a196b974c utils: logical AND for 'lfs find' compression exprs All search expressions provided to 'lfs find' must be combined as a logical AND. Fix newly added options for compression support, so that they comply with this logical AND. DDN-bug-id: EX-7714 Was-Change-Id: I3b28cd87c1d304df6d04753b413d46f5abcfe16e csdc: don't set compression layout when disabled When llite_enable_compression is disabled (lfs set_param llite.*.enable_compression=0), we should check it before sending it to MDS lest we get a file with compressed component which we cannot handle. DDN-bug-id: EX-7593 Was-Change-Id: Ib1e2123ffdb239c3e1401d682ae9c2c49e3f4a6f utils: support 'lfs find --printf %LZ' Add support for "lfs find --printf %LZ" to print the compression type:level of the last instantiated component of a file. DDN-bug-id: EX-6856 Was-Change-Id: Iaf1b6c031b06c70e7b5be51354697aa6bdcc9850 csdc: right error code in case compression is disabled Currently, if compression is disabled on a client the error message is confusing "Cannot set layout EA: Unknown error 524" Let's replace the error code from ENOTSUPP to EOPNOTSUPP, so error messages become more informative ctl get_param -n llite.*.enable_compression 0 lfs setstripe -i 0 -c 1 -E -1 -Z lz4 /mnt/lustre/foo.txt Cannot set layout EA: Operation not supported lfs setstripe: cannot create composite file '/mnt/lustre/foo.txt': Inappropriate ioctl for device This message could be even more informative, but this version is already much better. DDN-bug-id: EX-10577 Was-Change-Id: I7fd67d5d3d20bc7de169f35f6fa63b53f2bfe718 Signed-off-by: Bobi Jam <bobijam@whamcloud.com> Signed-off-by: Artem Blagodarenko <ablagodarenko@ddn.com> Signed-off-by: Marc Vef <mvef@whamcloud.com> Change-Id: Ic36946738c3463fd862aeca4ee2e2c2ed85eff84
▶Review feedback — your turn
(1)
30928
master
J –B ✓T ✓R +0/2−
LU-10502 utils: redefine progname in lfs.c
reviewing Jian Yu · John Hammond voted -1
stalled 457d
L +353 −343
457d
LU-10502 utils: redefine progname in lfs.c
reviewing Jian Yu · John Hammond voted -1
stalled 457d
L +353 −343
457d
reviews:
Andreas Dilger +1 · John Hammond -1
no vote yet: Jinshan Xiong
owner Jian Yu · uploader Jian Yu · PS13 uploaded 3106d ago · NEW · open in Gerrit ↗
commit message
LU-10502 utils: redefine progname in lfs.c This patch redefines progname in lfs.c to fix the issue of address of a local variable is returned through global variable. The patch also standardizes some error messages in lfs.c to remove argv[0] because progname already contains the sub-command name. Change-Id: I3adf824dc3b27fbc7e90e94b5163137017baae31 Signed-off-by: Bobi Jam <bobijam.xu@intel.com> Signed-off-by: Jian Yu <jian.yu@intel.com>
▶In CI
(0)
nothing here right now
▶Needs reviewers
(6)
59266
b2_15
J ✗1B ✓T ✓R 0/1
LU-16958 llite: migrate deadlock on not responding lock cancel
reviewing Etienne AUJAMES · CI green — no vote yet from Qian Yingjin, Andreas Dilger
stalled 535d
M +21 −49
535d
LU-16958 llite: migrate deadlock on not responding lock cancel
reviewing Etienne AUJAMES · CI green — no vote yet from Qian Yingjin, Andreas Dilger
stalled 535d
M +21 −49
535d
janitor flagged test failures unique to this patch — superseded (tests have since passed) — full janitor results
| unique failing test | history |
|---|---|
| sanity2@ldiskfs+DNE:test_813 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
build #113467 SUCCESS · tests all Maloo sessions
no vote yet: Qian Yingjin, Andreas Dilger
owner Etienne AUJAMES · uploader Etienne AUJAMES · PS1 uploaded 537d ago · NEW · backport · open in Gerrit ↗
commit message
LU-16958 llite: migrate deadlock on not responding lock cancel
lfs migrate race makes MDS hang with following backtrace
[ 3683.248584] [<0>] ldlm_completion_ast+0x78d/0x8e0 [ptlrpc]
[ 3683.250122] [<0>] ldlm_cli_enqueue_local+0x2fd/0x840 [ptlrpc]
[ 3683.251363] [<0>] mdt_object_local_lock+0x50e/0xb10 [mdt]
[ 3683.252615] [<0>] mdt_object_lock_internal+0x187/0x430 [mdt]
[ 3683.253793] [<0>] mdt_object_lock_try+0x22/0xa0 [mdt]
[ 3683.254857] [<0>] mdt_getattr_name_lock+0x1317/0x1dc0 [mdt]
[ 3683.256016] [<0>] mdt_intent_getattr+0x264/0x440 [mdt]
[ 3683.257105] [<0>] mdt_intent_opc+0x452/0xa80 [mdt]
[ 3683.258126] [<0>] mdt_intent_policy+0x1fd/0x390 [mdt]
[ 3683.259191] [<0>] ldlm_lock_enqueue+0x469/0xa90 [ptlrpc]
[ 3683.260350] [<0>] ldlm_handle_enqueue0+0x61a/0x16c0 [ptlrpc]
[ 3683.261596] [<0>] tgt_enqueue+0xa4/0x200 [ptlrpc]
[ 3683.262662] [<0>] tgt_request_handle+0xc9c/0x1a40 [ptlrpc]
[ 3683.263860] [<0>] ptlrpc_server_handle_request+0x323/0xbd0 [ptlrpc]
[ 3683.265220] [<0>] ptlrpc_main+0xbf3/0x1540 [ptlrpc]
[ 3683.266303] [<0>] kthread+0x134/0x150
[ 3683.267111] [<0>] ret_from_fork+0x35/0x40
The deadlock happens as follows:
T1:
vvp_io_init()
->ll_layout_refresh() <= take lli_layout_mutex
->ll_layout_intent()
->ll_take_md_lock() <= take the CR layout lock ref
->ll_layout_conf()
->vvp_prune()
->vvp_inode_ops() <= release lli_layout_mtex
->vvp_inode_ops() <= try to acquire lli_layout_mutex
-> racer wait here for T2
T2:
->ll_file_write_iter()
->vvp_io_init()
->ll_layout_refresh() <= take lli_layout_mutex
->ll_layout_intent() <= Request layout from MDT
-> racer wait from server...
And server want to cancel the CR layout lock T1 hold, and it won't
happen. Also T1 could has take extent ldlm lock while waiting
lli_layout_mutex hold by T2, and ofd_destroy_hdl does not get the
lock cancellation response from T1.
lli_layout_mutex is only needed for enqueuing layout lock from server,
so that ll_layout_conf() does not involve with lli_layout_mutex.
Lustre-change: https://review.whamcloud.com/52388
Lustre-commit: 37646c74bf884c535149d530af840d728814792b
Fixes: 8f2c1592c3 ("LU-16958 llite: migrate vs regular ops deadlock")
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: Ib94de2c63544c3a962199aa0537418255980ae8c
Reviewed-by: Qian Yingjin <qian@ddn.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Signed-off-by: Etienne AUJAMES <eaujames@ddn.com>
57653
b2_15
J ✗15B ✓T ✓R 0/1
LU-16637 llite: call truncate_inode_pages() in inode lock
reviewing Etienne AUJAMES · CI green — no vote yet from Neil Brown
stalled 537d
L +336 −97
537d
LU-16637 llite: call truncate_inode_pages() in inode lock
reviewing Etienne AUJAMES · CI green — no vote yet from Neil Brown
stalled 537d
L +336 −97
537d
janitor flagged test failures unique to this patch — superseded (tests have since passed) — full janitor results
| unique failing test | history |
|---|---|
| ost-pools@zfs:test_1n | seen in 2 other reviews |
| ost-pools@zfs:test_11 | seen in 2 other reviews |
| ost-pools@zfs:test_15 | seen in 2 other reviews |
| ost-pools@zfs:test_16 | seen in 2 other reviews |
| ost-pools@zfs:test_19 | seen in 2 other reviews |
| ost-pools@zfs:test_20 | seen in 2 other reviews |
| ost-pools@zfs:test_21 | seen in 2 other reviews |
| ost-pools@zfs:test_22 | seen in 2 other reviews |
| ost-pools@zfs:test_24 | seen in 3 other reviews |
| ost-pools@zfs:test_27 | seen in 2 other reviews |
| replay-single@ldiskfs+DNE:test_20b | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-flr@zfs:test_200c | seen in 2 other reviews |
| sanity-flr@zfs:test_203 | seen in 2 other reviews |
| sanity-flr@zfs:test_204d | seen in 2 other reviews |
| sanity-flr@zfs:test_204e | seen in 2 other reviews |
build #113465 SUCCESS · tests all Maloo sessions
no vote yet: Neil Brown
patchsets:
PS1 01-06
PS2 05-16
owner Etienne AUJAMES · uploader Etienne AUJAMES · PS2 uploaded 537d ago · NEW · backport · open in Gerrit ↗
commit message
LU-16637 llite: call truncate_inode_pages() in inode lock
In some cases vvp_prune()->truncate_inode_pages() is get called
without IO context, we need protect it with inode lock as well.
So we add ll_inode_info::lli_inode_lock_owner and set it according to
vfs lock rules (Documentation/filesystems/Locking or
Documentation/filesystems/locking.rst), so before calling
truncate_inode_pages(), we'd lock the inode if it's not locked in
vfs.
Lustre-change: https://review.whamcloud.com/50857
Lustre-commit: 51d62f2122fee14fbb3ff8333b5a830e1181e4e5
Fixes: ef9be34478 ("LU-16637 llite: call truncate_inode_pages() under inode lock")
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: I84d7d999a49325810062a9a7337e184d35467820
Reviewed-by: Neil Brown <neilb@suse.de>
Reviewed-by: Patrick Farrell <pfarrell@whamcloud.com>
Signed-off-by: Etienne AUJAMES <eaujames@ddn.com>
57654
b2_15
J !B ✓T ✓R 0/1
LU-16958 llite: migrate vs regular ops deadlock
reviewing Etienne AUJAMES · CI green — no vote yet from Andreas Dilger, Alex Zhuravlev
stalled 537d
M +47 −11
537d
LU-16958 llite: migrate vs regular ops deadlock
reviewing Etienne AUJAMES · CI green — no vote yet from Andreas Dilger, Alex Zhuravlev
stalled 537d
M +47 −11
537d
janitor run: 1 failing config(s), none unique to this patch — janitor results
build #113464 SUCCESS · tests all Maloo sessions
no vote yet: Andreas Dilger, Alex Zhuravlev
patchsets:
PS1 01-06
PS2 05-16
owner Etienne AUJAMES · uploader Etienne AUJAMES · PS2 uploaded 537d ago · NEW · backport · open in Gerrit ↗
commit message
LU-16958 llite: migrate vs regular ops deadlock
When it need to lock inode in lov_conf_set(), it could have hold
inode's lli_layout_mutex, we need unlock the layout mutex before
taking its inode lock to keep the lock order.
Lustre-change: https://review.whamcloud.com/c/51641
Lustre-commit: 8f2c1592c3bbd0351ab3984a88a3eed7075690c8
Fixes: 51d62f2122f ("LU-16637 llite: call truncate_inode_pages() in inode lock")
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: I7ee58039a6d31daefc625ac571a52baf112f8151
Reviewed-by: Alex Zhuravlev <bzzz@whamcloud.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Signed-off-by: Etienne AUJAMES <eaujames@ddn.com>
57652
b2_15
J ✗1B ✓T ✓R 0/1
LU-16637 llite: call truncate_inode_pages() under inode lock
reviewing Etienne AUJAMES · CI green — no vote yet from Andreas Dilger
stalled 537d
S +18 −6
537d
LU-16637 llite: call truncate_inode_pages() under inode lock
reviewing Etienne AUJAMES · CI green — no vote yet from Andreas Dilger
stalled 537d
S +18 −6
537d
janitor flagged test failures unique to this patch — superseded (tests have since passed) — full janitor results
| unique failing test | history |
|---|---|
| sanity-quota@zfs:test_82 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
build #113463 SUCCESS · tests all Maloo sessions
no vote yet: Andreas Dilger
patchsets:
PS1 01-06
PS2 05-16
owner Etienne AUJAMES · uploader Etienne AUJAMES · PS2 uploaded 537d ago · NEW · backport · open in Gerrit ↗
commit message
LU-16637 llite: call truncate_inode_pages() under inode lock truncate_inode_pages() is required to be called under (and serialised by) inode lock. Lustre-change: https://review.whamcloud.com/50284 Lustre-commit: ef9be34478036db0544753e33030fff7e32bfe44 Signed-off-by: Bobi Jam <bobijam@whamcloud.com> Change-Id: I0f1a09c8756522f87a2e5d8030d12f80e2f630b4 Reviewed-by: Patrick Farrell <pfarrell@whamcloud.com> Reviewed-by: Andreas Dilger <adilger@whamcloud.com> Signed-off-by: Etienne AUJAMES <eaujames@ddn.com>
57793
b2_15
J ✗1B ✓T ✓R 0/1
LU-17048 mdd: protect layout change in MDD layer
reviewing Etienne AUJAMES · CI green — no vote yet from Andreas Dilger, Alex Zhuravlev
stalled 657d
L +278 −96
657d
LU-17048 mdd: protect layout change in MDD layer
reviewing Etienne AUJAMES · CI green — no vote yet from Andreas Dilger, Alex Zhuravlev
stalled 657d
L +278 −96
657d
janitor flagged test failures unique to this patch — superseded (tests have since passed) — full janitor results
| unique failing test | history |
|---|---|
| sanityn@ldiskfs+DNE:test_51c | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
build #110333 SUCCESS · tests all Maloo sessions
no vote yet: Andreas Dilger, Alex Zhuravlev
owner Etienne AUJAMES · uploader Etienne AUJAMES · PS1 uploaded 658d ago · NEW · backport · open in Gerrit ↗
commit message
LU-17048 mdd: protect layout change in MDD layer
We need to detect changes to the LOD layout in between transaction
declaration and when the objects are locked during transaction
execution. Otherwise, if another thread has modified the layout
of an object used by the transaction then the declaration may
be incorrect.
This patch save objects' layout generation in transaction delaration
phase, and check whether they have been changed by others in the
transaction execution phase, if that's the case, the transaction will
be retried for several times.
Lustre-change: https://review.whamcloud.com/52146
Lustre-commit: d5ab62af24166529b84b4d7227b96d3a69989a95
Fixes: b7bd4e3422 ("LU-14621 mdd: fix lock-tx order in mdd_xattr_merge()")
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: I25fe03c6e8fc4eebccc039e62dfc88db1179cb26
Reviewed-by: Alex Zhuravlev <bzzz@whamcloud.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Signed-off-by: Etienne AUJAMES <eaujames@ddn.com>
49446
b2_12
J ✗1B ✓T ✓R 0/1
LU-14042 llite: don't check layout info for page discard
reviewing Etienne AUJAMES · CI green — no vote yet from Qian Yingjin, Andreas Dilger
stalled 1409d
S +9 −2
1409d
LU-14042 llite: don't check layout info for page discard
reviewing Etienne AUJAMES · CI green — no vote yet from Qian Yingjin, Andreas Dilger
stalled 1409d
S +9 −2
1409d
janitor flagged test failures unique to this patch — superseded (tests have since passed) — full janitor results
| unique failing test | history |
|---|---|
| sanity-hsm@ldiskfs+DNE:test_300 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
build #91244 SUCCESS · tests all Maloo sessions
no vote yet: Qian Yingjin, Andreas Dilger
owner Etienne AUJAMES · uploader Etienne AUJAMES · PS1 uploaded 1416d ago · NEW · backport · open in Gerrit ↗
commit message
LU-14042 llite: don't check layout info for page discard The CIT_MISC+ignore_layout is indicating locks/pages manipulation from the OSC layer, it does not care/access lov layout related info. Lustre-change: https://review.whamcloud.com/40267 Lustre-commit: 5d1ffc65d5a97c7b3a5597267c5682498c87a5da Signed-off-by: Bobi Jam <bobijam@whamcloud.com> Change-Id: Ibdf22f0d47712d370385af4c6c984052b91fc7c6 Reviewed-by: Andreas Dilger <adilger@whamcloud.com> Reviewed-by: Yingjin Qian <qian@ddn.com> Signed-off-by: Etienne AUJAMES <eaujames@ddn.com>
▶Waiting on reviewers
(0)
nothing here right now
▶Ready to land
(6)
69350
master
J –B ✓T ✓R +2/2
LU-12669 ec: create lock placeholder for reconstructed pages
reviewing Andreas Dilger · all green — queued for landing (master-next)
218_review_prioritypt_ecropw_shepherd
master-next
4 unresolved
L +532 −68
11h
LU-12669 ec: create lock placeholder for reconstructed pages
reviewing Andreas Dilger · all green — queued for landing (master-next)
218_review_prioritypt_ecropw_shepherd
master-next
4 unresolved
L +532 −68
11h
all green — queued for landing (master-next)
4 reviewer comment(s) to address if a respin is needed — last from Gerrit AI review for Lustre
build #134472 SUCCESS · tests all Maloo sessions
reviews:
Keguang Xu +1 · Zhenyu Xu +1
no vote yet: Marc Vef, Patrick Farrell
patchsets:
PS3 10-13
PS4 10-13
PS5 10-14
PS6 10-14
PS7 10-26
+2 earlier
PS1 10-01 PS2 10-01your previous vote: +1 on PS6 (2026-10-22 11:39) — now at PS7
threads: 4 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Gerrit AI review for Lustre ldlm_request.c:583 — (minor) If the patch is refreshed: this says matchers must skip LDLM_FL_PLACEHOLDER unless they only test page coverage, but osc_lock_to_pla
Gerrit AI review for Lustre
(minor) If the patch is refreshed: this says matchers must skip LDLM_FL_PLACEHOLDER unless they only test page coverage, but osc_lock_to_placeholder() matches with skip_flags 0 and without LDLM_FL_TEST_LOCK, taking a reader reference so it can reuse an existing placeholder:
mode = ldlm_lock_match_with_skip(ns, LDLM_FL_BLOCK_GRANTED, 0, ...
LCK_PR, LDLM_MATCH_AST, &lockh);
The same "only matched by page coverage tests" wording appears in the osc_lock_to_placeholder() comment and in the commit message. Maybe mention placeholder reuse as the second allowed match, so a future caller doesn't treat the reuse match as a contract violation, or copy it as a precedent for a generic match?
reply Gerrit AI review for Lustre vvp_io.c:494 — (minor) If the patch is refreshed: this comment says the LOV layer uses a placeholder for these mmap-buffer locks, but vvp_mode_from_vma() r
Gerrit AI review for Lustre
(minor) If the patch is refreshed: this comment says the LOV layer uses a placeholder for these mmap-buffer locks, but vvp_mode_from_vma() returns CLM_WRITE for a shared writable mapping, and osc_lock_to_placeholder() refuses anything but LCK_PR. For such a buffer the stripe is only tolerated, and the reconstructed pages are dropped after the read through ec_unprotected_recovery. Maybe say "a placeholder for a read-mode lock"?
reply Andreas Dilger vvp_io.c:1583 — Right, the kept pages never leave cl_lru_busy. This is fixed by https://review.whamcloud.com/69908 ("LU-12669 ec: fix degraded read page le
Gerrit AI review for Lustre
(defect) Do the pages kept here ever reach the OSC LRU list? A reconstructed page is created by cl_page_find(CPT_CACHEABLE) in lov_ec_read_stripe_pages(), so osc_page_init()->osc_lru_alloc() reserves a cache slot for it (ops_in_lru = 1, cl_lru_busy++). A page only moves from "busy" onto cl_lru_list in osc_extent_finish()->osc_lru_add_batch(), after a BRW. A rebuilt page never goes through a BRW, so it stays counted in cl_lru_busy and takes a ccc_lru_left slot. osc_lru_shrink() only scans cl_lru_list, so it cannot reclaim the page. Before this change, cl_page_delete() here always returned the slot through osc_page_delete()->osc_lru_del(). Now the slot is held until the placeholder (or the granted lock) is cancelled, or until kernel memory reclaim calls ll_release_folio(). A large degraded read can pin max_cached_mb this way, e.g. one dead stripe of a 4+2 file several times larger than the cache. osc_lru_alloc() callers for any file on the mount then sleep in l_wait_event_abortable(osc_lru_waitq, cl_lru_left > 0), and readahead gets -EBUSY. This lasts until the placeholder ages out of the ldlm LRU. Should the kept pages be added to the client LRU when they are marked Uptodate, like osc_lru_add_batch() does after a read?
Andreas Dilger
Right, the kept pages never leave cl_lru_busy. This is fixed by https://review.whamcloud.com/69908 ("LU-12669 ec: fix degraded read page leak and short read"), which adds the kept pages to the client LRU with cl_page_lru_add(). That fix will be merged into this patch the next time it is refreshed.
reply Gerrit AI review for Lustre osc_lock.c:1268 — (suggestion) This isn't a bug, but exporting ldlm_lock_create() and ldlm_lock_enqueue() means osc now builds an ldlm_lock by hand: it sets l
Gerrit AI review for Lustre
(suggestion) This isn't a bug, but exporting ldlm_lock_create() and ldlm_lock_enqueue() means osc now builds an ldlm_lock by hand: it sets l_conn_export, l_flags, l_policy_data and l_req_extent, and takes the addref before the grant. ldlm_cli_enqueue_local() does the same steps but asserts on a client namespace. Would a small exported client-side helper in ldlm (or a relaxed ldlm_cli_enqueue_local()) keep these lock-construction details inside ldlm, instead of making the two internals public API?
tags: 218_review_priority pt_ecro pw_shepherd
owner Andreas Dilger · uploader Andreas Dilger · PS7 uploaded 9d ago · NEW · open in Gerrit ↗
commit message
LU-12669 ec: create lock placeholder for reconstructed pages Pages that CIT_EC_RD reconstructs from parity for a stripe on an unavailable OST are not covered by a DLM lock, so they are dropped after each read, and every later read rebuilds them from parity again. Grant a client-only LDLM_FL_PLACEHOLDER ldlm_lock over the whole stripe object locally, without an RPC, and keep the reconstructed pages Uptodate under it. A stripe gets a placeholder when its target is inactive, or when its sub-lock enqueue fails. If the conversion fails, drop the pages after the read as before. Add cl_lock_operations::clo_to_placeholder() and ldlm_cli_enqueue_placeholder() for this. The pages stay valid while the parity they were rebuilt from is not STALE. Any write or truncate of the file must stale the parity with a layout write intent first, which revokes the layout lock on every client. When a client loses the layout lock, cancel the placeholder locks of the file with LCF_PLACEHOLDER, which discards their pages under the page lock as a server lock cancel does, and cancel one that a read creates meanwhile once that read is done. Fast reads from the page cache already wait for the next IO to refresh the layout, so make the mmap fast fault do the same. So the placeholder needs no server state: it is neither replayed nor dropped before a lock replay, is only matched by page coverage tests, does not hold up the KMS, and otherwise leaves the cache through the LRU like any unused lock. Only PR locks are converted, since a PW placeholder could satisfy a later write without a server lock. Also cancel initialized sub-locks on the lov_lock_sub_init() error path, and in lov_lock_cancel() when the sub-lock env is not found, so a placeholder reference is not leaked, and free the lov_lock with the size it was allocated with. Drop lov_lock_sub::sub_initialized, as every sub-lock is now initialized. Add sanity-ec test_49f to check that a second degraded read sends no read RPCs, that the placeholder survives OST recovery, and that the cached pages do not hide a later write from another client from either read() or an existing mmap. Test-Parameters: testlist=sanity-ec Test-Parameters: testlist=sanity-ec fstype=zfs Signed-off-by: Bobi Jam <bobijam@whamcloud.com> Signed-off-by: Andreas Dilger <adilger@thelustrecollective.com> Assisted-by: Augment Agent:DeepSeek V4.1 Flash Assisted-by: ClaudeCode:claude-opus-5.5 ltvm,llm_code_and_review_tools Change-Id: Idbad18031562d5cef02ab16aadcd4818ec3ebbe5
55936
b2_15
J ✓B ✓T ✓R +2/1
LU-17482 llite: short read could mess up next read offset
reviewing Etienne AUJAMES · all green — ready to land (not in b2_15-next yet)
LTS15
S +35 −4
78d
LU-17482 llite: short read could mess up next read offset
reviewing Etienne AUJAMES · all green — ready to land (not in b2_15-next yet)
LTS15
S +35 −4
78d
1 optional test failure(s) — informational
build #106610 SUCCESS · tests all Maloo sessions
reviews:
Stephane Thiell +1 · Andreas Dilger +1
no vote yet: Qian Yingjin, Patrick Farrell
owner Etienne AUJAMES · uploader Etienne AUJAMES · PS1 uploaded 820d ago · NEW · backport · open in Gerrit ↗
commit message
LU-17482 llite: short read could mess up next read offset
When read reaches EOF, it could read data from stale pagecache, but
we need to restore the iocb->ki_pos so that next read could continue
from the correct offset.
Lustre-change: https://review.whamcloud.com/53827
Lustre-commit: 35fb413683affe9d41f3521259c260de6caf81d9
Fixes: 4468f6c9d9 ("LU-16025 llite: adjust read count as file got truncated")
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: Ib8b62c41bf65f8efec82dda53fcfbdb68ad08b38
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Reviewed-by: Qian Yingjin <qian@ddn.com>
Reviewed-by: Patrick Farrell <patrick.farrell@oracle.com>
Signed-off-by: Etienne AUJAMES <eaujames@ddn.com>
60382
b2_15
J ✗2B ✓T ✓R +1/1
LU-10026 csdc: DoM pattern could be a combined value
reviewing Andreas Dilger · all green — ready to land (not in b2_15-next yet)
LTS15
stalled 296d
M +48 −38
296d
LU-10026 csdc: DoM pattern could be a combined value
reviewing Andreas Dilger · all green — ready to land (not in b2_15-next yet)
LTS15
stalled 296d
M +48 −38
296d
janitor flagged test failures unique to this patch — superseded (tests have since passed) — full janitor results
| unique failing test | history |
|---|---|
| sanity-flr@zfs:test_204c | seen in 3 other reviews |
| sanity-pfl@ldiskfs+DNE:test_22c | seen in 1 other review |
build #120346 SUCCESS · tests all Maloo sessions
reviews:
Andreas Dilger +1 · Zhenyu Xu +1
patchsets:
PS2 07-26
PS3 07-26
PS4 11-04
PS5 12-05
your previous vote: +1 on PS3 (2025-08-28 17:00) — now at PS5
owner Andreas Dilger · uploader Andreas Dilger · PS5 uploaded 335d ago · NEW · backport · open in Gerrit ↗
commit message
LU-10026 csdc: DoM pattern could be a combined value
DoM pattern is LOV_PATTERN_MDT for now, and in the future it could
be combined with LOV_PATTERN_COMPRESS to represent a compressed
DoM component.
Fix a minor glitch for lov_getstripe_old code path (in
ll_lov_getstripe_ea_info), which intends to return the last component
stripe info but the commit abf04e7ea3 omits to correctly set the
last component stripe info before using it.
Lustre-change: https://review.whamcloud.com/51978
Lustre-commit: bb0cc84fbed51e006bfac230dada426bfac4f500
Fixes: abf04e7ea3 ("LU-14337 lov: return valid stripe_count/size for PFL files")
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: Id0779c30c004b6979f88bf96b7b7b74a8b8c26e4
Reviewed-by: Patrick Farrell <pfarrell@whamcloud.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
60266
b2_15
J !B ✓T ✓R +3/1
LU-16837 llite: handle unknown layout component
reviewing Andreas Dilger · all green — ready to land (not in b2_15-next yet)
LTS15
stalled 321d
M +171 −22
321d
LU-16837 llite: handle unknown layout component
reviewing Andreas Dilger · all green — ready to land (not in b2_15-next yet)
LTS15
stalled 321d
M +171 −22
321d
janitor run: 1 failing config(s), none unique to this patch — janitor results
build #119906 SUCCESS · tests all Maloo sessions
reviews:
James Simmons +1 · Zhenyu Xu +1 · Vitaliy Kuznetsov +1
patchsets:
PS1 07-21
PS2 08-28
PS3 11-04
PS4 12-18
your previous vote: +1 on PS1 (2025-07-22 03:00) — now at PS4
owner Andreas Dilger · uploader Andreas Dilger · PS4 uploaded 321d ago · NEW · backport · open in Gerrit ↗
commit message
LU-16837 llite: handle unknown layout component
If lustre client encounters unknown layout component pattern in
a mirror file, this patch makes client mark this mirror as invalid
and skip it.
Lustre-change: https://review.whamcloud.com/51060
Lustre-commit: 14ed4a6f8f231fe94392906f991a32f07e7d7883
LU-16837 lov: NULL dereference in lov_delete_composite
commit 14ed4a6f8f retroduced the issue fixed by commit
5da049d9ef ("LU-14389 lov: avoid NULL dereference in cleanup), this
patch makes the fix cover the new case added by 14ed4a6f8f.
Lustre-change: https://review.whamcloud.com/52826
Lustre-commit: 250c6195fbe748d7c8f4c55888ed749de4cb95ce
Was-Change-Id: I4a2b72e21139b60519ed523b4851723c91f523c1
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: Ie5f44212ab96bdc706cc5a9e11f330234fc01069
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Reviewed-by: Vitaliy Kuznetsov <vkuznetsov@ddn.com>
60568
b2_15
J ✗4B ✓T ✓R +3/1
LU-15683 ofd: proper initialize filter_fid in ofd fallocate
cc Dominique Martinet · all green — ready to land (not in b2_15-next yet)
stalled 328d
2 unresolved
S +23 −0
328d
LU-15683 ofd: proper initialize filter_fid in ofd fallocate
cc Dominique Martinet · all green — ready to land (not in b2_15-next yet)
stalled 328d
2 unresolved
S +23 −0
328d
all green — ready to land (not in b2_15-next yet)
2 reviewer comment(s) to address if a respin is needed — last from Dominique Martinet
janitor flagged test failures unique to this patch — superseded (tests have since passed) — full janitor results
| unique failing test | history |
|---|---|
| recovery-small@ldiskfs+DNE:test_18c | seen in 1 other review |
| sanity1@ldiskfs+DNE:test_27ce | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity2@zfs:test_63a | seen in 5 other reviews |
| sanityn@ldiskfs+DNE:test_18 | NEW unique failure for this branch in the last 30 days, and was seen 1 times across 1 other branches 0 reviews |
1 optional test failure(s) — informational
build #117878 SUCCESS · tests all Maloo sessions
reviews:
Stephane Thiell +1 · Arshad Hussain +1 · Andreas Dilger +1
no vote yet: Oleg Drokin
patchsets:
PS1 08-06
PS2 08-06
PS3 08-07
PS4 10-24 Etienne AUJAMES
threads: 2 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Dominique Martinet COMMIT_MSG:12 — Hm, from what I'm seeing in other b2_15 commits actually it looks like such commits have been squashed together, keeping each commits messag
Andreas Dilger
(minor) this should also have a Fixes: line to reflect which patch introduced the issue.
Dominique Martinet
I've actually just backported this as a dependency of https://review.whamcloud.com/c/fs/lustre-release/+/60569/4 for https://jira.whamcloud.com/browse/LU-19203 For linux-stable this would get a `Stable-dep-of:` tag, but I see no such tag in lustre so I'm not quite sure how to express this. I'll find some time to check the test failures that are all over the place on these commits, but the few I looked at seem to be pretty much unrelated so it'll take a bit of time to make sure..
Dominique Martinet
Hm, from what I'm seeing in other b2_15 commits actually it looks like such commits have been squashed together, keeping each commits message body + Lustre-change/Lust-commit (and eventually renaming Change-Id to Was-Change-Id) But to be honest I picked this commit because it was a conflict but it's a completely independant fix, so I'm not really sure squashing is appropriate... Well, just let me know -- Stanford is already running quite a few non-merged patches so I don't have any strong opinion on trying to merge this, but if it doesn't take so much time I think we'd all rather run the same thing to avoid novel bugs due to non-standard setup so I'll be happy to do minor cleanups. (FWIW here's the list of patches they have: ``` LU-17482 llite: short read could mess up next read offset LU-16500 utils: 'lfs migrate' should select new OSTs LU-16500 utils: set default ost index for lfs migrate LU-16339 quota: notify OSTs until lge_qunit_nu is set LU-7668 utils: add lctl del_ost LU-16345 ofd: ofd_commitrw_read() with non-existing object LU-15117 ofd: no lock for dt_bufs_get() in read path LU-15117 ofd: don't take lock for dt_bufs_get() LU-16044 osd: discard pagecache in truncate's declaration LU-15880 quota: fix insane grant quota LU-15694 quota: keep grace time while setting default limits LU-15880 quota: fix issues in reserving quota LU-16771 llite: add statfs_project tunable ``` )
reply Dominique Martinet COMMIT_MSG:19 — I wish git had a more sensible way of saying "this is the original commit message" but given what we have I guess this makes as much sense a
Andreas Dilger
(minor) typically, the Tested-by: lines are also removed, along with Oleg's Reviewed-by: line, so that he is not CC'd on every patch that is backported.
Dominique Martinet
I wish git had a more sensible way of saying "this is the original commit message" but given what we have I guess this makes as much sense as not touching the original tags, I'll fix this next rebase
owner Dominique Martinet · uploader Etienne AUJAMES · PS4 uploaded 376d ago · NEW · backport · open in Gerrit ↗
commit message
LU-15683 ofd: proper initialize filter_fid in ofd fallocate Intialize filter_fid buffer and call xattr set XATTR_NAME_FID properly in ofd_object_fallocate(). Signed-off-by: Bobi Jam <bobijam@whamcloud.com> Change-Id: Ied573c39dde77f935622e9fbedb2d71eb3bd8f5d Reviewed-on: https://review.whamcloud.com/46919 Tested-by: jenkins <devops@whamcloud.com> Tested-by: Maloo <maloo@whamcloud.com> Reviewed-by: Andreas Dilger <adilger@whamcloud.com> Reviewed-by: Arshad Hussain <arshad.hussain@aeoncomputing.com> Reviewed-by: Oleg Drokin <green@whamcloud.com> Lustre-change: https://review.whamcloud.com/46919 Lustre-commit: 755fdc6678836652302cea51f838e4894f2a7efc Signed-off-by: Dominique Martinet <asmadeus@codewreck.org>
59271
b2_15
J !B ✓T ✓R +1/1
LU-16612 llite: protect cp_state with vmpage lock
cc Etienne AUJAMES · all green — ready to land (not in b2_15-next yet)
LTS15
stalled 378d
XS +5 −1
378d
LU-16612 llite: protect cp_state with vmpage lock
cc Etienne AUJAMES · all green — ready to land (not in b2_15-next yet)
LTS15
stalled 378d
XS +5 −1
378d
janitor run: 3 failing config(s), none unique to this patch — janitor results
1 optional test failure(s) — informational
build #117697 SUCCESS · tests all Maloo sessions
reviews:
Andreas Dilger +1
no vote yet: Patrick Farrell
patchsets:
PS1 05-16
PS2 10-22
owner Etienne AUJAMES · uploader Etienne AUJAMES · PS2 uploaded 379d ago · NEW · backport · open in Gerrit ↗
commit message
LU-16612 llite: protect cp_state with vmpage lock cl_page_make_ready() calls cl_page_io_start() without vmpage lock protection, and that could mess up cl_page's cp_state/cp_owner. Lustre-change: https://review.whamcloud.com/50180 Lustre-commit: d03b038d0dd8360dc896ceb7f3cee99245551cb8 Signed-off-by: Bobi Jam <bobijam@whamcloud.com> Change-Id: Id0df7e14246aa561494a9b6e581cebc55241c4b9 Reviewed-by: Patrick Farrell <pfarrell@whamcloud.com> Reviewed-by: Andreas Dilger <adilger@whamcloud.com> Signed-off-by: Etienne AUJAMES <eaujames@ddn.com>
▶Parked (WIP / self-blocked)
(0)
nothing here right now
85 open
▶Re-review needed — new patchset since your vote
(5)
69694
master
J –B ✓T ✓R +1/2
LU-20958 llite: only update blocks after a flush
reviewing Andreas Dilger · PS4→PS5 since your +1
pt_ecro218_review_priority
1 unresolved
M +116 −10
54m
LU-20958 llite: only update blocks after a flush
reviewing Andreas Dilger · PS4→PS5 since your +1
pt_ecro218_review_priority
1 unresolved
M +116 −10
54m
build #135070 SUCCESS · tests all Maloo sessions
reviews:
Keguang Xu +1
patchsets:
PS1 10-14
PS2 10-21 patrick bot
PS3 10-29
PS4 10-29
PS5 11-01
your previous vote: +1 on PS4 (2026-10-29 07:11) — now at PS5
threads: 1 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Gerrit AI review for Lustre vvp_io.c:1412 — (minor) If the patch is refreshed: this says i_size is not shrunk, but ll_merge_attr_try() -> ll_merge_attr_nolock(..., true) still shrinks
Gerrit AI review for Lustre
(minor) If the patch is refreshed: this says i_size is not shrunk, but ll_merge_attr_try() -> ll_merge_attr_nolock(..., true) still shrinks i_size when cat_kms_partial is clear, i.e. once every stripe has had a lock granted (the truncate-on-another-client case described in the commit message). Maybe "so i_size is not shrunk while some stripe size is unknown", to match the ll_merge_attr_nolock() kernel-doc.
tags: pt_ecro 218_review_priority
owner Andreas Dilger · uploader Andreas Dilger · PS5 uploaded 4d ago · NEW · open in Gerrit ↗
commit message
LU-20958 llite: only update blocks after a flush
vvp_io_fsync_end() merges the stripe attributes into the inode after
every flush and OST sync, to update the blocks for LSOM. Neither
takes a lock on the stripes, so the merged size and blocks are only
what this client last cached for each stripe. That replaces a valid
i_size, e.g. a strict SOM size from the MDS, with a smaller one, down
to 0, for example in the local flush before lseek(SEEK_DATA). An
lseek of an EC file with a stripe on an unavailable OST then finds no
data before this EOF.
Only update i_blocks there, which is what LSOM needed, and not while
i_size and i_blocks came from the MDS.
A write only locks the stripes it covers, and a stripe that this
client never held a lock on only has the size last cached for it, 0
if never seen, so the merge after a write, an O_SYNC write or a tiny
write could also shrink i_size, e.g. to 1MiB after a write at offset
0 of a 3MiB file with three 1MiB stripes whose size came from the
MDS. Have lov_merge_lvb_kms() report such a stripe in the new
cl_attr::cat_kms_partial, and since a write never makes a file
shorter, let these merges only grow i_size then. When the size of
every stripe is known, they may still shrink i_size, e.g. after a
truncate on another client. If that truncate changed the layout, a
write merge can keep a stale larger i_size until a glimpse, which
only affects the lazy SOM size sent at close.
Add sanity-flr test_44j, which checks that an fsync does not
shrink the strict SOM size of a mirrored file.
Test-Parameters: testlist=sanity-flr
Fixes: dfb08bbf77a1 ("LU-16465 llite: fix LSOM blocks for ftruncate and close")
Signed-off-by: Andreas Dilger <adilger@thelustrecollective.com>
Assisted-by: ClaudeCode:claude-opus-5-5 ltvm llm_code_and_review_tools
Change-Id: Id5561dd9af3aec5f966ae4db4bc055bb213ebbe5
64086
master
J –B ✓T …R -1/2−
LU-20958 lov: handle unavailable EC stripes in lseek
reviewing Patrick Farrell · PS47→PS49 since your +1
ec2
pt_ecro218_review_priority
6 unresolved
L +453 −12
8h
LU-20958 lov: handle unavailable EC stripes in lseek
reviewing Patrick Farrell · PS47→PS49 since your +1
ec2
pt_ecro218_review_priority
6 unresolved
L +453 −12
8h
reviews:
Ronnie Sahlberg -1
no vote yet: Keguang Xu, Marc Vef, Andreas Dilger
patchsets:
PS45 10-14 Andreas Dilger
PS46 10-16 Andreas Dilger
PS47 10-21 Andreas Dilger
PS48 10-29 Andreas Dilger
PS49 11-04 patrick bot
+44 earlier
PS1 02-17 PS2 03-29 PS3 03-29 PS4 03-29 PS5 03-29 Ronnie Sahlberg PS6 03-30 Ronnie Sahlberg PS7 03-31 Ronnie Sahlberg PS8 03-31 PS9 03-31 Ronnie Sahlberg PS10 04-01 Ronnie Sahlberg PS11 04-01 Ronnie Sahlberg PS12 04-07 Ronnie Sahlberg PS13 04-08 PS14 04-09 PS15 04-09 PS16 04-09 PS17 04-09 PS18 04-09 PS19 04-09 PS20 04-09 PS21 04-09 PS22 04-10 PS23 04-10 PS24 04-10 PS25 04-10 PS26 04-10 PS27 04-14 PS28 04-14 PS29 04-14 PS30 04-15 PS31 04-15 PS32 04-15 PS33 04-25 PS34 05-20 Marc Vef PS35 06-04 Ronnie Sahlberg PS36 07-13 Marc Vef PS37 07-13 Marc Vef PS38 07-13 Marc Vef PS39 07-15 Marc Vef PS40 07-16 Marc Vef PS41 07-26 Marc Vef PS42 07-26 Marc Vef PS43 08-17 Marc Vef PS44 08-19 Maximilian Dilgeryour previous vote: +1 on PS47 (2026-10-26 10:33) — now at PS49
threads: 6 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Marc Vef patchset comment — Highlighting a conflict with 69111. This patch (and the parent) needs to be refreshed due to 68361 since the code is no longer compatible. (
Marc Vef
Highlighting a conflict with 69111. This patch (and the parent) needs to be refreshed due to 68361 since the code is no longer compatible. (-1) Does this patch need the current parent patches or can it be rebased and updatd for the RAID10 patch now?
reply Marc Vef patchset comment — Conflicts with #69694: it sits on ps3 of #69694, and the current patch set (ps5) conflicts with it in lustre/lov/lov_io.c, lustre/tests/sani
Marc Vef
Conflicts with #69694: it sits on ps3 of #69694, and the current patch set (ps5) conflicts with it in lustre/lov/lov_io.c, lustre/tests/sanity-ec.sh. It needs a rebase onto #69694 before it can land.
reply Gerrit AI review for Lustre file.c:5435 — (defect) The code here depends on lli_attr_valid losing OBD_MD_FLSIZE when the UPDATE lock is cancelled. That clearing is added by 69828 ("L
Gerrit AI review for Lustre
(defect) The code here depends on lli_attr_valid losing OBD_MD_FLSIZE when the UPDATE lock is cancelled. That clearing is added by 69828 ("LU-20958 llite: drop strict SOM size with the UPDATE lock"), but 69828 is not an ancestor of this patch set. The parent is 8bef60849e (an older patch set of 69694), which sits directly on 40b80bc048 on master. In this tree, lli_attr_valid is written only in ll_update_inode(), and nothing clears it in ll_md_blocking_ast().
Without 69828, this sequence goes wrong:
client A: open/stat while the file is in sync -> OBD_MD_FLSIZE, i_size = S
client B: writes the file up to T > S (MDS revokes LAYOUT|UPDATE, marks the SOM stale)
an OST of a data stripe becomes unavailable
client A: lseek(SEEK_DATA, S) -> ci_ec_unavail, but FLSIZE is still set
-> no revalidate; vvp_io_lseek_start() skips ll_merge_attr()
-> eof = S, so the result is -ENXIO although [S, T) has data
Because ll_merge_attr() is skipped, this also misses B's data on the stripes that are available. Should this patch be rebased onto 69828 so that the two cannot land in the wrong order?
reply Andreas Dilger lov_io.c:3833 — Not yet in PS48: 68361 is still at PS17 and its stack does not apply to master. This will be done when 64086 is rebased onto the refreshed
Andreas Dilger
This needs to be updated for the LU-20690 parity layout in https://review.whamcloud.com/68361 ("LU-20690 ec: like-RAID10 parity layout"), which removes RAID0|PARITY: parity components become LOV_PATTERN_PARITY with the p parity objects of a raid set sharing one offset. Once that lands, this check returns -EOPNOTSUPP for every EC file and the parity SEEK_DATA/SEEK_HOLE path is never used. Please check for the parity flag/pattern instead and use the new mapping below.
Andreas Dilger
Not yet in PS48: 68361 is still at PS17 and its stack does not apply to master. This will be done when 64086 is rebased onto the refreshed 68361.
reply Andreas Dilger lov_io.c:3862 — Not yet in PS48, for the same reason. The slot helpers and absolute-offset row/set mapping will be used once 68361 is refreshed.
Andreas Dilger
The parity offset needs to change with 68361 in two ways: 1. RAID10 layout: one stripe_size per raid set per row, and the parity index selects the object rather than the offset, i.e. poff = e_start + (row * R + set) * ss + intra, pstripe = (stripe of that slot) + pi with R = esc_n0 + esc_n1, via the 69516/68361 slot helpers (lsme_parity_slots_per_raidset()) rather than lov_stripe_number() on the concatenated offset. 2. The row/set must come from the absolute data offset, not offset - e_start (see my lov_io.c comment on 68361 PS17): row = off / (c * ss), offset_i = (off / ss) % c, and poff relative to row0 = e_start / (c * ss). Otherwise when e_start is not a multiple of the stripe width this looks at the parity of a different raid set than the one holding the data. Ideally use the shared helper that 68361 adds for this mapping so the kernel recovery, llapi resync, hedge (64919) and lseek all agree. Rebase onto that series once it is updated.
Andreas Dilger
Not yet in PS48, for the same reason. The slot helpers and absolute-offset row/set mapping will be used once 68361 is refreshed.
reply Gerrit AI review for Lustre lov_io.c:3865 — (minor) lov_parity_mirror_index_from_data() looks up the parity link from the data component at lio->lis_pos, which is the lseek start, not
Gerrit AI review for Lustre
(minor) lov_parity_mirror_index_from_data() looks up the parity link from the data component at lio->lis_pos, which is the lseek start, not from dsub's component dindex. If the seek starts in an earlier component of the mirror that has no parity link (e.g. a non-EC first PFL component), pmirror is < 0, and the stripe is reported as all data even though in-sync parity exists. The result is still correct, only less precise. If this is changed to use lsm_entries[dindex]->lsme_mirror_link_id, note that the LASSERTF in lov_io_sub_init() does the same lis_pos lookup, so it would need to stay in step for lov_sub_get() on the parity stripe.
tags: pt_ecro 218_review_priority
owner Patrick Farrell · uploader patrick bot · PS49 uploaded 13h ago · NEW · open in Gerrit ↗
commit message
LU-20958 lov: handle unavailable EC stripes in lseek
SEEK_DATA/SEEK_HOLE on an EC file with a data stripe on an OST that
was deactivated would fail with -ESHUTDOWN, and with an OST that was
down, e.g. during an OSS failover, the lseek would wait for the OST to
return, although reads of the file are rebuilt from parity at once.
Do the lseek with no-delay lock enqueues, as reads do. When the
sub-lock enqueue of a stripe in an EC data component fails, mark it in
this IO's lov_io_sub::sub_ec_err and do not start its sub-IO. Retry
with blocking enqueues once every mirror has been tried. The
unavailable stripe leaves its size out of the merged stripe
attributes, so take EOF from the strict SOM size from the MDS instead,
fetched again as stat() does if the UPDATE lock was dropped. Without
one, wait for the OST, or return -EIO if it stays unavailable, rather
than miss data past a smaller EOF. A stripe whose extent lock is
still cached is locked locally, so its OST_SEEK still waits for the
OST.
Resync writes parity only where a data stripe of its raid set has
data, page aligned, and punches the rest, so a hole in an in-sync
parity stripe is a hole in every data stripe of the raid set. Seek an
available parity stripe of the unavailable stripe's raid set from the
matching offset, and map the result back, for the RAID0|PARITY parity
layout. Each row of a raid set holds one stripe_size chunk in every
data and parity object, so offsets in the two objects advance
together. The result can report data where only another stripe of the
raid set has data, but never a hole where the stripe may have data.
With no parity stripe that can answer, report the stripe as data from
where the IO starts in it, with no hole before its end, which is
always correct: a seek must not skip data, but may report a hole as
data. Since such a stripe has no hole at its end, report the hole at
EOF for SEEK_HOLE if nothing before it is found, and -ENXIO for
SEEK_DATA at EOF.
The parity object is not covered by the lseek lock, so seek it with a
server lock, and do not trust the LVB size of an unlocked object in
osc_io_lseek_start(). Seek parity without delay, failing at once if
its OST is disconnected; an idle import still reconnects for the seek.
Add sanity-ec test_79a, which stops the OST of a stripe, and
test_79b, which checks holes found from parity, and that the stripe
is reported as data when the parity OSTs are stopped too.
Test-Parameters: testlist=sanity-ec ostcount=8
Fixes: 783c13bb0b8f ("LU-12669 ec: recover data from parity")
Signed-off-by: Patrick Farrell <patrick@thelustrecollective.com>
Signed-off-by: Andreas Dilger <adilger@thelustrecollective.com>
Assisted-by: ClaudeCode:claude-opus-5-5 ltvm llm_code_and_review_tools
Change-Id: I5cce4e0ea51c68b0c6fda1d83b694af19cad57bd
47805
master
J ✗1B ✓T ✓R -1/2−
LU-12397 osp: remove opd_new_connection
reviewing Yang Sheng · PS7→PS16 since your +1
needs rebase
S +13 −28
4d
LU-12397 osp: remove opd_new_connection
reviewing Yang Sheng · PS7→PS16 since your +1
needs rebase
S +13 −28
4d
PS7→PS16 since your +1
blocked on the owner: needs rebase — checkpatch: cannot be cherry-picked
janitor flagged test failures unique to this patch — superseded (tests have since passed) — full janitor results
| unique failing test | history |
|---|---|
| sanity-quota@ldiskfs+DNE:test_48 | seen in 6 other reviews |
4 optional test failure(s) — informational
build #122116 SUCCESS · tests all Maloo sessions
no vote yet: Sergey Cheremencev, Andreas Dilger, Alex Zhuravlev
patchsets:
PS12 08-07
PS13 10-09
PS14 08-21
PS15 08-21
PS16 03-05
+11 earlier
PS1 06-28 PS2 07-14 PS3 07-18 PS4 07-22 PS5 07-22 PS6 07-23 PS7 07-23 PS8 03-29 Andreas Dilger PS9 04-24 PS10 05-31 PS11 07-25your previous vote: +1 on PS7 (2023-03-13 07:02) — now at PS16
owner Yang Sheng · uploader Yang Sheng · PS16 uploaded 245d ago · NEW · open in Gerrit ↗
commit message
LU-12397 osp: remove opd_new_connection Since we update opd_new_connection regardless the opd_got_disconnected, so it is pointless to use it rather than opd_imp_connected. Signed-off-by: Yang Sheng <ys@whamcloud.com> Change-Id: I02f9c1c434e0e16156f65b1a7865b3e164832145
67996
master
J –B ✓T ✓R 0/2
LU-20590 llite: pin the layout lock for a starving IO
reviewing Chris Horn · PS6→PS9 since your +1
CI@PS8
L +303 −9
14d
LU-20590 llite: pin the layout lock for a starving IO
reviewing Chris Horn · PS6→PS9 since your +1
CI@PS8
L +303 −9
14d
build #133851 SUCCESS · tests all Maloo sessions
no vote yet: Qian Yingjin
patchsets:
PS5 09-01
PS6 10-02
PS7 10-13
PS8 10-16
PS9 10-21
+4 earlier
PS1 08-14 PS2 08-14 PS3 08-16 PS4 08-30your previous vote: +1 on PS6 (2026-10-06 16:52) — now at PS9
build/test results are from PS8 — PS9…PS9 changed only the commit message (votes copied, CI not re-run)
owner Chris Horn · uploader Chris Horn · PS9 uploaded 14d ago · NEW · open in Gerrit ↗
commit message
LU-20590 llite: pin the layout lock for a starving IO
can_populate_pages() asks ll_file_io_generic() to restart the IO when
the cached layout generation of the inode is the invalid sentinel.
Local reclaim of the MDC ibits lock which carries the layout produces
that sentinel. With the lock cache under pressure, a reader or a
writer then goes round the restart loop. The loop can run until the
budget is gone, and move no data at all.
Count consecutive restarts which moved no bytes and found no cached
generation. After LL_LAYOUT_PIN_RESTARTS of them, ll_layout_pin()
pins the layout lock. The pin holds the lock out of voluntary LRU
reclaim for the rest of the syscall. The function ll_layout_unpin()
drops the pin on the way out. The pin takes no mode reference. The
server can still revoke the layout at once, and the existing
generation checks stay in force.
The counter is a heuristic. A server revoke and a local reclaim both
reach vvp_conf_set() through ll_layout_conf(OBJECT_CONF_INVALIDATE).
The sentinel therefore does not name the cause. A mirror failover
retry which moves nothing can advance the counter too. The cost of a
wrong guess is one spare pin, which the syscall drops on the way out.
A try which moves bytes, or which reads a valid generation, resets the
counter. The threshold only has to clear the one-shot paths.
A try at the pin can fail. A pin which succeeds spends one of
LL_LAYOUT_PIN_TRIES. A failure which says that no pin can help also
spends one. One syscall makes at most four such tries. Thus a server
which revokes four pins in one syscall ends the pins for that syscall.
Four revokes show that the server, not reclaim, causes the restarts.
More pins would then only add RPCs.
A failure with -ENOENT or -ESTALE says only that the reclaim won the
race. That race is the condition the pin exists for, so it
spends no try. The count of restarts still bounds the retries. Every
restart already sends its own layout intent RPC from vvp_io_init(), so
a try adds at most one RPC. A failed try never aborts the IO.
While a thread starves on a file, cancel_lru_locks and an
lru_size=clear no longer drop that file's layout lock.
Add a fault injection, OBD_FAIL_LLITE_LAYOUT_LRU_DROP (0x143a). The
helper vvp_layout_lru_drop() drops the unused locks of the MDC
namespace inside the window the IO uses. The injection goes through
the LRU cancel path, not a direct invalidation of the object. The
condition under test is therefore the real one. The injection fires
only after the layout refresh succeeds. The injection also gates on
the IO type, because vvp_io_init() serves every llite cl_io. The
reclaim is best effort, so the injection can bite fewer times than the
test needs.
Add the llite stats counters layout_restart and layout_pin. The first
counts the restarts which moved no data and found no cached
generation. The second counts the pins. A layout_restart count which
grows on a production client shows starvation of the lock cache.
Add sanity test_251d. The test writes and then reads 1 MiB under the
injection. It checks that each IO completes, that the data is correct,
and that the client took a pin. The test reads the counters, not the
debug log, so a change to a debug message cannot break it. The test
skips when the injection bit too few times in both IOs. A test which
did not run must not report a pass.
ldlm_cancel_lru() moves to a public header for the injection site. The
llite module is separate, so the patch exports the symbol. The move
also corrects the description of ldlm_cancel_lru(). The old text named
LCF_ASYNC for both cases. The return section named a parameter which
the function does not have. The section also gave one meaning to a
return of 0 where the function has two.
Fixes: 4af3ab1945fd ("LU-2017 mdc: add layout swap between 2 objects")
Test-Parameters: testlist=sanity env=ONLY=251,ONLY_REPEAT=3
Assisted-by: Claude:claude-opus-5
Signed-off-by: Chris Horn <chorn@ddn.com>
Change-Id: I94a96d0c1216acce674a47ade170c6de0b1474c3
48102
master
J ✗2B ✓T ✗2R -1/2−
LU-16064 ldlm: postpone lock cancellation
reviewing Alex Zhuravlev · PS15→PS72 since your +1
2 unique failures
stalled 100d
14 unresolved
M +109 −8
100d
LU-16064 ldlm: postpone lock cancellation
reviewing Alex Zhuravlev · PS15→PS72 since your +1
2 unique failures
stalled 100d
14 unresolved
M +109 −8
100d
PS15→PS72 since your +1
blocked on the owner: janitor: test failures unique to this patch; enforced tests failed
janitor flagged test failures unique to this patch — full janitor results
| unique failing test | history |
|---|---|
| sanity-slow@ldiskfs+DNE:test_255c | seen in 2 other reviews |
| sanityn@ldiskfs+DNE:test_121 | seen in 5 other reviews |
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-zfs-part-1 | RHEL 9.7 / x86_64 | ran 3 tests. 1 tests failed: sanity. | session |
| review-dne-zfs-part-2 | RHEL 10.1 / x86_64 | ran 11 tests. 1 tests failed: sanity-lfsck. | session |
build #127492 SUCCESS · tests all Maloo sessions
reviews:
Vitaly Fertman -1
no vote yet: Qian Yingjin, Alexey Lyashkov, Andreas Dilger, Mikhail Pershin
patchsets:
PS68 02-22
PS69 03-18
PS70 04-15
PS71 06-23
PS72 07-13
+67 earlier
PS1 08-01 PS2 08-01 PS3 08-02 PS4 08-02 PS5 08-02 PS6 08-02 PS7 08-03 PS8 08-18 PS9 08-18 PS10 08-22 PS11 08-23 PS12 08-30 PS13 09-05 PS14 09-05 PS15 09-23 Colin Faber PS16 11-28 PS17 01-17 Andreas Dilger PS18 03-04 PS19 04-24 PS20 05-09 PS21 05-11 PS22 06-01 PS23 06-12 PS24 06-15 PS25 06-28 PS26 06-30 PS27 08-01 PS28 08-20 PS29 08-22 PS30 09-23 PS31 09-24 PS32 10-06 PS33 10-16 PS34 10-25 PS35 11-03 PS36 11-09 PS37 11-19 PS38 11-30 PS39 01-06 PS40 04-30 PS41 05-11 PS42 06-10 PS43 06-19 PS44 06-21 PS45 07-09 PS46 07-27 PS47 02-06 PS48 02-14 PS49 02-19 PS50 03-27 PS51 04-10 PS52 04-18 PS53 05-18 PS54 06-05 PS55 06-16 PS56 06-18 PS57 06-30 PS58 07-09 PS59 07-15 PS60 11-04 PS61 11-26 PS62 12-12 PS63 12-24 PS64 01-06 PS65 01-09 PS66 01-28 PS67 02-18your previous vote: +1 on PS15 (2022-10-09 04:02) — now at PS72
threads: 14 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Gerrit AI review for Lustre COMMIT_MSG:11 — The body explains the postponement, but three parts of the diff are not accounted for.
Gerrit AI review for Lustre
The body explains the postponement, but three parts of the diff are not accounted for. The biggest one is the MDT exclusion in obd_stale_export_get(): the fix is deliberately disabled for MDT exports, so DoM writes from an evicted client are still exposed. That limitation belongs in the message rather than only in an XXX comment. The new OBD_FAIL_OST_PAUSE_COMMITRW fault point in ofd_commitrw_write() and the two new replay-dual subtests are also unmentioned.
reply Alex Zhuravlev patchset comment — we can't grab a lock on both server and client. marking makes no sense as few RPCs can be covered by a single lock.
Vitaly Fertman
> > we can do what is enough to resolve the problem. to grab. or to mark individual locks as not to be cancelled on eviction - so that you know which ones to leave on the export in ldlm_bl_thread_exports. > this is what the patch does - do not cancel on eviction and wait for all the export's RPC to complete. no, the patch postpones all the locks on the export from being cancelled, what I suggested above is to grab/mark only involved locks in ptlrpc_server_request_add for the on-going IO. others can be cancelled immediately. > > > once IO (in ofd) started we don't check locks until the operation is done. > > we prolong locks twice in advance in ptlrpc_server_request_add() and at the end in ptlrpc_server_finish_request() > we do, but eviction can happen during bulk, for example which may take dozen on seconds and during this time the corresponding thread just sleeps being unable to check/prolong locks. bulk starts after ptlrpc_server_request_add() which prolongs locks where I suggested to grab to corresponding locks, thus at the time of the eviction it will be clear which one are not to be cancelled. 1 operation under 1 lock should not block for dozen of seconds other 1000 locks on the same export which can be cancelled immediately. btw, there is another thread which is able to prolong if there is an IO under an expired lock - see expired_lock_main->ldlm_lock_busy. this loop could be optimised here as well.
Alex Zhuravlev
we can't grab a lock on both server and client. marking makes no sense as few RPCs can be covered by a single lock.
reply Gerrit AI review for Lustre obd_class.h:364 — (style) `exp` is used bare here while every other reference in this macro is parenthesised as `(exp)`. Worth matching the rest of the macro
Gerrit AI review for Lustre
(style) `exp` is used bare here while every other reference in this macro is parenthesised as `(exp)`. Worth matching the rest of the macro so a non-trivial argument expression can't bind wrongly.
reply Gerrit AI review for Lustre obd_class.h:365 — ldlm_bl_thread_wakeup() is only declared in lustre/ldlm/ldlm_internal.h, which is a module-private header, and it has no EXPORT_SYMBOL. obd_
Gerrit AI review for Lustre
ldlm_bl_thread_wakeup() is only declared in lustre/ldlm/ldlm_internal.h, which is a module-private header, and it has no EXPORT_SYMBOL. obd_class.h is a public header included all over the tree. It builds today only because the two users of class_export_rpc_dec() (ptlrpc/service.c via ptlrpc_internal.h, and ldlm/ldlm_lib.c) both happen to pull in ldlm_internal.h and both live in ptlrpc.ko. The first caller added from ofd/mdt/obdclass gets an implicit-declaration error, or an unresolved symbol at modpost. Would it be better to declare the wakeup in a public header (or route this through a small obdclass helper) so the macro stands on its own?
reply Patrick Farrell ldlm_lockd.c:2982 — Is this really just unique to the MDS?
Patrick Farrell
Is this really just unique to the MDS? What about OSTs where we're running clients for hot pools?
reply Patrick Farrell ldlm_lockd.c:2987 — Maybe I'm misunderstanding this, but isn't this making a very large change - We will now not do lock cancellation while there are any RPCs r
Patrick Farrell
Maybe I'm misunderstanding this, but isn't this making a very large change - We will now not do lock cancellation while there are any RPCs running? But on a busy system there will be RPCs ~all the time, so this seems like it would be a very big behavior change with possible performance impacts?
reply Alex Zhuravlev ldlm_lockd.c:3003 — I tend to agree, but we'd block anyway? and we have few threads to handle this?
Vitaly Fertman
this way the thread cannot take another job to handle. this check should be done right in ldlm_bl_get_work
Alex Zhuravlev
I tend to agree, but we'd block anyway? and we have few threads to handle this?
reply Gerrit AI review for Lustre genops.c:1924 — (minor) The loop always breaks immediately after list_del_init(), so nothing is iterated past a removal and `tmp` is never used for its purp
Gerrit AI review for Lustre
(minor) The loop always breaks immediately after list_del_init(), so nothing is iterated past a removal and `tmp` is never used for its purpose. Plain list_for_each_entry() would say what this does more clearly.
reply Gerrit AI review for Lustre genops.c:1925 — This carries forward an open question from patchset 29 that the current revision still doesn't answer, with some extra detail.
Gerrit AI review for Lustre
This carries forward an open question from patchset 29 that the current revision still doesn't answer, with some extra detail. The comment says an MDS can deadlock because RPC handling may need to evict its own client. The same shape looks reachable on an OST: a service thread holds exp_rpc_count on E and blocks in tgt_extent_lock()/ldlm_cli_enqueue_local() on a lock that conflicts with one of E's own granted locks; E's locks are only dropped by ldlm_bl_thread_exports(), which now can't get E because exp_rpc_count > 0. What structurally prevents that cycle on OST that doesn't hold on MDT? There is also no bound and no fallback wake here. If exp_rpc_count never returns to zero the export stays on obd_stale_exports forever, which keeps it on obd_unlinked_exports, and target cleanup then spins in obd_exports_barrier() printing "Is it stuck?" (and obd_zombie_impexp_stop() asserts the list is empty). Previously the export was always picked up.
reply Gerrit AI review for Lustre genops.c:1930 — Matching on obd_name means the fix silently turns itself off for the OSTs of any filesystem whose name contains "MDT" - `mkfs.lustre --fsnam
Gerrit AI review for Lustre
Matching on obd_name means the fix silently turns itself off for the OSTs of any filesystem whose name contains "MDT" - `mkfs.lustre --fsname=testMDT` gives obd_name "testMDT-OST0000", and strstr() finds it.
The device type is what's actually being tested here, so comparing the type would be exact:
strcmp(exp->exp_obd->obd_type->typ_name, LUSTRE_MDT_NAME) != 0
That is the idiom used elsewhere, e.g. tgt_handler.c:973. It also avoids running strstr() over every stale export on every scan while holding obd_stale_export_lock.
reply Gerrit AI review for Lustre replay-dual.sh:1347 — (style) Test preconditions in this suite read as the positive condition that must hold:
Gerrit AI review for Lustre
(style) Test preconditions in this suite read as the positive condition that must hold:
[[ "$ost1_FSTYPE" == ldiskfs ]] || skip "needs ldiskfs backend"
The negated `&&` form is what the tree is moving away from.
reply Gerrit AI review for Lustre replay-dual.sh:1363 — (minor) The suggestion to use /dev/urandom instead of /dev/random was raised on patchsets 38 and 39 and marked resolved, but both dd calls h
Gerrit AI review for Lustre
(minor) The suggestion to use /dev/urandom instead of /dev/random was raised on patchsets 38 and 39 and marked resolved, but both dd calls here (and in test_34b) still read /dev/random.
owner Alex Zhuravlev · uploader Alex Zhuravlev · PS72 uploaded 115d ago · NEW · open in Gerrit ↗
commit message
LU-16064 ldlm: postpone lock cancellation until all export's RPCs are complete, otherwise lock can be granted to another client and then RPC processing from just evicted client can break data consistency. Signed-off-by: Alex Zhuravlev <bzzz@whamcloud.com> Change-Id: Id7944cb5583cbe5997e96ee413f7ec70d3faf287
▶Awaiting your review — CI green
(33)
69392
master
J –B ✓T ✓R -1/2−
LU-12669 ec: wait for stripes that parity cannot rebuild
reviewing Andreas Dilger · CI green — awaiting your review
218_review_prioritypt_ecro
2 unresolved
L +289 −36
54m
LU-12669 ec: wait for stripes that parity cannot rebuild
reviewing Andreas Dilger · CI green — awaiting your review
218_review_prioritypt_ecro
2 unresolved
L +289 −36
54m
| 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
reviews:
Marc Vef -1
no vote yet: Keguang Xu, Ronnie Sahlberg
patchsets:
PS1 10-03
PS2 10-14
PS3 10-28
threads: 2 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
reply Marc Vef patchset comment — needs rebase or address the conflict with the placeholder patch
Marc Vef
needs rebase or address the conflict with the placeholder patch
tags: 218_review_priority pt_ecro
owner Andreas Dilger · uploader Andreas Dilger · PS3 uploaded 7d 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
69517
master
J –B ✓T ✓R +2/2
LU-20690 ec: implement STRIPE I/O scope
reviewing Keguang Xu · CI green — awaiting your review
raid10-like218_review_blockerpt_ecro218_review_prioritypw_shepherd
2 unresolved
L +455 −99
1h
LU-20690 ec: implement STRIPE I/O scope
reviewing Keguang Xu · CI green — awaiting your review
raid10-like218_review_blockerpt_ecro218_review_prioritypw_shepherd
2 unresolved
L +455 −99
1h
build #134549 SUCCESS · tests all Maloo sessions
reviews:
Ronnie Sahlberg +1 · Andreas Dilger +1
no vote yet: Marc Vef
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: 2 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 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: raid10-like 218_review_blocker pt_ecro 218_review_priority pw_shepherd
owner Keguang Xu · uploader Keguang Xu · PS9 uploaded 8d 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
69940
master
J –B ✓T ✓R 0/2
LU-21016 llite: do not switch hybrid IO to DIO on ZFS
reviewing Patrick Farrell · CI green — awaiting your review
pw_own218_review_priority
M +195 −8
7h
LU-21016 llite: do not switch hybrid IO to DIO on ZFS
reviewing Patrick Farrell · CI green — awaiting your review
pw_own218_review_priority
M +195 −8
7h
build #135279 SUCCESS · tests all Maloo sessions
no vote yet: Andreas Dilger, Timothy Day
patchsets:
PS3 10-26 patrick bot
PS4 10-27 patrick bot
PS5 10-27 patrick bot
PS6 11-01 patrick bot
PS7 11-03 patrick bot
+2 earlier
PS1 10-22 PS2 10-22 patrick bottags: pw_own 218_review_priority
owner Patrick Farrell · uploader patrick bot · PS7 uploaded 2d ago · NEW · open in Gerrit ↗
commit message
LU-21016 llite: do not switch hybrid IO to DIO on ZFS
Hybrid IO switches large buffered IO to direct IO. On ZFS
each direct write RPC forces a transaction group sync, so
with anything but fast storage hybrid IO is far slower than
the buffered IO it replaces. Reads do not sync and still
switch.
Do not switch writes when any initialized component of the
file has a stripe on a ZFS OST. ZFS OSTs are recognized by
the ocd_maxbytes they report at connect, MAX_LFS_FILESIZE,
which ldiskfs does not approach, so no server change is
needed. osd-wbcfs reports the same and is treated alike. The
OSTs are classified when the layout is unpacked, so the write
path tests a flag per component.
Add llite.*.hybrid_io_to_zfs, off by default, to allow the
write switch on ZFS anyway for sites with fast storage.
sanity 119k checks writes with and without it.
Fixes: d8a194db21dc ("LU-18033 llite: enable hybrid IO by default")
Assisted-by: ClaudeCode:claude-sonnet-5-5
Assisted-by: ClaudeCode:claude-opus-5-5
Assisted-by: Codex:gpt-6.1-sol
Signed-off-by: Patrick Farrell <patrick@thelustrecollective.com>
Change-Id: Ibb0043020a05087f6ec2d960524c0d7c5bb29858
69769
master
J –B ✓T ✓R 0/2
LU-11962 flr: fix FLR and SOM state after a layout swap
reviewing Andreas Dilger · CI green — awaiting your review
ssompt_ecropw_shepherd
3 unresolved
M +180 −6
8h
LU-11962 flr: fix FLR and SOM state after a layout swap
reviewing Andreas Dilger · CI green — awaiting your review
ssompt_ecropw_shepherd
3 unresolved
M +180 −6
8h
build #135064 SUCCESS · tests all Maloo sessions
no vote yet: Patrick Farrell
patchsets:
PS1 10-17
PS2 10-28
PS3 10-31
PS4 11-01
threads: 3 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Gerrit AI review for Lustre lod_lov.c:1372 — (suggestion) This covers the reload after an LU_XATTR_REPLACE swap. Other paths still keep the old state, though, because lod_striping_free_
Gerrit AI review for Lustre
(suggestion) This covers the reload after an LU_XATTR_REPLACE swap. Other paths still keep the old state, though, because lod_striping_free_nolock() never resets ldo_flr_state: - A mirrored file swapped with a file that has no layout loses its LOV through mdd_swap_layouts()->lod_xattr_del()->lod_striping_free(), and keeps LCM_FL_RDONLY in memory. - The plain-layout branch of lod_use_defined_striping() (the LU_XATTR_CREATE side of that swap) and lod_striping_from_default() with one mirror don't reset it either. If such a file later gets a default PFL layout, can lod_declare_layout_change() send the write intent to lod_declare_update_rdonly()? This predates the patch. Resetting ldo_flr_state to LCM_FL_NONE in lod_striping_free_nolock() might cover every path at once, here or in a follow-up.
reply Gerrit AI review for Lustre mdd_object.c:3213 — (minor) The HSM restore swap in hsm_swap_layouts() passes flags 0, so this now makes the restored file's SOM stale inside the swap transacti
Gerrit AI review for Lustre
(minor) The HSM restore swap in hsm_swap_layouts() passes flags 0, so this now makes the restored file's SOM stale inside the swap transaction. The mdt_lsom_downgrade() call that follows mo_swap_layouts() there will then always find SOM already stale, and it is the only caller of mdt_lsom_downgrade(). If the patch is refreshed, could that call (and maybe the function) be removed?
reply Gerrit AI review for Lustre mdt_handler.c:1969 — (defect) Can this deadlock against a concurrent rename that overwrites one of the two files?
Gerrit AI review for Lustre
(defect) Can this deadlock against a concurrent rename that overwrites one of the two files?
mdt_swap_layouts() locks the larger FID first: it does swap(o1, o2) when lu_fid_cmp(fid1, fid2) < 0, so o1 is always the larger FID. mdt_reint_rename() locks the two children in ascending FID order (LU-15491), taking the source `mold` with LOOKUP|XATTR and the target `mnew` with LOOKUP|UPDATE, both EX.
Before this change only the XATTR bit on `mold` conflicted with the swap. Now UPDATE also conflicts on `mnew`, so `lfs swap_layouts A B` racing with `mv A B` on the same MDT, A < B:
rename: holds A (LOOKUP|XATTR), waits for B (LOOKUP|UPDATE)
swap: holds B (LAYOUT|XATTR|UPDATE), waits for A
With A > B, rename takes B first (child_reverse_lock), and the swap order closes the same cycle. Both are server-local blocking enqueues with no trylock, so the two MDT threads hang and any later access to A or B blocks behind them. Any user who can write both files can trigger this.
mdt_close_handle_layouts() already locks in ascending order. Should mdt_swap_layouts() lock o2 before o1 (or swap only when the comparison is > 0) so that all three paths use the same order?
tags: ssom pt_ecro pw_shepherd
owner Andreas Dilger · uploader Andreas Dilger · PS4 uploaded 4d ago · NEW · open in Gerrit ↗
commit message
LU-11962 flr: fix FLR and SOM state after a layout swap
The SOM xattr stays with the inode when its layout is swapped, e.g. by
"lfs migrate" of a mirrored file after "lfs mirror resync". The new
layout is usually not FLR, so writes do not go through a layout write
intent that makes SOM stale, and mdt_lsom_update() does not change
strict SOM at close. The MDT then keeps returning the old size and
blocks as strict, and clients do not glimpse the OSTs. Also,
lod_parse_striping() does not reset the FLR state for a plain layout,
so after such a swap LOD keeps the state of the layout it replaced.
Make strict SOM stale on both files in mdd_swap_layouts(), in the
transaction of the swap, so that a replay never finds the swap
committed without it. HSM release keeps the strict SOM it sets.
Revoke the UPDATE locks too, so that clients drop strict attributes
they cached, and reset the FLR state of a plain layout in
lod_parse_striping().
Fixes: ce61bcac8661 ("LU-9771 clio: no glimpse for data immutable file")
Signed-off-by: Andreas Dilger <adilger@thelustrecollective.com>
Assisted-by: ClaudeCode:claude-opus-5-5 ltvm llm_code_and_review_tools
Change-Id: I4dd07511ca0cad7a412623976370fefb17f97e32
69688
master
J –B ✓T ✓R +1/2
LU-20964 llite: keep zero page owned if read ahead
reviewing Sebastien Buisson · CI green — awaiting your review
pw_shepherd
M +56 −1
12h
LU-20964 llite: keep zero page owned if read ahead
reviewing Sebastien Buisson · CI green — awaiting your review
pw_shepherd
M +56 −1
12h
build #134086 SUCCESS · tests all Maloo sessions
reviews:
Andreas Dilger +1
no vote yet: Shaun Tancheff, Timothy Day, Patrick Farrell
patchsets:
PS1 10-14
PS2 10-15
PS3 10-20
tags: pw_shepherd
owner Sebastien Buisson · uploader Sebastien Buisson · PS3 uploaded 16d ago · NEW · open in Gerrit ↗
commit message
LU-20964 llite: keep zero page owned if read ahead
When truncating an encrypted file to a size that is not a multiple
of PAGE_SIZE, ll_io_zero_page() assumes the page at the new EOF,
reads it if it is not uptodate, zeroes the end of it and writes it.
It sets PagePrivate2 so that ll_io_read_page() keeps the page owned
and locked.
But if the page was read ahead and not yet used, it has
cp_defer_uptodate set and is not uptodate. ll_io_read_page() then
marked it uptodate and called cl_page_disown(), whatever PagePrivate2
says. This cleared the owner and unlocked the vmpage, so
ll_io_zero_page() queued for write a page it did not own anymore:
(cl_io.c:944:cl_page_list_add()) ASSERTION( page->cp_owner != NULL )
ll_io_zero_page+0x46c/0x850 [lustre]
ll_setattr_raw+0x95c/0x1130 [lustre]
do_truncate+0x94/0x100
Do not disown the page in that case either, as is already done after
an actual read.
Add sanity-sec test_48d to exercise this. The client must hold a PW
lock covering the page before the truncate, otherwise the lock
request in ll_io_zero_page() cancels the read lock and drops the
read-ahead pages, so the test writes the file before reading it.
Fixes: edcd05e5ac03 ("LU-15803 sec: correctly handle page lock in ll_io_zero_page")
Signed-off-by: Sebastien Buisson <sbuisson@ddn.com>
Assisted-by: Claude:claude-opus-5-5
Change-Id: I06603a26e0be98dd60b4ee2bec4a2d3d7950dc2c
64441
master
J –B ✓T ✓R +2/2
LU-12187 lov: MDS layout pattern negotiation
reviewing Maximilian Dilger · CI green — awaiting your review
pt_ecropw_shepherd218_review_blocker
4 unresolved
XL +1273 −53
14h
LU-12187 lov: MDS layout pattern negotiation
reviewing Maximilian Dilger · CI green — awaiting your review
pt_ecropw_shepherd218_review_blocker
4 unresolved
XL +1273 −53
14h
build #135207 SUCCESS · tests all Maloo sessions
reviews:
Marc Vef +1 · Andreas Dilger +1
no vote yet: Oleg Drokin
patchsets:
PS30 10-13
PS31 10-21
PS32 10-24
PS33 11-02 Marc Vef
PS34 11-02 Marc Vef
+29 earlier
PS1 03-09 PS2 03-12 PS3 03-12 PS4 03-12 PS5 03-15 PS6 03-26 PS7 04-10 PS8 04-23 PS9 04-23 Andreas Dilger PS10 04-24 Andreas Dilger PS11 05-04 Andreas Dilger PS12 06-03 PS13 06-05 PS14 06-08 PS15 06-24 PS16 06-25 PS17 07-09 PS18 07-10 PS19 08-13 PS20 08-21 PS21 08-25 PS22 08-25 PS23 09-02 PS24 09-03 PS25 09-08 PS26 09-09 PS27 09-11 PS28 09-16 PS29 10-13threads: 4 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Gerrit AI review for Lustre COMMIT_MSG:7 — (style) This isn't a bug, but the summary is a noun phrase rather than imperative, e.g. "lov: add MDS layout pattern negotiation" (still wit
Gerrit AI review for Lustre
(style) This isn't a bug, but the summary is a noun phrase rather than imperative, e.g. "lov: add MDS layout pattern negotiation" (still within 62 characters).
reply Gerrit AI review for Lustre llite_lib.c:452 — (minor) Is the side effect here intended? lmv_get_info() for KEY_CONN_DATA also does
Gerrit AI review for Lustre
(minor) Is the side effect here intended? lmv_get_info() for KEY_CONN_DATA also does
exp->exp_connect_data = *(struct obd_connect_data *)val;
so now, on every OBD_NOTIFY_OCD from any MDC, sbi->ll_md_exp->exp_connect_data is rewritten with MDT0000's imp_connect_data:
ptlrpc_connect_interpret()->mdc_import_event(IMP_EVENT_OCD)->lmv_notify()->ll_upcall_notify()->ll_layout_pattern_types_refresh()->lmv_get_info()
Before this patch it was only written at mount. It is an unlocked struct copy while exp_connect_flags*(sbi->ll_md_exp) is read without locks all over llite. After an MDT0000 failover to a server granting different flags, those flags would change mid-mount, while the LL_SBI_* bits derived from them at mount stay the same. If it is intended, a line in the commit message would help. Otherwise the mask could be read from the MDT0000 MDC import without going through the LMV export.
reply Gerrit AI review for Lustre xattr.c:244 — (minor) For a regular file this check runs twice: ll_setstripe_ea() calls ll_adjust_lum() and then ll_lov_setstripe_ea_info(), and ll_lov_se
Gerrit AI review for Lustre
(minor) For a regular file this check runs twice: ll_setstripe_ea() calls ll_adjust_lum() and then ll_lov_setstripe_ea_info(), and ll_lov_setstripe_ea_info() calls ll_layout_patterns_check() again first thing (file.c). The only extra case covered here is S_ISDIR via ll_dir_setstripe(). The LL_IOC_LOV_SETSTRIPE ioctl on a directory goes to ll_dir_setstripe() without the check, so the two directory paths now behave differently. Should the check be either only in ll_lov_setstripe_ea_info(), or in ll_dir_setstripe() as well, so both directory paths agree?
reply Gerrit AI review for Lustre mdt_lproc.c:1431 — (suggestion) With MDT_LAYOUT_PATTERN_TYPES as defmask, cfs_str2mask() makes "layout_pattern_types=default" turn parity on (`newmask = defmas
Gerrit AI review for Lustre
(suggestion) With MDT_LAYOUT_PATTERN_TYPES as defmask, cfs_str2mask() makes "layout_pattern_types=default" turn parity on (`newmask = defmask`). The man page's Default property, and the mdt_init0() seed with mdt_enable_flr_ec=0, are the baseline without parity. The man page does say "all and default enable every type", but "default" giving something other than the default is surprising, and "default" is missing from Valid Values. Would passing the boot seed (LOV_LAYOUT_PATTERN_TYPES_217 | (mdt_enable_flr_ec ? LOV_PATTERN_PARITY : 0)) as defmask be more intuitive?
tags: pt_ecro pw_shepherd 218_review_blocker
owner Maximilian Dilger · uploader Marc Vef · PS34 uploaded 2d ago · NEW · open in Gerrit ↗
commit message
LU-12187 lov: MDS layout pattern negotiation
Add obd_connect_data::ocd_layout_pattern_types so a client and the MDS
negotiate the layout patterns and LOV_PATTERN_F_* flags both support.
The client sends what it knows, the MDS replies with the intersection
when it grants OBD_CONNECT2_FLR_EC, and the client falls back to the
pre-2.18 baseline LOV_LAYOUT_PATTERN_TYPES_217 otherwise. FLR-EC uses
this for LOV_PATTERN_PARITY. The mask comes from MDT0000 through the
LMV and is refreshed on every MDC reconnect; the client's own request
is restored for each reconnect like the connect flags, so a pattern
the MDS re-enables comes back without a remount. OSTs are not
involved.
A component whose pattern or flag was not negotiated is left
uninitialized by lov_init_composite() like an unknown pattern, so IO
reads another mirror instead; writes still stale it so that a later
resync rebuilds it. The client refuses to create such a component
with EOPNOTSUPP on both the setstripe ioctl and lustre.lov xattr
paths. Parsing stays pattern-agnostic so lsme alloc/free remain
symmetric.
Add mdt.*.layout_pattern_types to change the advertised types at
runtime (mdt_enable_flr_ec only seeds it at MDT start), read-only
lov.*.layout_pattern_types on the client, and man pages for both.
The value is filesystem-wide, so set it on all MDTs.
Rename llite_enable_flr_ec to enable_flr_ec, reached as
lustre.enable_flr_ec via 'lctl {get,set}_param --module'. Since
mdt_enable_flr_ec only seeds an MDT at startup, set_mdt_flr_ec() in
the test framework also enables parity on the MDT it has just
mounted. MODOPTS_MDT never reaches the MDS when mount loads the
server modules (LOAD_MODULES_REMOTE=false, as in autotest), so
sanity-ec and sanity test_27D negotiate parity explicitly, and
test_27D skips the EC subtests that create parity layouts when the
client or MDS cannot.
Add conf-sanity 163a-163d: the negotiated mask in the import, the
tunable and reconnect renegotiation, write staling from a client
without EC, and an un-negotiated layout flag injected with
OBD_FAIL_LOV_COMP_FLAG.
Assisted-by: ClaudeCode:Fable-5.1 llm_code_and_review_tools
Assisted-by: ClaudeCode:Opus-5.5 llm_code_and_review_tools
Test-Parameters: testlist=sanity-ec
Test-Parameters: testlist=conf-sanity env=ONLY="163"
Test-Parameters: testlist=sanity serverversion=2.17
Test-Parameters: testlist=sanity-pfl clientversion=2.17
Test-Parameters: testlist=sanity-pfl serverversion=2.17 env=SANITY_PFL_EXCEPT="18 28"
Test-Parameters: testlist=sanity-flr clientversion=2.17
Test-Parameters: testlist=sanity-flr serverversion=2.17 env=SANITY_FLR_EXCEPT="0a"
Signed-off-by: Maximilian Dilger <mdilger@whamcloud.com>
Change-Id: Iaef716e28014be5b91dd50b117dd0881f5c37f37
62952
master
J –B ✓T ✓R +1/2
LU-19687 lov: skip foreign layouts for regular file IO
reviewing Alex Zhuravlev · CI green — awaiting your review
pw_shepherd
19 unresolved
S +43 −2
1d
LU-19687 lov: skip foreign layouts for regular file IO
reviewing Alex Zhuravlev · CI green — awaiting your review
pw_shepherd
19 unresolved
S +43 −2
1d
build #134759 SUCCESS · tests all Maloo sessions
reviews:
Andreas Dilger +1
no vote yet: Oleg Drokin, Nikitas Angelinas, Patrick Farrell
patchsets:
PS17 06-12
PS18 06-23
PS19 09-16
PS20 10-23
PS21 10-29
+16 earlier
PS1 12-08 PS2 12-09 PS3 12-09 PS4 01-09 PS5 01-28 PS6 02-11 PS7 02-18 PS8 03-10 PS9 03-12 PS10 03-30 Andreas Dilger PS11 04-29 PS12 04-29 PS13 05-02 PS14 05-29 PS15 05-29 PS16 06-08threads: 19 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Gerrit AI review for Lustre COMMIT_MSG:20 — (minor) This removes a client LBUG, so a Fixes: tag would help decide which maintenance branches need it. The LASSERT came in with 61a002cd8
Gerrit AI review for Lustre
(minor) This removes a client LBUG, so a Fixes: tag would help decide which maintenance branches need it. The LASSERT came in with 61a002cd8631 ("LU-13602 flr: skip unknown FLR component types"), but it only became reachable for a plain PFL file once a broken component started being converted to an in-memory foreign entry:
Fixes: 902fe290e51d ("LU-17261 lov: ignore broken components")
reply Gerrit AI review for Lustre COMMIT_MSG:16 — (typo) "such a write" -> "such as a write".
Gerrit AI review for Lustre
(typo) "such a write" -> "such as a write".
reply Gerrit AI review for Lustre COMMIT_MSG:19 — (minor) If the patch is refreshed, could this also name the new OBD_FAIL_LOV_INVALID_OSTIDX2 fail_loc in lod_gen_component_ea()? The test_21
Gerrit AI review for Lustre
(minor) If the patch is refreshed, could this also name the new OBD_FAIL_LOV_INVALID_OSTIDX2 fail_loc in lod_gen_component_ea()? The test_210c/d sentence is the only hint that the patch also changes MDS code.
reply Oleg Drokin patchset comment — sanity-flr test_210c/test_210d fail in all 7 interop sessions with a b2_15 or b2_16 MDS
Oleg Drokin
sanity-flr test_210c/test_210d fail in all 7 interop sessions with a b2_15 or b2_16 MDS
in lustre-master-next build 1018 ("can dd" / "can truncate"), and pass in the other 50:
https://testing.whamcloud.com/test_sets/5655b63e-5787-4566-9872-2ea78d70e78d
https://testing.whamcloud.com/test_sets/7a2a037d-1b7c-4dd2-bae4-33f33a05cb9a
The tests depend on fail_loc 0x1440 (OBD_FAIL_LOV_INVALID_OSTIDX2) on mds1, which only
exists with this patch's lod_lov.c change, so an older MDS hands out a valid layout.
Please add an MDS version guard next to the client one, e.g.
(( $MDS1_VERSION >= $(version_code 2.17.<landing version>) )) ||
skip "need MDS with OBD_FAIL_LOV_INVALID_OSTIDX2"
reply Alex Zhuravlev obd_support.h:659 — oh, thanks!
Marc Vef
(conflict) this line has a neighbouring line conflict with https://review.whamcloud.com/c/fs/lustre-release/+/69573 69573 is ready. I just rebased 69573 on the current master. Since this patch needs to be refreshed again, I think it makes sense to rebase this patch onto 69573 so they can land together
Alex Zhuravlev
oh, thanks!
reply Gerrit AI review for Lustre obd_support.h:660 — (style) This isn't a bug, but 0x1440 sits between 0x1439 and 0x143a, so the list is out of order and 0x143b-0x143f are skipped. If the patch
Gerrit AI review for Lustre
(style) This isn't a bug, but 0x1440 sits between 0x1439 and 0x143a, so the list is out of order and 0x143b-0x143f are skipped. If the patch is refreshed, could it use the next free value (0x143b) after OBD_FAIL_LLITE_DIO_FALLBACK? A name that says what it does, e.g. OBD_FAIL_LOV_INVALID_OSTIDX_COMP0 (every stripe of component 0 gets a bad index), would also read better than a "2" suffix.
reply Nikitas Angelinas lod_lov.c:830 — cfs_fail_val isn't used in the added tests, fwiw
Nikitas Angelinas
cfs_fail_val isn't used in the added tests, fwiw
reply Nikitas Angelinas lod_lov.c:830 — the braces aren't necessary and could be removed; same for the CFS_FAIL_CHECK() below
Nikitas Angelinas
the braces aren't necessary and could be removed; same for the CFS_FAIL_CHECK() below
reply Alex Zhuravlev lod_lov.c:832 — well, no, I wanted to make it looking "mostly fine"
Nikitas Angelinas
Could this be cpu_to_le32(0xffffffff), same as below?
Alex Zhuravlev
well, no, I wanted to make it looking "mostly fine"
reply Gerrit AI review for Lustre lod_lov.c:846 — (style) Not a bug, but if the patch is refreshed: ltd_tgts_size+1 wants spaces around the +, and the two arms of the same if spell the same
Gerrit AI review for Lustre
(style) Not a bug, but if the patch is refreshed: ltd_tgts_size+1 wants spaces around the +, and the two arms of the same if spell the same test differently - !comp_idx here versus comp_idx == 0 just below.
reply Gerrit AI review for Lustre lod_lov.c:848 — (style) This isn't a bug, but now that the opening line is "} else if (", the continuation line should be re-aligned to start after the open
Gerrit AI review for Lustre
(style) This isn't a bug, but now that the opening line is "} else if (", the continuation line should be re-aligned to start after the open parenthesis. It still has the old "if (" indentation.
reply Gerrit AI review for Lustre lov_io.c:2356 — (defect) Skipping the entry here means lov_io_layout_at() reports "no component at this offset", and lov_foreach_io_layout() uses exactly th
Gerrit AI review for Lustre
(defect) Skipping the entry here means lov_io_layout_at() reports "no component at this offset", and lov_foreach_io_layout() uses exactly that as its loop terminator:
ind = lov_io_layout_at(lio, lov_io_extent(lio, ind)->e_end)
Take a mixed layout - comp0 [0,4M) regular, comp1 [4M,8M) foreign, comp2 [8M,EOF) regular. The loop in lov_io_iter_init() starts at comp0, then the advance step looks up offset 4M: comp1 is now skipped and comp2 does not cover 4M, so it returns -1 and the loop ends. comp2 never reaches lis_active, so a CIT_FSYNC or CIT_DATA_VERSION over the whole file quietly does nothing for it. The foreign component is not skipped, it truncates the iteration.
Everywhere else the tree handles a foreign component by skipping it in the loop body, so iteration continues - lov_io_iter_init() at line 1094 and lov_attr_get_composite() in lov_object.c. Those checks become unreachable with this change, as do lov_io.c:1251 and the lsm_entry_is_foreign() term at lov_io.c:1461, since lov_io_layout_at() can no longer return a foreign index.
Would it be better to have lov_io_layout_at() keep returning the foreign entry and let those per-caller checks decide? That steps over the foreign extent instead of stopping at it, and matches the PCC-RO / HSM-in-PFL case raised earlier in the review, where the regular components around a foreign one should stay usable.
tags: pw_shepherd
owner Alex Zhuravlev · uploader Alex Zhuravlev · PS21 uploaded 6d ago · NEW · open in Gerrit ↗
commit message
LU-19687 lov: skip foreign layouts for regular file IO If the client sees a bad layout in lsm_unpackmd_comp_md_v1(), for example if the OST index is invalid after the retry loop in lsme_unpack_comp()->lsme_unpack() waits for newly-added OSTs to appear in the client configuration (LU-17334) and fails, then lsm_unpackmd_comp_md_v1() changes the component type to use LOV_MAGIC_FOREIGN (in memory only). If a regular IO (such a write) meets a foreign component layout in lov_io_layout_at(), then just skip it instead of LASSERT(). Add sanity-flr.sh test_210c and test_210d to verify this case. Signed-off-by: Alex Zhuravlev <bzzz@whamcloud.com> Change-Id: I51c6dbc196d70d8d03a165b9877f7617b85dfac1
65798
master
J –B ✓T ✓R +1/2
LU-20238 ec: GFNI-accelerated EC primitives
reviewing Hiroshi Nishida · CI green — awaiting your review
pt_ecropw_smallfix
CI@PS23
XL +3332 −38
2d
LU-20238 ec: GFNI-accelerated EC primitives
reviewing Hiroshi Nishida · CI green — awaiting your review
pt_ecropw_smallfix
CI@PS23
XL +3332 −38
2d
build #134847 SUCCESS · tests all Maloo sessions
reviews:
Andreas Dilger +1
no vote yet: patrick bot, Keguang Xu, Ronnie Sahlberg, Patrick Farrell, Marc Vef, Maximilian Dilger, 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-13tags: 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 2d 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
69828
master
J –B ✓T ✓R +2/2
LU-20958 llite: drop strict SOM size with the UPDATE lock
reviewing Andreas Dilger · CI green — awaiting your review
218_review_prioritypt_ecro
2 unresolved
S +35 −1
2d
LU-20958 llite: drop strict SOM size with the UPDATE lock
reviewing Andreas Dilger · CI green — awaiting your review
218_review_prioritypt_ecro
2 unresolved
S +35 −1
2d
build #134055 SUCCESS · tests all Maloo sessions
reviews:
Keguang Xu +1 · Ronnie Sahlberg +1
no vote yet: 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 16d 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
69161
master
J ✓B ✓T ✓R +2/2
LU-20818 osc: build RPCs on a dedicated unbound workqueue
reviewing Patrick Farrell · CI green — awaiting your review
pw_bigfixpw_halt
1 unresolved
S +23 −10
3d
LU-20818 osc: build RPCs on a dedicated unbound workqueue
reviewing Patrick Farrell · CI green — awaiting your review
pw_bigfixpw_halt
1 unresolved
S +23 −10
3d
build #132327 SUCCESS · tests all Maloo sessions
reviews:
Sebastien Buisson +1 · Andreas Dilger +1
no vote yet: Shaun Tancheff, Timothy Day
patchsets:
PS1 09-23
PS2 09-25 patrick bot
threads: 1 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Xiao Yang patchset comment — Sorry for the confusion, I meant only 70293 needs the count, since it uses per-CPT workqueues.
Xiao Yang
Hi Patrick, I tested 69161/69162 for the single-stream write regression from LU-17180, and also wrote an alternative patch (70293) that runs the work on the submitter's CPT. On a client with several CPTs, 69161/69162 are still 7-12% slower than reverting LU-17180, while my patch matches the revert. Setup (local VMs) - Client: 8 vCPUs in one NUMA node, Rocky 10 (kernel 6.12), cpu_pattern="", so 4 CPTs of 2 CPUs each - 4 OSTs; file striped with lfs setstripe -C 16 -S 16M - dd if=/dev/zero bs=1M count=16384 conv=fsync, page cache dropped before each run, 5 runs per build - All builds based on 2.17.60, tested back to back in the same session Results (MB/s, mean of 5 runs) ┌───────────────────┬─────────────┬──────────────┐ │ Build │ checksums=0 │ checksums=1 │ ├───────────────────┼─────────────┼──────────────┤ │ LU-17180 reverted │ 919 │ 958 │ ├───────────────────┼─────────────┼──────────────┤ │ 69161 + 69162 │ 854 (−7.1%) │ 839 (−12.5%) │ ├───────────────────┼─────────────┼──────────────┤ │ 70293 │ 909 (−1.2%) │ 955 (−0.3%) │ └───────────────────┴─────────────┴──────────────┘ Before LU-17180, ptlrpcd_queue_work() ran this work in a ptlrpcd thread of the writer's CPT. An unbound workqueue, especially when spread over the node, loses that locality, and for a single writer that costs more than the extra CPUs gain. My patch instead queues the work on a per-CPT workqueue for the submitter's CPT, and counts the requests like ptlrpcd_queue_work() did, so a work item is never on two workqueues at once. I haven't tested your case (many OSCs on a small CCD, where spreading helps). I'd be glad to compare the two approaches and discuss which way to go.
patrick bot
Patrick-Bot: Thanks for the numbers and for 70293. Which approach should go forward is for the patch owner and reviewers to decide, so I am leaving this thread open for them. One factual point for the comparison: this series does not need a request count to keep a work item off two workqueues. Every queueing of cl_writeback_work and cl_lru_work in this patch goes to the single osc_brw workqueue, and __queue_work() sends a work item that is still running back to the pool running it whenever both are the same workqueue, for unbound workqueues too (rocky8 4.18 included). That covers the queue_work_on() in 69162 as well. The count in 70293 is needed because it uses one workqueue per CPT. osc_brw is WQ_SYSFS, so its cpumask and (on 6.12) affinity_scope under /sys/devices/virtual/workqueue/osc_brw/ can be changed at run time. Rerunning 69161 alone with its cpumask set to the writer's CPT would separate placement from the rest of the difference.
Xiao Yang
Sorry for the confusion, I meant only 70293 needs the count, since it uses per-CPT workqueues.
tags: pw_bigfix pw_halt
owner Patrick Farrell · uploader patrick bot · PS2 uploaded 40d ago · NEW · open in Gerrit ↗
commit message
LU-20818 osc: build RPCs on a dedicated unbound workqueue
Since RPC building moved from ptlrpcd to the system workqueue,
every OSC's writeback work is queued on the submitting CPU and
runs there one after another, CPU-bound work being serialized
on a per-CPU pool. A single thread's IO to a striped file is
built on one CPU, including the user copy of unaligned (and so
hybrid) DIO writes, which now caps at one core's copy rate.
The LRU work moved with it and has the same problem. The
system workqueue also has no rescuer, though writeback and LRU
shrinking may be needed to reclaim memory.
Queue the writeback and LRU work on an unbound, memory reclaim
workqueue of its own, so the OSCs run it in parallel. The
workqueue is visible in sysfs as osc_brw, for its CPU mask and
affinity scope.
Fixes: 776e163cf542 ("LU-17180 ptlrpc: don't block ptlrpcd too long")
Assisted-by: ClaudeCode:claude-opus-5-5
Signed-off-by: Patrick Farrell <patrick@thelustrecollective.com>
Change-Id: I2d0468fefd91aa5faf8c4c7a2fa7ab38f4181a37
69731
master
J –B ✓T ✓R 0/2
LU-19895 osc: account cached folios in base pages
reviewing Patrick Farrell · CI green — awaiting your review
pw_own
M +137 −23
3d
LU-19895 osc: account cached folios in base pages
reviewing Patrick Farrell · CI green — awaiting your review
pw_own
M +137 −23
3d
build #134783 SUCCESS · tests all Maloo sessions
no vote yet: Arshad Hussain, Shaun Tancheff, Andreas Dilger, Timothy Day
patchsets:
PS3 10-18 patrick bot
PS4 10-18 patrick bot
PS5 10-19 patrick bot
PS6 10-21 patrick bot
PS7 10-29 patrick bot
+2 earlier
PS1 10-16 PS2 10-16 patrick bottags: pw_own
owner Patrick Farrell · uploader patrick bot · PS7 uploaded 6d ago · NEW · open in Gerrit ↗
commit message
LU-19895 osc: account cached folios in base pages With large folios one osc_page covers a whole folio, up to 256 base pages, but the OSC LRU still took one slot for each osc_page. The IO reservation is made in base pages and the unused part is returned at the end of the IO, so a 1 MiB folio kept a 4 KiB charge. max_cached_mb was then not enforced: with max_cached_mb=64, a 256 MiB buffered write stayed fully cached while used_mb reported 1. Use osc_lru_npgs() to charge each osc_page for its folio in base pages. Count LRU, busy and unevictable totals, shrink scans and cross OSC reclaim in base pages too, so they agree with max_cached_mb, osc_cached_mb and readahead. Set cl_io::ci_folio_order only when large folios are allowed for the inode. For multi-page IO, round the reservation to whole folios in lov_io_lru_reserve() and osc_lru_alloc(), so a cached folio never waits for slots while the IO holds other queued folios. osc_lru_take() charges the shared cache for any shortfall, returning the reservation before waiting. A file limited to order 0 pages behaves as before. Add sanity/858 to check that max_cached_mb bounds the page cache and used_mb matches it after a large folio write. Test-Parameters: clientdistro=el10.1 Assisted-by: ClaudeCode:claude-opus-5-5 Assisted-by: Codex:gpt-6.1-sol Signed-off-by: Patrick Farrell <patrick@thelustrecollective.com> Change-Id: If759ec95cec1a2d867e24fc321016d40f083f210
67651
master
J –B ✓T ✓R -2/2−
LU-20541 lfs: Implement migrate_stripe command and add test
reviewing Ronnie Sahlberg · CI green — awaiting your review (needs rebase first)
needs rebase
ec2
pt_ecro
11 unresolved
XL +2004 −1
4d
LU-20541 lfs: Implement migrate_stripe command and add test
reviewing Ronnie Sahlberg · CI green — awaiting your review (needs rebase first)
needs rebase
ec2
pt_ecro
11 unresolved
XL +2004 −1
4d
CI green — awaiting your review (needs rebase first)
blocked on the owner: needs rebase — checkpatch: cannot be cherry-picked
build #134057 SUCCESS · tests all Maloo sessions
reviews:
Andreas Dilger -1
no vote yet: Marc Vef
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 16d 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
69205
master
J !B ✓T ✓R 0/2
LU-20783 llite: ignore nolock, remove LL_IOC_SETFLAGS
reviewing patrick bot · CI green — awaiting your review
bot-ci-generatedpw_own
CI@PS2
M +49 −87
5d
LU-20783 llite: ignore nolock, remove LL_IOC_SETFLAGS
reviewing patrick bot · CI green — awaiting your review
bot-ci-generatedpw_own
CI@PS2
M +49 −87
5d
janitor run: 2 failing config(s), none unique to this patch — janitor results
no vote yet: Qian Yingjin, Andreas Dilger, Lai Siyao, Patrick Farrell
patchsets:
PS1 09-25
PS2 10-01
PS3 10-09 Patrick Farrell
tags: bot-ci-generated pw_own
build/test results are from PS2 — PS3…PS3 changed only the commit message (votes copied, CI not re-run)
owner patrick bot · uploader Patrick Farrell · PS3 uploaded 26d ago · NEW · open in Gerrit ↗
commit message
LU-20783 llite: ignore nolock, remove LL_IOC_SETFLAGS
The nolock mount option and LL_IOC_SETFLAGS with
LL_FILE_IGNORE_LOCK both forced CILR_NEVER and
ci_no_srvlock, making buffered I/O both client- and
server-lockless. osc_req_attr_set() needs one of the two
to find a lock covering a dirty page when it builds a
writeback RPC; with neither, it LBUGs with "uncovered
page!" and "No lock resource". Direct I/O does not need
either interface: it is already client-lockless by
default, and normally still takes a server-side extent
lock per RPC, which these interfaces also dropped for no
benefit.
nolock still mounts, but is now ignored with a console
warning. LL_IOC_SETFLAGS and LL_IOC_CLRFLAGS are removed;
their ioctl numbers and LL_FILE_IGNORE_LOCK stay reserved
in lustre_user.h, and now fall through to -ENOTTY. A caller
that used LL_IOC_SETFLAGS(LL_FILE_IGNORE_LOCK) to get an
O_DIRECT file fully lockless, such as IOR's
--posix.lustre.ignorelocks, will see that ioctl fail rather
than silently keep the lock it asked to drop.
ll_file_nolock(), CILR_NEVER and ci_no_srvlock, along with
the code paths that existed only to serve them, are removed
as unreachable.
ll_show_options() had two separate display bugs around
"nolock". LL_SBI_NOLCK has no paired positive "lock"
pattern, so its generic "no"-prefix on/off handling printed
",nolock" on every mount that never asked for it; fixed by
skipping that token in the loop, since it is now never set.
The other bug was the leading, comma-less print used for an
actual nolock mount, which ran straight into the "rw" the
VFS itself prints, showing up as "rwnolock"; fixed by
dropping that print along with the option's effect.
Reproduced by mounting with nolock and doing a buffered
write: writeback LBUGed in osc_req_attr_set() as above.
The same write now takes a normal lock and completes
cleanly. Added conf-sanity/163 to cover it.
Fixes: 3f3a24dc5d7d ("LU-3259 clio: cl_lock simplification")
Assisted-by: Codex:gpt-6.1-sol
Signed-off-by: Patrick Farrell <patrick@thelustrecollective.com>
Change-Id: I689260706e82698efae846791246e35daba23820
69338
master
J –B ✓T ✓R +1/2
LU-20856 llite: do not force commits on background writeback
reviewing Patrick Farrell · CI green — awaiting your review
pw_own
M +85 −13
6d
LU-20856 llite: do not force commits on background writeback
reviewing Patrick Farrell · CI green — awaiting your review
pw_own
M +85 −13
6d
build #134186 SUCCESS · tests all Maloo sessions
reviews:
Keguang Xu +1
no vote yet: Qian Yingjin, Andreas Dilger, Timothy Day
patchsets:
PS1 09-30
PS2 10-21 patrick bot
tags: pw_own
owner Patrick Farrell · uploader patrick bot · PS2 uploaded 14d ago · NEW · open in Gerrit ↗
commit message
LU-20856 llite: do not force commits on background writeback
Background writeback runs whenever a client's dirty pages pass the
background threshold, which is normal for any client that is
writing. Since LU-16713 it is treated as memory reclaim, so every
background writeback pass sent an OST_SYNC for each stripe of
every file it visited, and busy clients produced storms of
forced journal commits on the OSTs.
Force a commit only for writeback started for page reclaim, which
LU-16713 added at the same time. Memory-limited cgroups do not
depend on the background commit: writers that write several times
their cgroup's limit with no fsync are not OOM-killed on cgroup v1
or v2 without it. Background writeback keeps the priority it gets
when the writer is over its dirty limit, so the active extent
flush from LU-19014 is unchanged.
Add sanity test 411c: with background writeback running for the
whole of a buffered write that never calls fsync, the client must
send far fewer OST_SYNC than OST_WRITE.
Fixes: 8aa231a99468 ("LU-16713 llite: writeback/commit pages under memory pressure")
Assisted-by: ClaudeCode:claude-opus-5-5
Signed-off-by: Patrick Farrell <patrick@thelustrecollective.com>
Change-Id: I4b68f32e4939d16a56e06d2d2e39fe53b967bece
69162
master
J ✓B ✓T ✓R 0/2
LU-20818 osc: spread RPC builds over the submitting node
reviewing Patrick Farrell · CI green — awaiting your review
pw_watch
M +73 −4
6d
LU-20818 osc: spread RPC builds over the submitting node
reviewing Patrick Farrell · CI green — awaiting your review
pw_watch
M +73 −4
6d
build #132329 SUCCESS · tests all Maloo sessions
no vote yet: Shaun Tancheff, Timothy Day
patchsets:
PS1 09-23
PS2 09-25 patrick bot
tags: pw_watch
owner Patrick Farrell · uploader patrick bot · PS2 uploaded 40d ago · NEW · open in Gerrit ↗
commit message
LU-20818 osc: spread RPC builds over the submitting node An unbound workqueue runs work in the affinity pod of the CPU it was queued on, and since Linux 6.6 the default pod is the last level cache; RHEL 9 carries that change. From 7.1 the default is an 8 core shard of the cache instead. Where the pod is one CCD of 8 CPUs, every OSC's RPC build still runs in the submitter's CCD, and a single thread's striped IO gains little over the system workqueue. A module cannot change a workqueue's scope. Queue each OSC's writeback work at a core of the submitting thread's node, in bit reversed order of the device index, so consecutive OSCs are far apart in the node's core order. Only the first thread of each core is used: SMT siblings share a cache, so a second OSC landing on one would build in the first's pod. Core order is not pod order, so this spreads the OSCs well rather than perfectly. An unplug is queued on every extent release and RPC completion, so the chosen CPU is kept on the client rather than walking the node's CPU mask each time. There is one slot, so an OSC whose unplugs arrive from two nodes recomputes whenever the node changes; it is the single node case that the walk cost hurts. Assisted-by: ClaudeCode:claude-opus-5 Signed-off-by: Patrick Farrell <patrick@thelustrecollective.com> Change-Id: I70dd11726cd1fd3e05ba04ad402de6ac19144e01
66255
master
J –B ✓T ✓R +2/2
LU-19712 utils: Handle migrate/mirror on pinned files
reviewing Nikos Papakonstantinou · CI green — awaiting your review
1 unresolved
XL +1886 −35
7d
LU-19712 utils: Handle migrate/mirror on pinned files
reviewing Nikos Papakonstantinou · CI green — awaiting your review
1 unresolved
XL +1886 −35
7d
build #134268 SUCCESS · tests all Maloo sessions
reviews:
Andreas Dilger +1 · Sebastien Buisson +1
patchsets:
PS44 10-16
PS45 10-19
PS46 10-21
PS47 10-22
PS48 10-22
+43 earlier
PS1 05-28 PS2 05-28 PS3 05-29 PS4 05-29 Janitor Bot PS5 06-04 PS6 06-05 PS7 06-05 PS8 06-08 PS9 06-10 PS10 06-14 PS11 06-15 PS12 06-22 PS13 07-09 PS14 07-10 PS15 07-10 PS16 07-13 PS17 07-14 PS18 07-15 PS19 07-15 PS20 07-16 PS21 07-17 PS22 07-20 PS23 07-20 PS24 07-30 PS25 07-30 PS26 07-31 PS27 08-07 PS28 08-20 PS29 08-26 PS30 08-27 PS31 08-27 PS32 08-27 PS33 09-01 PS34 09-04 PS35 09-04 PS36 09-08 PS37 09-14 PS38 09-15 PS39 09-15 PS40 09-23 PS41 10-01 PS42 10-08 PS43 10-14threads: 1 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Andreas Dilger lfs.c:6589 — On the other hand, moving this blob out-of-line of the caller probably makes it easier to read, even if the function is only used once.
Sebastien Buisson
I appreciate it needs quite some work to print the correct message, but I am not sure it deserves a dedicated function, as this code is only used once in `setstripe_pool_pin_check`.
Andreas Dilger
On the other hand, moving this blob out-of-line of the caller probably makes it easier to read, even if the function is only used once.
owner Nikos Papakonstantinou · uploader Nikos Papakonstantinou · PS48 uploaded 13d ago · NEW · open in Gerrit ↗
commit message
LU-19712 utils: Handle migrate/mirror on pinned files Add a safety gate to lfs setstripe/migrate/mirror operations that respects a file's lustre.pin pool constraints: - migrate requires the new layout to keep a whole mirror on every pinned pool that has one, and on at least one pinned pool; an exclusive pin also needs every component on a pinned pool, and no component may use a denied pool. A flat/omitted --pool falls back to the pool the MDS would itself assign from the target directory's default layout, so an in-place restripe still succeeds; --restripe is checked against that whole default. A bare "lfs migrate FILE" keeps the file's own layout, so it skips the pin check, but components naming no pool still pick up the directory default, which must not be denied or fall outside an exclusive pin. MDT-only migrate (-m) is not covered. - mirror extend and component-add only add data alongside what is already there, so only an exclusive pin or a deny_pool constraint restrict the new components; a plain pin is satisfied by the untouched existing copy. - mirror split and mirror delete are rejected only if removing the targeted mirror would leave no other whole mirror on a pinned pool. - mirror create is not covered: it always targets a file with no existing layout. - DoM and foreign components carry no OST pool and are skipped. mirror split/delete's selector and the pin gate's survivor check share one resolve_split_mirror_id() helper, so they can't disagree about which mirror is targeted. The pool inferred for lfs pool pin/unpin and lfs setstripe --pin also skips DoM and foreign components, so a file whose first component is DoM infers its first OST pool instead of none, and mirror_split() now returns an error when it cannot open the file. Also add llapi_pool_is_denied_fd()/_file()/_fid() to include/lustre/lustreapi.h alongside the existing is_pinned trio, with a matching man3 page. The gate parses each file's lustre.pin once. Signed-off-by: Nikos Papakonstantinou <npapakonstantinou@ddn.com> Change-Id: I748ff8d2af4d4ca914ed123b5edba1f28ccef3dd
69949
master
J –B ✓T ✓R +1/2
LU-21020 lov: wait for mirror once all were tried
reviewing Markus Hilger · CI green — awaiting your review
M +65 −6
7d
LU-21020 lov: wait for mirror once all were tried
reviewing Markus Hilger · CI green — awaiting your review
M +65 −6
7d
build #134487 SUCCESS · tests all Maloo sessions
reviews:
Andreas Dilger +1
no vote yet: Keguang Xu
patchsets:
PS1 10-22
PS2 10-24
PS3 10-26
owner Markus Hilger · uploader Markus Hilger · PS3 uploaded 9d ago · NEW · open in Gerrit ↗
commit message
LU-21020 lov: wait for mirror once all were tried
When fast mirror switching has tried all mirrors of a file,
lov_io_mirror_init() sets ci_tried_all_mirrors but leaves ci_ndelay
set, so the lock enqueue and BRW of the next try still carry
LDLM_FL_NDELAY and OBD_BRW_NDELAY. They fail at once with -EAGAIN,
and cl_io_loop() returns -EIO. A read of a mirrored file fails while
its OSTs are in failover, where a read of a file with one mirror
waits for them.
Clear ci_ndelay once ci_tried_all_mirrors is set, so that every user
of it waits for the OSTs in that round. This includes the glimpse of
stat(), which now waits as well instead of failing. EC IO keeps
ci_ndelay: it rebuilds a failed stripe from parity and decides on its
own when to wait.
ll_file_io_generic() carried ci_ndelay_tried across every restart of
a read, also those that moved data, so ci_tried_all_mirrors came up
in a long read while a mirror could still serve it. Carry it only
across restarts that moved no data, so that it means all mirrors
failed.
cl_io_loop() mapped -EAGAIN to -EIO in that round only while
ci_ndelay was set. Check ci_tried_all_mirrors first, so that an
-EAGAIN which does not come from the non-delay flags, e.g. from a
component that is not valid, still ends as -EIO and not -EAGAIN.
Add sanity-flr test_33f.
Test-Parameters: testlist=sanity-flr env=ONLY=33,ONLY_REPEAT=5
Fixes: f5564c35ede1 ("LU-16935 llite: avoid hopeless i/o repeats")
Signed-off-by: Markus Hilger <markus.hilger@megware.com>
Change-Id: I22d9f3b989e655add8a5fc8d69fe6eae34445e4f
68994
master
J –B ✓T ✓R -1/2−
LU-20765 osc: avoid RCU stalls during eviction page discard
reviewing Lai Siyao · CI green — awaiting your review (needs rebase first)
needs rebase
5 unresolved
S +36 −2
12d
LU-20765 osc: avoid RCU stalls during eviction page discard
reviewing Lai Siyao · CI green — awaiting your review (needs rebase first)
needs rebase
5 unresolved
S +36 −2
12d
CI green — awaiting your review (needs rebase first)
blocked on the owner: needs rebase — checkpatch: cannot be cherry-picked
build #134266 SUCCESS · tests all Maloo sessions
no vote yet: Andreas Dilger
patchsets:
PS1 09-17
PS2 09-17
PS3 10-22
threads: 5 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Gerrit AI review for Lustre COMMIT_MSG:19 — (minor) The description of the mechanism doesn't quite match what cond_resched() does. It doesn't reschedule unconditionally. __cond_resched
Gerrit AI review for Lustre
(minor) The description of the mechanism doesn't quite match what cond_resched() does. It doesn't reschedule unconditionally. __cond_resched() still calls preempt_schedule_common() only when should_resched(0) is true, so the old and new code yield the CPU in exactly the same cases. The real difference is in the no-resched path. On !CONFIG_PREEMPT_RCU kernels it calls rcu_all_qs(), which reports a quiescent state once RCU has set rcu_urgent_qs. Guarding cond_resched() with need_resched() skips that call. kernel/rcu/tree.c calls this out: "some in-kernel loops check need_resched() before calling cond_resched(), which defeats the above code". If the patch is refreshed, could the message say that the fix is to let cond_resched() report an RCU quiescent state between batches? The soft-lockup and NMI hard-LOCKUP claims also look out of reach for this change. The soft-lockup watchdog's stopper thread sets need_resched, which the old code already honoured. A hard LOCKUP needs IRQs disabled, and they aren't disabled anywhere in this loop.
reply Gerrit AI review for Lustre osc_cache.c:3548 — (minor) Is "simulate a slow discard" accurate here? The discard runs in (*cb)() after oo_tree_lock is dropped. OBD_FAIL_OSC_SLOW_PAGE_EVICT
Gerrit AI review for Lustre
(minor) Is "simulate a slow discard" accurate here? The discard runs in (*cb)() after oo_tree_lock is dropped. OBD_FAIL_OSC_SLOW_PAGE_EVICT (sanity test_903) already covers a slow discard outside the lock. This delay sits before the spin_unlock() and before the changed cond_resched(). So it injects a long lock hold that the fix can't affect. Any writer contending on oo_tree_lock spins with preemption disabled for the whole delay. Also, with fail_val left unset the default busy-wait is 20s under a spinlock. That reaches the default soft-lockup threshold (2 * watchdog_thresh), so the fault injection can trigger the very warning the patch is meant to prevent.
reply Gerrit AI review for Lustre osc_cache.c:3589 — (minor) If the patch is refreshed: cond_resched() only yields when a reschedule is already pending. What changes here is that it now also re
Gerrit AI review for Lustre
(minor) If the patch is refreshed: cond_resched() only yields when a reschedule is already pending. What changes here is that it now also reports an RCU quiescent state via rcu_all_qs(). Something like "let cond_resched() report an RCU quiescent state" would describe the change more accurately than "yield".
reply Andreas Dilger recovery-small.sh:3900 — (style) "nsec" looks like "nanoseconds", use "delay" or similar (should not "sleep" or "wait" that shadow shell functions)
Andreas Dilger
(style) "nsec" looks like "nanoseconds", use "delay" or similar (should not "sleep" or "wait" that shadow shell functions)
reply Gerrit AI review for Lustre recovery-small.sh:3918 — As written, does this test pass identically with and without the cond_resched() change? The fail_loc is one-shot (0x80000000). It fires once
Gerrit AI review for Lustre
As written, does this test pass identically with and without the cond_resched() change? The fail_loc is one-shot (0x80000000). It fires once, before the unlock, and 10s is below the default RCU stall and soft-lockup thresholds. The only check is client_up. Nothing looks for an "rcu.*stall" or "soft lockup" message in dmesg, and nothing exercises the many-batch path that the fix changes. So it doesn't seem to deliver the "RCU stall reproducer" or "guard against reintroducing a long hold" described in the commit message. One option is a per-batch delay outside the lock (like OBD_FAIL_OSC_SLOW_PAGE_EVICT, but busy-waiting), run long enough to pass jiffies_till_sched_qs, followed by a dmesg check. While at it, a stack_trap to remove the 256MB file would clean up after a failure too.
owner Lai Siyao · uploader Lai Siyao · PS3 uploaded 13d ago · NEW · open in Gerrit ↗
commit message
LU-20765 osc: avoid RCU stalls during eviction page discard On eviction osc_page_gang_lookup() walks the object page tree under osc_object::oo_tree_lock and discards cached pages in batches. For a large object this loop can run for a very long time (see LU-14711: discarding 750GB takes over 170s). The loop only called cond_resched() when need_resched() was already set, so on voluntary-preempt kernels it could monopolise the CPU across many batches - even though the tree lock is dropped between them - long enough to trip the soft-lockup / RCU-stall watchdog and, under an eviction storm, escalate to an NMI hard-LOCKUP. Reschedule unconditionally between batches. The tree lock is already released at that point, so yielding is safe and keeps each lock hold short. Also add OBD_FAIL_OSC_EVICT_HOLD_LOCK and recovery-small test_164, which holds oo_tree_lock across a dirty-page discard to deterministically exercise this path and guard against reintroducing a long hold of the page-tree lock during eviction. Signed-off-by: Lai Siyao <lai.siyao@whamcloud.com> Assisted-by: AugmentCode:Opus-4.8 llm_code_and_review_tools Change-Id: Ibd2578cab278f1d4fd18378f1d27006d6d085945
61016
master
J –B ✓T ✓R -1/2−
LU-13638 ptlrpc: delay to handle the req_unlinked
reviewing Yang Sheng · CI green — awaiting your review (needs rebase first)
needs rebase
27 unresolved
M +156 −30
14d
LU-13638 ptlrpc: delay to handle the req_unlinked
reviewing Yang Sheng · CI green — awaiting your review (needs rebase first)
needs rebase
27 unresolved
M +156 −30
14d
CI green — awaiting your review (needs rebase first)
blocked on the owner: needs rebase — checkpatch: cannot be cherry-picked
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-5 | RHEL 9.7 / x86_64 | ran 5 tests. 1 tests failed: sanityn. | session |
| review-dne-zfs-part-1 | RHEL 9.8 / x86_64 | ran 3 tests. 1 tests failed: sanity. | session |
build #134007 SUCCESS · tests all Maloo sessions
no vote yet: Qian Yingjin, Lai Siyao, Andreas Dilger
patchsets:
PS10 09-10
PS11 09-10
PS12 09-14
PS13 09-16
PS14 10-19
+9 earlier
PS1 09-01 PS2 09-03 PS3 09-04 PS4 09-29 PS5 10-27 PS6 01-13 PS7 03-06 PS8 03-20 PS9 06-09threads: 27 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Gerrit AI review for Lustre COMMIT_MSG:13 — (minor) The body describes only the ptlrpc_client_recv_or_unlink() change. Several other behaviour-changing hunks are not mentioned:
Gerrit AI review for Lustre
(minor) The body describes only the ptlrpc_client_recv_or_unlink() change. Several other behaviour-changing hunks are not mentioned: - ptlrpc_req_put() moves from request_out_callback() to reply_in_callback(), so the ptl_send_rpc() reference changes owner - the new on-wire MSG_WAIT_OUTACK flag - ptlrpc_wait_ack_list and its teardown in ptlrpc_exit_portals() - the new OBD_FAIL_PTLRPC_REQ_ACK_LOST fail_loc - the RMMOD_AWARE change in test-framework.sh cleanupall() Could these be covered in the message, and could the reference-ownership change in particular be spelled out? It is the part of the patch with the widest blast radius.
reply Gerrit AI review for Lustre COMMIT_MSG:14 — (minor) If MSG_WAIT_OUTACK stays in lustre_idl.h, this changes an on-wire definition and would be worth an interop run, e.g.
Gerrit AI review for Lustre
(minor) If MSG_WAIT_OUTACK stays in lustre_idl.h, this changes an on-wire definition and would be worth an interop run, e.g.
Test-Parameters: serverversion=2.16 clientversion=2.16
If the flag becomes a purely in-memory rq_* bit instead, this does not apply.
reply Gerrit AI review for Lustre COMMIT_MSG:9 — (minor) Removing the rq_req_unlinked wait has landed and been reverted twice already:
Gerrit AI review for Lustre
(minor) Removing the rq_req_unlinked wait has landed and been reverted twice already:
babf0232273 ("LU-13368 lnet: discard the callback")
reverted by fc28666b2f ("LU-14499 lnet: Revert \"LU-13368 lnet: discard the callback\"")
a6886dba0ed ("LU-17379 ptlrpc: fix check for callback discard")
reverted by 394de8d9066 ("LU-17704 revert: \"LU-17379 ptlrpc: fix check for callback discard\"")
Could the message say what those attempts got wrong and why keeping the buffer on a wait-ack list avoids it? Without that a future reader has no way to tell this apart from a third attempt at the same thing.
reply Gerrit AI review for Lustre COMMIT_MSG:14 — (minor) This fixes a real hang/timeout, so a Fixes: trailer would help the maintenance branches pick it up. The `!req->rq_req_unlinked ||` t
Gerrit AI review for Lustre
(minor) This fixes a real hang/timeout, so a Fixes: trailer would help the maintenance branches pick it up. The `!req->rq_req_unlinked ||` term being removed from ptlrpc_client_recv_or_unlink() was added by:
Fixes: b8e981df1ae9 ("LU-5696 ptlrpc: missing wakeup for ptlrpc_check_set")
That commit converted rq_req_unlink/rq_reply_unlink into status bits and made the client wait for the request-buffer unlink as well as the reply unlink, which is the wait this patch drops.
reply Gerrit AI review for Lustre lustre_idl.h:638 — (defect) pb_flags is sent to the server, so this consumes one of the few remaining on-wire flag bits for state that is purely client-local,
Gerrit AI review for Lustre
(defect) pb_flags is sent to the server, so this consumes one of the few remaining on-wire flag bits for state that is purely client-local, and the flag is then transmitted on any resend or replay of the request. MSG_WAIT_OUTACK has no meaning to a peer. Could this be a bit in struct ptlrpc_request instead of a lustre_idl.h flag? If it does have to stay on the wire, wirecheck.c and both wiretest.c copies would need the matching entries.
reply Gerrit AI review for Lustre lustre_net.h:2468 — (typo) "sometiem" -> "sometime". The last sentence also reads a little oddly - maybe "Just keep the request buffer until the ACK arrives."
Gerrit AI review for Lustre
(typo) "sometiem" -> "sometime". The last sentence also reads a little oddly - maybe "Just keep the request buffer until the ACK arrives."
reply Gerrit AI review for Lustre lustre_net.h:2476 — (defect) This writes into rq_reqmsg, and the condition guarding it is !rq_req_unlinked - that is, LNet still owns rq_reqbuf and may still be
Gerrit AI review for Lustre
(defect) This writes into rq_reqmsg, and the condition guarding it is !rq_req_unlinked - that is, LNet still owns rq_reqbuf and may still be transmitting from it. lustre_msg_add_flags() does a read-modify-write of pb_flags in that live buffer. For null sec rq_reqmsg == rq_reqbuf, so this is the exact memory that was handed to LNetMDBind()/LNetPut(). Under gss integrity the checksum was already computed over the pre-modification bytes. A bit in struct ptlrpc_request (e.g. rq_wait_outack:1, set under rq_lock which is already held here) would avoid touching the buffer at all.
reply Gerrit AI review for Lustre lustre_net.h:2478 — (defect) Dropping the rq_req_unlinked term also lets the request go back through ptl_send_rpc() while the previous request MD is still bound
Gerrit AI review for Lustre
(defect) Dropping the rq_req_unlinked term also lets the request go back through ptl_send_rpc() while the previous request MD is still bound. On a reply timeout rq_reply_unlinked is set by the reply-MD unlink, rq_receiving_reply is 0, so this returns 0, ptlrpc_check_set() advances the phase and the rq_timedout branch resends. ptl_send_buf() then does LNetMDBind(&md, LNET_UNLINK, &request->rq_req_md_h) over the live handle: the old MD can no longer be unlinked, two MDs point at the same rq_reqbuf while ptl_send_rpc() rewrites the handle, conn_cnt, xid and MSG_RESENT in it, and when the old MD's SEND event finally arrives request_out_callback() sets rq_req_unlinked (and possibly rq_net_err) against the new attempt. This is the timeout-then-resend case the patch is aimed at, so it would be good to have something that keeps the second send from starting while the first MD is live.
reply Gerrit AI review for Lustre lustre_net.h:2463 — (minor) With the rq_req_unlinked term gone, this rq_req_deadline early return is the only request-side gate left, and it is set purely by fa
Gerrit AI review for Lustre
(minor) With the rq_req_unlinked term gone, this rq_req_deadline early return is the only request-side gate left, and it is set purely by fault injection (OBD_FAIL_PTLRPC_LONG_REQ_UNLINK in ptlrpc_request_pack()). Nothing else reads rq_req_deadline.
So recovery-small test_115a/115b/115f/115g ("late REQ MDunlink") now exercise a simulated wait that no production path can enter. Should the deadline, the fail_loc and those cases be retired along with the condition, or is the deadline still meant to serve a purpose here?
reply Alexey Lyashkov client.c:2868 — rq_set can't be used where.
Alexey Lyashkov
rq_set can't be used where.
reply Gerrit AI review for Lustre client.c:2921 — (defect) MSG_WAIT_OUTACK is never cleared once ptlrpc_client_recv_or_unlink() sets it, so this test does not mean "the out ACK is still outs
Gerrit AI review for Lustre
(defect) MSG_WAIT_OUTACK is never cleared once ptlrpc_client_recv_or_unlink() sets it, so this test does not mean "the out ACK is still outstanding" at put time - it means "it was outstanding at some point". In the common case the callback arrives microseconds later and sets rq_req_unlinked, but the flag is still set here, so wait_ack is 1 and __ptlrpc_free_req() parks the request and its reqbuf on ptlrpc_wait_ack_list, where nothing frees them until ptlrpc_exit_portals(). Every RPC that ever loses that race leaks for the life of the module. Would testing !request->rq_req_unlinked here (the state that actually says LNet still owns the buffer) work instead?
reply Gerrit AI review for Lustre client.c:2445 — (defect) This store is not under rq_lock, but rq_wait_outack lives in the bitfield word that lustre_net.h documents as "client-side flags ar
Gerrit AI review for Lustre
(defect) This store is not under rq_lock, but rq_wait_outack lives in the bitfield word that lustre_net.h documents as "client-side flags are serialized by rq_lock", alongside rq_req_unlinked, rq_reply_unlinked and rq_net_err. request_out_callback() does its own read-modify-write of that word (rq_req_unlinked = 1, rq_net_err = 1) while holding rq_lock. Two unsynchronized RMWs on the same word lose one of the updates: - rq_wait_outack lost -> __ptlrpc_free_req() frees the request and rq_reqbuf while the MD is still live, which is exactly what this patch is trying to prevent - rq_req_unlinked / rq_net_err lost -> the send failure is never seen The rq_req_unlinked read in the condition above is unsynchronized for the same reason, so the decision itself can be made on a stale value.
owner Yang Sheng · uploader Yang Sheng · PS14 uploaded 16d ago · NEW · open in Gerrit ↗
commit message
LU-13638 ptlrpc: delay to handle the req_unlinked We ignore the req_unlinked flag in sending process since sometime the reply could be received before request out callback was invoked. In such case we should go ahead despite the md unlink ACK. Just keep the request buffer until it arrived. Signed-off-by: Yang Sheng <ys@whamcloud.com> Change-Id: I4969ed4473358dba89a82b38f230405cce7d9a1b
69716
master
J –B ✓T ✓R +1/2
LU-20924 ldiskfs: allocate hybrid metadata in IOPS groups
reviewing Andreas Dilger · CI green — awaiting your review
2 unresolved
XL +7153 −1728
16d
LU-20924 ldiskfs: allocate hybrid metadata in IOPS groups
reviewing Andreas Dilger · CI green — awaiting your review
2 unresolved
XL +7153 −1728
16d
build #133764 SUCCESS · tests all Maloo sessions
reviews:
Artem Blagodarenko +1
no vote yet: Li Dongyang
threads: 2 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Andreas Dilger ext4-mballoc-for-hybrid.patch:157 — Minor nit to fix if patch is refreshed for some other reason.
Gerrit AI review for Lustre
(minor) If the patch is refreshed: ext4_mb_scan_state_next() also lets data use these clusters when the blocks are delalloc-reserved, even with mb_enable_iops_data=0, so "can only use if mb_enable_iops_data is set" isn't quite accurate. The same comment is in the other copies.
Andreas Dilger
Minor nit to fix if patch is refreshed for some other reason.
reply Andreas Dilger ext4-mballoc-for-hybrid.patch:727 — Seems reasonable if patch is refreshed. As-is this patch is fixing significant issues with the IOPS allocation, and delalloc is not used by
Gerrit AI review for Lustre
(defect) With mb_enable_iops_data=0, can delalloc data land in IOPS groups even though the HDD groups still have usable space?
This fallback runs inside ext4_mb_regular_allocator(), so ext4_mb_new_blocks() never gets to its usual ENOSPC recovery before IOPS blocks are used:
ext4_mb_new_blocks()
ext4_mb_regular_allocator()
NON_IOPS pass fails
ext4_mb_scan_state_next() -> IOPS pass (DELALLOC_RESERVED)
/* never reached: */
ext4_mb_discard_preallocations_should_retry()
Other inodes' PAs and the locality-group PAs show as used in the buddy but free in s_freeclusters_counter. So when an HDD region is nearly full and most of its free space is held in PAs, the NON_IOPS pass fails and writeback goes straight to flash. Without this patch, those PAs would be discarded and the allocation retried on HDD.
The same thing happens with blocks freed in the running transaction: ext4_do_writepages() would force a commit and retry on -ENOSPC, but the fallback gets there first.
Could the delalloc IOPS fallback be held back until the PA discard retries are used up (e.g. only once EXT4_MB_STRICT_CHECK is set), or moved into ext4_mb_new_blocks() after the retry loop? The same code is in the rhel8, rhel9.4, rhel10.0, rhel10.2 and linux-6.12 copies.
Andreas Dilger
Seems reasonable if patch is refreshed. As-is this patch is fixing significant issues with the IOPS allocation, and delalloc is not used by Lustre today so that would only affect a local ldiskfs mount. That might happen during a whole-target backup/restore via tar, but that is also unlikely for OSTs (which can do online migration/evacuation), and is typically only used for MDTs (which are invariably all-flash anyway).
owner Andreas Dilger · uploader Andreas Dilger · PS1 uploaded 20d ago · NEW · open in Gerrit ↗
commit message
LU-20924 ldiskfs: allocate hybrid metadata in IOPS groups
Previously, on a hybrid ldiskfs with EXT4_BG_IOPS groups on flash,
directory, xattr and extent index blocks were almost never allocated
in the IOPS groups. The goal group and the s_mb_max_linear_groups
linear scan were tried before the IOPS lists, and the metadata goal
was in the HDD groups next to the inode. The IOPS lists were only
searched at the two fast criteria, and only once a group's buddy was
loaded, so metadata fell back to HDD whenever those missed. The data
fallback into IOPS groups at CR_ANY_FREE was dead code, and with
mb_enable_iops_data=1 data used IOPS groups as soon as the fast HDD
lists missed. Free IOPS space was counted as available for data, so
with mb_enable_iops_data=0 a full HDD region made delalloc writeback
loop on ENOSPC, and statfs and OST grants reported space data could
not use.
Rework all copies of ext4-mballoc-for-hybrid.patch (rhel8, rhel9.4,
rhel10.0, rhel10.2, linux-6.12) and add it to the 7.0-ml and ubuntu26
series as linux-7.0, so each allocation has a scan state limiting it
to one class of groups. Metadata (no EXT4_MB_HINT_DATA) searches only
IOPS groups through all criteria, from an IOPS goal mapped from its
original goal, and falls back to the non-IOPS groups only if that pass
fails. Data searches only the non-IOPS groups, and IOPS groups only
after that and if mb_enable_iops_data is set or the blocks are
delalloc-reserved. The class check in ext4_mb_good_group_nolock() and
ext4_mb_find_by_goal() covers the goal, linear and list scans, and the
IOPS pass scans linearly only a sorted array of the IOPS groups. The
IOPS lists are the upper half of the existing list or xarray arrays,
replacing the _iops copies of the scan functions.
Track free IOPS clusters in a percpu counter, shown in sysfs file
mb_iops_free_clusters, and exclude them from the space available for
data unless mb_enable_iops_data is set, and search IOPS groups last
for metadata when none are free. If only some inode tables are in
IOPS groups (flash appended to the filesystem), place new directory
inodes in groups whose inode table is in an IOPS group, spreading them
by name hash, randomly or by a hash of the parent's inode number. Map
the data goal of files with inodes in IOPS groups onto the non-IOPS
groups. Load the IOPS group buddies at mount and read-write remount.
Treat EA inode blocks, quota files, the orphan file (not on rhel8) and
files with the new EXT4_STATE_META_ALLOC inode state as metadata on
hybrid filesystems, so osd-ldiskfs can place its internal files and
llog headers in IOPS groups. In the xarray copies, return after the
s_mb_max_linear_groups scan if it covered all groups (e.g. exactly
that many IOPS groups) and moved to the next criteria, which could
reach the WARN_ON() in ext4_mb_scan_groups() at CR_GOAL_LEN_SLOW.
Add conf-sanity test_170 to check placement, including quota files,
both fallbacks and the free IOPS cluster count. Refresh the rhel8.8
fstrim patch context.
Placement on rhel9.7, 1000MiB dm-linear device, groups 0-3 IOPS:
master patched
dir blocks in IOPS 0/124 124/124
xattr blocks in IOPS 0/40 40/40
extent index blocks in IOPS 0/2 2/2
data blocks in IOPS 0 0
dir blocks, IOPS full / freed 0/31 / 0/31 0/31 / 31/31
data, HDD fragmented, iops_data=1 256/256 0/256
dir inodes, itables in 24-31 IOPS 28/80 80/80
Fixes: 05e487a01b40 ("LU-16750 ldiskfs: optimize metadata allocation for hybrid LUNs")
Signed-off-by: Andreas Dilger <adilger@thelustrecollective.com>
Assisted-by: ClaudeCode:claude-opus-5.5 ltvm,llm_code_and_review_tools
Change-Id: I71c2e85f43279f01a507245371b5ed62d53ebbe5
69717
master
J –B ✓T ✓R +1/2
LU-20924 osd-ldiskfs: allocate internal files as metadata
reviewing Andreas Dilger · CI green — awaiting your review
L +312 −17
16d
LU-20924 osd-ldiskfs: allocate internal files as metadata
reviewing Andreas Dilger · CI green — awaiting your review
L +312 −17
16d
build #133765 SUCCESS · tests all Maloo sessions
reviews:
Artem Blagodarenko +1
no vote yet: Li Dongyang
owner Andreas Dilger · uploader Andreas Dilger · PS1 uploaded 20d ago · NEW · open in Gerrit ↗
commit message
LU-20924 osd-ldiskfs: allocate internal files as metadata On hybrid flash/HDD ldiskfs targets, Lustre internal index and log files are regular files, so ldiskfs allocates their blocks as data in the HDD groups. OI lookups are the main small random IO on an OST, and the other IAM indexes and the last_rcvd, reply_data and LAST_ID record files are updated in place like other metadata. Set LDISKFS_STATE_META_ALLOC on these inodes before osd-ldiskfs allocates blocks for them, so ldiskfs places them in the IOPS groups like directories. The state is set before every IAM block append and every block allocation in osd_write() to a regular file, which is only used for internal files. Only the header (first 64KiB) of a plain unnamed llog (changelog, OSP sync and DNE update llogs) is updated in place, while the records are appended and written back by journal checkpoint sequentially, so for these the state is set only while allocating blocks in the first 64KiB and cleared for later blocks. This is done under i_append_sem with each allocation, since changelog and OUT update writes to one llog run in parallel, and the block preallocation for llog appends stops at 64KiB. They are identified by their unnamed-llog or update-log FID sequence, and DNE update llogs by their normal FID, which no other regular file written by osd_write() has. Named llogs (CONFIGS, changelog_users...) and catalogs are long-lived, so they are fully metadata, catalogs recognized by LLOG_F_IS_CAT in the llog header that llog_osd_write_rec() writes before each record, or read from the first block once after the inode is loaded. OST object and DoM file data are written through the bulk IO path and stay data. The state is kept in memory only, so it also applies to existing filesystems. Add conf-sanity test_172 to check that directories, internal files, named llogs, catalogs and llog headers of a hybrid MDT and OST are in the IOPS groups and plain llog records and file data are not. Signed-off-by: Andreas Dilger <adilger@thelustrecollective.com> Assisted-by: ClaudeCode:claude-opus-5.5 ltvm,llm_code_and_review_tools Change-Id: I3ec147655d3e3f111ccb08b342eef681bc3ebbe5
39732
master
J ✗1B ✓T ✓R -2/2−
LU-13214 llite: pass error to upper layers
reviewing Alexander Boyko · CI green — awaiting your review (needs rebase first)
needs rebase
M +96 −11
37d
LU-13214 llite: pass error to upper layers
reviewing Alexander Boyko · CI green — awaiting your review (needs rebase first)
needs rebase
M +96 −11
37d
CI green — awaiting your review (needs rebase first)
blocked on the owner: needs rebase — checkpatch: cannot be cherry-picked
janitor flagged test failures unique to this patch — superseded (tests have since passed) — full janitor results
| unique failing test | history |
|---|---|
| sanity1@zfs:test_27T | NEW unique failure for this branch in the last 30 days, and was seen 1 times across 1 other branches 1 reviews |
2 optional test failure(s) — informational
build #103819 SUCCESS · tests all Maloo sessions
no vote yet: Qian Yingjin, Alexander Zarochentsev, Vitaly Fertman, Andreas Dilger, Patrick Farrell
patchsets:
PS5 02-19
PS6 02-28
PS7 03-08
PS8 03-25
PS9 04-03
+2 earlier
PS3 12-16 PS4 12-18owner Alexander Boyko · uploader Alexander Boyko · PS9 uploaded 946d ago · NEW · open in Gerrit ↗
commit message
LU-13214 llite: pass error to upper layers vvp_io_write_start ignores error when some bytes were written. For a stripe case this could lead to a wrong data and wrong assumptions at user level. For example write at two stripes, first is DOM was written 1 page from 16, seocond is OST and was fully written. Data is [0:4096]-hole-[64K:1M], user level see successfull write for 4096 bytes, and file position at the 1MB. The patch passes error to the upper layer to notify caller about write error. Also sanity test 281 is added. Test simulate MDT enospace, this leads to no grants on a client, and partial fail write data-hole-data. HPE-bug-id: LUS-8414 Signed-off-by: Alexander Boyko <alexander.boyko@hpe.com> Change-Id: I56ff460ca536549009ff2105669f4eed37021dde
45071
master
J ✗4B ✓T ✓R -1/2−
LU-15016 osd: fix corrupted OI file online
reviewing Hongchao Zhang · CI green — awaiting your review
1 unresolved
L +251 −43
49d
LU-15016 osd: fix corrupted OI file online
reviewing Hongchao Zhang · CI green — awaiting your review
1 unresolved
L +251 −43
49d
janitor flagged test failures unique to this patch — superseded (tests have since passed) — full janitor results
| unique failing test | history |
|---|---|
| conf-sanity3@ldiskfs+DNE:test_109a | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| conf-sanity3@ldiskfs+DNE:test_150 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| conf-sanity3@zfs:test_135 | seen in 55 other reviews |
| sanity2@ldiskfs+DNE:test_421h | seen in 5 other reviews |
1 optional test failure(s) — informational
build #103356 SUCCESS · tests all Maloo sessions
reviews:
Andreas Dilger -1
no vote yet: Qian Yingjin, Alexey Lyashkov
patchsets:
PS4 10-22
PS5 03-14
PS6 03-14
PS7 03-22
PS8 03-22
+3 earlier
PS1 09-28 PS2 09-29 PS3 09-29threads: 1 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Hongchao Zhang osd_oi.c:679 — If the old corrupted OI file has been deleted immediately because the Scrub thread was not
Andreas Dilger
(defect?) is there a danger that osd_scrub_start() is called but the started thread does not set scrub->os_running before mutex_unlock(&oi->oi_mutex) is called? Otherwise, it looks like the above code to set ic_pending_delete = 1 could be called by another thread:
if (bag->ic_stale) {
if (!scrub->os_running) {
spin_lock(&osd->od_oi_lock);
osd->od_oi_table_old[index] = NULL;
bag->ic_pending_delete = 1;
spin_unlock(&osd->od_oi_lock);
}
That would mean that the old OI file could be deleted *immediately* at "out" below, rather than stick around while scrub is being run?
Setting "ic_stale = 1" *after* osd_scrub_start() returns would be better. What happens if osd_scrub_start() fails? Then the old OI file is already deleted and the new one will not be created?
Or maybe it would be better to check something like:
if (scrub->os_file.sf_status == SS_COMPLETED)
instead of os_running?
Hongchao Zhang
If the old corrupted OI file has been deleted immediately because the Scrub thread was not started normally, the following FID lookup will try to start Scrub thread again to fix it in the new OI file. If the old corrupted OI file was reserved if Scrub failed to start, it could need to wait the completion of next Scrub to complete, could it be complex for just handling the error case of Scrub start? or it could be more complicated if the new OI file encounters some error during rebuilding the OI?
owner Hongchao Zhang · uploader Hongchao Zhang · PS8 uploaded 958d ago · NEW · open in Gerrit ↗
commit message
LU-15016 osd: fix corrupted OI file online When the OI files are being used to lookup/insert/update FID/inode pairs, if some of block is corrupted, the MDT was needed to umount to fix it by deleting the corrupted file. With this patch, it will recreate a new OI index file by OI scrub and replace it online, the corrupted OI file will temporarily be saved as "old" versions in memory for FID lookup while OI Scrub rebuilds a new OI file. FIDs will only be added or deleted to/from the "new" OI file, but until OI Scrub has finished scanning the whole filesystem it is at least possible to find FIDs in the old OI (if that part is not corrupted). If the FID is found in the old OI file then it avoids returning -EINPROGRESS and blocking client access to the filesystem while OI Scrub is running. Signed-off-by: Hongchao Zhang <hongchao@whamcloud.com> Change-Id: Id16414455aa7da928e86a78cc47f7db2d6f7550b
52166
master
J ✓B ✓T ✓R -1/2−
LU-13814 osc: add osc_dio_page_submit
reviewing Patrick Farrell · CI green — awaiting your review (needs rebase first)
needs rebase
M +42 −16
62d
LU-13814 osc: add osc_dio_page_submit
reviewing Patrick Farrell · CI green — awaiting your review (needs rebase first)
needs rebase
M +42 −16
62d
CI green — awaiting your review (needs rebase first)
blocked on the owner: needs rebase — checkpatch: cannot be cherry-picked
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-3 | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: conf-sanity. | session |
| review-dne-part-5 | RHEL 8.10 / x86_64 | ran 5 tests. 1 tests failed: sanityn. | session |
| review-dne-part-8 | RHEL 9.5 / x86_64 | ran 4 tests. 1 tests failed: replay-dual. | session |
| review-dne-zfs-part-1 | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity. | session |
| review-dne-zfs-part-2 | RHEL 8.10 / x86_64 | ran 11 tests. 1 tests failed: sanity-lnet. | session |
| review-dne-zfs-part-7 | RHEL 8.10 / x86_64 | ran 5 tests. 1 tests failed: sanity-scrub. | session |
| review-ldiskfs | RHEL 8.10 / x86_64, RHEL 9.5 / x86_64 | ran 5 tests. 1 tests failed: sanity. | session |
| review-ldiskfs-ubuntu | RHEL 8.10 / x86_64, Ubuntu 22.04 / x86_64 | ran 8 tests. 1 tests failed: sanity. | session |
| review-zfs | RHEL 8.10 / x86_64 | ran 10 tests. 1 tests failed: replay-single. | session |
8 optional test failure(s) — informational
build #119017 SUCCESS · tests all Maloo sessions
no vote yet: Qian Yingjin, Marc Vef, Andreas Dilger
patchsets:
PS32 07-04
PS33 07-14
PS34 11-06
PS35 11-09
PS36 11-16
+31 earlier
PS1 08-29 PS2 08-30 PS3 08-30 PS4 08-30 PS5 08-31 PS6 09-05 PS7 09-09 PS8 09-10 PS9 09-10 PS10 09-10 PS11 09-10 PS12 09-10 PS13 09-10 PS14 09-12 PS15 09-14 PS16 09-15 PS17 09-24 PS18 09-25 PS19 09-26 PS20 09-26 PS21 10-05 PS22 10-05 PS23 10-20 PS24 10-22 PS25 10-22 PS26 02-27 PS27 10-28 PS28 11-03 PS29 04-28 PS30 04-28 PS31 05-01owner Patrick Farrell · uploader Patrick Farrell · PS36 uploaded 353d ago · NEW · open in Gerrit ↗
commit message
LU-13814 osc: add osc_dio_page_submit This patch adds the osc_dio_page_submit and specializes osc_page_submit to take only BIO pages. Signed-off-by: Patrick Farrell <pfarrell@whamcloud.com> Change-Id: I048bbcd25ffee28fbbd8fee26017796b5e3586bd
52182
master
J !B ✓T ✓R 0/2
LU-13814 osc: simplify osc_dio_page_submit
reviewing Patrick Farrell · CI green — awaiting your review
stalled 341d
S +10 −14
341d
LU-13814 osc: simplify osc_dio_page_submit
reviewing Patrick Farrell · CI green — awaiting your review
stalled 341d
S +10 −14
341d
janitor run: 3 failing config(s), none unique to this patch — janitor results
2 optional test failure(s) — informational
build #119105 SUCCESS · tests all Maloo sessions
no vote yet: Qian Yingjin, Marc Vef, Andreas Dilger
patchsets:
PS33 07-14
PS34 11-06
PS35 11-09
PS36 11-16
PS37 11-16
+32 earlier
PS1 08-30 PS2 08-30 PS3 08-30 PS4 08-31 PS5 09-05 PS6 09-09 PS7 09-09 PS8 09-10 PS9 09-10 PS10 09-10 PS11 09-10 PS12 09-10 PS13 09-10 PS14 09-10 PS15 09-12 PS16 09-14 PS17 09-15 PS18 09-24 PS19 09-25 PS20 09-26 PS21 09-26 PS22 10-05 PS23 10-05 PS24 10-20 PS25 10-22 PS26 10-22 PS27 02-27 PS28 10-28 PS29 11-03 PS30 04-28 PS31 05-01 PS32 07-04owner Patrick Farrell · uploader Patrick Farrell · PS37 uploaded 353d ago · NEW · open in Gerrit ↗
commit message
LU-13814 osc: simplify osc_dio_page_submit Remove more code from osc_dio_page_submit, with the goal of eliminating it entirely. Signed-off-by: Patrick Farrell <pfarrell@whamcloud.com> Change-Id: Id408aad01c2e81a126dd04807819aed9d29fca6b
52167
master
J !B ✓T ✓R 0/2
LU-13814 osc: add osc_dio_completion
reviewing Patrick Farrell · CI green — awaiting your review
stalled 341d
M +49 −32
341d
LU-13814 osc: add osc_dio_completion
reviewing Patrick Farrell · CI green — awaiting your review
stalled 341d
M +49 −32
341d
janitor run: 3 failing config(s), none unique to this patch — janitor results
2 optional test failure(s) — informational
build #119044 SUCCESS · tests all Maloo sessions
no vote yet: Qian Yingjin, Marc Vef, Andreas Dilger
patchsets:
PS32 07-14
PS33 11-06
PS34 11-09
PS35 11-16
PS36 11-16
+31 earlier
PS1 08-29 PS2 08-30 PS3 08-30 PS4 08-30 PS5 08-31 PS6 09-05 PS7 09-09 PS8 09-10 PS9 09-10 PS10 09-10 PS11 09-10 PS12 09-10 PS13 09-10 PS14 09-12 PS15 09-14 PS16 09-15 PS17 09-24 PS18 09-25 PS19 09-26 PS20 09-26 PS21 10-05 PS22 10-05 PS23 10-20 PS24 10-22 PS25 10-22 PS26 02-27 PS27 10-28 PS28 11-03 PS29 04-28 PS30 05-01 PS31 07-04owner Patrick Farrell · uploader Patrick Farrell · PS36 uploaded 353d ago · NEW · open in Gerrit ↗
commit message
LU-13814 osc: add osc_dio_completion Specialize osc_completion to add the osc_dio_completion version. Signed-off-by: Patrick Farrell <pfarrell@whamcloud.com> Change-Id: I4d202165ee6c4f50338b6a9381aa476b969d3593
61801
b2_15
J ✗2B ✓T ✓R +1/1
LU-19113 llite: cfs_delete_from_page_cache() keep page locked
reviewing Etienne AUJAMES · CI green — awaiting your review
stalled 376d
S +6 −6
376d
LU-19113 llite: cfs_delete_from_page_cache() keep page locked
reviewing Etienne AUJAMES · CI green — awaiting your review
stalled 376d
S +6 −6
376d
janitor flagged test failures unique to this patch — superseded (tests have since passed) — full janitor results
| unique failing test | history |
|---|---|
| recovery-small@ldiskfs+DNE:test_24b | seen in 1 other review |
| replay-single1@ldiskfs+DNE:test_90 | seen in 1 other review |
1 optional test failure(s) — informational
build #117871 SUCCESS · tests all Maloo sessions
reviews:
Bruno Faccini +1
no vote yet: Patrick Farrell
patchsets:
PS1 10-13
PS2 10-24
owner Etienne AUJAMES · uploader Etienne AUJAMES · PS2 uploaded 376d ago · NEW · backport · open in Gerrit ↗
commit message
LU-19113 llite: cfs_delete_from_page_cache() keep page locked
Like in other places where generic_error_remove_folio() is
also being called, in both Lustre and Kernel, page should not
be unlocked prior to call it in cfs_delete_from_page_cache().
This was also allowing a race where page->mapping may become
NULL.
Taking an extra reference is also useless if page not unlocked
anymore.
Lustre-change: https://review.whamcloud.com/59829
Lustre-commit: 3dec26990738ad3f5008d46ee9d3d03df7454925
Fixes: 738e69d4b9 ("LU-16292 llite: delete_from_page_cache not exported")
Signed-off-by: Bruno Faccini <bfaccini@nvidia.com>
Change-Id: If39575f4339afe460b3b1c955201e8f9cdfeb871
Reviewed-by: Patrick Farrell <pfarrell@whamcloud.com>
Reviewed-by: Zhenyu Xu <bobijam@whamcloud.com>
Signed-off-by: Etienne AUJAMES <eaujames@ddn.com>
31596
master
J ✓B ✓T ✓R -1/2−
LU-10781 test: Add sanity-flr test_33a
reviewing Sarah Liu · CI green — awaiting your review
stalled 464d
M +52 −0
464d
LU-10781 test: Add sanity-flr test_33a
reviewing Sarah Liu · CI green — awaiting your review
stalled 464d
M +52 −0
464d
build #8408 SUCCESS
reviews:
Andreas Dilger -1
no vote yet: James Nunez
owner Sarah Liu · uploader James Nunez · PS5 uploaded 2609d ago · NEW · open in Gerrit ↗
commit message
LU-10781 test: Add sanity-flr test_33a Add sanity-flr test_33a to test OST fail senario when reading is ongoing Test-Parameters: trivial testlist=sanity-flr Signed-off-by: Wei Liu <wei3.liu@intel.com> Change-Id: I33c56f5552f567a94d000d01fc4967431df8423b
44765
master
J !B ✓T ✓R +0/2−
LU-14794 utils: output text for lctl debug_daemon
reviewing Yang Sheng · CI green — awaiting your review
stalled 464d
M +134 −62
464d
LU-14794 utils: output text for lctl debug_daemon
reviewing Yang Sheng · CI green — awaiting your review
stalled 464d
M +134 −62
464d
janitor run: 3 failing config(s), none unique to this patch — janitor results
build #23991 SUCCESS · tests all Maloo sessions
reviews:
Emoly Liu +1 · Andreas Dilger -1
patchsets:
PS4 09-29
PS5 09-30
PS6 09-30
PS7 10-09
PS8 11-03
+3 earlier
PS1 08-27 PS2 09-27 PS3 09-27owner Yang Sheng · uploader Yang Sheng · PS8 uploaded 1827d ago · NEW · open in Gerrit ↗
commit message
LU-14794 utils: output text for lctl debug_daemon Add a option to output log in text mode while debug daemon running. It can be used to monitoring the log rather than convert later. Signed-off-by: Yang Sheng <ys@whamcloud.com> Change-Id: I173fba77853c36484fefa1068fd8f098535bec6a
52613
master
J !B ✓T ✓R 0/2
LU-17177 mdt: prevent read-on-open for FLR file
reviewing Mikhail Pershin · CI green — awaiting your review
stalled 464d
S +45 −1
464d
LU-17177 mdt: prevent read-on-open for FLR file
reviewing Mikhail Pershin · CI green — awaiting your review
stalled 464d
S +45 −1
464d
janitor run: 3 failing config(s), none unique to this patch — janitor results
2 optional test failure(s) — informational
build #99307 SUCCESS · tests all Maloo sessions
no vote yet: Qian Yingjin, Andreas Dilger
owner Mikhail Pershin · uploader Mikhail Pershin · PS1 uploaded 1121d ago · NEW · open in Gerrit ↗
commit message
LU-17177 mdt: prevent read-on-open for FLR file DoM read-on-open shouldn't fetch data for FLR file without knowledge about mirror states. Also it is better to ignore DoM component having STALE flag. The following changes are proposed: - no read-on-open data prefetch for FLR file - no DoM lock/size returned if DoM component has stale FLR flag Signed-off-by: Mikhail Pershin <mpershin@whamcloud.com> Change-Id: I38a29d34f0c1d9f9bc56f362e49202e759f9e800
57655
b2_15
J ✓B ✓T ✓R 0/1
LU-16637 llite: tolerate fresh page cache pages after truncate
reviewing Etienne AUJAMES · CI green — awaiting your review
LTS15
stalled 537d
M +63 −11
537d
LU-16637 llite: tolerate fresh page cache pages after truncate
reviewing Etienne AUJAMES · CI green — awaiting your review
LTS15
stalled 537d
M +63 −11
537d
build #113466 SUCCESS · tests all Maloo sessions
no vote yet: Andrew Perepechko
patchsets:
PS1 01-06
PS2 05-16
owner Etienne AUJAMES · uploader Etienne AUJAMES · PS2 uploaded 537d ago · NEW · backport · open in Gerrit ↗
commit message
LU-16637 llite: tolerate fresh page cache pages after truncate Truncate called by ll_layout_refesh() can race with a fast read or tiny write, which can add an uninitialized non-uptodate page into the page cache. We want to avoid expensive locking for this rare case so if there is any leftover in the cache after truncate, just check that the pages are not uptodate, not dirty and do not have any filesystem-specific information attached to them. Lustre-change: https://review.whamcloud.com/53554 Lustre-commit: 7bb1e211d217d5a82ac2d5e4edad5ae018090761 Change-Id: I8cadc022a3d1822a585f32e1a765e59ad0ff434d Signed-off-by: Andrew Perepechko <andrew.perepechko@hpe.com> HPE-bug-id: LUS-11937 Reviewed-by: Zhenyu Xu <bobijam@hotmail.com> Reviewed-by: Patrick Farrell <pfarrell@whamcloud.com> Signed-off-by: Etienne AUJAMES <eaujames@ddn.com>
57668
b2_15
J !B ✓T ✓R +1/1
LU-18468 llapi: always truncate mirrors on resync
reviewing Etienne AUJAMES · CI green — awaiting your review
stalled 665d
M +54 −11
665d
LU-18468 llapi: always truncate mirrors on resync
reviewing Etienne AUJAMES · CI green — awaiting your review
stalled 665d
M +54 −11
665d
janitor run: 1 failing config(s), none unique to this patch — janitor results
build #110108 SUCCESS · tests all Maloo sessions
reviews:
Alex Zhuravlev +1
no vote yet: Andreas Dilger
owner Etienne AUJAMES · uploader Etienne AUJAMES · PS1 uploaded 666d ago · NEW · backport · open in Gerrit ↗
commit message
LU-18468 llapi: always truncate mirrors on resync When mirrors are synced, all mirrors should be truncated to match the size of the source/primary mirror. This was skipped if the size was unaligned, but that is a mistake. Lustre-change: https://review.whamcloud.com/57090 Lustre-commit: b5db891cad71f17dda00ab157332db819d2292f8 Test-Parameters: testlist=sanity-flr,sanity-flr,sanity-flr Test-Parameters: testlist=sanity-pfl,sanity-pfl,sanity-pfl Signed-off-by: Patrick Farrell <pfarrell@whamcloud.com> Signed-off-by: Alex Zhuravlev <bzzz@whamcloud.com> Change-Id: I767a1b3ef58c855f57967228d37b04fa0ab87e57 Reviewed-by: Zhenyu Xu <bobijam@hotmail.com> Reviewed-by: Andreas Dilger <adilger@whamcloud.com> Signed-off-by: Etienne AUJAMES <eaujames@ddn.com>
50325
b2_12
J ✓B ✓T ✓R 0/1
LU-10810 osd: implement lseek method in OSD
reviewing Etienne AUJAMES · CI green — awaiting your review
stalled 1325d
M +165 −42
1325d
LU-10810 osd: implement lseek method in OSD
reviewing Etienne AUJAMES · CI green — awaiting your review
stalled 1325d
M +165 −42
1325d
build #93096 SUCCESS · tests all Maloo sessions
no vote yet: Andreas Dilger, Mikhail Pershin
owner Etienne AUJAMES · uploader Etienne AUJAMES · PS1 uploaded 1328d ago · NEW · backport · open in Gerrit ↗
commit message
LU-10810 osd: implement lseek method in OSD Introduce lseek support in dt_object methods and at OSD level This is server support for SEEK_HOLE and SEEK_DATA distributed request, it returns a resulting offset or error code ZFS support is added as well but it is not yet available due to missing export of dmu_offset_next() function. Patch adds also osd_quasi_file() common method to create fake file structure to use in inode i_fop calls Lustre-change: https://review.whamcloud.com/39706 Lustre-commit: 947af94817f8eeb5e6108b0b3cde65419b13c8d3 Signed-off-by: Mikhail Pershin <mpershin@whamcloud.com> Change-Id: I3802743e31c94d2de219b72a540c5df9c72f1897 Reviewed-by: Bobi Jam <bobijam@hotmail.com> Reviewed-by: Andreas Dilger <adilger@whamcloud.com> Signed-off-by: Etienne AUJAMES <eaujames@ddn.com>
▶Awaiting review — CI not green yet
(38)
67507
master
J –B ✓T …R 0/2
LU-6142 obdclass: add/use OBD_ALLOC_PTR_ARRAY[_LARGE]()
reviewing Andreas Dilger · awaiting review (CI not green yet)
pw_smallfix
L +193 −213
3h
LU-6142 obdclass: add/use OBD_ALLOC_PTR_ARRAY[_LARGE]()
reviewing Andreas Dilger · awaiting review (CI not green yet)
pw_smallfix
L +193 −213
3h
no vote yet: Marc Vef, Alex Zhuravlev, Timothy Day
patchsets:
PS8 10-07 patrick bot
PS9 10-27 patrick bot
PS10 10-28 patrick bot
PS11 11-04 patrick bot
PS12 11-05 patrick bot
+7 earlier
PS1 07-24 PS2 07-25 PS3 07-25 PS4 09-28 patrick bot PS5 10-05 patrick bot PS6 10-05 patrick bot PS7 10-06 patrick bottags: pw_smallfix
owner Andreas Dilger · uploader patrick bot · PS12 uploaded 4h ago · NEW · open in Gerrit ↗
commit message
LU-6142 obdclass: add/use OBD_ALLOC_PTR_ARRAY[_LARGE]() Reimplement OBD_ALLOC_PTR_ARRAY() and OBD_ALLOC_PTR_ARRAY_LARGE() with overflow-checked array sizes instead of open-coding them, and add OBD_ALLOC_ARRAY_GFP() and OBD_ALLOC_ARRAY_LARGE_GFP() as the underlying array allocators. These simplify callers and avoid potential bugs with overflow of calculations with 32-bit variables. Convert OBD_ALLOC() and OBD_ALLOC_LARGE() and corresponding OBD_FREE[_LARGE]() callers to the new macros where possible. OBD_ALLOC_ARRAY_LARGE_GFP() keeps the explicit kmalloc then vmalloc fallback of OBD_ALLOC_LARGE(), since kvmalloc_array() does not fall back to vmalloc for GFP_NOFS before Linux 5.15. Remove OBD_ALLOC_WAIT(), OBD_ALLOC_PTR_WAIT() and OBD_ALLOC_PTR_ARRAY_WAIT(); their few callers now use OBD_ALLOC_GFP(..., GFP_KERNEL) directly. Update leak_finder.pl to parse the new allocation labels. Change lds_def_comp_size_cnt to hold the maximum count of entries in the lds_def_comp_entries array, rather than the requested number of entries. This avoids recalculating the array size on each call so lod_free_def_comp_entries() and lod_free_comp_buffer() can use OBD_FREE_PTR_ARRAY_LARGE(). Cleanup code style issues in related code. Signed-off-by: Andreas Dilger <adilger@thelustrecollective.com> Assisted-by: ClaudeCode:claude-opus-5-5 Assisted-by: ClaudeCode:claude-sonnet-5 Change-Id: Ie0db250d017d228606d4d976132968d138500c1e
64919
master
J –B ✓T …R +1/2
LU-12669 lov: slow and dead OST detection for degraded reads
reviewing Maximilian Dilger · awaiting review (CI not green yet)
218_review_prioritypw_shepherdpt_ecro
5 unresolved
XL +2385 −77
8h
LU-12669 lov: slow and dead OST detection for degraded reads
reviewing Maximilian Dilger · awaiting review (CI not green yet)
218_review_prioritypw_shepherdpt_ecro
5 unresolved
XL +2385 −77
8h
reviews:
Keguang Xu +1
no vote yet: Ronnie Sahlberg, Andreas Dilger
patchsets:
PS49 10-05 Andreas Dilger
PS50 10-05 Andreas Dilger
PS51 10-15 Andreas Dilger
PS52 10-24 Andreas Dilger
PS53 11-04
+48 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-19 PS48 09-26threads: 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: 218_review_priority pw_shepherd pt_ecro
owner Maximilian Dilger · uploader Maximilian Dilger · PS53 uploaded 12h 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
69908
master
J –B ✓T …R +1/2
LU-12669 ec: fix degraded read page leak and short read
reviewing Maximilian Dilger · awaiting review (CI not green yet)
218_review_prioritypt_ecro
3 unresolved
L +253 −8
8h
LU-12669 ec: fix degraded read page leak and short read
reviewing Maximilian Dilger · awaiting review (CI not green yet)
218_review_prioritypt_ecro
3 unresolved
L +253 −8
8h
reviews:
Ronnie Sahlberg +1
no vote yet: Andreas Dilger, Patrick Farrell
patchsets:
PS1 10-22
PS2 11-03
PS3 11-04
threads: 3 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 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 · PS3 uploaded 11h 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_51c 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
68347
master
J –B ✗T –R ✗
LU-10026 ofd: csdc final integration patch
reviewing Marc Vef · blocked on the owner: build failure; Marc Vef voted -1
CR -1
csdc
5 unresolved
XL +3772 −421
8d
LU-10026 ofd: csdc final integration patch
reviewing Marc Vef · blocked on the owner: build failure; Marc Vef voted -1
CR -1
csdc
5 unresolved
XL +3772 −421
8d
blocked on the owner: build failure; Marc Vef voted -1
awaiting review (CI not green yet)
build #130325 FAILURE
reviews:
Marc Vef -1
no vote yet: Sergey Cheremencev, Sebastien Buisson, Alex Zhuravlev, Hongchao Zhang, Li Dongyang
patchsets:
PS1 08-25
PS2 08-26
threads: 5 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Marc Vef patchset comment — [Marc Bot] upstream remarks for reference:
Marc Vef
[Marc Bot] upstream remarks for reference: Port notes for this upstream submission (large squash; adapted to current master): - The build-file hunk was retargeted: the tree no longer has per-directory autotools files (LU-18876), so ofd_compress.o is added to the kbuild lustre/ofd/Makefile; the EXTRA_DIST hunk has no equivalent and was dropped. - LU-13139 moved the dt_bufs_get()/dt_read_prep()/dt_write_prep() bodies out of dt_object.h into obdclass/dt_object.c; this patch's signature changes (offset/len args, decompression/read flags) were applied to the relocated bodies, with the prototypes and the new dt_unlock_pages() wrapper in the header. - OBD_FAIL_OST_BRW_WRITE_BULK3 renumbered 0x256 -> 0x258: 0x256 is already OBD_FAIL_OST_GRANT_PREPARE on master. - An m4 call to LC_FORCE_UACCESS_BEGIN was dropped: the macro is not defined anywhere (neither in this patch nor in the tree). The functional m4 content (LC_VM_MAP_RAM_PROT_ARG probe for the 4-arg vm_map_ram()) is kept. - The compression level-mapping helpers and compr_type_table were moved from lustreapi.h into the lustre_user.h UAPI header (as this patch intends, so server code can share them), based on the current series' versions of those helpers; the table gained the LL_COMPR_TYPE_MAX sentinel and iteration skips NULL-name entries. compress_type_2str()/ mapback_compress_level() are static inlines there now; the lfs find loops live in liblustreapi_pfind.c and were converted there. - Adapted to the reworked struct ll_compr_hdr (65769): split magic words and the packed level_and_chunk byte with its accessors, in ofd_compress.c and the shared compression library. is_chunk_start() takes a folio in this series; the OFD call sites pass page_folio(lnb_page). - The chunk-bits fields follow the series' *_lum_bits naming and offset semantics; llc_compr_chunk_lum_bits already stores the offset above COMPR_CHUNK_MIN_BITS, so the filter-fid assignment in lod_object.c is direct, without re-subtracting COMPR_CHUNK_MIN_BITS. - ptlrpc_connection_is_local() does not exist upstream - replaced with the LNetIsPeerLocal(&exp->exp_connection->c_peer.nid) form used by the surrounding OFD code. - osd_write_prep(): the partial-page zeroing block had been converted to kmap_local_page()/folio_index_page() upstream; the patch's changes (PageUptodate skip, read flag, whole-page memset) were applied on the current form. - The preview-period client-side restriction on non-chunk-aligned overwrites (vvp_io_write_start) is removed as in the original patch. - unmerge_chunk(): the new tail-clearing loop indexed lnb[i] while its loop condition and debug message used first + i; the stores now use lnb[first + i] consistently. - Old version gates carried by the squashed test additions (sanity-compr 1004-1006, sanity-lfsck 18i, test_460e area) are meaningless on master and were converted to the compression_supported() helper. - A Fixes: line pointing at one of this patch's own squashed sub-patches was dropped; a file for an external repository (lipe) was dropped.
reply Misc Code Checks Robot (Gatekeeper helper) ofd_compress.c:663 — warn: ofd_map_chunks_to_lnb_write():missing conversion: 'rc + maxlnb' 'unit_page + unit_array_size'
Misc Code Checks Robot (Gatekeeper helper)
warn: ofd_map_chunks_to_lnb_write():missing conversion: 'rc + maxlnb' 'unit_page + unit_array_size'
reply Misc Code Checks Robot (Gatekeeper helper) ofd_compress.c:667 — warn: ofd_map_chunks_to_lnb_write():missing conversion: 'rc + maxlnb' 'unit_page + unit_array_size'
Misc Code Checks Robot (Gatekeeper helper)
warn: ofd_map_chunks_to_lnb_write():missing conversion: 'rc + maxlnb' 'unit_page + unit_array_size'
reply Marc Vef ofd_compress.c:975 — (defect) range lock must be taken before `ofd_map_chunks_to_lnb_write()`
Marc Vef
(defect) range lock must be taken before `ofd_map_chunks_to_lnb_write()`
reply Misc Code Checks Robot (Gatekeeper helper) ofd_compress.c:1048 — warn: ofd_object_punch_compr():duplicate check 'orig_lnb' (previous on line 957)
Misc Code Checks Robot (Gatekeeper helper)
warn: ofd_object_punch_compr():duplicate check 'orig_lnb' (previous on line 957)
tags: csdc
owner Marc Vef · uploader Marc Vef · PS2 uploaded 70d ago · NEW · open in Gerrit ↗
commit message
LU-10026 ofd: csdc final integration patch
Add calls to the csdc functions from the regular read/write paths.
This also brings OFD range locking back for compressed objects,
reverting commit a21ce928aa64 ("LU-15894 ofd: revert range locking
in ofd") for this use case.
ofd: rename 'local' in thread_big_cache
It's not a big deal since it's only used a few times, but
let's give this variable a descriptive name.
DDN-bug-id: EX-7601
Was-Change-Id: Ide136cd42e885d59f1a2e4ce22a2e7449faca3f9
ofd: rename map_remote_to_local
osd_map_remote_to_local implies some complex role, but in
fact what this does is initialize the fields of the
local niobuf structs to represent the requested range.
This *may* be the same as a remote niobuf, but it also
isn't in some cases. Name it osd_init_lnbs instead.
DDN-bug-id: EX-7601
Was-Change-Id: I0d3b5f24e42ee8dc962437daea7cf9347ccb9059
ofd: series description and reorder declarations
Reorder declarations in tgt_brw_read prior to adding things.
This trivial patch is a good place to put the description
of this series, which handles unaligned reads to compressed
files.
-----------------------
These patches handle compression chunk unaligned reads on
the server.
When using compression, the client attempts to send chunk
aligned reads, but sometimes it can't, and the client will
send a read to the server which is not chunk aligned.
In this case, the server must read the full chunk,
decompress it, and provide the requested data to the client.
Here's how we do this.
The server receives a set of remote niobufs describing IO
from the client. Each remote niobuf (rnb) describes a range
of data the client wants to do IO to.
These are translated to a set of local niobufs on the
server, which we then use to do the read. For compression,
the server has to read complete chunks on unalinged reads.
So we walk these remote niobufs and identify unaligned read
requests (in ofd_preprw_read), then round them to chunk
size. The server then reads the chunk rounded read request
from storage.
The local niobufs now contain a set of complete compressed
chunks, ie, the raw data from disk. We need to decompress
the chunks where the client is doing an unaligned read, but
leave the other chunks compressed (because the client will
uncompress them).
So, in obd_decompress_read, we use the remote niobuf to
identify unaligned reads from the client. We then walk the
local niobufs, identify the chunks which match the unaligned
reads from the client, and decompress them 'in place'.
The decompression uses temporary buffers, but the
decompressed data is placed back in the local niobuf.
(If the data is uncompressed on disk, we of course do not
decompress it. This happens for incompressible data.)
Now the local niobuf contains some raw chunks and some
chunks which have been decompressed. This is *more* data
than the client asked for. Normally, the server local
niobuf contains exactly what the client asked for, so the
server checksums and sends the entire local niobuf. But
because we read complete chunks, the local niobuf contains
more data than the client requested.
This means we need to identify the subset of the local
niobuf which the client actually wants to read and present
that to the client.
In order to do that, we walk the local niobuf and use the
remote niobufs (the description of the pages the client
needs) and create a special tx niobuf which points to only
the pages the client wants (io_lnb_to_tx_lnb). Then we use
this tx niobuf for checksum and transfer to the client.
DDN-bug-id: EX-7601
Was-Change-Id: Ic89dcef7e169879725caa6cdef4619b9a76b2b37
ofd: identify reads to round
If the beginning or end of a client read is unaligned, we
must round the locking. This patch identifies reads where
this is required, the next patch will do the locking.
Print a debug message when such an IO is found, but don't
do anything different - yet.
DDN-bug-id: EX-7601
Was-Change-Id: Ibdab35b733225b4b1349ef457f66ca37dcb2d9bf
ofd: round read lock to chunk
For unaligned reads, we need to round the read locking to
cover the any leading or trailing chunks. We do this by
creating a local 'remote niobuf' to describe the rounded
range and doing the locking against that niobuf.
DDN-bug-id: EX-7601
Was-Change-Id: I8818522c188aca3c5c5eb564da2a8ba8aef18a4b
ofd: convert dt_bufs_get to offset, len
dt_bufs_get takes a remote niobuf, but just uses the
offset and length for getting pages.
Compression requires rounding the local IO to include the
full compression chunk, which means the local IO does not
match the remote niobuf any more.
So we modify dt_bufs_get to take an offset and length
rather than a remote niobuf, so we can ask for the pages we
need.
DDN-bug-id: EX-7601
Was-Change-Id: I4beaf8207fa00d802c0a339df3de2a3c71154fc7
ofd: add chunk_size to preprw_read
preprw_read needs chunk size for rounding. Add this in a
separate patch to keep things trivial, it will be used in
a subsequent patch.
Also use this to add a check in DOM to ensure it doesn't
attempt to do compression. This should already be
prevented by setstripe, so this is just an extra safety
check.
DDN-bug-id: EX-7601
Was-Change-Id: I9dc4d1559e5c8be315268a593466571b54c90a96
ofd: add remote_pages
When we round a read to get all of the compressed chunks,
the number of local and the number of remote pages will
differ. We need to make sure we do the checksum and data
transfer using the number of remote pages, not the number of
local pages.
This patch calculates the number of remote pages and uses it
accordingly. This doesn't do anything yet, but when we
round the local read to include the whole compressed chunk,
this will be needed.
DDN-bug-id: EX-7601
Was-Change-Id: I4875b02016570d227b3b926efd117f0a7cda41b4
tgt: add second tbc lnb for RDMA
Compression requires the server to do local IO which differs
from the IO requested by the client. This means we cannot
directly use the IO niobufs for doing the transfer to the
client.
So we add a second set of lnb pointers, which are used to
point at a specific subset of the pages in the main
per-thread cache. This subset will be used for doing the
transfer to the client.
DDN-bug-id: EX-7601
Was-Change-Id: I53aa46045aaf335da20a311900ac0bf425823b22
tgt: add io_lnb_to_tx_lnb
With compression, the lnbs used for the disk IO on the
server can contain more data than the client requested,
due to reading up whole chunks for decompression.
This means we need to transfer only a subset of the lnbs.
We do this by creating a second set of lnbs, and pointing
them at the pages in the local io lnb which need to be
transferred to the client.
This code doesn't do anything for now, but it will kick in
with the next patch when we start rounding chunks for read.
DDN-bug-id: EX-7601
Was-Change-Id: I0fe690718a3484578b139eaaec52c0c3b265da6a
ofd: add chunk rounding to read
We need to round all niobufs to chunk size in the read
process, so we read in the full chunk.
dt_bufs_get sets up the local niobuf for the read, so we
round before calling it.
This patch is a partial implementation of unaligned read
support, and breaks compression testing until the next few
patches are landed. So this patch temporarily adds the
compression tests to ALWAYS_EXCEPT.
DDN-bug-id: EX-7601
Was-Change-Id: I587a519db4dae983db5db1d690e63e15bc010b7e
ofd: add chunk_size to preprw_write
preprw_write needs chunk size for rounding. Add this in a
separate patch to keep things trivial, it will be used in
a subsequent patch.
This patch is really trivial on the write side, since the
read side already did most of this. But it's being kept
separate for symmetry.
DDN-bug-id: EX-7601
Was-Change-Id: Id25957dbc185b6e61b7f208cee8cf5f897f03944
ofd: do not use page cache for compressed files
It is challenging for the server to safely use the page
cache with compressed files, because if data is
decompressed in to the page cache, the data in cache now
differs from the data on disk.
This is a problem if *part* of the page cache is ever
evicted, because we can end up with a situation where a read
will be partially satisfied from cache and partially from
disk, but the data on disk is compressed and the data in
cache is not.
It is possible to deal with this by carefully ensuring the
page cache is not used just for decompressed data, but this
makes getting the buffers/lnbs for compressed files fairly
complicated. Instead, we can just entirely block using the
server page cache for compressed files.
This must be done for both read and write, and only works
for ldiskfs - ZFS cannot easily be forced to not use its
page cache. But that's OK because we do not support CSDC
with ZFS.
DDN-bug-id: EX-7601
Was-Change-Id: Iee73abb29ad5631bb2203c2133756d7ebf5b686d
ofd: add ofd_decompress_read implementation
ofd_decompress_read is responsible for walking the
remote niobufs (rnbs) in the RPC and identifying if they
are chunk unaligned. It then passes them on to the rnb
decompression code (not implemented yet, see next patch).
It also allocates the bounce buffers for decompression so
they can be reused for each remote niobuf.
DDN-bug-id: EX-7601
Was-Change-Id: I1f2f86ce3fc036ac5d79b060a5e44f6564e123aa
ofd: lock pages from read to decompression
When using the page cache on the server, for pages which
will be decompressed, we can't unlock them until they've
been decompressed.
Rather than only waiting to unlock the pages which will be
decompressed, we keep all of the read pages locked. This
simplifies the code, at the cost of delaying other reads to
the aligned portion of an unaligned read. ie, shouldn't be
important in practice.
DDN-bug-id: EX-7601
Was-Change-Id: Ie98920327979a5c9600e8c9e8627816461ea1a34
ofd: (ofd part)add obd level compression lib
Some compression functions will be used by several areas of
of Lustre, so they need to be in obdclass.
This moves merge_chunk and unmerge_chunk there and adds the
ability for them to merge lnbs. This is used in a future
patch.
DDN-bug-id: EX-7601
Was-Change-Id: If4a318119bb7685e41adb9f3b31a66074031e6ac
ofd: make compress_chunk take chunk_bits
Chunk bits is used everywhere, have compress_chunk convert
to log bits rather than have the callers do it.
Was-Signed-off-by: Patrick Farrell <pfarrell@whamcloud.com>
ofd: add decompress_rnb implementation
This implements decompress_rnb, which is the core code for
handling unaligned reads from the client.
Decompress rnb takes an unaligned remote niobuf and
identifies the unaligned portion(s) of the IO, then finds
the corresponding local niobufs (pages read from disk),
and passes them on for decompression in place.
decompress_chunk_in_lnb decompresses the data in a set of
lnbs and copies it back to the same location, replacing the
raw data from disk with decompressed data. (If the chunk
was not compressed, it does nothing.)
With this patch, the implementation of unaligned reads is
complete and we can add the compression sanity tests back
safely.
DDN-bug-id: EX-7601
Was-Change-Id: Ifd1d9b03d5d004bec3f5e456da359b8d10e005f9
ofd: improve decompress_rnb debug
Since we're very close on landing the unaligned read
patches, this minor debug improvement is being placed later
in the series.
DDN-bug-id: EX-7601
Was-Change-Id: I36ad243bd1f7025e358f9593f1008f0b851cc1bb
tgt: reorder tgt_brw_write decls
Reorder the declarations in tgt_brw_write.
This patch also serves as the series head for implementing
read-modify-write support for compressed chunks.
The process for read-modify-write is similar to that used
for unaligned reads.
At a high level, read-modify-write means we must read up,
decompress, then recompress and write back the data. This
only applies when we're actually doing read-modify-write.
To know when to do this, we rely partly on the client. If
the client is able to compress a chunk, either because it is
a complete chunk, or because the start is chunk aligned and
the write is past EOF, we know there is no read-modify-write
required. Either there is no existing data (write past EOF)
or the data will be fully replaced.
So, when we see a write which is not fully chunk aligned and
not already compressed, we will do a read-modify-write.
For this, we round the IO lnbs and associated locking to
cover complete chunks, then we do a read of the unaligned
chunks.
ie, if we have a write which goes from 63 KiB to 257 KiB
with a chunk size of 64 KiB, we will read 0-64 KiB and
256-320 KiB, and decompress those chunks in to the buffer.
64 KiB to 256 KiB is *NOT* read, because those are complete
chunks.
We then set up a transfer mapping - identical to the process
for unaligned reads - so the client data is written in to
the correct lnbs.
Now we have a set of chunk aligned lnbs which contain data
updated with the client write. In the initial version, we
write these to disk uncompressed. This is sufficient for
correct operation, but it does mean read-modify-write will
decompress those chunks.
There is code for recompression, but it is not working 100%
yet, and there are some complexities around managing holes
and EOF which still need to be resolved.
TBD if this will make our initial release - I am hopeful but
not sure yet.
DDN-bug-id: EX-7601
Was-Change-Id: Ia24583d4221f498928e99afa8c289b70e4d25f5b
tests: unaligned read tests
This adds testing for handling unaligned reads and partial
chunk reads from compressed files.
Testing for writes and multi-client and racing tests will
be added later, but we put the checking function in
test-framework now so it's easy to use later.
DDN-bug-id: EX-7601
Was-Change-Id: I06217c8aeba75016aa4168f329026842dff1d979
obd: add error check in merge_chunk
If the lnbs we're trying to merge have an error recorded in
them, then they're not going to be valid input for
decompression, so return an error.
DDN-bug-id: EX-7601
Was-Change-Id: I1bf17131cb65106087eb5e72e2700db30c0cc975
obd: do not decompress empty lnbs
For reads which cross EOF, we may get lnbs with no data in
them (similarly for writes which cross EOF).
For these cases, it's important to only copy from the lnbs
where there is data, and only do decompression on the lnbs
if there's actually data in them.
Modify merge chunk to do this.
DDN-bug-id: EX-7601
Was-Change-Id: I83fefcfa6d1396dcd97fad994334bf29438bb4bf
ofd: clear pages in decompression
Handling writes to compressed files requires a
read-modify-write cycle, which has implications for how we
handle reads.
Consider the case of a file with an 8 KiB write at offset 0,
which is compressed to 4 KiB. Then there is another 4 KiB
write at offset 16 KiB.
Updating this correctly requires reading the first chunk,
then decompressing it. However, this read will go past
EOF, because the write has not occurred yet. The OSD read
code does not fill in these pages, because read past EOF is
not returned to the client (client gets a short read and
does not actually use the pages).
In our case, however, we must use these pages (from 8 KiB
16 KiB). In the naive version without recompression, we
simply write out 0 - 16 KiB, so we must have zeroes in
those pages, and once we have recompression, we must
compress those pages so we need zeroes in that case too.
So we note if a page has data in it after decompression,
then if it does not, we clear the page. Note we do NOT set
lnb_rc to 0 when we clear a page, because lnb_rc = 0 is
used to indicate EOF rather than a gap in the file.
DDN-bug-id: EX-7601
Was-Change-Id: If1d1360185eb087e821167a08e49c9427e29ffc4
tgt: identify writes to round
If the beginning or end of a client write is unaligned, we
must round the locking. This patch identifies writes where
this is required, the next patch will do the locking.
DDN-bug-id: EX-7601
Was-Change-Id: Iec140c24423a0da478f6d42ff6fc620d7ad3ba4a
tgt: round write lock to chunk
For unaligned writes, we need to round the write locking to
cover the any leading or trailing chunks. We do this by
creating a local 'remote niobuf' to describe the rounded
range and doing the locking against that niobuf.
DDN-bug-id: EX-7601
Was-Change-Id: I2bdea620386ad229375647a0e2cc6180c9bd7aa6
tgt: add remote_pages for writes
When we round a write to get all of the compressed chunks,
the number of local and the number of remote pages will
differ. We need to make sure we do the checksum and data
transfer using the number of remote pages, not the number of
local pages.
This patch calculates the number of remote pages and uses it
accordingly.
Note that just like on the read side, this patch doesn't do
anything until we're actually rounding the chunks for IO in
a later patch.
DDN-bug-id: EX-7601
Was-Change-Id: I38256070d68246613ce67b0bfe328f6443a95533
csdc: fix ofd_preprw_write() for sanity 819b test
Sanity 819b asserts:
tgt_brw_write()) ASSERTION( npages_local == npages_remote )
The test triggers fault inject in ofd_preprw_write():
if (OBD_FAIL_CHECK(OBD_FAIL_OST_2BIG_NIOBUF))
rnb[i].rnb_len += PAGE_SIZE;
ofd_preprw_write() calculates npages_local taking in account
additional len from fault inject, BUT npages_remote is calulated
BEFORE the fault inject. So npages_remote was not adjusted.
To solve the problem it is enough to move range_to_page_count() call.
DDN-bug-id: EX-9523
Was-Change-Id: Ifd659985a78c7630049a17622aff2eb7f4525fb1
tgt: add tx lnb for writes
With compression, the lnbs used for the disk IO on the
server can contain more data than the client requested,
due to reading up whole chunks for decompression.
This means the client is only going to write data in to
a subset of the lnbs used for io to storage.
We handle this the same way we do for reads:
We create a second set of lnbs just for the transfer, and
point these lnbs at the pages which will actually receive
data from the client.
DDN-bug-id: EX-7601
Was-Change-Id: I5b668547537698309792daf309842866be79f0b6
ofd: switch preprw to chunk_bits
The compression/decompression code requires chunk_bits
rather than chunk size. Since we need to call this code
from ofd_preprw_write, we need chunk_bits there.
This modifies the functions so chunk_bits is available
there.
DDN-bug-id: EX-7601
Was-Change-Id: Id98e6d6364eeaaa7753a8aba059387e3e659d2a2
vvp: remove unaligned write restriction
This series will resolve the unaligned write issue for
compressed files, so we need to remove the restriction on
unaligned writes in order to test it.
This does not mean unaligned writes are working yet, but we
need to make this change so the subsequent patches can be
tested.
DDN-bug-id: EX-7601
Was-Change-Id: I4abcbdcd18b00718099483c8dfdb9a7aa41c3ce7
ofd: add chunk rounding to write
For compressed files, we need to round all niobufs to
chunk size in the write process, so we have buffers for
reading in and rewriting the complete chunks.
dt_bufs_get sets up the local niobuf for the write, so we
round before calling it.
Note this breaks writing to compressed files, which is not
fixed until a few patches later. For this reason, we
disable the compression tests. They will be reenabled
shortly - similar to how we handled the read series.
DDN-bug-id: EX-7601
Was-Change-Id: I413aaba9866dd7d6c4463fa620eadf1423379ba1
ofd: add read to write process
This adds a very simple read to the write process, which
just reads up the entire chunk-rounded write range.
This is a first step - the read will eventually be modified
to only read the unaligned portions which must be
decompressed for read-modify-write. We will create a
special lnb mapping which contains only the pages which must
be read for decompression (similar to the tx lnb mapping).
For now, this read allows us to test decompression without
handling the mapping.
DDN-bug-id: EX-7601
Was-Change-Id: I169ddc2e161094aebdad1a60ec62e9c1d75cd6d8
ofd: add decompress_read to ofd_preprw_write
We have read up the compressed data from disk, now we must
decompress it so we can rewrite it successfully.
This code still works on the whole lnbs rather than just on
the portion of it which is unaligned. This is temporary
and will be resolved by a future patch.
With this patch, we have basic read-modify-write support,
so we can re-enable testing. The next patch adds tests
for read-modify-write.
DDN-bug-id: EX-7601
Was-Change-Id: Ib6503c15e9fb3d425a7bc295bcc61b41c089a1f0
ofd: add read lnb to ofd_preprw_write
The read phase of read-modify-write for compressed files
needs to read only a subset of the pages which will be
written, so it needs a separate set of lnb pointers for
tracking this subset.
This patch passes around the necessary argument but does
not set up or use the lnb yet.
DDN-bug-id: EX-7601
Was-Change-Id: I7ec7101e65e73a6c9e67cea3c58d8cace38e70e0
ofd: distinguish nr_write and nr_read
We will have two counts of pages in lnbs, distinguish
between them.
Not actually used yet - will be calculated when the read
lnb mapping is created.
DDN-bug-id: EX-7601
Was-Change-Id: I709b8fd299163d348a196184152bb0294fcb650b
ofd: create read mapping for read-modify-write
When we need to do a read-modify-write for unaligned writes
to a compressed file, it's important we read only the
portion of the file which is receiving unaligned IO.
This patch identifies these chunks in preprw_write and
creates a read lnb mapping from a subset of the pages for
write. These pages we read up are then decompressed.
Note one issue this patch does not address is reading of
data past EOF. If the final chunk is unaligned, we will
round the write to cover it. This results in extending the
file inappropriately, writing zeroes where they aren't
needed. The read side gives us the info to address this,
which we will do in a future patch.
DDN-bug-id: EX-7601
Was-Change-Id: Iede43f12127cbb93e73c22a915192aa2f814a927
osd: add assert for prepare partial page
In the write prep code, we read up any partial pages (pages
which are not completely overwritten by the write) to
prepare them for write. But for compressed files, we will
have already done this to prepare for decompression.
Add an assert to make sure we catch if this is ever wrong.
DDN-bug-id: EX-7601
Was-Change-Id: I1366b1f5b191a4d581448d692933d562198c3a1f
ofd: minor debug improvements
A smattering of minor debug improvements across several
patches, placed at the end because they're all minor and
some of them would disturb early parts of the series.
DDN-bug-id: EX-7601
Was-Change-Id: I2071911eb09f5c7fad28203db05396bb31ccda59
ofd: set compressed file size for fake writes
When using the fake writes fail_loc, file size setting is
done at the ofd layer, since the osd layer isn't used. So
we must also handle the compressed file size for this case.
This fixes sanity test 399a with compression.
DDN-bug-id: EX-8826
Was-Change-Id: Icda612405908166d043e1e568d0d8bd9cd0c5156
tgt: objcount in RPC must be 1
Much of the BRW write code assumes objcount is one, but
there is some provision for multiple objects.
Since the code will break if we send it multiple objects,
add errors to make sure anyone changing it will notice.
This isn't strictly compression related, but compression
adds even more code which assumes this, so this protection
will be useful.
DDN-bug-id: EX-7601
Was-Change-Id: Idcbf33fd14d4b1bd179c9516bed07cca907008bc
ofd: multiple reads in same chunk
When doing DIO or if we get unusual cache behavior on the
client, multiple reads can hit the same chunk.
This only shows up in racing tests, but it's important to
handle. We do this by making sure we start searching the
lnbs for decompression at the start of the last chunk we
decompressed.
DDN-bug-id: EX-7601
Was-Change-Id: I81fbbba79b16066e6d4519c66030cc58e03d2de7
ofd: don't read for writes past eof
There's no data past EOF, so there's no need to do
read-modify-writes when the entire write is past the chunk
at EOF. So in that case, don't read up data and don't
attempt decompression.
There's no explicit test for this, but this shows up
immediately in the random-offset copy tests, because they
seek and write various sizes to offsets past current EOF.
We also need this functionality for reads, because in some
cases the client will do reads past EOF (this is unusual,
but can still happen sometimes). This is added in a
separate patch because it requires some code reorganization.
DDN-bug-id: EX-7601
Was-Change-Id: Ia2b598165d5645c5a44c3d58bea69c7e42f10e41
ofd: same-ify preprw_read and preprw_write
preprw_read and preprw_write have some sections which are
functionally the same but which have diverged slightly.
(These can't easily be shared between the functions.)
This is a short patch to make them more similar before
adding eof checking to reads.
DDN-bug-id: EX-7601
Was-Change-Id: I7bce912e99e61a4eec4060d6b49d4917894b44c4
ofd: put decompress_read in read prep
ofd_decompress_read is called from ofd_write_prep for
writes, but from tgt_brw_read for reads. This makes the
code a little harder to follow and makes it difficult to
check read side decompression against EOF.
Instead, we move the decompression call to ofd_preprw_read.
This makes no change to the real operations here, but makes
for better code (and more similar code between read and
write).
DDN-bug-id: EX-7601
Was-Change-Id: Ibefd0a48ad08e83725f2df64618db60ba61c5ce0
ofd: add past eof check for reads
The client does not normally generate reads past EOF, but
this can occur during some racing situations. We need to
check for that case and not attempt decompression, since
there's no data to decompress if we're reading past EOF.
This covers a failure which shows up occasionally in the
racing parts of the test suite, but it's challenging to
write an explicit test for this.
We also add handling for complete reads of the last chunk,
even if that chunk is partial, because we can send that to
the client for decompression.
This allows us to remove the slightly funky eof handling
in decompress_rnb, since we'll just not call that code in
this case now. Note we'll still call decompress_rnb, etc,
for writes if they start before EOF and finish after EOF
(and are unaligned). This is fine - this case should be
rare and if we hit it, we'll notice there's nothing to
decompress and proceed accordingly.
DDN-bug-id: EX-7601
Was-Change-Id: I50295f2803af611de5069d094c0a5d1b0a4a9c2d
ofd: add checks to io_lnb_to_tx_lnb
We should always be able to find the remote niobuf in the
local io range, if we can't, there's a bug. So assert on
this.
We should also never have page level overlapping remote IOs,
at least until we have unaligned DIO. (We can remove this
check when we combine the features.)
DDN-bug-id: EX-7601
Was-Change-Id: I325d4a37d25c116e42621964e90b225b71fd8f1f
tests: tests for read-modify-write
This patch adds tests for the read-modify-write case for
EX-7601. There's still some additional tests to be added
here, but this is a good start.
DDN-bug-id: EX-7601
Was-Change-Id: I5dd9e566b8274ece99283c8962e0d34225089cc0
tests: use alternative data source for rewriting
Using the same file as input has disadvantages. It is not
possible to understand that data was not rewritten at all.
Alternative data source should be used.
Let's shift source file data and use it as a source.
To check rewriting result the same operarion is performed
on the destination file copy stored outside the Lustre FS.
DDN-bug-id: EX-8598
Was-Change-Id: I6ef400520359bfe9156c3f47e757064863bdf4e0
tests: add multi-mount compression test
This adds a multi-mount correctness test for compression.
This races IO from two mountpoints at varying sizes to
stress test compression.
DDN-bug-id: EX-7601
Was-Change-Id: If49cbd6d171068faa802835146f273d835b39bc3
obd: add 'lvl' for best and fast
'best' and 'fast' compression types must also set a level,
because not all levels are supported by all algorithms.
Rather than trying to be clever, just use simple universally
supported values, except for lz4fast, where we special case
this, because otherwise '0' is the slowest setting (and
lz4fast is likely to remain our default fastest).
DDN-bug-id: EX-6269
Was-Change-Id: I7c29659d4f027af2e44285ae38e4c9d91e35509a
ofd: use niocount consistently
'niocount' refers to the number of remote niobufs, ie, the
number of separate IOs from the client. Except for a few
places, where it's used to refer to the number of pages in
the entire RPC. Eek.
Replace this usage with 'npages', making niocount usage
consistent.
DDN-bug-id: EX-8993
Was-Change-Id: I266087ad8dccadb54c054b0a11fb03dc9868a725
csdc: allow specify 'fast'/'best' compression type
Use lctl set_param osc.*.compress_type_{fast|best}=<type>:<level>
to specify the compression_type:level for LL_COMPR_TYPE_FAST/
LL_COMPR_TYPE_BEST.
lctl get_param osc.*.compress_type_{fast|best} will list these
values.
DDN-bug-id: EX-8311
Was-Change-Id: Ifeff7f25e30fc0884f0c770a3b6d0798937b3c35
lfs: not iterate compr_type_table using ARRAY_SIZE
patch modifies compr_type_table to contain NULL fields in the
array, so iterate over the array should not use ARRAY_SIZE, but skip
those elements with NULL compression type name.
DDN-bug-id: EX-8311
Was-Change-Id: I8e4988fd3a63c1cb66f75510d190c2ebc4f8f9be
ofd: handle 'missing object' reads
When the read code (eg, mdt_preprw_read) finds there is no
object, it will return a read with 0 pages, but not fail the
read. The assert for local and remote pages needs to
recognize this case.
DDN-bug-id: EX-8996
Was-Change-Id: Idc6ff70f71abc100f750a63eca73a754a56f6435
ofd: do not write 'hole' pages on compression
When doing unaligned read-modify-write to a compressed file,
we must round the IO lnb used for write in order to read up
the compressed data for modification.
In some cases, this creates a situation where there are
pages in the write lnb which have no data in them. It is
important not to write out these pages, because if we do,
this wastes space and can cause incorrect file size.
In most cases, the file size is covered by the client
sending the file size, but if the client does not compress
a particular write, it does not send the size and the server
does not use it. We could resolve this by having the client
always send size info and have the server always use it, but
it's better to make server writes 'hole' aware, since this
improves space usage. (And this will be required for the
server to do recompression on read-modify-write, otherwise
no space is gained.)
DDN-bug-id: EX-8993
Was-Change-Id: I66169e205fe4691ed03b2c9b3005ffc4ecd3213d
obdclass: disable T10PI guard from disk when decompressing
When server handles chunk unaligned read, we need to read
the chunk from disk and decompress the raw data.
This means we should not use the guard tags from the storage,
as they only match the raw data.
Disable the guard from disk and the T10PI checksum will be
recalculated later using decompressed data.
DDN-bug-id: EX-9108
Was-Change-Id: I49964e1412e9d02769797c64aab290b17851e26f
ofd: take local chunk-aligned lock
On OST side to prevent racing read-modify-write against same
compressed chunk from the same client.
DDN-bug-id: EX-9192
Was-Change-Id: Iffaf2d2856e276cb2f9becce2506154314217e3c
csdc: Do not print error if a chunk is not compressed
is_chunk_start() can decide that a chunk can not be decompressed in
two cases: 1) chunk has not been compressed 2) chunk is corrupted
The error message should be printed only in case 2)
DDN-bug-id: EX-9784
Was-Change-Id: I85f4850f989ba0fc8f00653f8f6b0f1b4837d625
osd: add @read param to dt_write_prep()
the purpose is to skip full page reading when OSD is aked for
pages to be written later. in CSDC we need all data as the
pages can be compressed and we may need to decompress them
first.
DDN-bug-id: EX-9858
Was-Change-Id: I2ea9888a1dab419275dbee97e9acc661101b5262
ofd: new structures and data for csdc in ofd
just structures and few helper function to manipulate
chunks and buffers.
DDN-bug-id: EX-9858
Was-Change-Id: I25931f8360a30689a027eaf05ad6c43b4f1746f9
ofd: chunk decompress function
ofd_decompress_chunk() is to literally decompress chunks.
it uses kernel's vmap infrastructure to create a virtual
linear buffer from the pages provided by OSD.
memcpy vs vm_map_ramp()+vm_unmap_ram() benchmark as it's
a replacement for memcpy, each operation repeats 1M times
in each thread, then cost in usec is calculated:
memcpy 32 pages 1 threads - 2404282998, 2404 usec/1
memcpy 32 pages 2 threads - 4830830436, 2415 usec/1
memcpy 32 pages 4 threads - 10098563354, 2524 usec/1
vmap 32 pages 1 threads - 1088538713, 1088 usec/1
vmap 32 pages 2 threads - 2207667980, 1103 usec/1
vmap 32 pages 4 threads - 4613110111, 1153 usec/1
memcpy 64 pages 1 threads - 5564630189, 5564 usec/1
memcpy 64 pages 2 threads - 15904163026, 7952 usec/1
memcpy 64 pages 4 threads - 30345722986, 7586 usec/1
vmap 64 pages 1 threads - 1587480151, 1587 usec/1
vmap 64 pages 2 threads - 3190874847, 1595 usec/1
vmap 64 pages 4 threads - 6887315343, 1721 usec/1
the benchmark was done in qemu (6 cores enabled).
DDN-bug-id: EX-9858
Was-Change-Id: Ia46406401d3c8d720065cc8000b6a52d1a437349
ofd: vm_map_ram prot argument
From kernel 5.8 commit d4efd79a81 "mm: remove the prot argument from
vm_map_ram" the vm_map_ram() function does not accept a prot argument
anymore.
DDN-bug-id: EX-9858
Was-Change-Id: Ib878ba6c6a214ebc0b0716392ce9b7e91bb74453
ofd: csdc read helpers
few functions to implement read path in ofd.
DDN-bug-id: EX-9895
Was-Change-Id: Idca3b095471dbbf177b4026853aa716414280757
ofd: csdc write helpers
few functions to implement write path in ofd.
DDN-bug-id: EX-9895
Was-Change-Id: I0f6802b0911bd358bdb69e0ddb5e8581878cb9dc
ofd: csdc truncate support
to truncate a compressed file correctly we may need to
convert a compressed chunk into a regular one first.
DDN-bug-id: EX-9895
Was-Change-Id: Ia8a3b12eda81874e209046eef1afd33e165561b0
ofd: ofd_object_punch_compr
Fix potential memory leak in ofd_object_punch_compr.
It might not release orig_lnb in case of error from
ofd_trans_create or ofd_map_niobuf_to_chunks.
DDN-bug-id: EX-11092
Was-Change-Id: I45bafdbbf06036add5b5fa9993cbac9e06c856e9
tests: couple new FAIL codes
and trivial way to break a compressed chunk on a disk.
DDN-bug-id: EX-9858
Was-Change-Id: I5516ab3d7add4eb5d76292cf15ac220db08a7150
csdc: expand filter_fid
Expand filter_fid to include compression information, for
compatibility reason, if the file is an uncompressed file, still
store the old filter_fid with no compression info in FID EA.
WasChange-Id: I388500c03604749d05849aeed3c9141974540e4a
lfsck: support compression in filter_fid
The OST object compression info has been stored in filter_fid
by EX-8038, the LFSCK also needs to handle the compression info
during processing the filter_fid.
DDN-bug-id: EX-6247
Was-Change-Id: Id050214ba0057776a05c194dc9222117c5d7fd8b
ofd: add info in overflow error message
Such a message should help to inverstigate which
client triggered the overflow.
DDN-bug-id: EX-9895
Was-Change-Id: I701d8c8fb2a37684ecb0cd5cd272321c715db864
ofd: reject incomplete compressed chunks
client can send a compressed tail, but this RPC can race with another
newer RPC containing bits (uncompressed) from the same compression
chunk as the first RPC. OST can't handle such a compressed partial
chunk properly (that would need to decompress into a temp buffer,
then merge back to disk buffers). but we can ask the client to resend
this RPC uncompressed.
DDN-bug-id: EX-10402
Was-Change-Id: I5e854be4300d50bc8368911782018fb6fa6d38fa
Test-Parameters: forjanitoronly
Signed-off-by: Patrick Farrell <pfarrell@whamcloud.com>
Signed-off-by: Artem Blagodarenko <ablagodarenko@ddn.com>
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Signed-off-by: Li Dongyang <dongyangli@ddn.com>
Signed-off-by: Alex Zhuravlev <bzzz@whamcloud.com>
Signed-off-by: Artem Blagodarenko <artem.blagodarenko@hpe.com>
Signed-off-by: Sebastien Buisson <sbuisson@ddn.com>
Signed-off-by: Sergey Cheremencev <scherementsev@ddn.com>
Signed-off-by: Hongchao Zhang <hongchao@whamcloud.com>
Signed-off-by: Marc Vef <mvef@whamcloud.com>
Change-Id: I7b95416530b5d0f1994900ee4ae1ceb392046e32
68693
master
J –B ✓T ✗2R -1/2−
LU-17364 mdc: ignore no-object in truncate path
reviewing Alex Zhuravlev · blocked on the owner: enforced tests failed
5 unresolved
S +38 −1
8d
LU-17364 mdc: ignore no-object in truncate path
reviewing Alex Zhuravlev · blocked on the owner: enforced tests failed
5 unresolved
S +38 −1
8d
blocked on the owner: enforced tests failed
awaiting review (CI not green yet)
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-2 | RHEL 9.7 / x86_64 | ran 11 tests. 1 tests failed: sanity-sec. | session |
| review-dne-selinux-ssk-part-2 | RHEL 8.10 / x86_64 | ran 7 tests. 1 tests failed: sanity-sec. | session |
build #134426 SUCCESS · tests all Maloo sessions
reviews:
Alexey Lyashkov -1
patchsets:
PS1 09-07
PS2 09-15
PS3 09-30
PS4 10-25
threads: 5 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Gerrit AI review for Lustre COMMIT_MSG:24 — (typo) "found in a unexpected start" should read "found in an unexpected state".
Gerrit AI review for Lustre
(typo) "found in a unexpected start" should read "found in an unexpected state".
reply Gerrit AI review for Lustre COMMIT_MSG:29 — (minor) This fixes an LBUG, so it should probably carry a Fixes: tag. The -ENODATA comes from mdc_attr_get(), which returns the LVB error st
Gerrit AI review for Lustre
(minor) This fixes an LBUG, so it should probably carry a Fixes: tag. The -ENODATA comes from mdc_attr_get(), which returns the LVB error stored in lvb_blocks, and from mdt_dom_lvb_alloc(), which seeds the DoM LVB with -ENODATA. Both were added together, along with mdc_io_setattr_start() returning that error, in:
Fixes: 4f35c341f22b ("LU-3285 mds: add IO locking to the MDC and MDT")
reply Gerrit AI review for Lustre sanity-dom.sh:197 — (minor) PID is saved but never used: the bare `wait` below ignores the truncate's exit status, so the test can only fail by crashing the nod
Gerrit AI review for Lustre
(minor) PID is saved but never used: the bare `wait` below ignores the truncate's exit status, so the test can only fail by crashing the node. With the fix, the truncate should succeed. Would `wait $PID || error "truncate failed"` be useful here? The test also relies on `sleep 0.3` for the truncate to reach the fail_loc before the rm. On a slow VM the rm can run first, and the test then passes without hitting the race.
reply Gerrit AI review for Lustre sanity-dom.sh:200 — (minor) The file is created as $tf (that is, $DIR/$tfile), but here it is removed as $MOUNT/$tfile. If DIR is not $MOUNT, `rm -f` silently s
Gerrit AI review for Lustre
(minor) The file is created as $tf (that is, $DIR/$tfile), but here it is removed as $MOUNT/$tfile. If DIR is not $MOUNT, `rm -f` silently succeeds without removing anything, the race never happens, and the test passes without testing anything. Should this be `rm -f $tf`?
reply Gerrit AI review for Lustre sanity-dom.sh:204 — (typo) "trancate" on the previous line should be "truncate". Also, the MDT puts -ENODATA (not ENOENT) into lvb_blocks, as mdt_dom_lvb_alloc(
Gerrit AI review for Lustre
(typo) "trancate" on the previous line should be "truncate". Also, the MDT puts -ENODATA (not ENOENT) into lvb_blocks, as mdt_dom_lvb_alloc() shows and as the commit message says. "brings ENOENT back to in lvb_blocks" reads a bit garbled.
owner Alex Zhuravlev · uploader Alex Zhuravlev · PS4 uploaded 10d ago · NEW · open in Gerrit ↗
commit message
LU-17364 mdc: ignore no-object in truncate path when DoM component is presented the following race is possible: 1) 1st process initiates a truncate by filename, refreshes layout and about to enqueue ldlm locks on data objects (incl. DoM component) 2) 2nd process does unlink which removes the file and given the file is not open - kills MDT object, then releases corresponding LDLM lock on MDT 3) 1st process enqueues LDLM lock on DoM component, but MDT can not find corresponding object and returns -ENODATA in LVB's lvb_blocks 4) cl_io_loop() needs to start IO on all involved components starting from DoM: mdc_io_setattr_start() fails due to missing attributes and expected osc_io_setattr_start() is not called. 5) a part of IO starting process is osc_cache_truncate_start() which is to prepare data extents, so the extents belonging to OSCs are ignored 6) in osc_io_setattr_end() those extents are found in a unexpected start which is the reason for LBUG: (osc_page.c:144:osc_page_delete()) Trying to teardown failed: -16 (osc_page.c:146:osc_page_delete()) ASSERTION( 0 ) failed: the fix is to ignore such an error in mdc_io_setattr_start() Test-Parameters: env=ONLY=9 testlist=sanity-dom Test-Parameters: env=ONLY=9 testlist=sanity-dom Test-Parameters: env=ONLY=9 testlist=sanity-dom Assisted-by: ClaudeCode:Opus-5 Signed-off-by: Alex Zhuravlev <bzzz@whamcloud.com> Change-Id: I942e9372c6175c6a3a00552b9858fba26ff063f3
64440
master
J !B ✓T ✗2R -1/2−
LU-19956 osc: fix race from direct ops_transfer_pinned clear
reviewing Patrick Farrell · blocked on the owner: needs rebase — checkpatch: cannot be cherry-picked; enforced tests failed
needs rebase
10 unresolved
M +82 −16
14d
LU-19956 osc: fix race from direct ops_transfer_pinned clear
reviewing Patrick Farrell · blocked on the owner: needs rebase — checkpatch: cannot be cherry-picked; enforced tests failed
needs rebase
10 unresolved
M +82 −16
14d
blocked on the owner: needs rebase — checkpatch: cannot be cherry-picked; enforced tests failed
awaiting review (CI not green yet)
janitor run: 1 failing config(s), none unique to this patch — janitor results
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-2 | RHEL 9.7 / x86_64 | ran 11 tests. 1 tests failed: sanity-lfsck. | session |
| review-dne-zfs-part-4 | RHEL 10.1 / x86_64 | ran 9 tests. 1 tests failed: sanity-hsm. | session |
build #130741 SUCCESS · tests all Maloo sessions
no vote yet: Jinshan Xiong, Shaun Tancheff, Andreas Dilger, Oleg Drokin
patchsets:
PS10 03-10
PS11 03-11
PS12 03-11
PS13 08-31 Zhenyu Xu
PS14 08-31 Andreas Dilger
+9 earlier
PS1 03-09 PS2 03-09 PS3 03-09 PS4 03-09 PS5 03-09 PS6 03-09 PS7 03-09 PS8 03-10 PS9 03-10threads: 10 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Gerrit AI review for Lustre COMMIT_MSG:35 — This paragraph describes formal_models/clio/TransferPin.tla, but the patch does not add that file and it does not exist anywhere in the tree
Gerrit AI review for Lustre
This paragraph describes formal_models/clio/TransferPin.tla, but the patch does not add that file and it does not exist anywhere in the tree:
$ find . -name '*.tla'
$ git log --oneline -- formal_models
Should the model be added here, or should the paragraph point at where it actually lives?
reply Gerrit AI review for Lustre COMMIT_MSG:38 — The body doesn't mention the lustre/tests/sanity.sh changes at all. Two things happen there that a reader would not expect from this message
Gerrit AI review for Lustre
The body doesn't mention the lustre/tests/sanity.sh changes at all. Two things happen there that a reader would not expect from this message: test_80 is renamed to test_80a, and a new test_80b is added. The new OBD_FAIL_OSC_COMPLETION_RACE (0x41b) fail_loc isn't described either. Renaming a long-lived subtest also breaks references to "sanity test_80" in older bug reports and results history. Would a fresh unused number for the new test avoid that?
reply Gerrit AI review for Lustre COMMIT_MSG:43 — This fixes a crash, so it should carry a Fixes: tag. The direct clear of ops_transfer_pinned paired with a separate cl_page_put() goes back
Gerrit AI review for Lustre
This fixes a crash, so it should carry a Fixes: tag. The direct clear of ops_transfer_pinned paired with a separate cl_page_put() goes back to the original CLIO landing:
Fixes: fbf5870b9848 ("land clio. b=14166")
If a more recent anchor is preferred, 364c4cdb58ed ("LU-1030 osc: move io data from lov_oinfo into osc_object") is the commit that moved the pattern from osc_page_completion_common() into what is now osc_completion().
reply Gerrit AI review for Lustre lustre_osc.h:556 — This isn't a bug, but the same prototype is added to lustre/osc/osc_internal.h line 31 as well, and osc_cache.c includes both headers. The o
Gerrit AI review for Lustre
This isn't a bug, but the same prototype is added to lustre/osc/osc_internal.h line 31 as well, and osc_cache.c includes both headers. The only new caller is osc_cache.c, inside the osc module, so the osc_internal.h declaration on its own would do - and then EXPORT_SYMBOL() in osc_page.c isn't needed either. No code outside osc references osc_page_transfer_put().
reply Gerrit AI review for Lustre osc_cache.c:1395 — Not introduced here, but this comment now reads badly next to a sleeping call. osc_completion() is not called under cl_loi_list_lock - osc_e
Gerrit AI review for Lustre
Not introduced here, but this comment now reads badly next to a sleeping call. osc_completion() is not called under cl_loi_list_lock - osc_extent_finish() calls osc_free_grant() after the loop, and that takes cl_loi_list_lock itself:
osc_free_grant() { ... spin_lock(&cli->cl_loi_list_lock); ... }
Since the function is being touched anyway, would it be worth correcting the comment so the new CFS_FAIL_TIMEOUT_MS() doesn't look like it sleeps under a spinlock?
reply Gerrit AI review for Lustre osc_cache.c:1455 — The injection sits between cl_page_get() and osc_page_transfer_put(), so what it widens is the interval where the page is still pinned and s
Gerrit AI review for Lustre
The injection sits between cl_page_get() and osc_page_transfer_put(), so what it widens is the interval where the page is still pinned and still CPS_PAGEOUT. That is exactly the interval this patch argues is safe. The window the commit message is worried about is transfer_put -> cl_page_complete, and nothing is injected there. Also, the fail_loc only exists in the fixed code, so the test can't fail before the fix and pass after it. Should the sleep go between osc_page_transfer_put() and cl_page_complete(), and should it be added on top of the old ordering to demonstrate the failure?
reply Gerrit AI review for Lustre sanity.sh:12982 — This description doesn't match the code being fixed. Before this patch osc_completion() did its own cl_page_put() for every non-transient pa
Gerrit AI review for Lustre
This description doesn't match the code being fixed. Before this patch osc_completion() did its own cl_page_put() for every non-transient page:
if (cptype != CPT_TRANSIENT)
cl_page_put(env, page);
so the pin's reference was always released and nothing was orphaned. osc_page_delete() skipping its cl_page_put() when the flag is already clear is the intended behaviour of osc_page_transfer_put(), not a leak.
The failure the commit message describes is ASSERTION(!opg->ops_transfer_pinned) in osc_page_transfer_get(), which is a different symptom from an LBUG in cl_batch_put(). Could the comment be reworded to match?
reply Gerrit AI review for Lustre sanity.sh:12995 — fail_loc is global and osc_completion() runs once per page, so this makes every OSC completion on the client sleep 100ms for 30 seconds. osc
Gerrit AI review for Lustre
fail_loc is global and osc_completion() runs once per page, so this makes every OSC completion on the client sleep 100ms for 30 seconds. osc_extent_finish() walks ext->oe_pages calling osc_completion() for each, and it runs in brw_interpret() on a ptlrpcd thread - a 1MiB RPC is 256 pages, so ~25s of uninterruptible sleep in one interpreter.
The cancellation loop this test drives goes through the same path:
osc_lock_flush() -> osc_cache_writeback_range() -> osc_extent_finish() -> osc_completion()
so a blocking AST that has to flush a megabyte of dirty pages now takes longer than ldlm_timeout, which risks evicting the client rather than reproducing the race. Would a much smaller fail_val, or a CFS_FAIL_ONCE variant, still widen the window enough?
reply Gerrit AI review for Lustre sanity.sh:13010 — The filesystem name is hard-coded. On any mount where FSNAME isn't "lustre" this glob matches nothing, lctl fails, and since errors are redi
Gerrit AI review for Lustre
The filesystem name is hard-coded. On any mount where FSNAME isn't "lustre" this glob matches nothing, lctl fails, and since errors are redirected the while loop exits on the first iteration - the lock-cancellation half of the test silently never runs. Combined with the fact that the test makes no assertion, that is a vacuous pass.
Other cases in this suite avoid it, e.g. test at line 18635 uses:
ldlm.namespaces.*-OST0000-osc-*.lru_size=clear
Using $FSNAME (or a leading wildcard) would fix it.
reply Gerrit AI review for Lustre sanity.sh:13018 — kill only reaps the two subshells; the dd or lctl child running at that moment survives, so writes can continue into the next subtest. Addin
Gerrit AI review for Lustre
kill only reaps the two subshells; the dd or lctl child running at that moment survives, so writes can continue into the next subtest. Adding the child pids, or a `wait` on the dd itself, would make this deterministic. test_80a removes $DIR/$tfile when it finishes - a stack_trap for the file here would keep the two consistent.
owner Patrick Farrell · uploader Andreas Dilger · PS14 uploaded 65d ago · NEW · open in Gerrit ↗
commit message
LU-19956 osc: fix race from direct ops_transfer_pinned clear The ops_transfer_pinned flag in osc_page is paired with a cl_page reference -- the flag and the ref must always be managed together through the osc_page_transfer_get/put() accessors. osc_completion() violated this by clearing the flag directly and dropping the ref with a separate cl_page_put(). This decoupled the flag from the ref, opening a race on weakly-ordered architectures. The initial fix (complete first, then transfer_put) introduced a re-submission crash: once cl_page_complete() transitions the page to CPS_CACHED, a concurrent write can re-submit it via osc_page_cache_add -> osc_page_transfer_get, which asserts the pin is clear. If the old completion has not yet called transfer_put, the assert fires. Fix osc_completion to release the transfer pin BEFORE cl_page_complete(). While still in CPS_PAGEOUT, the state machine prevents any other transition, so the transfer_put is race-free. Take a temporary cl_page ref first: transfer_put drops the pin's ref (cp_ref 2->1), and cl_page_complete's end_page_writeback can make the page reclaimable on another CPU. A TLA+ formal model (formal_models/clio/TransferPin.tla) with the NoPinWhileCached invariant verifies this fix catches the re-submission crash in all three buggy variants (original, LASSERT-in-delete, complete-first). Generated with Claude Code + Tools Test-Parameters: testlist=sanity env=ONLY=80b Signed-off-by: Patrick Farrell <pfarrell@whamcloud.com> Signed-off-by: Bobi Jam <bobijam@whamcloud.com> Signed-off-by: Andreas Dilger <adilger@thelustrecollective.com> Change-Id: Ib8416c753e13fe6eb8e11790b63687fbc2c8a26d
14288
master
J –B ✓T ✓R +0/2−
LU-6418 llite: Simplify code of ll_direct_rw_pages
reviewing Wu Libin · awaiting review (CI not green yet)
M +10 −46
28d
LU-6418 llite: Simplify code of ll_direct_rw_pages
reviewing Wu Libin · awaiting review (CI not green yet)
M +10 −46
28d
reviews:
Jinshan Xiong +1 · Timothy Day -1
owner Wu Libin · uploader Wu Libin · PS3 uploaded 4233d ago · NEW · open in Gerrit ↗
commit message
LU-6418 llite: Simplify code of ll_direct_rw_pages In function ll_direct_rw_pages, the cl_page_find will return a cl_page with cp_type with value of CPT_TRANSIENT for sure. And it will not cache this type of cl_page anymore. This patch remove the code of logical when cp_type is equal to CPT_CACHEABLE which is needed in old version. Signed-off-by: Wu Libin <lwu@ddn.com> Change-Id: I6634c31dca65a54ad6d0e092554c033403315077
57454
master
J !B ✓T ✗1R 0/2
LU-18461 layout: allow to be started from zero offset.
reviewing Alexey Lyashkov · blocked on the owner: enforced tests failed
70 unresolved
XL +1309 −65
30d
LU-18461 layout: allow to be started from zero offset.
reviewing Alexey Lyashkov · blocked on the owner: enforced tests failed
70 unresolved
XL +1309 −65
30d
blocked on the owner: 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-5 | RHEL 9.7 / x86_64 | ran 7 tests. 1 tests failed: lustre-rsync-test. | session |
build #132562 SUCCESS · tests all Maloo sessions
no vote yet: James Simmons, Alexander Boyko, Andreas Dilger, Mikhail Pershin
patchsets:
PS34 08-20
PS35 08-25
PS36 09-14
PS37 09-23
PS38 09-29
+33 earlier
PS1 12-16 PS2 12-17 PS3 12-27 PS4 01-10 PS5 02-18 PS6 02-19 PS7 02-21 PS8 02-27 PS9 02-28 PS10 03-18 PS11 05-23 PS12 08-22 PS13 09-09 PS14 09-22 PS15 10-15 PS16 10-17 PS17 10-22 PS18 11-03 PS19 12-18 PS20 12-18 PS21 12-25 PS22 01-13 PS23 01-27 PS24 02-20 PS25 02-28 PS26 03-02 PS27 03-02 PS28 04-24 PS29 04-27 PS30 05-19 PS31 05-21 PS32 05-26 PS33 06-02threads: 70 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Andreas Dilger COMMIT_MSG:10 — (typo) "Do object"?
Andreas Dilger
(typo) "Do object"?
reply Gerrit AI review for Lustre COMMIT_MSG:7 — (style) The subject has no grammatical subject - "allow to be started" leaves out what is being started. Something like "allow components to
Gerrit AI review for Lustre
(style) The subject has no grammatical subject - "allow to be started" leaves out what is being started. Something like "allow components to start at offset zero" reads better, and the trailing period is not usual for Lustre subjects. More importantly, neither the subject nor the body names anything that this patch actually adds: `LOV_PATTERN_ZEROSTART`, `LLAPI_LAYOUT_ZEROSTART`, the `zerostart` layout type, or `lfs setstripe --zerostart`. That makes the change hard to find later with `git log --grep`.
reply Gerrit AI review for Lustre COMMIT_MSG:10 — (typo) "Do object" - DoM?
Gerrit AI review for Lustre
(typo) "Do object" - DoM? This was raised on an earlier patchset and still reads the same way here.
reply Gerrit AI review for Lustre COMMIT_MSG:19 — Several hunks are not accounted for by the description; could they be explained, or split out?
Gerrit AI review for Lustre
Several hunks are not accounted for by the description; could they be explained, or split out? - osc_cache.c: the LASSERTF message gains `io %px`, which looks like debug instrumentation for this work rather than part of the feature. - lfs.c `case 'C'`: the guard changes from `lsa_pattern == LLAPI_LAYOUT_MDT` to `(lsa_pattern & LLAPI_LAYOUT_RAID0) == 0`, a behaviour change to `-C|--overstripe-count` validation. - lov_io.c `lov_io_layout_at()` and lov_offset.c `lov_stripe_offset()`: `return` converted to `RETURN()`. - lov_offset.c: blank line after the SPDX tag removed. - sanity-pfl.sh test_16b: two blank lines removed. - lov_cl_internal.h: `lov_foreach_io_layout()` split into two macros. It would also help to state the interop story here: `LOV_PATTERN_ZEROSTART` is a new on-disk/on-wire pattern bit, so a client older than this patch fails `lov_pattern_supported()` on such a layout and cannot open the file, and an older MDS rejects the setstripe. Is a version/feature gate expected, or is "both ends must be new" the intended contract?
reply Gerrit AI review for Lustre COMMIT_MSG:10 — (typo) "Do object" -> "DoM object". This was raised on patchset 30 and is still here.
Gerrit AI review for Lustre
(typo) "Do object" -> "DoM object". This was raised on patchset 30 and is still here.
reply Gerrit AI review for Lustre COMMIT_MSG:19 — The body describes the motivation well but never names anything the patch adds, so this won't be findable later with `git log --grep`. Could
Gerrit AI review for Lustre
The body describes the motivation well but never names anything the patch adds, so this won't be findable later with `git log --grep`. Could it mention `--zerostart`, `LOV_PATTERN_ZEROSTART`/`LLAPI_LAYOUT_ZEROSTART` and `lsme_is_zerostart()` explicitly? It also doesn't cover the largest kernel-side piece: the rework of `lov_io_iter_init()` that pulls the last stripe of the preceding component into a truncate so the KMS survives when a ZEROSTART component is truncated to its own start. That deserves a paragraph. A few hunks are not explained at all and read as leftovers - should they be split out, or described? - `lustre/osc/osc_cache.c`: the `osc_extent_find()` LASSERTF() gains the `io %px` argument; it looks like a debugging aid rather than part of the feature. - `lustre/utils/lfs.c`: the `-C|--overstripe-count` check changes from `== LLAPI_LAYOUT_MDT` to `& LLAPI_LAYOUT_RAID0` and the message text changes. That is a user-visible behaviour change and isn't needed for `--zerostart` to work. - `lustre/tests/sanity-dom.sh`: dropping the explicit `mkdir -p $MOUNT2` / `mount_client $MOUNT2` is unrelated to this feature (it is redundant with `MOUNT_2=yes` + `check_and_setup_lustre`, so it looks correct, just out of scope).
reply Gerrit AI review for Lustre COMMIT_MSG:10 — (typo) "Do object" was pointed out on patch set 30 and is still here. Should it be "DoM object"?
Gerrit AI review for Lustre
(typo) "Do object" was pointed out on patch set 30 and is still here. Should it be "DoM object"?
reply Gerrit AI review for Lustre COMMIT_MSG:13 — (style) The body explains the motivation but not what the patch actually changes, so it is hard to find later with git log. If the patch is
Gerrit AI review for Lustre
(style) The body explains the motivation but not what the patch actually changes, so it is hard to find later with git log. If the patch is refreshed, could it name: - the new `LOV_PATTERN_ZEROSTART` / `LLAPI_LAYOUT_ZEROSTART` pattern bit - the `lfs setstripe --zerostart` and `-L raid0,zerostart` options - the truncate change in lov_io_iter_init(), which pulls the last stripe of the preceding component into a truncate landing on a ZEROSTART component start - the new sanity-zero.sh suite Also, the subject should not end with a period.
reply Gerrit AI review for Lustre lfs-setstripe.1:189 — (minor) There is no `lfs join` command or `lfs-join.1` man page in the tree - the join-file feature was removed, as the commit message itsel
Gerrit AI review for Lustre
(minor) There is no `lfs join` command or `lfs-join.1` man page in the tree - the join-file feature was removed, as the commit message itself notes. This cross-reference will be a dangling link; could the sentence just describe the property directly?
reply Gerrit AI review for Lustre lfs-setstripe.1:219 — (typo) "below" - the `--zerostart` description is above this one in the page.
Gerrit AI review for Lustre
(typo) "below" - the `--zerostart` description is above this one in the page.
reply Gerrit AI review for Lustre lfs-setstripe.1:599 — (minor) EXAMPLES doesn't gain a `--zerostart` case. A short composite example, e.g. a DoM or plain first component followed by a zerostart o
Gerrit AI review for Lustre
(minor) EXAMPLES doesn't gain a `--zerostart` case. A short composite example, e.g. a DoM or plain first component followed by a zerostart one, would show how the option is meant to be combined - the option description alone leaves that to the reader.
reply Gerrit AI review for Lustre lfs-setstripe.1:217 — (typo) "see --zerostart below": the --zerostart option is described above this point in the page.
Gerrit AI review for Lustre
(typo) "see --zerostart below": the --zerostart option is described above this point in the page.
owner Alexey Lyashkov · uploader Alexey Lyashkov · PS38 uploaded 36d ago · NEW · open in Gerrit ↗
commit message
LU-18461 layout: allow to be started from zero offset. Traditional PFL objects have a hole at the start to accommodate the Do object if it needs to be migrated. This is not always necessary, however, as the hole can prevent the use of large files with a small number of OST objects in the ldiskfs backend. Introducing the ability to eliminate this hole at the beginning could provide an opportunity for OST objects to be moved across components and offsets, and allow for a greater number of OST objects to be stored in larger files. Additionally, multiple files could be combined into one, similar to the join file feature of the past, once components are able to be relocated. Test-Parameters: testlist=sanity-zero Signed-off-by: Alexey Lyashkov <alexey.lyashkov@hpe.com> Change-Id: I730c66c695a3ff718c78cb82dab878b4f720bf55
68371
master
J ✗1B ✗T –R -1/2−
LU-10026 osc: Add counters for compressed data
reviewing Marc Vef · blocked on the owner: janitor: test failures unique to this patch; build failure
1 unique failure
csdc
1 unresolved
L +544 −265
69d
LU-10026 osc: Add counters for compressed data
reviewing Marc Vef · blocked on the owner: janitor: test failures unique to this patch; build failure
1 unique failure
csdc
1 unresolved
L +544 −265
69d
blocked on the owner: janitor: test failures unique to this patch; build failure
awaiting review (CI not green yet)
janitor flagged test failures unique to this patch — full janitor results
| unique failing test | history |
|---|---|
| sanity-pfl@ldiskfs+DNE:test_100b | seen in 5 other reviews |
build #130346 FAILURE
no vote yet: Sebastien Buisson, Artem Blagodarenko, Vitaliy Kuznetsov
threads: 1 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Marc Vef patchset comment — [Marc Bot] upstream remarks for reference:
Marc Vef
[Marc Bot] upstream remarks for reference: - The removed dead decompression helpers (decompress_chunk_in_lnb / decompress_rnb) were deleted against their current (folio/accessor) form. - obt_compr_stats placed after the histogram member master added since. - The osc stats_compr file and the compress_type_fast/best entries live in the debugfs vars table; the stats_compr fops therefore use LDEBUGFS_SEQ_FOPS (LPROC_SEQ_FOPS produces struct proc_ops on kernels >= 5.6, which the CI -Werror build rejects for debugfs entries). The ofd counter-init sits next to the reworked kernel-doc of ofd_stats_counter_init(). - New tests' old-version gates converted to compression_supported; the counter-reset calls are unconditional (the parameters always exist on a server with this series).
tags: csdc
owner Marc Vef · uploader Marc Vef · PS1 uploaded 70d ago · NEW · open in Gerrit ↗
commit message
LU-10026 osc: Add counters for compressed data
This patch is the first of two patches that add counters
to track client/server-side data compression statistics.
This patch add new compr_stats file in osc.*.compr_stats.
From added counters:
1. Size of compressed/uncompressed chunks written/read by
client to compressed files, in chunk/bytes;
2. Compressed page counter;
ofd: Add counters for compressed data
This patch is the second of two patches that add counters
to track server-side data compression statistics.
From added counters:
1. Size of compressed/uncompressed chunks read by
client to compressed files, in chunk/bytes;
Example:
obdfilter.lustre-OST0000.stats_compr=
snapshot_time 1715876501.602669648 secs.nsecs
start_time 1715873670.819396144 secs.nsecs
elapsed_time 2830.783273504 secs.nsecs
compressed_objects 2 samples [reqs]
uncompressed_objects 1 samples [reqs]
compr_bytes_read 885 samples [bytes] 557 126974 52174403
compr_bytes_read_raw 893 samples [bytes] 16384 131104 115885042
incompr_bytes_read 8 samples [bytes] 16384 16384 131072
compr_chunks_read 885 samples [reqs]
incompr_chunks_read 8 samples [reqs]
DDN-bug-id: EX-7729
Was-Change-Id: I0998b1facaffd3e84b8d9429c5674d8d9ad60020
csdc: rename client-side stats
Some CSDC client-side stats can be confusing for the uninitiated:
- write_pages_compr is the number of pages from the 'raw' file that
could actually be compressed;
- write_pages_uncompr is the number of pages from the 'raw' file that
count not be compressed;
- write_chunks_compr is the number of chunks from the 'raw' file that
could actually be compressed;
- write_chunks_no_compr is the number of chunks from the 'raw' file
that count not be compressed;
- read_pages_compr is the number of pages from the 'raw' file that
were actually compressed;
- read_chunks_compr is the number of chunks from the 'raw' file that
were actually compressed;
So rename those parameters as follows:
write_pages_compr -> write_pages_compressible
write_pages_uncompr -> write_pages_incompressible
write_chunks_compr -> write_chunks_compressible
write_chunks_no_compr -> write_chunks_incompressible
read_pages_compr -> read_pages_compressed
read_chunks_compr -> read_chunks_compressed
And also change the corresponding field names in struct client_obd to
make them more explicit.
DDN-bug-id: EX-10914
Was-Change-Id: Ia876e0cde435095493e0b7457ce7f363ea86146d
test: sanity-compr.sh/test_1001 error
sanity-compr test_1001: operand expected (error token is "+ ")
Some compression stat counters could be 0 and not shows in the
stats_compr stats, so we need to assign 0 to the counter if
necessary.
DDN-bug-id: EX-10088
Was-Change-Id: I87948a61e591680d105a8a98a4cde4fba634e5fe
tests: fix check compr_chunk in test 1020
Skip test 1020 in sanity-compr, which depends on fixes
applied to the code that were not available in older
versions.
Temporarily add an additional tolerance of 1 unit when
checking the number of chunks in test 1020 in
sanity-compr.sh
DDN-bug-id: EX-10914
Was-Change-Id: Ia1c071d754217127decbf4d4397a58b512808843
Test-Parameters: forjanitoronly
DDN-bug-id: EX-7729
Signed-off-by: Vitaliy Kuznetsov <vkuznetsov@ddn.com>
Signed-off-by: Sebastien Buisson <sbuisson@ddn.com>
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Signed-off-by: Artem Blagodarenko <ablagodarenko@ddn.com>
Signed-off-by: Marc Vef <mvef@whamcloud.com>
Change-Id: I091153480e53309c641d39f271bef536296dc09e
68390
master
J !B ✗T –R 0/2
LU-10026 mmap: add mmap support for compression
reviewing Marc Vef · blocked on the owner: build failure
csdc
1 unresolved
L +446 −78
69d
LU-10026 mmap: add mmap support for compression
reviewing Marc Vef · blocked on the owner: build failure
csdc
1 unresolved
L +446 −78
69d
blocked on the owner: build failure
awaiting review (CI not green yet)
janitor run: 31 failing config(s), none unique to this patch — janitor results
build #130362 FAILURE
threads: 1 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Marc Vef patchset comment — [Marc Bot] upstream remarks for reference:
Marc Vef
[Marc Bot] upstream remarks for reference: - OBD_FAIL_LOV_SKIP_CHECK_COMPR renumbered to 0x143a: the original's 0x1436 collides with OBD_FAIL_LLITE_TRUNC_PAUSE on this branch, and the original's sanity.sh test actually set fail_loc=0x1429, which is OBD_FAIL_LLITE_FORCE_BIO_AS_DIO - both the define and the test now use 0x143a consistently. - The osd_lseek() compressed-object rejection was merged into the current form of the function (osd_get_filp_for_inode(), not osd_alloc_file_pseudo()); osd_xattr_get() prototype added to osd_internal.h. - mmap_copy_file added to the current THETESTS line in tests/Makefile.am. - test_1003 anchored before test_1004; its gate and the sanity.sh 460g gate converted to compression_supported.
tags: csdc
owner Marc Vef · uploader Marc Vef · PS1 uploaded 70d ago · NEW · open in Gerrit ↗
commit message
LU-10026 mmap: add mmap support for compression This removes the EOPNOTSUPP for compression with mmap and adds an mmap sanity test for compression. This patch removes all the restrictions for mmap, but we actually only have unaligned read support right now, so the test is deliberately simplified to only test reads. A more complicated version which also tests mmap writes comes later in the series, once read-modify-write is supported. The test tests mmap by copying data at several different block sizes with several different compression chunk sizes. tests: add mmap write test This improves the existing mmap test to test mmap writing as well as mmap reading. DDN-bug-id: EX-7601 Was-Change-Id: I81840c7bbbefbc5c3bae6b270c2d94297a254d19 csdc: server reject FIEMAP/SEEK_HOLE|DATA on compr obj Server return -EOPNOTSUPP if they get the FIEMAP and SEEK_HOLE/SEEK_DATA requests upon compressed file objects. DDN-bug-id: EX-8927 Was-Change-Id: I9f04fbb13a22cc83402d9989daab63a59367ff33 csdc: check ocd flag for fiemap/lseek Currently client will not sending fiemap/lseek request to OST if the file is a compressed one. This patch will check the OBD_CONNECT2_COMPRESS flags and send the request if OST supports compression as server would do the fiemap/lseek check instead. DDN-bug-id: EX-8927 Was-Change-Id: I478cbf161044165fa31d4caa2336e9949fc626fe Test-Parameters: forjanitoronly DDN-bug-id: EX-7644 Signed-off-by: Patrick Farrell <pfarrell@whamcloud.com> Signed-off-by: Bobi Jam <bobijam@whamcloud.com> Signed-off-by: Marc Vef <mvef@whamcloud.com> Change-Id: I4a37b106831a903d90e8a8871e9a93baac4e201e
68349
master
J ✗2B ✗T –R +0/2−
LU-10026 osc: limit compression chunks in RPC
reviewing Marc Vef · blocked on the owner: janitor: test failures unique to this patch; build failure
2 unique failures
csdc
2 unresolved
L +283 −22
70d
LU-10026 osc: limit compression chunks in RPC
reviewing Marc Vef · blocked on the owner: janitor: test failures unique to this patch; build failure
2 unique failures
csdc
2 unresolved
L +283 −22
70d
blocked on the owner: janitor: test failures unique to this patch; build failure
awaiting review (CI not green yet)
janitor flagged test failures unique to this patch — full janitor results
| unique failing test | history |
|---|---|
| runtests@ldiskfs+DNE:test_1 | seen in 10 other reviews |
| runtests-ssk@ldiskfs+SharedKey:test_1 | seen in 10 other reviews |
build #130327 FAILURE
reviews:
Alex Zhuravlev +1
no vote yet: Artem Blagodarenko
patchsets:
PS1 08-25
PS2 08-26
threads: 2 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Marc Vef patchset comment — [Marc Bot] upstream remarks for reference:
Marc Vef
[Marc Bot] upstream remarks for reference: Port notes: - try_to_add_extent_for_io()/get_write_extents() gained their env parameter on top of master's reworked extent-RPC code: the erd_max_compr_chunks member was added to the write_rpc_def()/read_rpc_def() initializer macros (which master introduced since), with the macros now taking the osc object. - Page indices in the chunk-counting loops use osc_index() - struct brw_page no longer has a bp_page member on master (folio-based). - The RPC-fragment limiting in the submit path is applied in osc_io_submit() only; master has since split direct-IO submission into osc_dio_submit(), which keeps its existing behaviour (DIO on compressed files is restricted to chunk-aligned IO anyway). - cp_compr_chunk_log_bits -> cp_compr_chunk_lum_bits (series field naming). - Fixed a short memcpy in the chunk-ledger growth helper (expand_osc_compr_chunk_array copied the element count as bytes, losing 3/4 of the saved entries on expansion). - The new sanity-compr test_1016 gained a compression_supported skip guard (it had none).
reply Misc Code Checks Robot (Gatekeeper helper) osc_io.c:138 — error: osc_io_submit():'osc' dereferencing possible ERR_PTR()
Misc Code Checks Robot (Gatekeeper helper)
error: osc_io_submit():'osc' dereferencing possible ERR_PTR()
tags: csdc
owner Marc Vef · uploader Marc Vef · PS2 uploaded 70d ago · NEW · open in Gerrit ↗
commit message
LU-10026 osc: limit compression chunks in RPC
Limit the number of partial compressed chunks that can be sent to
the server in a single RPC, so that it doesn't need to allocate
buffers for read-modify-write on a huge number of chunks at once.
It is better to handle that in separate server threads.
In the worst case, each extent in the BRW RPC belongs to a different
compression chunk, so the worst_case_chunks would expand on the OSS
to worst_case_chunks * compression_chunk_size bytes IO on the server.
That might be hundreds of MB in size per thread and LASSERT or OOM.
Add tunable osc.*.compress_rpc_fragment_ratio to reduce the maximum
compressed chunks by the given factor, its value ranges in [1, 32].
osc: scan extents to find compression chunks
as we can't trust oe_start and oe_end, we have to scan all the
pages covered by extent and so find all compression chunks to
estimate and limit potential read-modify-write IO on OST.
osc_submit_io() should not create too big extents we can't send
due to limits for compressed chunks.
DDN-bug-id: EX-10141
Was-Change-Id: I00b104ded6cdb8e66414eb2f759f6dca1b7b4d11
osc: make oti_compr_chunks ledger expandable
This patch makes osc_thread_info::oti_compr_chunks an expandable
array.
DDN-bug-id: EX-10361
Was-Change-Id: Ib2ad5407815c733687eadd4a46014d0a694dbf41
osc: expand_osc_compr_chunks_array() use atomic alloc
This can be called in "spinlock" context and generate a stack dump:
BUG: sleeping function called from invalid context
in_atomic(): 1, irqs_disabled(): 0, name: ptlrpcd_00_02
Call Trace:
___might_sleep.cold.23+0x104/0x118
kmem_cache_alloc_trace+0x1cd/0x2a0
expand_osc_compr_chunk_array+0xc6/0x5d0 [osc]
try_to_add_extent_for_io.isra.10+0x11f6/0x16b0 [osc]
osc_io_unplug0+0x6a4/0x1b50 [osc]
brw_queue_work+0x29/0xb0 [osc]
work_interpreter+0x2b/0x100 [ptlrpc]
ptlrpc_check_set+0x583/0x2fe0 [ptlrpc]
ptlrpcd_check+0x511/0x570 [ptlrpc]
ptlrpcd+0x1b5/0x4b0 [ptlrpc]
DDN-bug-id: EX-10361
Was-Change-Id: I72f30b5185be0417c1bb7170ac278f48b04e7d0b
osc: revert to correct cl_max_extent_pages
otherwise grant overhead calculation breaks.
DDN-bug-id: EX-10267
Was-Change-Id: I4e74524b17c7834c432a708bb917f291fd773023
Test-Parameters: forjanitoronly
DDN-bug-id: EX-10047
Signed-off-by: Alex Zhuravlev <bzzz@whamcloud.com>
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Signed-off-by: Artem Blagodarenko <ablagodarenko@ddn.com>
Signed-off-by: Marc Vef <mvef@whamcloud.com>
Change-Id: I4d0b4bdaaa91f46147d2ca1c52741117533f8f7a
62675
master
J !B ✓T ✗2R +0/2−
LU-19569 ofd: print more logs for -ENOSPC
reviewing Hongchao Zhang · blocked on the owner: needs rebase — checkpatch: cannot be cherry-picked; enforced tests failed
needs rebase
S +19 −5
74d
LU-19569 ofd: print more logs for -ENOSPC
reviewing Hongchao Zhang · blocked on the owner: needs rebase — checkpatch: cannot be cherry-picked; enforced tests failed
needs rebase
S +19 −5
74d
blocked on the owner: needs rebase — checkpatch: cannot be cherry-picked; enforced tests failed
awaiting review (CI not green yet)
janitor run: 5 failing config(s), none unique to this patch — janitor results
| failed enforced test | platform | detail | |
|---|---|---|---|
| custom-1001 | RHEL 8.10 / x86_64, Rocky 9.5 / aarch64 | ran 1 tests. 1 tests failed: node-provisioning. %% NODE-PROVISIONING FAILED MULTIPLE TIMES FOR custom %% http | session |
| review-ldiskfs-dne | RHEL 8.10 / x86_64 | ran 5 tests. 1 tests failed: sanity. | session |
build #120861 SUCCESS · tests all Maloo sessions
reviews:
Andreas Dilger +1
no vote yet: Qian Yingjin, Jian Yu
patchsets:
PS10 12-18
PS11 12-19
PS12 12-26
PS13 01-22 Andreas Dilger
PS14 01-22 Andreas Dilger
+9 earlier
PS1 11-24 PS2 11-24 PS3 11-25 PS4 11-26 PS5 11-28 PS6 12-01 PS7 12-05 PS8 12-09 PS9 12-16owner Hongchao Zhang · uploader Andreas Dilger · PS14 uploaded 287d ago · NEW · open in Gerrit ↗
commit message
LU-19569 ofd: print more logs for -ENOSPC Print more logs for test_45 in sanity-lfsck to error -ENOSPC Test-Parameters: trivial clientdistro=rocky9.5 clientarch=aarch64 serverarch=x86_64 serverdistro=el8.10 testlist=sanity-lfsck,sanity-lfsck,sanity-lfsck,sanity-lfsck,sanity-lfsck env=DEBUG_SIZE=100 Signed-off-by: Hongchao Zhang <hongchao@whamcloud.com> Change-Id: Iacab1d1c4ff5a0ce78b9751c3ca3caf4c1c76911
66111
master
J ✗45B ✓T ✗0R 0/2
DRAFT LU-20244 utils: add support to resync a region
reviewing Ronnie Sahlberg · blocked on the owner: janitor: test failures unique to this patch; enforced tests failed
45 unique failures
ec2
pt_ecro
M +84 −36
78d
DRAFT LU-20244 utils: add support to resync a region
reviewing Ronnie Sahlberg · blocked on the owner: janitor: test failures unique to this patch; enforced tests failed
45 unique failures
ec2
pt_ecro
M +84 −36
78d
blocked on the owner: janitor: test failures unique to this patch; enforced tests failed
awaiting review (CI not green yet)
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
patchsets:
PS1 05-25
PS2 05-25
PS3 05-25
PS4 08-18
tags: pt_ecro
owner Ronnie Sahlberg · uploader Ronnie Sahlberg · PS4 uploaded 78d 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.
reviewing Ronnie Sahlberg · blocked on the owner: janitor: test failures unique to this patch; enforced tests failed
45 unique failures
ec2
pt_ecro
3 unresolved
S +30 −4
78d
DRAFT LU-20244 utils: resync/verify stale mirrors in 1GB chunks.
reviewing Ronnie Sahlberg · blocked on the owner: janitor: test failures unique to this patch; enforced tests failed
45 unique failures
ec2
pt_ecro
3 unresolved
S +30 −4
78d
blocked on the owner: janitor: test failures unique to this patch; enforced tests failed
awaiting review (CI not green yet)
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
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 78d 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
reviewing Ronnie Sahlberg · blocked on the owner: janitor: test failures unique to this patch; enforced tests failed
45 unique failures
ec2
pt_ecro
M +148 −0
78d
DRAFT LU-20244 tests: add tests for resync of FLR + EC
reviewing Ronnie Sahlberg · blocked on the owner: janitor: test failures unique to this patch; enforced tests failed
45 unique failures
ec2
pt_ecro
M +148 −0
78d
blocked on the owner: janitor: test failures unique to this patch; enforced tests failed
awaiting review (CI not green yet)
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
patchsets:
PS1 05-25
PS2 05-25
PS3 05-25
PS4 08-18
tags: pt_ecro
owner Ronnie Sahlberg · uploader Ronnie Sahlberg · PS4 uploaded 78d 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
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 217d
1 unresolved
L +442 −423
217d
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 217d
1 unresolved
L +442 −423
217d
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: Ronnie Sahlberg, Qian Yingjin, Alexey Lyashkov, Andreas Dilger, 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 327d 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>
32066
master
J –B ✓T ✓R -2/2−
LU-10927 osc: do not spend too much time in osc_lru_reclaim
reviewing Li Xi · blocked on the owner: needs rebase — checkpatch: cannot be cherry-picked
needs rebase
stalled 219d
XS +3 −4
219d
LU-10927 osc: do not spend too much time in osc_lru_reclaim
reviewing Li Xi · blocked on the owner: needs rebase — checkpatch: cannot be cherry-picked
needs rebase
stalled 219d
XS +3 −4
219d
blocked on the owner: needs rebase — checkpatch: cannot be cherry-picked
awaiting review (CI not green yet)
reviews:
Jinshan Xiong -1
no vote yet: Rahul Deshmukh
owner Li Xi · uploader Li Xi · PS1 uploaded 3122d ago · NEW · open in Gerrit ↗
commit message
LU-10927 osc: do not spend too much time in osc_lru_reclaim When a IO calls osc_lru_reclaim(), it needs the LRU slots immediately. So if the thread is asking for less than max_pages_per_rpc slots, do not waste time to shrink max_pages_per_rpc slots. The overhead will become much more significant when memory gets bigger. Signed-off-by: Li Xi <lixi@ddn.com> Change-Id: Ia9a5f7756f931db8bcb0a23d14914712fa804004
57426
master
J !B ✓T ✗3R -1/2−
LU-18553 llite: ensure layout refresh on fast read
reviewing Patrick Farrell · blocked on the owner: needs rebase — checkpatch: cannot be cherry-picked; enforced tests failed
needs rebase
stalled 240d
1 unresolved
M +47 −15
240d
LU-18553 llite: ensure layout refresh on fast read
reviewing Patrick Farrell · blocked on the owner: needs rebase — checkpatch: cannot be cherry-picked; enforced tests failed
needs rebase
stalled 240d
1 unresolved
M +47 −15
240d
blocked on the owner: needs rebase — checkpatch: cannot be cherry-picked; enforced tests failed
awaiting review (CI not green yet)
janitor run: 2 failing config(s), none unique to this patch — janitor results
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-zfs-part-1 | RHEL 8.10 / x86_64 | ran 4 tests. 1 tests failed: sanity. | session |
| review-ldiskfs | RHEL 8.10 / x86_64, RHEL 9.3 / x86_64 | ran 5 tests. 1 tests failed: sanity. | session |
| review-ldiskfs-ubuntu | RHEL 8.10 / x86_64, Ubuntu 22.04 / x86_64 | ran 6 tests. 1 tests failed: sanity-sec. | session |
2 optional test failure(s) — informational
build #109666 SUCCESS · tests all Maloo sessions
no vote yet: Qian Yingjin, Shaun Tancheff, Andreas Dilger, Alex Zhuravlev
patchsets:
PS1 12-13
PS2 12-13
PS3 12-13
threads: 1 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Patrick Farrell rw.c:2019 — And look, we can finally get rid of this terrifying (and correct!) TODO ....... eek
Patrick Farrell
And look, we can finally get rid of this terrifying (and correct!) TODO ....... eek
owner Patrick Farrell · uploader Patrick Farrell · PS3 uploaded 691d ago · NEW · open in Gerrit ↗
commit message
LU-18553 llite: ensure layout refresh on fast read It is essential to refresh the layout before doing a fast read, otherwise we could read stale data if the layout has changed and, eg, the mirror our data is from is now stale. Today, we do this refresh incidentally in file_read_confine_iter->cl_io_init->vvp_io_init, but this is obviously fragile to future changes, since it's not directly associated with the fast read path. Add dedicated code in the fast read path to refresh the layout. Also opportunistically rename a few functions to make clear they are Lustre functions and not kernel functions. Signed-off-by: Patrick Farrell <pfarrell@whamcloud.com> Change-Id: Ifbd827b79847309fe8d798963774ccd6650ad22f
61816
b2_15
J !B ✓T ✗2R -1/1−
LU-19223 osc: stop after scanning
reviewing Etienne AUJAMES · blocked on the owner: enforced tests failed
stalled 268d
M +100 −21
268d
LU-19223 osc: stop after scanning
reviewing Etienne AUJAMES · blocked on the owner: enforced tests failed
stalled 268d
M +100 −21
268d
blocked on the owner: 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-zfs-part-1 | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity. | session |
| review-dne-zfs-part-2 failed 2× | RHEL 8.10 / x86_64 | ran 11 tests. 1 tests failed: pjdfstest. | session |
1 optional test failure(s) — informational
build #117419 SUCCESS · tests all Maloo sessions
reviews:
Andreas Dilger -1
no vote yet: Shaun Tancheff, Patrick Farrell
patchsets:
PS1 10-14
PS2 10-14
owner Etienne AUJAMES · uploader Etienne AUJAMES · PS2 uploaded 386d ago · NEW · backport · open in Gerrit ↗
commit message
LU-19223 osc: stop after scanning Currently, the Lustre shrinker tries to scan until it has freed the number of pages requested for scanning. If no pages can be freed, this can take an extremely long time, manifesting as an almost hung system. Also set nr_scanned so the kernel can understand what we've done. Lustre-change: https://review.whamcloud.com/60489 Lustre-commit: 109e32dc23c53baf0d5b8e11d34a9f5f2fce70aa Signed-off-by: Patrick Farrell <pfarrell@whamcloud.com> Change-Id: Ic3ed85d27a785c2f722b6529b79beb3757e15549 Reviewed-by: Zhenyu Xu <bobijam@whamcloud.com> Reviewed-by: Shaun Tancheff <shaun.tancheff@hpe.com> Signed-off-by: Etienne AUJAMES <eaujames@ddn.com>
21652
master
J –B ✓T ✓R -1/2−
LU-8464 llite: Lustre I/O hung waiting for page
reviewing Andriy Skulysh · awaiting review (CI not green yet)
stalled 457d
M +118 −63
457d
LU-8464 llite: Lustre I/O hung waiting for page
reviewing Andriy Skulysh · awaiting review (CI not green yet)
stalled 457d
M +118 −63
457d
reviews:
Jinshan Xiong -1
no vote yet: Patrick Farrell, Andriy Skulysh, Ann Koehler, Oleg Drokin
owner Andriy Skulysh · uploader Andriy Skulysh · PS4 uploaded 3725d ago · NEW · open in Gerrit ↗
commit message
LU-8464 llite: Lustre I/O hung waiting for page
A deadlock during lock_page()
Thread 1:
sleep_on_page
__wait_on_bit_lock
<<< lock 2nd page
__lock_page
vvp_page_make_ready
cl_page_make_ready
osc_extent_make_ready
osc_io_unplug0
Thread 2:
__wait_on_bit
wait_on_page_bit
shrink_inactive_list
shrink_list
shrink_zone
do_try_to_free_pages
try_to_free_mem_cgroup_pages
mem_cgroup_hierarchical_reclaim
__mem_cgroup_try_charge
mem_cgroup_prepare_migration
<<< lock 2nd page
migrate_pages
compact_zone
__compact_pgdat
compact_node
sysfs_compact_node
Thread 2 tries to migrate 2nd page from extent
and waits for 1st to complete writeback.
But these 2 pages are going to fit in one RPC.
Lock all extent pages and modify them after.
Change-Id: Iec92bb5961561386ca8cc2b141d829bc5b367cd1
Seagate-bug-id: MRP-3434
Signed-off-by: Andriy Skulysh <andriy.skulysh@seagate.com>
27992
master
J –B ✓T ✗0R +1/2
LU-9762 lov: Remove lsm lock
reviewing Patrick Farrell · blocked on the owner: enforced tests failed
stalled 457d
S +0 −32
457d
LU-9762 lov: Remove lsm lock
reviewing Patrick Farrell · blocked on the owner: enforced tests failed
stalled 457d
S +0 −32
457d
blocked on the owner: enforced tests failed
awaiting review (CI not green yet)
reviews:
Ben Evans +1
no vote yet: Andreas Dilger
owner Patrick Farrell · uploader Patrick Farrell · PS2 uploaded 3182d ago · NEW · open in Gerrit ↗
commit message
LU-9762 lov: Remove lsm lock The lsm lock was formerly used to protect lov_stripe_md. That use has been replaced by the coh_attr_guard lock. Remove the lock. This reduces overhead in getattr slightly. Signed-off-by: Patrick Farrell <paf@cray.com> Change-Id: I6056eea10ba5dea79517391ecfc00ba02b66cd0d
28139
master
J –B ✓T ✓R 0/2
LU-9787 quota: acquire id lock when overquota
reviewing Niu Yawei · awaiting review (CI not green yet)
stalled 457d
1 unresolved
S +26 −11
457d
LU-9787 quota: acquire id lock when overquota
reviewing Niu Yawei · awaiting review (CI not green yet)
stalled 457d
1 unresolved
S +26 −11
457d
no vote yet: Sergey Cheremencev, Hongchao Zhang
threads: 1 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Sergey Cheremencev osd_io.c:1180 — In a new code there is a check above right after for (i = 0; i < npages; i++) cycle:
Sergey Cheremencev
In a new code there is a check above right after for (i = 0; i < npages; i++) cycle:
/*
* overwrite case, no need to modify tree and
* allocate blocks.
*/
if (!extent_end)
goto out_declare;
At least this change is not needed anymore.
owner Niu Yawei · uploader Niu Yawei · PS1 uploaded 3395d ago · NEW · open in Gerrit ↗
commit message
LU-9787 quota: acquire id lock when overquota When overquota flag is set on client, we'd acquire id lock to trigger pre-acquire even if usage is equal to granted, otherwise, client will keep sync write forever if all writes from client are re-writes. (re-writes doesn't need to allocate space, so it won't trigger quota acquire usually) Minor fix in osd_declare_write_commit() for ldiskfs: when all pages are mapped, no need to add extra meta blocks for quota space. Signed-off-by: Niu Yawei <yawei.niu@intel.com> Change-Id: I9f3d84471bc04d29f5b7c56762bc6021f89cae24
30848
master
J ✗1B ✓T ✗1R -1/2−
LU-10407 osc: update size before queue page
reviewing Hongchao Zhang · blocked on the owner: janitor: test failures unique to this patch; enforced tests failed
1 unique failure
stalled 457d
XS +3 −3
457d
LU-10407 osc: update size before queue page
reviewing Hongchao Zhang · blocked on the owner: janitor: test failures unique to this patch; enforced tests failed
1 unique failure
stalled 457d
XS +3 −3
457d
blocked on the owner: janitor: test failures unique to this patch; enforced tests failed
awaiting review (CI not green yet)
janitor flagged test failures unique to this patch
| unique failing test | history |
|---|---|
| sanity-dom@ldiskfs+DNE:test_155b | 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-selinux | CentOS 7.8/x86_64 | ran 5 tests. 1 tests failed: recovery-small. | session |
1 optional test failure(s) — informational
build #78701 SUCCESS
reviews:
Jinshan Xiong -1
no vote yet: Jinshan Xiong, Alexey Lyashkov
owner Hongchao Zhang · uploader Oleg Drokin · PS2 uploaded 2120d ago · NEW · open in Gerrit ↗
commit message
LU-10407 osc: update size before queue page In osc_io_commit_async, the inode's size should be updated before the corresponding page is queued to some osc_extent. Change-Id: I57e0e3acb20518148dceec9de0a305335ecf30ce Signed-off-by: Hongchao Zhang <hongchao.zhang@intel.com>
33137
master
J –B ✓T ✗0R -1/2−
LU-10686 tests: correct layout in sanity-pfl 9
reviewing Patrick Farrell · blocked on the owner: enforced tests failed
stalled 457d
XS +1 −6
457d
LU-10686 tests: correct layout in sanity-pfl 9
reviewing Patrick Farrell · blocked on the owner: enforced tests failed
stalled 457d
XS +1 −6
457d
blocked on the owner: enforced tests failed
awaiting review (CI not green yet)
build #614 SUCCESS
reviews:
James Nunez -1
owner Patrick Farrell · uploader James Nunez · PS2 uploaded 2975d ago · NEW · open in Gerrit ↗
commit message
LU-10686 tests: correct layout in sanity-pfl 9 The layout used in sanity-pfl test 9 is too short, which means that the write intended to instantiate a component fails. Make the layout longer and do not except this test. Test-Parameters: trivial mdscount=1 mdtcount=1 testlist=sanity-pfl Test-Parameters: testgroup=review-dne-part-4 Change-Id: I655e3cd06bcb23fe8e4c1e6bf152cd88bd3786ee Signed-off-by: Patrick Farrell <paf@cray.com>
33862
master
J ✗1B ✓T ✓R +2/2
LU-11775 osc: check imp_invalid without imp_lock
reviewing Li Dongyang · blocked on the owner: Verified -1 by Oleg Drokin
Verified -1
stalled 457d
XS +0 −2
457d
LU-11775 osc: check imp_invalid without imp_lock
reviewing Li Dongyang · blocked on the owner: Verified -1 by Oleg Drokin
Verified -1
stalled 457d
XS +0 −2
457d
blocked on the owner: Verified -1 by Oleg Drokin
awaiting review (CI not green yet)
janitor flagged test failures unique to this patch — superseded (tests have since passed)
| unique failing test | history |
|---|---|
| conf-sanity-slow@zfs:test_69 | NEW unique failure for this branch in the last 30 days, but was seen 0 times across 0 other branches 0 reviews |
build #5675 SUCCESS
reviews:
Patrick Farrell +1 · Alexander Boyko +1
no vote yet: James Simmons, Andreas Dilger, Alex Zhuravlev, Oleg Drokin
owner Li Dongyang · uploader Alexander Boyko · PS3 uploaded 2710d ago · NEW · open in Gerrit ↗
commit message
LU-11775 osc: check imp_invalid without imp_lock We don't need to hold imp_lock while checking the imp_invalid flag. This avoids the contention on imp_lock in osc_io_ter_init(). Signed-off-by: Li Dongyang <dongyangli@ddn.com> Change-Id: Ic825ad09f6c8020058d0fa9a417281c1258156ce
36517
master
J !B ✓T –R 0/2
LU-12916 clio: force lockless io for all writes
reviewing Oleg Drokin · awaiting review (CI not green yet)
stalled 457d
M +67 −30
457d
LU-12916 clio: force lockless io for all writes
reviewing Oleg Drokin · awaiting review (CI not green yet)
stalled 457d
M +67 −30
457d
build #15619 SUCCESS
no vote yet: Qian Yingjin, Shuichi Ihara, Andreas Dilger, Alex Zhuravlev, Shilong Wang
owner Oleg Drokin · uploader Oleg Drokin · PS8 uploaded 2306d ago · NEW · open in Gerrit ↗
commit message
LU-12916 clio: force lockless io for all writes Only for write operations. Test-Parameters: fortestonly Change-Id: I06975c9a22f0c5f95a553dd63d8235f9162e1639 Signed-off-by: Oleg Drokin <green@whamcloud.com>
38577
master
J ✗1B ✓T ✗1R +0/2−
LU-13435 utils: Add max value to --mirror-id
reviewing Dominique Martinet · blocked on the owner: janitor: test failures unique to this patch; enforced tests failed
1 unique failure
stalled 457d
S +7 −3
457d
LU-13435 utils: Add max value to --mirror-id
reviewing Dominique Martinet · blocked on the owner: janitor: test failures unique to this patch; enforced tests failed
1 unique failure
stalled 457d
S +7 −3
457d
blocked on the owner: janitor: test failures unique to this patch; enforced tests failed
awaiting review (CI not green yet)
janitor flagged test failures unique to this patch
| unique failing test | history |
|---|---|
| sanity-quota@zfs:test_18 | 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-part-3 failed 3× | CentOS 7.0/x86_64 | ran 3 tests. 1 tests failed: conf-sanity. | session |
build #15035 SUCCESS
reviews:
Andreas Dilger -1 · Quentin Bouget +1
no vote yet: Kevin Baillergeau, Jian Yu
owner Dominique Martinet · uploader Kevin Baillergeau · PS8 uploaded 2333d ago · NEW · open in Gerrit ↗
commit message
LU-13435 utils: Add max value to --mirror-id Add max value for mirror_id : MIRROR_ID_MAX, which is 0x7FFF as the mirror-id is stored in __u16 Add a test to check if --mirror-id argument is higher than its max value MIRROR_ID_MAX Signed-off-by: Kévin Baillergeau <kevin.baillergeau.ocre@cea.fr> Change-Id: Icefbb8fb577fe8f4a3118c8a469e378a8410c8eb
40937
master
J ✓B ✓T ✗2R -1/2−
LU-13638 ptlrpc: addition change for callback discard
reviewing Yang Sheng · blocked on the owner: enforced tests failed
stalled 457d
S +15 −9
457d
LU-13638 ptlrpc: addition change for callback discard
reviewing Yang Sheng · blocked on the owner: enforced tests failed
stalled 457d
S +15 −9
457d
blocked on the owner: enforced tests failed
awaiting review (CI not green yet)
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-4 | CentOS 8.3/x86_64 | ran 10 tests. 2 tests failed: sanity-quota, replay-single. | session |
| review-dne-selinux-ssk | CentOS 8.3/x86_64 | ran 6 tests. 1 tests failed: sanity. | session |
build #19571 SUCCESS
reviews:
Alexey Lyashkov -1
no vote yet: Qian Yingjin, Shuichi Ihara, James Simmons, Serguei Smirnov, Amir Shehata, Andreas Dilger
owner Yang Sheng · uploader Yang Sheng · PS4 uploaded 2066d ago · NEW · open in Gerrit ↗
commit message
LU-13638 ptlrpc: addition change for callback discard --Fix some style issue; --decrease ibc_nsends_posted along with ibc_sending, else we may hit the ASSERT in kiblnd_destroy_conn(); --We should bypass checking delayed request and then handle it in ptlrpc_unregister_reply(); Fixes: babf023227 (LU-13368 lnet: discard the callback) Signed-off-by: Yang Sheng <ys@whamcloud.com> Change-Id: I84dc43acad1e010bf1370dc115f2f12002a35b4d
44526
master
J –B ✓T ✗3R ✗
LU-14917 llite: Switch mmap readahead logic
reviewing Patrick Farrell · blocked on the owner: enforced tests failed; Patrick Farrell voted -1
CR -1
stalled 457d
M +228 −11
457d
LU-14917 llite: Switch mmap readahead logic
reviewing Patrick Farrell · blocked on the owner: enforced tests failed; Patrick Farrell voted -1
CR -1
stalled 457d
M +228 −11
457d
blocked on the owner: enforced tests failed; Patrick Farrell voted -1
awaiting review (CI not green yet)
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-3 | CentOS 8.3/x86_64 | ran 3 tests. 1 tests failed: conf-sanity. | session |
| review-dne-part-3 failed 2× | RHEL 8.3/x86_64 | ran 1 tests. 1 tests failed: node-provisioning. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE TIMES | session |
| review-dne-part-4 failed 2× | CentOS 8.3/x86_64 | ran 9 tests. 1 tests failed: sanity-flr. | session |
build #86016 SUCCESS · tests all Maloo sessions
reviews:
Patrick Farrell -1
no vote yet: Qian Yingjin, Andreas Dilger
patchsets:
PS22 11-08
PS23 12-09
PS24 01-26
PS25 02-01
PS26 02-02
+19 earlier
PS3 08-09 PS4 08-13 Peter Jones PS5 09-16 Andreas Dilger PS6 09-16 Andreas Dilger PS7 10-13 PS8 10-13 PS9 10-13 PS10 10-14 PS11 10-15 PS12 10-15 PS13 10-15 PS14 10-17 PS15 10-20 PS16 10-20 PS17 10-21 PS18 11-05 PS19 11-06 PS20 11-07 PS21 11-07owner Patrick Farrell · uploader Patrick Farrell · PS26 uploaded 1737d ago · NEW · open in Gerrit ↗
commit message
LU-14917 llite: Switch mmap readahead logic The mmap readahead logic has shown to be badly suited for certain workloads (kdb). Experimentation showed that for these workloads, the standard readahead algorithm works better. This patch allows switching the readahead algorithm for mmap to the 'standard' readahead algorithm. The added tunable is: mmap_read_ahead_logic in llite (lctl get_param llite.*.mmap_read_ahead_logic) It defaults to '1', which is the special mmap readahead logic. Setting it to 0 switches mmap readahead to use the standard readahead logic. This patch also fixes the existing mmap readahead test, which was not running. Note the results for the existing test are better with the standard readahead logic, ie, with mmap readahead logic disabled. This suggests we should default to non-mmap readahead logic. However, the mmap readahead logic was carefully tuned for certain workloads, and this would be a large change. So, this question is deferred until we can do a larger look at readahead behavior. Signed-off-by: Patrick Farrell <pfarrell@whamcloud.com> Change-Id: Ib34297f1dd0498356b21580224f4b954bb10cb14
45263
master
J !B ✓T ↻R 0/2
LU-15108 hsm: HE_STATE should be issued when necessary
reviewing Etienne AUJAMES · awaiting review (CI not green yet)
stalled 457d
M +177 −57
457d
LU-15108 hsm: HE_STATE should be issued when necessary
reviewing Etienne AUJAMES · awaiting review (CI not green yet)
stalled 457d
M +177 −57
457d
janitor run: 2 failing config(s), none unique to this patch — janitor results
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-zfs-part-4 retesting failed 2× | CentOS 8.5/x86_64 | ran 9 tests. 1 tests failed: sanity-quota. | session |
2 optional test failure(s) — informational
build #90292 SUCCESS · tests all Maloo sessions
no vote yet: Qian Yingjin, Guillaume Courrier, Lai Siyao, Nikitas Angelinas, Thomas LEIBOVICI, Aurelien Degremont, Andreas Dilger
patchsets:
PS5 11-02
PS6 11-02
PS7 11-02
PS8 12-08
PS9 11-02
+4 earlier
PS1 10-15 PS2 10-15 PS3 10-18 PS4 10-26owner Etienne AUJAMES · uploader Etienne AUJAMES · PS9 uploaded 1463d ago · NEW · open in Gerrit ↗
commit message
LU-15108 hsm: HE_STATE should be issued when necessary HE_ARCHIVE HSM changelog is issued by the coordinator instead of HE_STATE event for restore request. The HE_STATE changelogs issued inside hsm_cdt_request_completed() are redundant with the actuals HE_ARCHIVE, HE_RESTORE, HE_REMOVE and HE_CANCEL changelogs. This could confuse monitoring softwares (like Robinhood). This patch disables the HE_STATE changelogs inside hsm_cdt_request_completed() by adding a new setxattr flag "LU_XATTR_NO_CHLG". The behaviour of mdd_hsm_update_locked() is corrected to return if a changelog should be emitted for a HE_STATE event. Test-Parameters: testlist=sanity-hsm,sanity-hsm Test-Parameters: testlist=sanity-hsm env=ONLY="607",ONLY_REPEAT=20 Signed-off-by: Etienne AUJAMES <eaujames@ddn.com> Change-Id: Ib1b7a7705050d3c2f34a61b0c651fb3a15ee7384
45554
master
J !B ✓T ✗4R +0/2−
LU-14364 nrs: release spinlock when stopping policy
reviewing Li Xi · blocked on the owner: enforced tests failed
stalled 457d
XS +6 −1
457d
LU-14364 nrs: release spinlock when stopping policy
reviewing Li Xi · blocked on the owner: enforced tests failed
stalled 457d
XS +6 −1
457d
blocked on the owner: 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 | RHEL 8.6/x86_64 | ran 7 tests. 1 tests failed: sanity-sec. | session |
| review-dne-part-4 | RHEL 8.6/x86_64 | ran 9 tests. 1 tests failed: sanity-quota. | session |
| review-dne-zfs-part-1 | CentOS 8.5/x86_64 | ran 6 tests. 1 tests failed: sanity. | session |
| review-ldiskfs-arm | RHEL 8.6/aarch64, RHEL 8.6/x86_64 | ran 6 tests. 1 tests failed: sanity-lnet. | session |
2 optional test failure(s) — informational
build #91467 SUCCESS · tests all Maloo sessions
reviews:
Etienne AUJAMES -1 · Vitaliy Kuznetsov +1
no vote yet: Qian Yingjin, Andreas Dilger, Alex Zhuravlev, Oleg Drokin
patchsets:
PS1 11-12
PS2 11-12
PS3 11-13
PS4 11-15
PS5 01-05 Andreas Dilger
owner Li Xi · uploader Andreas Dilger · PS5 uploaded 1400d ago · NEW · open in Gerrit ↗
commit message
LU-14364 nrs: release spinlock when stopping policy Stopping a NRS policy might sleep. So release the spinlock temporarily to avoid soft lockup. Signed-off-by: Li Xi <lixi@ddn.com> Change-Id: I30641d5d3c4e9499305dd3270311e820a1ae212e
46569
master
J !B ✓T ✗7R -1/2−
LU-15578 readahead: hold the lock reference for readahead
reviewing Yang Sheng · blocked on the owner: enforced tests failed
stalled 457d
1 unresolved
M +131 −45
457d
LU-15578 readahead: hold the lock reference for readahead
reviewing Yang Sheng · blocked on the owner: enforced tests failed
stalled 457d
1 unresolved
M +131 −45
457d
blocked on the owner: enforced tests failed
awaiting review (CI not green yet)
janitor run: 1 failing config(s), none unique to this patch — janitor results
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-2 | RHEL 8.6/x86_64 | ran 7 tests. 1 tests failed: sanity-sec. | session |
| review-dne-selinux-ssk-part-2 | CentOS 8.5/x86_64 | ran 7 tests. 1 tests failed: sanity-sec. | session |
| review-dne-zfs-part-2 | CentOS 8.5/x86_64 | ran 7 tests. 1 tests failed: sanity-sec. | session |
| review-dne-zfs-part-4 | CentOS 8.5/x86_64 | ran 9 tests. 1 tests failed: sanity-quota. | session |
| review-dne-zfs-part-5 crashed | CentOS 8.5/x86_64 | ran 6 tests. 1 tests failed: sanityn. %% THIS TEST SESSION CRASHED %% | session |
| review-ldiskfs-arm | RHEL 8.6/aarch64, RHEL 8.6/x86_64 | ran 6 tests. 1 tests failed: sanity-sec. | session |
| review-ldiskfs-ubuntu | CentOS 8.5/x86_64, Ubuntu 20.04/x86_64 | ran 6 tests. 1 tests failed: sanity-sec. | session |
3 optional test failure(s) — informational
build #90571 SUCCESS · tests all Maloo sessions
reviews:
Andreas Dilger -1
no vote yet: Qian Yingjin, Wang Shilong, Patrick Farrell
patchsets:
PS10 02-26
PS11 02-27
PS12 03-08
PS13 03-14
PS14 11-11 Andreas Dilger
+9 earlier
PS1 02-21 PS2 02-22 PS3 02-23 PS4 02-23 PS5 02-23 PS6 02-23 PS7 02-23 PS8 02-23 PS9 02-25threads: 1 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Patrick Farrell (personal) rw.c:1771 — This seems like a long-winded way to say "not the first page"? But of course what's a shorter way to do it... Huh.
Patrick Farrell (personal)
This seems like a long-winded way to say "not the first page"? But of course what's a shorter way to do it... Huh.
owner Yang Sheng · uploader Andreas Dilger · PS14 uploaded 1454d ago · NEW · open in Gerrit ↗
commit message
LU-15578 readahead: hold the lock reference for readahead
While the readahead is working as separate thread, we should
hold the lock reference of ldlm lock to avoid it was canceled.
LustreError: (osc_object.c:396:osc_req_attr_set()) uncovered page!
BUG: unable to handle kernel NULL pointer dereference at 000000016
IP: ldlm_resource_dump+0x86/0x420 [ptlrpc]
Oops: 0000 [#1] SMP
Call Trace:
osc_req_attr_set+0x3ec/0x620 [osc]
cl_req_attr_set+0x63/0x160 [obdclass]
osc_build_rpc+0x483/0x1070 [osc]
osc_io_unplug0+0xc22/0x1910 [osc]
brw_interpret+0x34b/0xea0 [osc]
ptlrpc_check_set.part.23+0x481/0x1df0 [ptlrpc]
ptlrpc_check_set+0x5b/0xe0 [ptlrpc]
ptlrpcd_check+0x4ab/0x590 [ptlrpc]
ptlrpcd+0x29b/0x560 [ptlrpc]
Fixes: c2791674260 ("LU-12043 llite: improve single-thread read performance")
Signed-off-by: Yang Sheng <ys@whamcloud.com>
Change-Id: Id8c3b8544ef5652693746471f41c938566875857
50379
master
J ✗6B ✓T ✗4R 0/2
LU-16656 llite: Improve 'out:' in ll_file_io_generic
reviewing Patrick Farrell · blocked on the owner: janitor: test failures unique to this patch; enforced tests failed
6 unique failures
stalled 457d
XS +2 −1
457d
LU-16656 llite: Improve 'out:' in ll_file_io_generic
reviewing Patrick Farrell · blocked on the owner: janitor: test failures unique to this patch; enforced tests failed
6 unique failures
stalled 457d
XS +2 −1
457d
blocked on the owner: janitor: test failures unique to this patch; enforced tests failed
awaiting review (CI not green yet)
janitor flagged test failures unique to this patch — full janitor results
| unique failing test | history |
|---|---|
| recovery-small@ldiskfs+DNE:test_110m | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| replay-single@ldiskfs+DNE:test_70c | seen in 4 other reviews |
| sanity2@ldiskfs+DNE:test_154g | seen in 2 other reviews |
| sanity-pcc@ldiskfs+DNE:test_1d | seen in 3 other reviews |
| sanity-pcc@zfs:test_1f | seen in 2 other reviews |
| sanity-pcc@zfs:test_1g | seen in 3 other reviews |
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-selinux-ssk-part-1 | RHEL 8.7/x86_64 | ran 3 tests. 1 tests failed: sanity. | session |
| review-dne-selinux-ssk-part-2 | RHEL 8.7/x86_64 | ran 5 tests. 1 tests failed: sanity-sec. | session |
| review-dne-zfs-part-1 | RHEL 8.7/x86_64 | ran 4 tests. 1 tests failed: sanity. | session |
| review-zfs | RHEL 8.7/x86_64 | ran 10 tests. 1 tests failed: replay-single. | session |
1 optional test failure(s) — informational
build #93762 SUCCESS · tests all Maloo sessions
no vote yet: Qian Yingjin, Andreas Dilger
patchsets:
PS1 03-22
PS2 03-22
PS3 04-10
owner Patrick Farrell · uploader Patrick Farrell · PS3 uploaded 1304d ago · NEW · open in Gerrit ↗
commit message
LU-16656 llite: Improve 'out:' in ll_file_io_generic The location of the 'out:' label in ll_file_io_generic is a bit scary, because it skips part of the setup for io restart, where partial io is taken in to account. This is safe today because 'out' is only used before calls to cl_io_loop, so IO hasn't started yet, but if 'out' is ever used later in the function, it will be incorrect. Let's move it now rather than leave a trap for the unwary. Note that until cl_io_loop is called "io->ci_nob" is 0, so this shouldn't change current behavior. Signed-off-by: Patrick Farrell <pfarrell@whamcloud.com> Change-Id: I89e29708a6d17c5eecdf4f86261dfa013c7a5ec3
50407
master
J ✗1B ✓T ✗1R -1/2−
LU-16665 llite: check whether page under I/O in releasepage()
reviewing Qian Yingjin · blocked on the owner: janitor: test failures unique to this patch; enforced tests failed
1 unique failure
stalled 457d
6 unresolved
M +52 −7
457d
LU-16665 llite: check whether page under I/O in releasepage()
reviewing Qian Yingjin · blocked on the owner: janitor: test failures unique to this patch; enforced tests failed
1 unique failure
stalled 457d
6 unresolved
M +52 −7
457d
blocked on the owner: janitor: test failures unique to this patch; enforced tests failed
awaiting review (CI not green yet)
janitor flagged test failures unique to this patch — full janitor results
| unique failing test | history |
|---|---|
| sanity-flr@zfs:test_200 | seen in 29 other reviews |
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-selinux-ssk-part-1 | CentOS 8.5/x86_64 | ran 3 tests. 1 tests failed: sanity. | session |
2 optional test failure(s) — informational
build #93282 SUCCESS · tests all Maloo sessions
reviews:
Patrick Farrell -1
no vote yet: Andreas Dilger
patchsets:
PS1 03-24
PS2 03-27
threads: 6 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Patrick Farrell file.c:2084 — A general thought - I think it would be better to fall back to slow read on error here, rather than add this cost to the fast read path ever
Patrick Farrell
A general thought - I think it would be better to fall back to slow read on error here, rather than add this cost to the fast read path every time. In fact, I think we should probably just fall back to slow read on *any* error from fast read.
reply Patrick Farrell file.c:2091 — Hmm, is tiny_write an issue as well? (see ll_file_write_iter)
Patrick Farrell
Hmm, is tiny_write an issue as well? (see ll_file_write_iter)
reply Patrick Farrell llite_mmap.c:311 — don't we need to do this for mkwrite as well?
Patrick Farrell
don't we need to do this for mkwrite as well?
reply Patrick Farrell rw.c:1643 — That caching would be tricky, now that I think about it. Maybe not worth the trouble.
Patrick Farrell
So we're going to do this for every page. If there are many readers moving many pages, I think this will get *expensive* quickly, because there will be several LCCs, and we will check all of them for every page. Basically, we're taking an inode level rwlock for every page we move, and then walking a list. That list won't have thousands of members, but it could have 10s or 100s of members, and if it's being updated a lot (which would happen with many readers), it would be taking the 'write' lock a lot. If we really want to go this route, it might make sense to cache the most recently used lcc and check it first?
Patrick Farrell
That caching would be tricky, now that I think about it. Maybe not worth the trouble.
reply Patrick Farrell rw.c:1643 — I remain worried about cost of this; I think it's correct but I'm worried about the cost...
Patrick Farrell
I remain worried about cost of this; I think it's correct but I'm worried about the cost...
reply Patrick Farrell rw26.c:211 — It's not that we check refcount without any lock - other people change the page refcount without taking the lock. You can see it in some pl
Patrick Farrell
So, the vmpage_in_use check is still wrong - it's racey, it just works most of the time. But it's incorrect because it's racey. I think we need to see if this approach can pass: sanityn 16f,16g,95b (the test in my seqlock fix for generic_file_read_iter) without the vmpage_in_use check and without either seqlock fix.
Qian Yingjin
Could you please describe why it is racey in NVDA DGS?
static inline int vmpage_in_use(struct page *vmpage, int refcount)
{
return (page_count(vmpage) - page_mapcount(vmpage) > 2 + refcount);
}
I guess it is because that NVDA DGS gets an extra lock reference, thus vmpage_in_use check returns true, thus we can not release the page?
We check vmpage refcount without any lock?
Could we do some quick but not including all cases checking for whether the vmpageis in use as following?:
static inline int vmpage_in_use(struct page *vmpage, int refcount)
{
return (page_count(vmpage) > 2 + refcount);
}
Patrick Farrell
It's not that we check refcount without any lock - other people change the page refcount without taking the lock. You can see it in some places in generic_file_buffered_read() - the page is unlocked, and then page_put() is called. So it doesn't matter what we do - the lock does not protect the refcount. (That's why the refcount has to be an atomic.) And this means we can't use this for checking things like this. The refcount just protects the page from freeing. So, the race isn't specific to GDS, but it does affect GDS: GDS needs to be able to flush pages, and if we have this vmpage check, it sometimes fails to flush them. Even if they are not part of IO. But the more important thing is this refcount is changed without the lock, so we can't safely use it for anything.
owner Qian Yingjin · uploader Qian Yingjin · PS2 uploaded 1319d ago · NEW · open in Gerrit ↗
commit message
LU-16665 llite: check whether page under I/O in releasepage() We use seqlock to check if a page has been deleted on this inode during the fault process, allowing us to catch an erronous short read or EIO and retry the I/O. However, the newer kernel (such as Unbutu 2204) introduces @mapping->invalidate_lock. By using this lock, we could get rid of all these seqlock check for the newer kernel which may have impact on the performance. A user can use drop_caches or DONTNEED fadvise to drop unused page cache. In kernel it calls invalidate_mapping_pages() to release pages that are not in use or under I/O. And this function is called without invalidate_lock held. Thus it needs to check wether the current page trying to release in ->releasepage() is under I/O or not. In ->releasepage(), we check whether the current page is under I/O by check whether it is in the I/O range of the read/fault I/O context in the list @lli_lccs(ll_cl_context). The page can only be released if it is not under I/O or in use. Signed-off-by: Qian Yingjin <qian@ddn.com> Change-Id: I281c0815e79ab800944700451c4a168ebddbc7c8
23552
master
J –B ✓T ✗7R +0/2−
LU-8709 llite: implement parallel asynchronous readahead
reviewing Li Xi · blocked on the owner: needs rebase — checkpatch: cannot be cherry-picked; enforced tests failed
needs rebase
stalled 457d
XL +1467 −1103
457d
LU-8709 llite: implement parallel asynchronous readahead
reviewing Li Xi · blocked on the owner: needs rebase — checkpatch: cannot be cherry-picked; enforced tests failed
needs rebase
stalled 457d
XL +1467 −1103
457d
blocked on the owner: needs rebase — checkpatch: cannot be cherry-picked; enforced tests failed
awaiting review (CI not green yet)
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-1 | CentOS 7.0/x86_64 | ran 6 tests. 1 tests failed: sanity. | session |
| review-dne-part-2 | CentOS 7.0/x86_64 | ran 10 tests. 1 tests failed: sanity-hsm. | session |
| review-dne-part-4 crashed | CentOS 7.0/x86_64 | ran 12 tests. 1 tests failed: sanity-flr. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-zfs-part-1 | CentOS 7.0/x86_64 | ran 6 tests. 1 tests failed: sanity. | session |
| review-dne-zfs-part-2 | CentOS 7.0/x86_64 | ran 10 tests. 1 tests failed: sanity-hsm. | session |
| review-ldiskfs | CentOS 7.0/x86_64 | ran 6 tests. 1 tests failed: sanity. | session |
| review-zfs crashed | CentOS 7.0/x86_64 | ran 10 tests. 1 tests failed: sanity-flr. %% THIS TEST SESSION CRASHED %% | session |
2 optional test failure(s) — informational
build #60987 SUCCESS
reviews:
Andreas Dilger +1
no vote yet: Qian Yingjin, Jinshan Xiong, Patrick Farrell, James Simmons
owner Li Xi · uploader Wang Shilong · PS14 uploaded 2861d ago · NEW · open in Gerrit ↗
commit message
LU-8709 llite: implement parallel asynchronous readahead This patch proposes a new design of Lustre readahead framework, parallel-readahead, which implements a similar algorithm like current Linux kernel's on-demand readahead, but in a way that is more optimized for the characteristics of Lustre, more extendable for differet I/O patterns, and more adaptable to the high bandwidth of Lustre since data could be prefetched in parallel by multiple threads. Like the on-demand readahead, the parallel-readahead maintains a "readahead window" consisting of a portion of the file starting with the application's last read. Pages inside the readahead window are either already in the page cache, or being prefetched into the page cache of the client. The window moves forward as the reading of the application moves forward. The parallel-readahead framework prefetches more agressively than on-demand readahead using a large readahead window, since Lustre usually has more overhead than local file systems. The parallel-readahead can do real asynchronous prefetch in parallel by multiple threads. The reason of this implement is that, if all prefetching is done in the process of the application that issued read() syscall, the overhead caused by logic of Lustre client side would become the bottleneck. The parallel-readahead framework provides an extendable I/O pattern detection mechanism which currently has detection algorithms for both sequential read and stride read. And more pattern detection algorithms and corresponding prefetching policies can be added into the framework for other I/O patterns, including random read, semisequential read, backward read, interleaved read, etc. Todo: make max_read_ahead_whole_mb really work Signed-off-by: Li Xi <lixi@ddn.com> Signed-off-by: Wang Shilong <wshilong@whamcloud.com> Change-Id: Ida399b9d0b499ba3f6bd08d7bb4528132e8e98e4
39926
master
J ✓B ✓T ✗3R +0/2−
LU-13669 readahead: increase ra window progressively
reviewing Wang Shilong · blocked on the owner: enforced tests failed
stalled 464d
S +15 −2
464d
LU-13669 readahead: increase ra window progressively
reviewing Wang Shilong · blocked on the owner: enforced tests failed
stalled 464d
S +15 −2
464d
blocked on the owner: enforced tests failed
awaiting review (CI not green yet)
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-1 | CentOS 8.3/x86_64 | ran 6 tests. 1 tests failed: sanity. | session |
| review-dne-zfs-part-1 crashed | CentOS 8.3/x86_64 | ran 6 tests. 1 tests failed: sanity. %% THIS TEST SESSION CRASHED %% | session |
| review-ldiskfs-arm | CentOS 8.3/aarch64, CentOS 8.3/x86_64 | ran 6 tests. 1 tests failed: sanity. | session |
build #81939 SUCCESS · tests all Maloo sessions
reviews:
Qian Yingjin +1 · Andreas Dilger -1
no vote yet: Shuichi Ihara, Patrick Farrell
owner Wang Shilong · uploader Wang Shilong · PS2 uploaded 1940d ago · NEW · open in Gerrit ↗
commit message
LU-13669 readahead: increase ra window progressively For KX applications(https://kx.com), use default read ahead per window will hurt performance, we only get good numbers with 1M window size. The reason behind that is it is not really sequenetial mmap read, however sequential read RPC size increased as one RPC size even first time, this potentially cause a lot of page discard. To overcome problem like above, RPC size will be started as 32K and increased twice every time before it reach RPC size(16M etc). Once we reach RPC size, it will grow one RPC size each time as before. With this patch, we got same performance numbers with 1M and 64M read_ahead_per_file_mb. Signed-off-by: Wang Shilong <wshilong@ddn.com> Change-Id: I147aafefb66b574a9b130786597018d079553727
50423
master
J !B ✓T ✗2R +1/2
LU-16665 llite: remove lli_page_inv_lock in newer kernel
reviewing Qian Yingjin · blocked on the owner: enforced tests failed
stalled 1295d
2 unresolved
S +28 −2
1295d
LU-16665 llite: remove lli_page_inv_lock in newer kernel
reviewing Qian Yingjin · blocked on the owner: enforced tests failed
stalled 1295d
2 unresolved
S +28 −2
1295d
blocked on the owner: enforced tests failed
awaiting review (CI not green yet)
janitor run: 1 failing config(s), none unique to this patch — janitor results
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-1 | RHEL 8.6/x86_64 | ran 4 tests. 1 tests failed: sanity. | session |
| review-ldiskfs | CentOS 8.5/x86_64 | ran 5 tests. 1 tests failed: sanity. | session |
1 optional test failure(s) — informational
build #93286 SUCCESS · tests all Maloo sessions
reviews:
Patrick Farrell +1
no vote yet: Andreas Dilger
patchsets:
PS1 03-27
PS2 03-27
PS3 03-27
threads: 2 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Patrick Farrell vvp_io.c:923 — This needs to be rebased - not urgently or anything, but I see it's missing the latest version of the patch which added this
Patrick Farrell
This needs to be rebased - not urgently or anything, but I see it's missing the latest version of the patch which added this
reply Patrick Farrell vvp_page.c:89 — [minor]
Patrick Farrell
[minor] Maybe split this comment to "clearpageuptodate" and "seqlock" parts and move the clearpageuptodate part above the #ifdef? It would be sad if we removed the whole comment when we (some day!) remove the lli_page_inv_lock code completely
owner Qian Yingjin · uploader Qian Yingjin · PS3 uploaded 1319d ago · NEW · open in Gerrit ↗
commit message
LU-16665 llite: remove lli_page_inv_lock in newer kernel This patch remove @lli_page_inv_lock in newer kernel as @mapping->invalidate_lock can achieve the same effect. Test-Parameters: testlist=sanityn clientdistro=ubuntu2204 env=ONLY="16f 16g 95b",ONLY_REPEAT=10 Signed-off-by: Qian Yingjin <qian@ddn.com> Change-Id: I5a26ce366817b3a92f9fe1ca9724ab5a9e13f999
49138
master
J !B ✓T ✗2R 0/2
LU-16285 ldlm: flush the page out for bl lock
reviewing Yang Sheng · blocked on the owner: enforced tests failed
stalled 1350d
6 unresolved
M +196 −9
1350d
LU-16285 ldlm: flush the page out for bl lock
reviewing Yang Sheng · blocked on the owner: enforced tests failed
stalled 1350d
6 unresolved
M +196 −9
1350d
blocked on the owner: enforced tests failed
awaiting review (CI not green yet)
janitor run: 2 failing config(s), none unique to this patch — janitor results
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-selinux-ssk-part-2 | CentOS 8.5/x86_64 | ran 5 tests. 1 tests failed: recovery-small. | session |
| review-dne-zfs-part-4 | CentOS 8.5/x86_64 | ran 9 tests. 1 tests failed: sanity-quota. | session |
2 optional test failure(s) — informational
build #90833 SUCCESS · tests all Maloo sessions
no vote yet: Andreas Dilger, Patrick Farrell
patchsets:
PS1 11-11
PS2 11-16
PS3 11-23
threads: 6 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Andreas Dilger COMMIT_MSG:12 — This is a good explanation, but it needs to be added into the commit message so that it can be found in the future, not in a Gerrit comment
Andreas Dilger
Can you please expand the description of what this patch is doing. It looks like there is a separate thread or timer that is generating RPCs for high priority locks, but I don't understand why this is much different from the current client RPC generation engine? I'm wondering if we are missing something simple in the current RPC engine that it doesn't keep on sending new RPCs for blocked locks when the current RPCs have completed. Maybe something like the high-priority locks/object are being blocked by rpcs_in_flight or similar?
Yang Sheng
Yes, I set a timer if the bl queue depth has reached a limitation while a blwi insert. Then start flushing out the pages after the timer fired if the blwi still in queue. The different than usual RPC engine is that current engine only consider flush whole range of lock but we need only flush part pages(only one RPC in this patch).
Andreas Dilger
This is a good explanation, but it needs to be added into the commit message so that it can be found in the future, not in a Gerrit comment on an old version of the patch. My main concern is that having two separate RPC engines may cause other issues (eg. overflow of max_rpcs_in_flight, fragmented RPCs, etc). My preference would be to update the current RPC generation to round-robin over HP objects/locks when there is a large HP object/lock that is taking too long to flush. I'm thinking something like limiting the number of RPCs for each object at one time to max(1, max_rpcs_in_flight / 4), and doing a pass over all HP locks and sending an RPC for those that have not had any RPCs sent in some time (obd_timeout / 4). This will ensure that there are no locks left idle for a long time, and if there are many small files that can be written with a few RPCs they will be finished quickly, and the large files that take thousands of RPCs to flush will still have occasional RPCs sent to keep the locks alive. If there are only the large files in the HP list then they will be processed more quickly.
reply Yang Sheng ldlm_lockd.c:2873 — I was thinking no possible to divide zero since jiffies should change rapidly. But in fact it really crash on divide zero.
Andreas Dilger
Is there a danger that this could ever divide by zero? I don't think so, (blp_proc_time should always be <= jiffies, so I guess the "+1" is to handle the == case) but it isn't totally obvious.
Yang Sheng
I was thinking no possible to divide zero since jiffies should change rapidly. But in fact it really crash on divide zero.
reply Yang Sheng ldlm_lockd.c:3026 — Since bl queue is accessed as FIFO in bl thread. But we need flush the pages as a reverse order(All of blwis before blp_echo_item are older
Andreas Dilger
(style) it would be more understandable if this was written like "list_for_each_entry()" or similar.
Yang Sheng
Since bl queue is accessed as FIFO in bl thread. But we need flush the pages as a reverse order(All of blwis before blp_echo_item are older than it). Since the start pointer is different than end pointer. Seem no stand api can be used. But i'll try to find it.
reply Yang Sheng ldlm_lockd.c:3039 — It is my fault. I should set the pos as blp_echo_item->prev. So it was moved one step forward in worst case. Will update.
Andreas Dilger
(defect?) I don't understand why this does not just lloop on the same blwi entry each time? The item is not being removed from the list or moved to the end (AFAICS), so it definitely has some danger.
Yang Sheng
It is my fault. I should set the pos as blp_echo_item->prev. So it was moved one step forward in worst case. Will update.
reply Andreas Dilger ldlm_lockd.c:3051 — (style) remove extra blank space
Andreas Dilger
(style) remove extra blank space
reply Andreas Dilger osc_lock.c:350 — (style) only one space between variable type and name for local variable declarations
Andreas Dilger
(style) only one space between variable type and name for local variable declarations
owner Yang Sheng · uploader Yang Sheng · PS3 uploaded 1442d ago · NEW · open in Gerrit ↗
commit message
LU-16285 ldlm: flush the page out for bl lock The client could be evicted if it is no chance to write out the dirty data and cancel the lock in timely manner. So we made some IO for locks which still in BL queue. The timeout can be prolong to avoid eviction. Signed-off-by: Yang Sheng <ys@whamcloud.com> Change-Id: I7349d45e565cade7581fb756eee448356c6d91f7
▶Voted on current patchset
(9)
69573
master
J –B ✓T ✓R +2/2
LU-19932 llite: Treat direct write as sync write again
reviewing Xiao Yang · you voted +1 on current PS
pw_shepherd
S +35 −2
11h
LU-19932 llite: Treat direct write as sync write again
reviewing Xiao Yang · you voted +1 on current PS
pw_shepherd
S +35 −2
11h
build #135046 SUCCESS · tests all Maloo sessions
reviews:
Marc Vef +1 · Zhenyu Xu +1
no vote yet: Qian Yingjin, Andreas Dilger, Patrick Farrell, Timothy Day
patchsets:
PS6 10-15
PS7 10-18
PS8 10-29
PS9 10-29
PS10 11-01
+5 earlier
PS1 10-11 PS2 10-12 PS3 10-12 PS4 10-14 PS5 10-15your previous vote: +1 on PS3 (2026-10-13 05:05) — now at PS10
tags: pw_shepherd
owner Xiao Yang · uploader Xiao Yang · PS10 uploaded 4d ago · NEW · open in Gerrit ↗
commit message
LU-19932 llite: Treat direct write as sync write again
LU-16695 dropped O_DIRECT from wr_sync when switching to ki_flags.
When a DIO write falls back to a buffered write (e.g. unaligned DIO to
OSTs without unaligned DIO support, or -EBUSY from invalidating cached
pages) and pages are committed to OSC once the buffered write reaches
64MiB (PTLRPC_MAX_BRW_SIZE), the last extent committed by the write
cl_io stays active until its cl_io_end. Before that, the same thread
runs direct_write_fallback(), whose nested fsync cl_io waits for that
extent, so the thread deadlocks with itself.
Include IOCB_DIRECT in wr_sync again so the extent is released at
commit in cl_io_start instead of at cl_io_end.
Test-Parameters: serverversion=2.15 testlist=sanity env=ONLY=119
Fixes: dad7079dfd9d ("LU-16695 llite: switch to ki_flags from f_flags")
Signed-off-by: Xiao Yang <xyang@ddn.com>
Change-Id: I1dce660ee3a29341e1c484dc7c466f05a176a228
66882
master
J –B ✓T ✓R +2/2
LU-20211 mdt: trunc(0) layout replace on inactive stripes
reviewing Keguang Xu · you voted +1 on current PS
218_review_prioritypw_shepherdpt_ecro
3 unresolved
XL +1320 −64
11h
LU-20211 mdt: trunc(0) layout replace on inactive stripes
reviewing Keguang Xu · you voted +1 on current PS
218_review_prioritypw_shepherdpt_ecro
3 unresolved
XL +1320 −64
11h
build #135174 SUCCESS · tests all Maloo sessions
reviews:
Andreas Dilger +1 · Zhenyu Xu +1
no vote yet: Ronnie Sahlberg, 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: 3 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply 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: 218_review_priority pw_shepherd pt_ecro
owner Keguang Xu · uploader Andreas Dilger · PS45 uploaded 3d 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
65219
master
J –B ✓T ✓R +2/2
LU-12669 llite: make AIO reads on EC file synchronous
reviewing Patrick Farrell · you voted +1 on current PS
pw_ownpt_ecro
M +127 −14
22h
LU-12669 llite: make AIO reads on EC file synchronous
reviewing Patrick Farrell · you voted +1 on current PS
pw_ownpt_ecro
M +127 −14
22h
build #134978 SUCCESS · tests all Maloo sessions
reviews:
Andreas Dilger +1 · Zhenyu Xu +1
no vote yet: Ronnie Sahlberg, Marc Vef, Shaun Tancheff
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 5d 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
57682
b2_15
J ✗2B ✓T ✓R +2/1
LU-17364 llite: don't use stale page.
reviewing Etienne AUJAMES · you voted +1 on current PS
LTS15
testfix
S +44 −1
2d
LU-17364 llite: don't use stale page.
reviewing Etienne AUJAMES · you voted +1 on current PS
LTS15
testfix
S +44 −1
2d
janitor flagged test failures unique to this patch — superseded (tests have since passed) — full janitor results
| unique failing test | history |
|---|---|
| runtests@ldiskfs+DNE:test_1 | seen in 11 other reviews |
| sanityn@zfs:test_51c | seen in 1 other review |
1 optional test failure(s) — informational
build #117698 SUCCESS · tests all Maloo sessions
reviews:
Alexey Lyashkov +1 · Zhenyu Xu +1
no vote yet: Alexander Zarochentsev, Patrick Farrell
patchsets:
PS1 01-08
PS2 10-21
PS3 10-22
tags: testfix
owner Etienne AUJAMES · uploader Etienne AUJAMES · PS3 uploaded 379d ago · NEW · backport · open in Gerrit ↗
commit message
LU-17364 llite: don't use stale page. using stale page for write might confuse a read path, which expect any IO page have PG_uptodate flag set, and it caused an panic with removing from IO. Lustre-commit: dad3bed7617fba895db169facde91856e89c2b08 Lustre-change: https://review.whamcloud.com/53550 Test-Parameters: testlist=sanityn env=SLOW=yes,ONLY=16k,ONLY_REPEAT=10 Test-Parameters: testlist=sanityn env=SLOW=yes,ONLY=16k,ONLY_REPEAT=10 Test-Parameters: testlist=sanityn env=SLOW=yes,ONLY=16k,ONLY_REPEAT=10 Test-Parameters: testlist=sanityn env=SLOW=yes,ONLY=16k,ONLY_REPEAT=10 Test-Parameters: testlist=sanityn env=SLOW=yes,ONLY=16k,ONLY_REPEAT=10 Test-Parameters: testlist=sanityn env=SLOW=yes,ONLY=16k,ONLY_REPEAT=10 Signed-off-by: Alexey Lyashkov <alexey.lyashkov@hpe.com> Change-Id: Ia01129ceaecf53d8d9f301c26cd2d65122f6a267 Reviewed-by: Patrick Farrell <pfarrell@whamcloud.com> Reviewed-by: Alexander Zarochentsev <alexander.zarochentsev@hpe.com> Signed-off-by: Etienne AUJAMES <eaujames@ddn.com>
69702
master
J –B ✓T ✓R +1/2
LU-20708 llite: rebuild faulting EC pages from parity
reviewing Andreas Dilger · you voted +1 on current PS
pt_ecro218_review_priority
5 unresolved
M +220 −15
7d
LU-20708 llite: rebuild faulting EC pages from parity
reviewing Andreas Dilger · you voted +1 on current PS
pt_ecro218_review_priority
5 unresolved
M +220 −15
7d
build #133745 SUCCESS · tests all Maloo sessions
reviews:
Zhenyu Xu +1
no vote yet: Keguang Xu, Patrick Farrell
threads: 5 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Gerrit AI review for Lustre llite_mmap.c:77 — (style) This isn't a bug, but the kernel-doc block above ll_fault_io_init() doesn't describe the new @ndelay_tried and @ndelay parameters, s
Gerrit AI review for Lustre
(style) This isn't a bug, but the kernel-doc block above ll_fault_io_init() doesn't describe the new @ndelay_tried and @ndelay parameters, so `contrib/scripts/kernel-doc -v -none` now warns twice for this file.
reply Gerrit AI review for Lustre llite_mmap.c:160 — (suggestion) Only the fast fault path finds the rebuilt page on the retry. With llite.*.fast_read=0, or while the layout lock is not held (C
Gerrit AI review for Lustre
(suggestion) Only the fast fault path finds the rebuilt page on the retry. With llite.*.fast_read=0, or while the layout lock is not held (CL_LAYOUT_GEN_NONE), the retried fault takes the slow path. Its CIT_FAULT lock enqueue never matches the EC placeholder, since osc_match_base() skips LDLM_FL_PLACEHOLDER except for page-coverage tests. The no-delay enqueue fails again, ll_fault_ec_read() returns false because FAULT_FLAG_TRIED is set, and the fault ends up waiting for the OST after already doing the parity rebuild. Should the commit message mention the fast_read dependency, or should the slow path handle this case?
reply Keguang Xu llite_mmap.c:179 — (defect?) the 1MiB round-down prefetch in ll_fault_ec_read() can make a
Keguang Xu
(defect?) the 1MiB round-down prefetch in ll_fault_ec_read() can make a recoverable fault unrecoverable. For non-VM_RAND_READ faults, ll_fault_ec_read() expands the read to an aligned 1MiB window (llite_mmap.c:177-179). That range is what CIT_EC_RD passes to lov_find_comp_with_ec(). If the window overlaps any stale parity component on the mirror, that helper clears the match and breaks out of the mirror walk, so a later valid parity component in the same mirror is never considered (lov_io.c:375-380). The whole CIT_EC_RD then fails with -EIO even when the fault page itself could have been rebuilt. Example: - stripe size 64KiB - components [0, 512KiB) and [512KiB, EOF) - parity for the first component is stale; parity for the second is valid - the offline data OST holds data at the start of both components - fault at offset 512KiB The target page sits only in the second component and could be restored from its valid parity. ll_fault_ec_read() instead starts at round_down(512KiB, 1MiB) == 0 and reads [0, 1MiB). That extent overlaps the stale first parity, lov_find_comp_with_ec() rejects the parity mirror, and the read fails before the target page is rebuilt. ll_fault_ec_read() ignores the read result and still returns true, so the fault returns VM_FAULT_RETRY. On the next entry FAULT_FLAG_TRIED makes fault_flag_allow_retry_first() fail, recovery is not retried, and the fault waits for the OST. Please restore the fault page first (or clamp the prefetch window to the target component) before prefetching neighbouring pages, and do not treat a failed EC read as success.
reply Keguang Xu llite_mmap.c:362 — (defect?) after a successful EC rebuild, the fault can still hang waiting for the offline OST ll_fault_ec_read() fills the page cache under
Keguang Xu
(defect?) after a successful EC rebuild, the fault can still hang waiting for the offline OST ll_fault_ec_read() fills the page cache under an EC placeholder and returns VM_FAULT_RETRY, but completing the kernel retry still depends on one opportunistic fast-path hit in __ll_fault() (llite_mmap.c around the ll_filemap_fault() call). That is not reliable.
Example 1 — fast_read enabled, folio lock contention:
1. First fault: OST down, ndelay/mirror path ends in ll_fault_ec_read(),
pages are Uptodate in cache, return VM_FAULT_RETRY.
2. Kernel re-enters ->fault with FAULT_FLAG_TRIED.
3. Fast path sets FAULT_FLAG_RETRY_NOWAIT and calls ll_filemap_fault().
Another thread briefly holds the folio lock, so filemap_fault() returns
VM_FAULT_RETRY immediately without waiting.
4. __ll_fault() treats that as a fast-path miss and falls through to the
slow CIT_FAULT path in the same call.
5. CIT_FAULT enqueues a normal data lock before filemap_fault(). Placeholder
locks are skipped by ordinary match in osc_match_base() (only page-coverage
TEST_LOCK may match them), so this enqueues against the dead data OST.
6. Recovery is attempted again, but ll_fault_ec_read() bails out because
fault_flag_allow_retry_first() is false under FAULT_FLAG_TRIED, then
ndelay is cleared and the fault waits for the OST.
At step 6 the rebuilt pages are already in cache. A later folio unlock does not unblock the LDLM wait.
Example 2 — fast_read disabled (no contention required):
Same as above after step 1, but the retry never takes the fast path, so it
goes straight to CIT_FAULT and the same placeholder/OST wait problem.
The intended model is "rebuild once, then the retried fault consumes cache via the fast path". Any miss of that single NOWAIT lookup leaves a fault that cannot complete while the OST is still down.
Please make cache consume on retry reliable — for example match/use the placeholder for coverage, or skip dead-OST enqueue when the fault page is already Uptodate under a placeholder — rather than depending on one NOWAIT fast-path lookup.
reply Gerrit AI review for Lustre llite_mmap.c:402 — (minor) ll_fault_io_init() returns ERR_PTR(-ENODATA) for the EC switch, but also returns cl_io_init()'s own rc unchanged, and an HSM-release
Gerrit AI review for Lustre
(minor) ll_fault_io_init() returns ERR_PTR(-ENODATA) for the EC switch, but also returns cl_io_init()'s own rc unchanged, and an HSM-released file returns -ENODATA too. lov_io_init_released() sets ci_restore_needed, and vvp_io_fini() leaves ci_need_restart clear when ll_layout_restore() fails ("if restore registration failed, no restart, we will return -ENODATA").
So a fault on a released file whose restore can't be registered now goes into the parity path. ll_fault_ec_read() drops the mmap lock and runs a 1MiB read_iter() (another restore attempt) and returns VM_FAULT_RETRY. The retried fault fails twice more before the SIGBUS that used to happen right away. That is about four restore requests instead of one, plus an "EC read" debug message for a non-EC file.
Could the EC switch be reported with its own signal, e.g. a `bool *switch_ec` out parameter, rather than overloading -ENODATA?
tags: pt_ecro 218_review_priority
owner Andreas Dilger · uploader Andreas Dilger · PS1 uploaded 21d ago · NEW · open in Gerrit ↗
commit message
LU-20708 llite: rebuild faulting EC pages from parity
A page fault on an EC file with a data stripe on an unavailable OST,
e.g. during an OSS failover, waits for the OST in the fault's lock
enqueue, while read() of the same page is rebuilt from parity at once.
So mmap readers of the file, such as git or executables, hang.
Do the lock enqueues of read faults without delay like reads, so they
fail over to another mirror, and switch to CIT_EC_RD after the mirror
rounds as reads do. The fault then drops the mmap lock, as
filemap_fault() does for IO, rebuilds the page, with the rest of the
aligned 1MiB around it unless the mapping is read randomly, into the
page cache with a CIT_EC_RD read, where the EC placeholder lock keeps
the pages Uptodate, and retries, which finds the page through the fast
fault path. A fault that cannot be retried, one under a read() or
write() of the same file, which holds lli_trunc_sem, and one whose
every mirror has been tried wait for the OST as before.
The read RPC of a fault is not sent without delay, since a fault
cannot be restarted once the read fails, so a fault on a page whose
extent lock is still cached also waits for the OST.
Add sanity-ec test_41o, which stops the OST of a stripe.
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: I8d565cbf7d643f026a5fb5e9428b5612e63ebbe5
31748
master
J –B ✓T ✓R +0/2−
LU-4423 llite: change sai_thread to sai_task
reviewing Dmitry Eremin · you voted +1 on current PS
M +106 −99
28d
LU-4423 llite: change sai_thread to sai_task
reviewing Dmitry Eremin · you voted +1 on current PS
M +106 −99
28d
reviews:
Zhenyu Xu +1 · Timothy Day -1
no vote yet: Jinshan Xiong, Andreas Dilger
owner Dmitry Eremin · uploader Dmitry Eremin · PS5 uploaded 3130d ago · NEW · open in Gerrit ↗
commit message
LU-4423 llite: change sai_thread to sai_task Rather than allocating a ptlrpc_thread for the stat-ahead thread, just use the task_struct provided by kthreads directly. As nothing ever waits for the sai_task, it must call do_exit() directly rather than simply return from the function. Also it cannot use kthread_should_stop() to know when to stop. There is one caller which can ask it to stop so we need a simple signaling mechanism. I've chosen to set ->sai_task to NULL when the thread should finish up. The thread notices this and cleans up and exits. lli_sa_lock is used to avoid races between waking up the process and the process exiting. Change-Id: I0c807dfc3d9cc307e30b024e7a75c5d541fbaa12 Signed-off-by: NeilBrown <neilb@suse.com> Signed-off-by: Dmitry Eremin <dmitry.eremin@intel.com>
65392
master
J ✗2B ✓T ✓R +0/2−
LU-20156 lov: dont check layout rdonly for OSC page discard
reviewing Qian Yingjin · you voted +1 on current PS
5 unresolved
XS +4 −2
37d
LU-20156 lov: dont check layout rdonly for OSC page discard
reviewing Qian Yingjin · you voted +1 on current PS
5 unresolved
XS +4 −2
37d
janitor flagged test failures unique to this patch — superseded (tests have since passed) — full janitor results
| unique failing test | history |
|---|---|
| racer@ldiskfs+DNE:test_2 | seen in 65 other reviews |
| sanity-lfsck@ldiskfs+DNE:test_18e | seen in 12 other reviews |
7 optional test failure(s) — informational
build #129029 SUCCESS · tests all Maloo sessions
reviews:
Zhenyu Xu +1 · Timothy Day -1
no vote yet: Andreas Dilger
patchsets:
PS1 04-17
PS2 08-10
threads: 5 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Gerrit AI review for Lustre COMMIT_MSG:9 — (defect) The description says the read-only state is not checked for page discard coming in as CIT_MISC+ignore_layout, but the code does not
Gerrit AI review for Lustre
(defect) The description says the read-only state is not checked for page discard coming in as CIT_MISC+ignore_layout, but the code does not key on that at all - lsm_is_rdonly() is still called for that I/O type whenever `lo_lsm` happens to be non-NULL. The skip is keyed on the pointer, not on the I/O type. Could the body also say why `lo_lsm` can be NULL here? The OSC path runs without lo_type_guard, so lov_layout_change() can be sitting between lov_fini_composite() and the new llo_init(). Without that, a later reader cannot tell what the NULL case corresponds to.
reply Gerrit AI review for Lustre COMMIT_MSG:14 — (style) Change-Id: normally sits after Signed-off-by: - that is the order the Lustre commit-msg hook produces.
Gerrit AI review for Lustre
(style) Change-Id: normally sits after Signed-off-by: - that is the order the Lustre commit-msg hook produces.
reply Qian Yingjin lov_io.c:527 — done
Patrick Farrell
Should we skip this for any other cases as well?
Qian Yingjin
You mean only check for type CIT_READ CIT_WRITE CIT_SETATTR CIT_FAULT and skip other types?
Zhenyu Xu
I think the more appropriate change is to check lo_lsm before checking the rdonly state, as CIT_MISC+ignore_layout is called from the OSC, and the object's lo_lsm could have already been freed by then.
Qian Yingjin
done
reply Timothy Day lov_io.c:727 — Maybe have a copy of the line `rdonly = lsm_is_rdonly(obj->lo_lsm);` in every case of the switch-case that needs it?
Gerrit AI review for Lustre
(defect) This is a test and then a separate dereference of a field that nothing on this path serializes. LOV_2DISPATCH_MAYLOCK() in lov_io_init() deliberately skips lov_conf_freeze() for CIT_MISC+ci_ignore_layout, and lov_io_init_composite() does not bump lo_active_ios for it, so lov_layout_wait() never waits on this I/O.
lov_free_memmd() does:
*lsmp = NULL;
kref_put(&lsm->lsm_refc, lsm_free);
A read that lands just before that store still returns a pointer that lsm_free() can release before lsm_is_rdonly() gets to `lsm_is_rdonly`. Does this shrink the race window rather than close it?
The CIT_MISC+ignore_layout case never touches lo_lsm anywhere else - it returns at the ci_ignore_layout test further down, before the lo_lsm users. So keying the skip off the I/O type would keep that path from reading lo_lsm at all, and would match what the commit message describes:
if (!(io->ci_ignore_layout && io->ci_type == CIT_MISC))
rdonly = lsm_is_rdonly(obj->lo_lsm);
Timothy Day
Maybe have a copy of the line `rdonly = lsm_is_rdonly(obj->lo_lsm);` in every case of the switch-case that needs it?
reply Qian Yingjin lov_io.c:745 — null obj->lo_lsm is usually coming from CIT_MISC
Misc Code Checks Robot (Gatekeeper helper)
error: lov_io_slice_init():we previously assumed 'obj->lo_lsm' could be null (see line 727)
Qian Yingjin
null obj->lo_lsm is usually coming from CIT_MISC
owner Qian Yingjin · uploader Qian Yingjin · PS2 uploaded 87d ago · NEW · open in Gerrit ↗
commit message
LU-20156 lov: dont check layout rdonly for OSC page discard
It should not check the read-only state of the LOV layout for
page discard from OSC layer via CIT_MISC+ignore_layout as it
does not care/access LOV layout related info.
Fixes: ce98bfe5f72 ("LU-10499 pcc: add readonly mode for PCC")
Change-Id: I18506033ed53fbc6376fc8db546efbc0bfc9e350
Signed-off-by: Yingjin Qian <qian@ddn.com>
31734
master
J –B ✓T ✓R +0/2−
LU-4423 llite: remove 'ptlrpc_thread usage' for sai_agl_thread
reviewing Dmitry Eremin · you voted +1 on current PS
stalled 457d
M +57 −75
457d
LU-4423 llite: remove 'ptlrpc_thread usage' for sai_agl_thread
reviewing Dmitry Eremin · you voted +1 on current PS
stalled 457d
M +57 −75
457d
reviews:
Neil Brown -1 · Zhenyu Xu +1
no vote yet: Jinshan Xiong, Andreas Dilger
owner Dmitry Eremin · uploader Dmitry Eremin · PS3 uploaded 3131d ago · NEW · open in Gerrit ↗
commit message
LU-4423 llite: remove 'ptlrpc_thread usage' for sai_agl_thread Lustre has a 'struct ptlrpc_thread' which provides control functionality wrapped around kthreads. None of the functionality used in statahead.c requires ptlrcp_thread - it can all be done directly with kthreads. So discard the ptlrpc_thread and just use a task_struct directly. Change-Id: Ifa63dead3dc791f702d355fe03aea834ff7c2965 Signed-off-by: NeilBrown <neilb@suse.com> Signed-off-by: Dmitry Eremin <dmitry.eremin@intel.com>
48311
b2_12
J !B ✓T ✓R +1/1
LU-14541 llite: Check vmpage in releasepage
reviewing Etienne AUJAMES · you voted +1 on current PS
stalled 1484d
S +28 −12
1484d
LU-14541 llite: Check vmpage in releasepage
reviewing Etienne AUJAMES · you voted +1 on current PS
stalled 1484d
S +28 −12
1484d
janitor run: 1 failing config(s), none unique to this patch — janitor results
build #89205 SUCCESS · tests all Maloo sessions
reviews:
Zhenyu Xu +1
no vote yet: Andreas Dilger, John Hammond
owner Etienne AUJAMES · uploader Etienne AUJAMES · PS1 uploaded 1534d ago · NEW · backport · open in Gerrit ↗
commit message
LU-14541 llite: Check vmpage in releasepage
We cannot release a page if the vmpage reference count is
>1, otherwise we will detach a vmpage from Lustre when the
page is still referenced in the VM.
This creates a situation where page discard for lock
cancellation will not find the page, so we can get stale
data reads.
This re-introduces the LU-12587 issue where direct I/O on
a client falls back to buffered I/O if there are pages in
cache, since it cannot flush them. This is annoying but
not a huge problem.
Lustre-change: https://review.whamcloud.com/47262
Lustre-commit: c524079f4f59a39b99467d9868ee4aafdcf033e9
Fixes: e59f0c9a245f ("LU-12587 llite: don't check vmpage refcount in ll_releasepage()")
Signed-off-by: Patrick Farrell <pfarrell@whamcloud.com>
Change-Id: I3aa1cd7330f5e7d1ba2ddb0c12779aa22f3d70b7
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Reviewed-by: John L. Hammond <jhammond@whamcloud.com>
Signed-off-by: Etienne AUJAMES <eaujames@ddn.com>
CC'd — on your radar, review not requested
(1)
58981
master
J !B ✓T ✗15R -2/2−
LU-17159 lod: mark file layouts with append striping
cc Patrick Farrell · blocked on the owner: needs rebase — checkpatch: cannot be cherry-picked; enforced tests failed
needs rebase
stalled 442d
1 unresolved
M +74 −2
442d
LU-17159 lod: mark file layouts with append striping
cc Patrick Farrell · blocked on the owner: needs rebase — checkpatch: cannot be cherry-picked; enforced tests failed
needs rebase
stalled 442d
1 unresolved
M +74 −2
442d
janitor run: build failed — no tests ran — janitor results
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-1 crashed | RHEL 9.4 / x86_64 | ran 6 tests. 1 tests failed: sanity. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-part-1 crashed | RHEL 8.10 / x86_64 | ran 6 tests. 1 tests failed: sanity. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-part-4 crashed | RHEL 8.10 / x86_64 | ran 13 tests. 2 tests failed: sanity-flr, sanity-dom. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-part-4 crashed | RHEL 9.4 / x86_64 | ran 13 tests. 2 tests failed: sanity-flr, sanity-dom. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-part-6 | RHEL 8.10 / x86_64 | ran 4 tests. 1 tests failed: replay-single. | session |
| review-dne-selinux-ssk-part-1 crashed | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-subtest-change | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity. | session |
| review-dne-zfs-part-1 crashed | RHEL 8.10 / x86_64 | ran 6 tests. 1 tests failed: sanity. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-zfs-part-4 crashed | RHEL 8.10 / x86_64 | ran 13 tests. 2 tests failed: sanity-flr, sanity-dom. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-zfs-subtest-change | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity. | session |
| review-ldiskfs crashed | RHEL 8.10 / x86_64 | ran 7 tests. 1 tests failed: sanity. %% THIS TEST SESSION CRASHED %% | session |
| review-ldiskfs crashed | RHEL 9.4 / x86_64 | ran 7 tests. 1 tests failed: sanity. %% THIS TEST SESSION CRASHED %% | session |
| review-ldiskfs crashed | RHEL 8.10 / x86_64, RHEL 9.4 / x86_64 | ran 7 tests. 1 tests failed: sanity. %% THIS TEST SESSION CRASHED %% | session |
| review-ldiskfs crashed | RHEL 8.10 / x86_64, SLES 15.5 / x86_64 | ran 7 tests. 1 tests failed: sanity. %% THIS TEST SESSION CRASHED %% | session |
| review-ldiskfs-ubuntu crashed | RHEL 8.10 / x86_64, Ubuntu 22.04 / x86_64 | ran 8 tests. 1 tests failed: sanity. %% THIS TEST SESSION CRASHED %% | session |
7 optional test failure(s) — informational
build #112825 SUCCESS · tests all Maloo sessions
reviews:
Andreas Dilger -1
no vote yet: Qian Yingjin
patchsets:
PS1 04-25
PS2 04-26
PS3 04-26
PS4 04-26
PS5 04-26
threads: 1 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply Andreas Dilger lod_object.c:5405 — Instead of making this a
Zhenyu Xu
if want_composite is true, then we need to set mirror_count to 1, as there is an assertion to make sure mirror_count == 0 only for plain layout file in lod_fill_mirrors() as LU-18962 shows.
Andreas Dilger
Instead of making this a
owner Patrick Farrell · uploader Patrick Farrell · PS5 uploaded 558d ago · NEW · open in Gerrit ↗
commit message
LU-17159 lod: mark file layouts with append striping Add LCM_FL_APPEND flag to file layouts when a file is opened with O_APPEND flag. This makes it easier to diagnose layout behavior when the MDS decides to use append-specific layout, which can override the default file layout. Add dah_flags to dt_allocation_hint structure to pass MDS_OPEN_APPEND flag from mdd_object_make_hint() to lod_ah_init(). The flag is set in mdd_object_make_hint() when MDS_OPEN_APPEND is present in the open flags, and is then used in lod_ah_init() to set the LCM_FL_APPEND flag in the layout. Also added BUILD_BUG_ON tests for LCM_FL flags in wiretest.c to ensure the flag values remain consistent. Signed-off-by: Patrick Farrell <pfarrell@whamcloud.com> Change-Id: I927faae3a385a9d0acf40a37ab1be0c0d4cbb82c
Merged — last 30 days
(1)
67613
master
J –B ✓T ✓R +4/2
LU-19994 ec: block LCME_FL_PARITY flag changes
mine
pt_ecro
2 unresolved
M +91 −6
7d
LU-19994 ec: block LCME_FL_PARITY flag changes
mine
pt_ecro
2 unresolved
M +91 −6
7d
reviews:
Ronnie Sahlberg +1 · Andreas Dilger +1 · Oleg Drokin +2
patchsets:
PS1 07-29
PS2 09-24
PS3 10-14 Andreas Dilger
PS4 10-14 Andreas Dilger
tags: pt_ecro
owner Zhenyu Xu · uploader Oleg Drokin · PS5 uploaded 7d ago · MERGED · open in Gerrit ↗
commit message
LU-19994 ec: block LCME_FL_PARITY flag changes
The LCME_FL_PARITY flag is reserved for EC parity mirrors that are
created implicitly by the --ec option. It must not be settable on a
file layout component through "lfs setstripe --comp-set
--comp-flags=parity", nor clearable with "^parity", on either a
plain data component or the data component of an EC file.
The set of component flags that users may not set or clear on an
existing component, LCME_FL_INIT and LCME_FL_PARITY, was open-coded in
both llapi_layout_file_comp_set() and lod_declare_layout_set(), and
the same pair was reused as the keep-mask in mdd_split_ea(). Three
copies of one constant invite drift: adding another internal flag
later would have to be remembered at every site.
Hoist it into LCME_INTERNAL_COMP_FLAGS in lustre_user.h, next to the
existing LCME_USER_COMP_FLAGS, and use it at all three sites.
Also correct the LCME_USER_COMP_FLAGS comment. LCME_FL_PARITY was
added to that mask by 782f0899635a ("LU-12186 utils: Add parity flag
to correct places"), but LU-19994 now rejects it on an existing
component, so "creation/modification time" is only accurate for
creation.
Fixes: 782f0899635a ("LU-12186 utils: Add parity flag to correct places")
Assisted-by: Augment:GLM-5.2
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: Ie1aba5b5817569fc76d9e52548c36ba9dd38f9db
Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/67613
Reviewed-by: Oleg Drokin <green@whamcloud.com>
Reviewed-by: Ronnie Sahlberg <rsahlberg@whamcloud.com>
Reviewed-by: Andreas Dilger <adilger@thelustrecollective.com>
Tested-by: Maloo <maloo@whamcloud.com>
Tested-by: jenkins <devops@whamcloud.com>