fixes_for_v11.patch
application/octet-stream
Filename: fixes_for_v11.patch
Type: application/octet-stream
Part: 0
Patch
Format: unified
Series: patch v11
| File | + | − |
|---|---|---|
| doc/src/sgml/logical-replication.sgml | 2 | 2 |
| src/backend/executor/execReplication.c | 5 | 4 |
| src/backend/replication/logical/conflict.c | 9 | 3 |
| src/backend/replication/logical/worker.c | 6 | 3 |
| src/include/replication/conflict.h | 8 | 4 |
| src/test/subscription/t/013_partition.pl | 7 | 3 |
diff --git a/doc/src/sgml/logical-replication.sgml b/doc/src/sgml/logical-replication.sgml
index 57216d6c52..cd92f6a7d5 100644
--- a/doc/src/sgml/logical-replication.sgml
+++ b/doc/src/sgml/logical-replication.sgml
@@ -1595,8 +1595,8 @@ test_sub=# SELECT * FROM t1 ORDER BY id;
unique constraint. Note that to log the origin and commit
timestamp details of the conflicting key,
<link linkend="guc-track-commit-timestamp"><varname>track_commit_timestamp</varname></link>
- should be enabled. In this case, an error will be raised until the
- conflict is resolved manually.
+ should be enabled on the subscriber. In this case, an error will be
+ raised until the conflict is resolved manually.
</para>
</listitem>
</varlistentry>
diff --git a/src/backend/executor/execReplication.c b/src/backend/executor/execReplication.c
index 09b51706db..b8a6de5eca 100644
--- a/src/backend/executor/execReplication.c
+++ b/src/backend/executor/execReplication.c
@@ -549,8 +549,9 @@ CheckAndReportConflict(ResultRelInfo *resultRelInfo, EState *estate,
TransactionId xmin;
GetTupleTransactionInfo(conflictslot, &xmin, &origin, &committs);
- ReportApplyConflict(ERROR, type, resultRelInfo->ri_RelationDesc, uniqueidx,
- xmin, origin, committs, conflictslot);
+ ReportApplyConflict(ERROR, type, resultRelInfo->ri_RelationDesc,
+ uniqueidx, xmin, origin, committs,
+ conflictslot);
}
}
}
@@ -623,8 +624,8 @@ ExecSimpleRelationInsert(ResultRelInfo *resultRelInfo,
*
* XXX OTOH, this could lead to clean-up effort for dead tuples added
* in heap and index in case of conflicts. But as conflicts shouldn't
- * be a frequent thing so we preferred to save the performance overhead
- * of extra scan before each insertion.
+ * be a frequent thing so we preferred to save the performance
+ * overhead of extra scan before each insertion.
*/
if (conflict)
CheckAndReportConflict(resultRelInfo, estate, CT_INSERT_EXISTS,
diff --git a/src/backend/replication/logical/conflict.c b/src/backend/replication/logical/conflict.c
index c69194244c..27e7cb1950 100644
--- a/src/backend/replication/logical/conflict.c
+++ b/src/backend/replication/logical/conflict.c
@@ -20,7 +20,7 @@
#include "utils/lsyscache.h"
#include "utils/rel.h"
-const char *const ConflictTypeNames[] = {
+static const char *const ConflictTypeNames[] = {
[CT_INSERT_EXISTS] = "insert_exists",
[CT_UPDATE_DIFFER] = "update_differ",
[CT_UPDATE_EXISTS] = "update_exists",
@@ -211,9 +211,15 @@ errdetail_apply_conflict(ConflictType type, Oid conflictidx,
}
case CT_DELETE_MISSING:
return errdetail("Did not find the row to be deleted.");
- }
- return 0; /* silence compiler warning */
+ /*
+ * XXX should we add a default behavior instead of just returning zero?
+ * This style can detect mistakes of coding.
+ */
+ default:
+ elog(ERROR, "unexpected conflict type: %d", (int) type);
+ return 0; /* silence compiler warning */
+ }
}
/*
diff --git a/src/backend/replication/logical/worker.c b/src/backend/replication/logical/worker.c
index b09d780fc5..105af9775c 100644
--- a/src/backend/replication/logical/worker.c
+++ b/src/backend/replication/logical/worker.c
@@ -2668,7 +2668,8 @@ apply_handle_update_internal(ApplyExecutionData *edata,
TimestampTz localts;
/*
- * Report the conflict if the tuple was modified by a different origin.
+ * Report the conflict if the tuple was modified by a different
+ * origin.
*/
if (GetTupleTransactionInfo(localslot, &localxmin, &localorigin, &localts) &&
localorigin != replorigin_session_origin)
@@ -2824,7 +2825,8 @@ apply_handle_delete_internal(ApplyExecutionData *edata,
TimestampTz localts;
/*
- * Report the conflict if the tuple was modified by a different origin.
+ * Report the conflict if the tuple was modified by a different
+ * origin.
*/
if (GetTupleTransactionInfo(localslot, &localxmin, &localorigin, &localts) &&
localorigin != replorigin_session_origin)
@@ -3036,7 +3038,8 @@ apply_handle_tuple_routing(ApplyExecutionData *edata,
}
/*
- * Report the conflict if the tuple was modified by a different origin.
+ * Report the conflict if the tuple was modified by a
+ * different origin.
*/
if (GetTupleTransactionInfo(localslot, &localxmin, &localorigin, &localts) &&
localorigin != replorigin_session_origin)
diff --git a/src/include/replication/conflict.h b/src/include/replication/conflict.h
index e9ba6818fc..1d466c3cad 100644
--- a/src/include/replication/conflict.h
+++ b/src/include/replication/conflict.h
@@ -45,12 +45,16 @@ typedef enum
*/
} ConflictType;
-extern bool GetTupleTransactionInfo(TupleTableSlot *localslot, TransactionId *xmin,
- RepOriginId *localorigin, TimestampTz *localts);
+extern bool GetTupleTransactionInfo(TupleTableSlot *localslot,
+ TransactionId *xmin,
+ RepOriginId *localorigin,
+ TimestampTz *localts);
extern void ReportApplyConflict(int elevel, ConflictType type,
Relation localrel, Oid conflictidx,
- TransactionId localxmin, RepOriginId localorigin,
- TimestampTz localts, TupleTableSlot *conflictslot);
+ TransactionId localxmin,
+ RepOriginId localorigin,
+ TimestampTz localts,
+ TupleTableSlot *conflictslot);
extern void InitConflictIndexes(ResultRelInfo *relInfo);
#endif
diff --git a/src/test/subscription/t/013_partition.pl b/src/test/subscription/t/013_partition.pl
index 896985d85b..e26f26acc5 100644
--- a/src/test/subscription/t/013_partition.pl
+++ b/src/test/subscription/t/013_partition.pl
@@ -786,10 +786,12 @@ ok( $logfile =~
# Enable the track_commit_timestamp to detect the conflict when attempting
# to update a row that was previously modified by a different origin.
-$node_subscriber1->append_conf('postgresql.conf', 'track_commit_timestamp = on');
+$node_subscriber1->append_conf('postgresql.conf',
+ 'track_commit_timestamp = on');
$node_subscriber1->restart;
-$node_subscriber1->safe_psql('postgres', "INSERT INTO tab2 VALUES (3, 'yyy')");
+$node_subscriber1->safe_psql('postgres',
+ "INSERT INTO tab2 VALUES (3, 'yyy')");
$node_publisher->safe_psql('postgres',
"UPDATE tab2 SET b = 'quux' WHERE a = 3");
@@ -800,7 +802,9 @@ ok( $logfile =~
qr/conflict update_differ detected on relation "public.tab2_1".*\n.*DETAIL:.* Updating a row that was modified locally in transaction [0-9]+ at .*/,
'updating a tuple that was modified by a different origin');
-$node_subscriber1->append_conf('postgresql.conf', 'track_commit_timestamp = off');
+# The remaining tests no longer test conflict detection.
+$node_subscriber1->append_conf('postgresql.conf',
+ 'track_commit_timestamp = off');
$node_subscriber1->restart;
# Test that replication continues to work correctly after altering the