| From: | Imran Zaheer <imran(dot)zhir(at)gmail(dot)com> |
|---|---|
| To: | Daniel Gustafsson <daniel(at)yesql(dot)se> |
| Cc: | Peter Eisentraut <peter(at)eisentraut(dot)org>, PostgreSQL Hackers <pgsql-hackers(at)postgresql(dot)org> |
| Subject: | Re: Move system identifier generation to a common helper |
| Date: | 2026-06-25 06:06:02 |
| Message-ID: | CA+UBfa=BjJr1PQKSUKNUKniR9HST7+Zk-T-3v2FHQhK6hjshnw@mail.gmail.com |
| Views: | Whole Thread | Raw Message | Download mbox | Resend email |
| Thread: | |
| Lists: | pgsql-hackers |
On Thu, Jun 11, 2026 at 1:29 AM Daniel Gustafsson <daniel(at)yesql(dot)se> wrote:
>
> > On 10 Jun 2026, at 15:25, Peter Eisentraut <peter(at)eisentraut(dot)org> wrote:
> >
> > On 04.06.26 14:22, Imran Zaheer wrote:
> >> The code used to generate a new system identifier is duplicated in
> >> multiple locations, including BootStrapXLOG(), pg_createsubscriber, and
> >> pg_resetwal.
> >> Move the generation logic into a common GenerateSystemIdentifier()
> >> helper so that all callers use a single implementation, avoiding
> >> duplication of the same algorithm.
> >
> > Then again, this code is from PG 8.0. We have had pg_strong_random() required since PG 12. Maybe we should use that now for this.
>
> One feature of the current scheme is that it's explicitly not random, but can
> be reverse-engineered to figure out the init time. Maybe we should have a
> better way of doing that regardless, but it doesn't seem like a bad feature to
> keep.
>
> --
> Daniel Gustafsson
>
Hi,
The ability to extract init time can be useful for debugging purposes.
```
postgres=# SELECT to_timestamp(system_identifier >> 32) AS
cluster_init_time FROM pg_control_system();
cluster_init_time
------------------------
2026-06-05 17:12:07+05
(1 row)
```
To preserve this while improving the uniqueness, we could keep the
upper 32 bit (tv_sec) and replace the lower half (tv_usec + PID) with
pg_strong_random().
```
+ struct timeval tv;
+ uint64 sysidentifier;
+ uint32 random_bits;
+
+ gettimeofday(&tv, NULL);
+ sysidentifier = ((uint64) tv.tv_sec) << 32;
+
+ if (!pg_strong_random(&random_bits, sizeof(random_bits)))
+ {
+ #ifndef FRONTEND
+ elog(PANIC, "could not generate random bytes for system identifier");
+ #else
+ pg_fatal("could not generate random bytes for system identifier");
+ #endif
+ }
+
+ sysidentifier |= (uint64) random_bits;
```
thoughts?
| From | Date | Subject | |
|---|---|---|---|
| Next Message | shveta malik | 2026-06-25 06:07:52 | Re: Proposal: Conflict log history table for Logical Replication |
| Previous Message | Chao Li | 2026-06-25 06:03:00 | Re: doc: fix pg_stat_autovacuum_scores threshold wording |