diff --git a/doc/src/sgml/logical-replication.sgml b/doc/src/sgml/logical-replication.sgml
index 4217a2e7dee..bfb9c2fb31c 100644
--- a/doc/src/sgml/logical-replication.sgml
+++ b/doc/src/sgml/logical-replication.sgml
@@ -2507,14 +2507,18 @@ CONTEXT: processing remote data for replication origin "pg_16395" during "INSER
- Note that commit timestamps and origin data are not preserved during the
- upgrade. Consequently, even with
+ Commit timestamps and origin data are not preserved during the upgrade.
+ As a result, even if
retain_conflict_info
- enabled, the upgraded subscriber might be unable to detect conflicts or log
+ is enabled, the upgraded subscriber may be unable to detect conflicts or log
relevant commit timestamps and origins when applying changes from the
- publisher occurring before or during the upgrade. To prevent this issue, the
- user must ensure that all potentially conflicting changes are fully
- replicated to the subscriber before proceeding with the upgrade.
+ publisher occurred before the upgrade especially if those changes were not
+ replicated. Additionally, immediately after the upgrade, the vacuum may
+ remove the deleted rows that are required for conflict detection. This can
+ affect the changes that were not replicated before the upgrade. To ensure
+ consistent conflict tracking, users should ensure that all potentially
+ conflicting changes are replicated to the subscriber before initiating the
+ upgrade.
diff --git a/doc/src/sgml/ref/create_subscription.sgml b/doc/src/sgml/ref/create_subscription.sgml
index e5ba669e075..ed835032d27 100644
--- a/doc/src/sgml/ref/create_subscription.sgml
+++ b/doc/src/sgml/ref/create_subscription.sgml
@@ -463,11 +463,11 @@ CREATE SUBSCRIPTION subscription_name
- Note that the information for conflict detection cannot be purged if
- the subscription is disabled; thus, the information will accumulate
- until the subscription is enabled. To prevent excessive accumulation,
- it is recommended to disable retain_conflict_info
- if the subscription will be inactive for an extended period.
+ Note that the information for conflict detection cannot be purged if
+ the subscription is disabled; thus, the information will accumulate
+ until the subscription is enabled. To prevent excessive accumulation,
+ it is recommended to disable retain_conflict_info
+ if the subscription will be inactive for an extended period.
diff --git a/src/bin/pg_upgrade/check.c b/src/bin/pg_upgrade/check.c
index 71314180535..5314e81390b 100644
--- a/src/bin/pg_upgrade/check.c
+++ b/src/bin/pg_upgrade/check.c
@@ -1966,7 +1966,10 @@ check_new_cluster_replication_slots(void)
int i_nslots_on_new;
int i_rci_slot_on_new;
- /* Logical slots can be migrated since PG17. */
+ /*
+ * Logical slots can be migrated since PG17 and a physical slot
+ * CONFLICT_DETECTION_SLOT can be migrated sing PG19.
+ */
if (GET_MAJOR_VERSION(old_cluster.major_version) <= 1600)
return;
@@ -2159,7 +2162,7 @@ check_old_cluster_for_valid_slots(void)
/*
* The name "pg_conflict_detection" (defined as
* CONFLICT_DETECTION_SLOT) has been reserved for logical
- * replication conflict detection since PG18.
+ * replication conflict detection slot since PG19.
*/
if (strcmp(slot->slotname, "pg_conflict_detection") == 0)
{
diff --git a/src/bin/pg_upgrade/pg_upgrade.c b/src/bin/pg_upgrade/pg_upgrade.c
index f6b967bc3a9..1b46293abc8 100644
--- a/src/bin/pg_upgrade/pg_upgrade.c
+++ b/src/bin/pg_upgrade/pg_upgrade.c
@@ -200,13 +200,25 @@ main(int argc, char **argv)
check_ok();
/*
- * Migrate the logical slots to the new cluster. Note that we need to do
- * this after resetting WAL because otherwise the required WAL would be
- * removed and slots would become unusable. There is a possibility that
- * background processes might generate some WAL before we could create the
- * slots in the new cluster but we can ignore that WAL as that won't be
- * required downstream. The conflict detection slots is not affected by
- * these concerns, but is created here for consistency.
+ * Migrate replication slots to the new cluster.
+ *
+ * Note that we must migrate logical slots after resetting WAL because
+ * otherwise the required WAL would be removed and slots would become
+ * unusable. There is a possibility that background processes might
+ * generate some WAL before we could create the slots in the new cluster
+ * but we can ignore that WAL as that won't be required downstream.
+ *
+ * The conflict detection slot is not affected by concerns related to
+ * WALs as it only retains the dead tuples. It is created here for
+ * consistency. Note that the new conflict detection slot uses the latest
+ * transaction ID as xmin, so it cannot protect dead tuples that existed
+ * before the upgrade. Additionally, commit timestamps and origin data
+ * are not preserved during the upgrade. So, even after creating the slot,
+ * the upgraded subscriber may be unable to detect conflicts or log
+ * relevant commit timestamps and origins when applying changes from the
+ * publisher occurred before the upgrade especially if those changes were
+ * not replicated. It can only protect tuples that might be deleted after
+ * the new cluster starts.
*/
if (count_old_cluster_logical_slots() ||
old_cluster.sub_retain_conflict_info)