Uno scenario interessante su cui mi è capitato di lavorare riguarda l’utilizzo di una sequence in un database Postgres. In un applicazione containerizzata con Docker era prevista un’operazione di reboot del sistema operativo, la quale eseguiva il riavvio della macchina host su cui erano in esecuzione i container. La cosa bizzarra è che a seguito del riavvio, la sequence veniva incrementata di un valore pari a quello indicato nel campo log_cnt della tabella della sequence.
Esempio pratico
Questo esempio è preso dal caso reale che ho affrontato. Come prima cosa, quando interroghiamo la sequence per verificarne lo stato corrente utilizzando questa query
SELECT * FROM sequence_name;
Otteniamo un risultato simile al seguente
last_value | log_cnt | is_called
------------+---------+-----------
1 | 32 | t
(1 row)
log_cnt
è 32.
La cosa anomala si verificava al riavvio della macchina host mediante questo comando
dbus-send --system --print-reply --dest=org.freedesktop.login1 /org/freedesktop/login1 "org.freedesktop.login1.Manager.Reboot" boolean:true'
last_value
era 33 ossia log_cnt + last_value
.
last_value | log_cnt | is_called
------------+---------+-----------
33 | 0 | t
(1 row)
Per maggiori approfondimenti tecnici invito a prendere visione di questa domanda su stackoverflow: https://stackoverflow.com/questions/66456952/what-does-log-cnt-mean-in-the-postgres-sequence.
Per una soluzione pratica, è sufficiente, prima del riavvio della macchina host, arrestare il container dove è in esecuzione Postgres, affinché l’evento di reboot della macchina non venga interpretato come un crash di sistema e gestito quindi da Postgres con un restore della sequence al valore last_value + log_cnt
.