RE: [BUG] 2.44.0 t7704.9 Fails on NonStop ia64
From: <hidden>
Date: 2024-02-25 19:08:43
On Sunday, February 25, 2024 1:45 PM, I wrote:
To: git@vger.kernel.org Subject: [BUG] 2.44.0 t7704.9 Fails on NonStop ia64 This appears to be a new issue introduced at 2.44.0. It only occurs on
NonStop ia64
but not on x86. I am not sure why this is happening although 1Mb exceeds
the
single I/O size on this machine.
expecting success of 7704.9 '--max-cruft-size with pruning':
git init max-cruft-size-prune &&
(
cd max-cruft-size-prune &&
test_commit base &&
foo="$(generate_random_blob foo $((1024*1024)))" &&
bar="$(generate_random_blob bar $((1024*1024)))" &&
baz="$(generate_random_blob baz $((1024*1024)))" &&
test-tool chmtime -10000 "$objdir/$(test_oid_to_path"$foo")" &&
git repack -d --cruft --max-cruft-size=1M &&
# backdate the mtimes of all cruft packs to validate
# that they were rewritten as a result of pruning
ls $packdir/pack-*.mtimes | sort >cruft.before &&
for cruft in $(cat cruft.before)
do
mtime="$(test-tool chmtime --get -10000 "$cruft")"
&&
echo $cruft $mtime >>mtimes || return 1
done &&
# repack (and prune) with a --max-cruft-size to ensure
# that we appropriately split the resulting set of packs
git repack -d --cruft --max-cruft-size=1M \
--cruft-expiration=10.seconds.ago &&
ls $packdir/pack-*.mtimes | sort >cruft.after &&
for cruft in $(cat cruft.after)
do
old_mtime="$(grep $cruft mtimes | cut -d" " -f2)"&&
new_mtime="$(test-tool chmtime --get $cruft)" &&
test $old_mtime -lt $new_mtime || return 1
done &&
test_line_count = 3 cruft.before &&
test_line_count = 2 cruft.after &&
test_must_fail git cat-file -e $foo &&
git cat-file -e $bar &&
git cat-file -e $baz
)
Initialized empty Git repository in
/home/ituglib/randall/jenkins/.jenkins/workspace/Git_Pipeline/t/trash
directory.t7704-repack-cruft/max-cruft-size-prune/.git/
[master (root-commit) d1ff1c9] base
Author: A U Thor mailto:author@example.com
1 file changed, 1 insertion(+)
create mode 100644 base.t
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Writing objects: 100% (3/3), done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0) Enumeratingcruft
objects: 6, done. Counting objects: 100% (3/3), done. Compressing objects: 100% (3/3), done. Writing objects: 100% (3/3), done. Total 3 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0) Enumerating
objects: 3,
done. Counting objects: 100% (3/3), done. Writing objects: 100% (3/3), done. Total 3 (delta 0), reused 3 (delta 0), pack-reused 0 (from 0) ls: cannot access '.git/objects/pack/pack-*.mtimes': No such file or
directory
test_line_count: line count for cruft.after != 2 not ok 9 -
--max-cruft-size with
pruning # # git init max-cruft-size-prune && # ( # cd max-cruft-size-prune && # # test_commit base && # foo="$(generate_random_blob foo $((1024*1024)))" && # bar="$(generate_random_blob bar $((1024*1024)))" && # baz="$(generate_random_blob baz $((1024*1024)))" && # # test-tool chmtime -10000
"$objdir/$(test_oid_to_path
"$foo")" && # # git repack -d --cruft --max-cruft-size=1M && # # # backdate the mtimes of all cruft packs to
validate
# # that they were rewritten as a result of pruning # ls $packdir/pack-*.mtimes | sort >cruft.before && # for cruft in $(cat cruft.before) # do # mtime="$(test-tool chmtime --get -10000 "$cruft")" && # echo $cruft $mtime >>mtimes || return 1 # done && # # # repack (and prune) with a --max-cruft-size to ensure # # that we appropriately split the resulting set of packs # git repack -d --cruft --max-cruft-size=1M \ # --cruft-expiration=10.seconds.ago && # ls $packdir/pack-*.mtimes | sort >cruft.after && # # for cruft in $(cat cruft.after) # do # old_mtime="$(grep $cruft mtimes | cut -d" " -f2)" && # new_mtime="$(test-tool chmtime --get $cruft)" && # test $old_mtime -lt $new_mtime || return 1 # done && # # test_line_count = 3 cruft.before && # test_line_count = 2 cruft.after && # test_must_fail git cat-file -e $foo && # git cat-file -e $bar && # git cat-file -e $baz # ) # 1..9
I did find the following calls to write(), one of which might be involved. write() should not be used directly unless the count is clearly very small. Xwrite() should be used instead. There are other calls but those are either small or not on platform. reftable/writer.c: int n = w->write(w->write_arg, zeroed, w->pending_padding); reftable/writer.c: n = w->write(w->write_arg, data, len); run-command.c: len = write(io->fd, io->u.out.buf, t/helper/test-path-utils.c: if (write(1, buffer, count) < 0) t/helper/test-windows-named-pipe.c: write(1, buf, nbr); t/helper/test-windows-named-pipe.c: write(1, buf, nbr); trace2/tr2_dst.c: bytes = write(fd, buf_line->buf, buf_line->len);