Subject: RE: [BUG] 2.44.0 t7704.9 Fails on NonStop ia64

From: <[email-masked]>
Date: Sun, 25 Feb 2024 14:08:35 -0500

On Sunday, February 25, 2024 1:45 PM, I wrote:
>To: [email-masked]
>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:[email-masked]
> 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) Enumerating
cruft
>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);