mirror of
https://github.com/postgres/postgres.git
synced 2025-07-27 12:41:57 +03:00
Restart the apply worker if the privileges have been revoked.
Restart the apply worker if the subscription owner's superuser privileges have been revoked. This is required so that the subscription connection string gets revalidated and use the password option to connect to the publisher for non-superusers, if required. Author: Vignesh C Reviewed-by: Amit Kapila Discussion: http://postgr.es/m/CALDaNm2Dxmhq08nr4P6G+24QvdBo_GAVyZ_Q1TcGYK+8NHs9xw@mail.gmail.com
This commit is contained in:
@ -1275,13 +1275,11 @@ LogicalRepSyncTableStart(XLogRecPtr *origin_startpos)
|
||||
relstate = GetSubscriptionRelState(MyLogicalRepWorker->subid,
|
||||
MyLogicalRepWorker->relid,
|
||||
&relstate_lsn);
|
||||
CommitTransactionCommand();
|
||||
|
||||
/* Is the use of a password mandatory? */
|
||||
must_use_password = MySubscription->passwordrequired &&
|
||||
!superuser_arg(MySubscription->owner);
|
||||
|
||||
/* Note that the superuser_arg call can access the DB */
|
||||
CommitTransactionCommand();
|
||||
!MySubscription->ownersuperuser;
|
||||
|
||||
SpinLockAcquire(&MyLogicalRepWorker->relmutex);
|
||||
MyLogicalRepWorker->relstate = relstate;
|
||||
|
@ -3966,6 +3966,24 @@ maybe_reread_subscription(void)
|
||||
apply_worker_exit();
|
||||
}
|
||||
|
||||
/*
|
||||
* Exit if the subscription owner's superuser privileges have been
|
||||
* revoked.
|
||||
*/
|
||||
if (!newsub->ownersuperuser && MySubscription->ownersuperuser)
|
||||
{
|
||||
if (am_parallel_apply_worker())
|
||||
ereport(LOG,
|
||||
errmsg("logical replication parallel apply worker for subscription \"%s\" will stop because the subscription owner's superuser privileges have been revoked",
|
||||
MySubscription->name));
|
||||
else
|
||||
ereport(LOG,
|
||||
errmsg("logical replication worker for subscription \"%s\" will restart because the subscription owner's superuser privileges have been revoked",
|
||||
MySubscription->name));
|
||||
|
||||
apply_worker_exit();
|
||||
}
|
||||
|
||||
/* Check for other changes that should never happen too. */
|
||||
if (newsub->dbid != MySubscription->dbid)
|
||||
{
|
||||
@ -4492,13 +4510,11 @@ run_apply_worker()
|
||||
replorigin_session_setup(originid, 0);
|
||||
replorigin_session_origin = originid;
|
||||
origin_startpos = replorigin_session_get_progress(false);
|
||||
CommitTransactionCommand();
|
||||
|
||||
/* Is the use of a password mandatory? */
|
||||
must_use_password = MySubscription->passwordrequired &&
|
||||
!superuser_arg(MySubscription->owner);
|
||||
|
||||
/* Note that the superuser_arg call can access the DB */
|
||||
CommitTransactionCommand();
|
||||
!MySubscription->ownersuperuser;
|
||||
|
||||
LogRepWorkerWalRcvConn = walrcv_connect(MySubscription->conninfo, true,
|
||||
must_use_password,
|
||||
@ -4621,11 +4637,18 @@ InitializeLogRepWorker(void)
|
||||
SetConfigOption("synchronous_commit", MySubscription->synccommit,
|
||||
PGC_BACKEND, PGC_S_OVERRIDE);
|
||||
|
||||
/* Keep us informed about subscription changes. */
|
||||
/*
|
||||
* Keep us informed about subscription or role changes. Note that the
|
||||
* role's superuser privilege can be revoked.
|
||||
*/
|
||||
CacheRegisterSyscacheCallback(SUBSCRIPTIONOID,
|
||||
subscription_change_cb,
|
||||
(Datum) 0);
|
||||
|
||||
CacheRegisterSyscacheCallback(AUTHOID,
|
||||
subscription_change_cb,
|
||||
(Datum) 0);
|
||||
|
||||
if (am_tablesync_worker())
|
||||
ereport(LOG,
|
||||
(errmsg("logical replication table synchronization worker for subscription \"%s\", table \"%s\" has started",
|
||||
|
Reference in New Issue
Block a user