]> git.ipfire.org Git - thirdparty/public-inbox.git/commitdiff
git: calculate MAX_INFLIGHT properly in Perl
authorEric Wong <e@80x24.org>
Fri, 29 Sep 2023 02:44:06 +0000 (02:44 +0000)
committerEric Wong <e@80x24.org>
Fri, 29 Sep 2023 06:58:09 +0000 (06:58 +0000)
Unlike C, Perl automatically converts quotients to double-precision
floating point even with UV/IV numerators and denominators.  So
force the intermediate quotient to be an integer before
multiplying it by the size of each inflight array element.

This bug was inconsequential for all platforms since d4ba8828ab23f278
(git: fix asynchronous batching for deep pipelines, 2023-01-04)
and inconsequential on most (or all?) Linux even before that due
to the larger 4096-byte PIPE_BUF on Linux.

lib/PublicInbox/Git.pm
t/git.t

index 764e38d7daabc16a01195b09f5c5086827b627d8..53887e3d4b1ba5810fddb8ce31a7532d5949e7aa 100644 (file)
@@ -35,10 +35,10 @@ my @MODIFIED_DATE = qw[for-each-ref --sort=-committerdate
                        --format=%(committerdate:raw) --count=1];
 
 # 512: POSIX PIPE_BUF minimum (see pipe(7))
-# 3: @$inflight is flattened [ $OID, $cb, $arg ]
 # 65: SHA-256 hex size + "\n" in preparation for git using non-SHA1
+# 3: @$inflight is flattened [ $OID, $cb, $arg ]
 use constant {
-       MAX_INFLIGHT => 512 * 3 / (65 + length('contents ')),
+       MAX_INFLIGHT => int(512 / (65 + length('contents '))) * 3,
        BATCH_CMD_VER => v2.36.0, # git 2.36+
 };
 
diff --git a/t/git.t b/t/git.t
index dfa5eab21f41a2e07805088bcc1bdc4120a29ca6..bde6d35b8410564cc975b997f5a45ae331433d7f 100644 (file)
--- a/t/git.t
+++ b/t/git.t
@@ -8,6 +8,8 @@ my ($dir, $for_destroy) = tmpdir();
 use PublicInbox::Import;
 use POSIX qw(strftime);
 use PublicInbox::Git;
+is(PublicInbox::Git::MAX_INFLIGHT,
+       int(PublicInbox::Git::MAX_INFLIGHT), 'MAX_INFLIGHT is an integer');
 
 {
        PublicInbox::Import::init_bare($dir, 'master');