Commit c1669fd5 authored by Michael Paquier's avatar Michael Paquier

Fix instance of elog() called while holding a spinlock

This broke the project rule to not call any complex code while a
spinlock is held.  Issue introduced by b89e1510.

Discussion: https://postgr.es/m/20200602.161518.1399689010416646074.horikyota.ntt@gmail.com
Backpatch-through: 9.5
parent f88bd313
...@@ -972,6 +972,7 @@ LogicalIncreaseRestartDecodingForSlot(XLogRecPtr current_lsn, XLogRecPtr restart ...@@ -972,6 +972,7 @@ LogicalIncreaseRestartDecodingForSlot(XLogRecPtr current_lsn, XLogRecPtr restart
{ {
slot->candidate_restart_valid = current_lsn; slot->candidate_restart_valid = current_lsn;
slot->candidate_restart_lsn = restart_lsn; slot->candidate_restart_lsn = restart_lsn;
SpinLockRelease(&slot->mutex);
elog(DEBUG1, "got new restart lsn %X/%X at %X/%X", elog(DEBUG1, "got new restart lsn %X/%X at %X/%X",
(uint32) (restart_lsn >> 32), (uint32) restart_lsn, (uint32) (restart_lsn >> 32), (uint32) restart_lsn,
...@@ -979,18 +980,25 @@ LogicalIncreaseRestartDecodingForSlot(XLogRecPtr current_lsn, XLogRecPtr restart ...@@ -979,18 +980,25 @@ LogicalIncreaseRestartDecodingForSlot(XLogRecPtr current_lsn, XLogRecPtr restart
} }
else else
{ {
XLogRecPtr candidate_restart_lsn;
XLogRecPtr candidate_restart_valid;
XLogRecPtr confirmed_flush;
candidate_restart_lsn = slot->candidate_restart_lsn;
candidate_restart_valid = slot->candidate_restart_valid;
confirmed_flush = slot->data.confirmed_flush;
SpinLockRelease(&slot->mutex);
elog(DEBUG1, "failed to increase restart lsn: proposed %X/%X, after %X/%X, current candidate %X/%X, current after %X/%X, flushed up to %X/%X", elog(DEBUG1, "failed to increase restart lsn: proposed %X/%X, after %X/%X, current candidate %X/%X, current after %X/%X, flushed up to %X/%X",
(uint32) (restart_lsn >> 32), (uint32) restart_lsn, (uint32) (restart_lsn >> 32), (uint32) restart_lsn,
(uint32) (current_lsn >> 32), (uint32) current_lsn, (uint32) (current_lsn >> 32), (uint32) current_lsn,
(uint32) (slot->candidate_restart_lsn >> 32), (uint32) (candidate_restart_lsn >> 32),
(uint32) slot->candidate_restart_lsn, (uint32) candidate_restart_lsn,
(uint32) (slot->candidate_restart_valid >> 32), (uint32) (candidate_restart_valid >> 32),
(uint32) slot->candidate_restart_valid, (uint32) candidate_restart_valid,
(uint32) (slot->data.confirmed_flush >> 32), (uint32) (confirmed_flush >> 32),
(uint32) slot->data.confirmed_flush (uint32) confirmed_flush);
);
} }
SpinLockRelease(&slot->mutex);
/* candidates are already valid with the current flush position, apply */ /* candidates are already valid with the current flush position, apply */
if (updated_lsn) if (updated_lsn)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment