RS_EPHEMERAL vs RS_TEMPORARY
I'm trying to figure out what's specific about RS_EPHEMERAL and RS_TEMPORARY
slot kinds. The following comment (see definition of the
ReplicationSlotPersistency enumeration) tells when each kind is dropped
* Slots marked as PERSISTENT are crash-safe and will not be dropped when
* released. Slots marked as EPHEMERAL will be dropped when released or after
* restarts. Slots marked TEMPORARY will be dropped at the end of a session
* or on error.
...
typedef enum ReplicationSlotPersistency
However I don't see the actual difference: whenever ReplicationSlotCleanup()
is called (on error or session end), ReplicationSlotRelease() has already been
called too. And as for server restart, I see that RestoreSlotFromDisk()
discards both EPHEMERAL and TEMPORARY. Do we really need both of them?
--
Antonin Houska
Web: https://www.cybertec-postgresql.com
On 2020-02-25 08:30, Antonin Houska wrote:
I'm trying to figure out what's specific about RS_EPHEMERAL and RS_TEMPORARY
slot kinds. The following comment (see definition of the
ReplicationSlotPersistency enumeration) tells when each kind is dropped
The general idea is that an "ephemeral" slot is a future persistent slot
that is not completely initialized yet. If there is a crash and you
find an ephemeral slot, you can clean it up. The name is perhaps a bit
odd, you can think of it as an uninitialized one. A temporary slot is
one that behaves like a temporary table: It is removed at the end of a
session.
Perhaps the implementation differences are not big or are none, but it's
relevant for reporting. For example, the pg_replication_slots view
shows which slots are temporary. You wouldn't want to show an ephemeral
slot as temporary.
--
Peter Eisentraut http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
Peter Eisentraut <peter.eisentraut@2ndquadrant.com> wrote:
On 2020-02-25 08:30, Antonin Houska wrote:
I'm trying to figure out what's specific about RS_EPHEMERAL and RS_TEMPORARY
slot kinds. The following comment (see definition of the
ReplicationSlotPersistency enumeration) tells when each kind is droppedThe general idea is that an "ephemeral" slot is a future persistent slot that
is not completely initialized yet. If there is a crash and you find an
ephemeral slot, you can clean it up. The name is perhaps a bit odd, you can
think of it as an uninitialized one. A temporary slot is one that behaves
like a temporary table: It is removed at the end of a session.Perhaps the implementation differences are not big or are none, but it's
relevant for reporting. For example, the pg_replication_slots view shows
which slots are temporary. You wouldn't want to show an ephemeral slot as
temporary.
ok, so only comments seem to be the problem.
Anyway, the reason I started to think about it was that I noticed an Assert()
statement I considered inaccurate. Does this patch make sense?
--
Antonin Houska
Web: https://www.cybertec-postgresql.com
Attachments:
repl_slot_persist_assert.patchtext/plainDownload
@@ -682,7 +682,7 @@ ReplicationSlotPersist(void)
ReplicationSlot *slot = MyReplicationSlot;
Assert(slot != NULL);
- Assert(slot->data.persistency != RS_PERSISTENT);
+ Assert(slot->data.persistency == RS_EPHEMERAL);
SpinLockAcquire(&slot->mutex);
slot->data.persistency = RS_PERSISTENT;