postgrespro.git / summary / log / commit / refs

commit    5b0ce3ec334bb65bbab4aba78f204f986c356e80
Author:   Thomas Munro <tmunro@postgresql.org>
Date:     Thu Nov 15 03:25:30 2018 +0000

    Increase the number of possible random seeds per time period.
    
    Commit 197e4af9 refactored the initialization of the libc random()
    seed, but reduced the number of possible seeds values that could be
    chosen in a given time period.  This negation of the effects of
    commit 98c50656c was unintentional.  Replace with code that
    shifts the fast moving timestamp bits left, similar to the original
    algorithm (though not the previous float-tolerating coding, which
    is no longer necessary).
    
    Author: Thomas Munro
    Reported-by: Noah Misch
    Reviewed-by: Tom Lane
    Discussion: https://postgr.es/m/20181112083358.GA1073796%40rfd.leadboat.com


src/backend/postmaster/postmaster.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c index 688f462e7d..981a058522 100644 --- a/src/backend/postmaster/postmaster.c +++ b/src/backend/postmaster/postmaster.c @@ -2525,8 +2525,16 @@ InitProcessGlobals(void) random_start_time.tv_usec = 0; #endif - /* Set a different seed for random() in every backend. */ - srandom((unsigned int) MyProcPid ^ (unsigned int) MyStartTimestamp); + /* + * Set a different seed for random() in every backend. Since PIDs and + * timestamps tend to change more frequently in their least significant + * bits, shift the timestamp left to allow a larger total number of seeds + * in a given time period. Since that would leave only 20 bits of the + * timestamp that cycle every ~1 second, also mix in some higher bits. + */ + srandom(((unsigned int) MyProcPid) ^ + ((unsigned int) MyStartTimestamp << 12) ^ + ((unsigned int) MyStartTimestamp >> 20)); } [parent: aa5518304213]