Details
-
Bug
-
Resolution: Fixed
-
Critical
-
Lustre 2.13.0, Lustre 2.12.2, Lustre 2.10.8
-
None
-
3
-
9223372036854775807
Description
Truncate to exactly the first byte of an uninstantiated PFL component doesn't work - It has no effect.
Example:
[root@cent7c02 lustre]# mkdir testdir; lfs setstripe -E 4M --stripe-count=1 -E -1 testdir [root@cent7c02 lustre]# touch testdir/testfile; lfs getstripe testdir/testfile testdir/testfile lcm_layout_gen: 2 lcm_mirror_count: 1 lcm_entry_count: 2 lcme_id: 1 lcme_mirror_id: 0 lcme_flags: init lcme_extent.e_start: 0 lcme_extent.e_end: 4194304 lmm_stripe_count: 1 lmm_stripe_size: 1048576 lmm_pattern: raid0 lmm_layout_gen: 0 lmm_stripe_offset: 0 lmm_objects: - 0: { l_ost_idx: 0, l_fid: [0x100000000:0x24b:0x0] } lcme_id: 2 lcme_mirror_id: 0 lcme_flags: 0 lcme_extent.e_start: 4194304 lcme_extent.e_end: EOF lmm_stripe_count: 1 lmm_stripe_size: 1048576 lmm_pattern: raid0 lmm_layout_gen: 0 lmm_stripe_offset: -1[root@cent7c02 lustre]# truncate --size 4194304 testdir/testfile; ls -la testdir/testfile -rw-r--r-- 1 root root 0 Jul 24 15:11 testdir/testfile [root@cent7c02 lustre]# truncate --size 4194303 testdir/testfile; ls -la testdir/testfile -rw-r--r-- 1 root root 4194303 Jul 24 15:11 testdir/testfile [root@cent7c02 lustre]# truncate --size 4194305 testdir/testfile; ls -la testdir/testfile -rw-r--r-- 1 root root 4194305 Jul 24 15:11 testdir/testfile
Notice that the truncate to 4 MiB (4194304) leaves the size at 0, but truncate to 4194303 or 4194305 works fine.
Once the component is instantiated, this works fine:
[root@cent7c02 lustre]# truncate --size 4194305 testdir/testfile; ls -la testdir/testfile -rw-r--r-- 1 root root 4194305 Jul 24 15:14 testdir/testfile [root@cent7c02 lustre]# lfs getstripe testdir/testfile testdir/testfile lcm_layout_gen: 3 lcm_mirror_count: 1 lcm_entry_count: 2 lcme_id: 1 lcme_mirror_id: 0 lcme_flags: init lcme_extent.e_start: 0 lcme_extent.e_end: 4194304 lmm_stripe_count: 1 lmm_stripe_size: 1048576 lmm_pattern: raid0 lmm_layout_gen: 0 lmm_stripe_offset: 1 lmm_objects: - 0: { l_ost_idx: 1, l_fid: [0x100010000:0x24d:0x0] } lcme_id: 2 lcme_mirror_id: 0 lcme_flags: init lcme_extent.e_start: 4194304 lcme_extent.e_end: EOF lmm_stripe_count: 1 lmm_stripe_size: 1048576 lmm_pattern: raid0 lmm_layout_gen: 0 lmm_stripe_offset: 0 lmm_objects: - 0: { l_ost_idx: 0, l_fid: [0x100000000:0x24e:0x0] } [root@cent7c02 lustre]# truncate --size 4194304 testdir/testfile; ls -la testdir/testfile -rw-r--r-- 1 root root 4194304 Jul 24 15:14 testdir/testfile
This is due to a slightly mixup in the write intent code between "end" for truncate, which is a size, and "end" for a normal write, which is actually "endpos", ie, the position of the write cursor after a write, which is not actually accessed and so does not need to be instantiated. But "end" for truncate is not endpos, it's end, ie, it's included.
Fix coming momentarily.