On July 30, 2019 3:45 PM, Jeff King wrote:
> To: Randall S. Becker <[email protected]>
> Cc: 'Junio C Hamano' <[email protected]>; [email protected]; git-
> [email protected]
> Subject: Re: [ANNOUNCE] Git v2.23.0-rc0 - Initial test failures on NonStop
>
> On Tue, Jul 30, 2019 at 01:08:37PM -0400, Randall S. Becker wrote:
>
> > t0016: oidmap
> >
> > Subtest 6 had an ordering issue. We do not know whether the problem is
> the code or the test result not keeping up with the code changes.
> > --- expect 2019-07-30 16:56:36 +0000
> > +++ actual 2019-07-30 16:56:36 +0000
> > @@ -1,6 +1,6 @@
> > NULL
> > NULL
> > NULL
> > +7c7cd714e262561f73f3079dfca4e8724682ac21 3
> > 139b20d8e6c5b496de61f033f642d0e3dbff528d 2
> > d79ce1670bdcb76e6d1da2ae095e890ccb326ae9 1
> > -7c7cd714e262561f73f3079dfca4e8724682ac21 3
>
> This one is very curious. It's iterating a hash, which _seems_ like it would
> produce non-deterministic output. But neither this test nor the hashmap test
> it is based on sorts the output, and they pass consistently for me. I assume
> that's because while hash ordering is not guaranteed, it happens to be the
> same as long the pattern of inserts is the same (with our implementation,
> which does not do any hash randomization).
>
> But I am scratching my head as to what could be different on your platform
> that would cause a different ordering (especially when the hashmap test this
> is based on doesn't get one!).
>
> I guess in some sense it may not be worth tracking down, and we should just
> sort the output of a hash iteration unconditionally when comparing it to
> expected output.
Definitely a head scratcher. Is it possible that the bucket() function, which
uses
key->hash & (map->tablesize - 1);
might better use
key->hash % (map->tablesize - 1);
I have not seen a bucket computation done this way before so that surprised me,
not that it should make a difference on hash-determinism. The only thing that
might is an uninitialized stack variable, which on this platform's C compiler
will not initialize. Global statics are always 0 unless otherwise specified,
but I'm not sure about stack-local (but there's nothing wrong I can see in
hashmap.c on those points.
Sorting the output seems like a safe option, providing that the hash is itself
demonstrably solid otherwise.
Cheers,
Randall