mirror of
https://github.com/postgres/postgres.git
synced 2025-10-16 17:07:43 +03:00
Fix Coverity issue reported in commit a850be2fe
.
Address a potential SIGSEGV that may occur when the tablesync worker attempts to locate a deleted row while applying changes. This situation arises during conflict detection for update-deleted scenarios. To prevent this crash, ensure that the operation is errored out early if the leader apply worker is unavailable. Since the leader worker maintains the necessary conflict detection metadata, proceeding without it serves no purpose and risks reporting incorrect conflict type. In the passing, improve a nearby comment. Reported by Tom Lane as per Coverity Author: shveta malik <shveta.malik@gmail.com> Reviewed-by: Amit Kapila <amit.kapila16@gmail.com> Discussion: https://postgr.es/m/334468.1757280992@sss.pgh.pa.us
This commit is contained in:
@@ -3266,12 +3266,18 @@ FindDeletedTupleInLocalRel(Relation localrel, Oid localidxoid,
|
||||
|
||||
/*
|
||||
* Obtain the information from the leader apply worker as only the
|
||||
* leader manages conflict retention (see
|
||||
* leader manages oldest_nonremovable_xid (see
|
||||
* maybe_advance_nonremovable_xid() for details).
|
||||
*/
|
||||
LWLockAcquire(LogicalRepWorkerLock, LW_SHARED);
|
||||
leader = logicalrep_worker_find(MyLogicalRepWorker->subid,
|
||||
InvalidOid, false);
|
||||
if (!leader)
|
||||
{
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
|
||||
errmsg("could not detect conflict as the leader apply worker has exited")));
|
||||
}
|
||||
|
||||
SpinLockAcquire(&leader->relmutex);
|
||||
oldestxmin = leader->oldest_nonremovable_xid;
|
||||
|
Reference in New Issue
Block a user