diff options
author | Michael Paquier <michael@paquier.xyz> | 2020-06-04 10:18:27 +0900 |
---|---|---|
committer | Michael Paquier <michael@paquier.xyz> | 2020-06-04 10:18:27 +0900 |
commit | 4a9809e34d091881fd8bf6b72ded44eb50693b8d (patch) | |
tree | ff7de988898efde6ca837ccd9de360dfc03db919 | |
parent | a8c6eb5b4c4cf3470159a0b4b3fd2f2942b7909b (diff) | |
download | postgresql-4a9809e34d091881fd8bf6b72ded44eb50693b8d.tar.gz postgresql-4a9809e34d091881fd8bf6b72ded44eb50693b8d.zip |
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 b89e151.
Discussion: https://postgr.es/m/20200602.161518.1399689010416646074.horikyota.ntt@gmail.com
Backpatch-through: 9.5
-rw-r--r-- | src/backend/replication/logical/logical.c | 24 |
1 files changed, 16 insertions, 8 deletions
diff --git a/src/backend/replication/logical/logical.c b/src/backend/replication/logical/logical.c index 77a73bd3d1e..0b005dcfe35 100644 --- a/src/backend/replication/logical/logical.c +++ b/src/backend/replication/logical/logical.c @@ -870,6 +870,7 @@ LogicalIncreaseRestartDecodingForSlot(XLogRecPtr current_lsn, XLogRecPtr restart { slot->candidate_restart_valid = current_lsn; slot->candidate_restart_lsn = restart_lsn; + SpinLockRelease(&slot->mutex); elog(DEBUG1, "got new restart lsn %X/%X at %X/%X", (uint32) (restart_lsn >> 32), (uint32) restart_lsn, @@ -877,18 +878,25 @@ LogicalIncreaseRestartDecodingForSlot(XLogRecPtr current_lsn, XLogRecPtr restart } 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", (uint32) (restart_lsn >> 32), (uint32) restart_lsn, (uint32) (current_lsn >> 32), (uint32) current_lsn, - (uint32) (slot->candidate_restart_lsn >> 32), - (uint32) slot->candidate_restart_lsn, - (uint32) (slot->candidate_restart_valid >> 32), - (uint32) slot->candidate_restart_valid, - (uint32) (slot->data.confirmed_flush >> 32), - (uint32) slot->data.confirmed_flush - ); + (uint32) (candidate_restart_lsn >> 32), + (uint32) candidate_restart_lsn, + (uint32) (candidate_restart_valid >> 32), + (uint32) candidate_restart_valid, + (uint32) (confirmed_flush >> 32), + (uint32) confirmed_flush); } - SpinLockRelease(&slot->mutex); /* candidates are already valid with the current flush position, apply */ if (updated_lsn) |