[pgpool-hackers: 4605] Re: Shuffle random functions and use better random numbers
Tatsuo Ishii
ishii at postgresql.org
Thu Jun 5 19:07:13 JST 2025
> In general looks good to me, however, maybe rename prng_state to
> something like backsel_state, or something similar. That way it's
> more clear that it's a dedicated state for backend selection. Else
> it would be just as easy to use pg_prng.c's pg_global_prng_state
> variable. But that's just my colour bikeshed.
I think renaming prng_state is a good idea. In v3 patch I changed the
variable name to backsel_state as you suggested. Also I slightly
modified the commit message, and added "Author" field. I think now the
patch is commit-able shape.
If there's no objection, I will commit the patch.
Best regards,
--
Tatsuo Ishii
SRA OSS K.K.
English: http://www.sraoss.co.jp/index_en/
Japanese:http://www.sraoss.co.jp
> On Thu, 2025-05-29 at 10:33 +0900, Tatsuo Ishii wrote:
>> > > No strong objections, but some questions:
>> > > - Why put initialize_prng() inside do_child()? Wouldn't it make sense
>> > > to put it inside select_load_balancing_node() under a
>> > > `static int init` guard? That way people might not overlook to
>> > > initialize it if the prng code is used somewhere else, in another
>> > > process.
>>
>> Okay. I changed select_load_balancing_node() so that it has its own
>> prng state data and initialization. Fo the prng initialization I added
>> initialize_prng() in the same file, and remove the prng initialization
>> from do_child().
>>
>> > > - I'm not too fond of initializing the entire prng_state with random
>> > > crap. While it currently only holds two uint64 values that are
>> > > supposed to be random, it could cause major head scratching if with
>> > > some update adds a new non-random field to it. If nothing else it
>> > > just feels like bad practice. I'd suggest to something like
>> > > uint64 seed;
>> > > if (!pg_strong_random(&seed, sizeof(seed)))
>> > > seed = 1; /* Pick a value, as long as it spreads */
>>
>> Thanks. I did it in initialize_prng();
>>
>> > > pg_prng_seed(&pg_global_prng_state, seed);
>> > > - initialize_prng feels overengineered. If strong crypto fails why not
>> > > fall back to simply a value of 1, or simply crash? The goal is to
>> > > have an even spread over the backends, not that the distribution
>> > > follows a different path on each restart.
>>
>> Agreed. The complexity is not worth the trouble.
>>
>> Please see attached v2 patch.
>>
>> > I will answer them later on.
>> >
>> > >
>> > > For the rest no issues spotted from reading the code, but since
>> > > pg_prng.h is missing I can't compile/run test it.
>> > >
>> > > Martijn van Duren
>> > >
>> > > On Wed, 2025-05-21 at 15:58 +0900, Tatsuo Ishii wrote:
>> > > > > I have pushed the patch to master branch, with slightly modified
>> > > > > commit message, and credited you as a reviewer.
>> > > >
>> > > > Attached is the followup commit to import pg_prng.c and use
>> > > > pg_prng_double() for calculating a random number between 0 and 1.0.
>> > > > Actually pg_prng_double() generates a random number [0, 1.0) (1.0 is
>> > > > not inclusive), I think it's ok for our purpose.
>> > > >
>> > > > [ from the commit message]
>> > > >
>> > > > Other notes regarding the port:
>> > > >
>> > > > - pg_prng needs to be initialized using pg_prng_strong_seed() per
>> > > > process. Currently the only caller is child.c (per session
>> > > > process). If other process needs to use pg_prng, it needs the same
>> > > > initialization as child.c.
>> > > >
>> > > > - Some of functions in the file were not ported because they require
>> > > > additional library: pg_bitutils.c. In the future we may revisit and
>> > > > import pg_bitutils.c.
>> > > >
>> > > > - likely/unlikely are ignored. In the future we may revisit and import
>> > > > them.
>> > > >
>> > > > - All conditional compiling regarding "sun" or "_sun" are removed. It
>> > > > seems the platform is not used for running pgpool anymore.
>> > > >
>> > > > - Since srandom() is not necessary any more, related code are removed
>> > > > from pgpool_main.c, child.c and pcp_worker.c.
>> > > >
>> > > > Best regards,
>> > > > --
>> > > > Tatsuo Ishii
>> > > > SRA OSS K.K.
>> > > > English: http://www.sraoss.co.jp/index_en/
>> > > > Japanese:http://www.sraoss.co.jp
>> > >
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: v3-0001-Replace-random-with-pg_prng-random-function.patch
Type: application/octet-stream
Size: 20495 bytes
Desc: not available
URL: <http://www.pgpool.net/pipermail/pgpool-hackers/attachments/20250605/acf1020a/attachment-0001.obj>
More information about the pgpool-hackers
mailing list