*** a/src/backend/replication/syncrep.c
--- b/src/backend/replication/syncrep.c
***************
*** 368,373 **** SyncRepReleaseWaiters(void)
--- 368,374 ----
  {
  	volatile WalSndCtlData *walsndctl = WalSndCtl;
  	volatile WalSnd *syncWalSnd = NULL;
+ 	int			sync_standby = walsndctl->sync_standby;
  	int			numwrite = 0;
  	int			numflush = 0;
  	int			priority = 0;
***************
*** 392,411 **** SyncRepReleaseWaiters(void)
  	 */
  	LWLockAcquire(SyncRepLock, LW_EXCLUSIVE);
  
! 	for (i = 0; i < max_wal_senders; i++)
  	{
! 		/* use volatile pointer to prevent code rearrangement */
! 		volatile WalSnd *walsnd = &walsndctl->walsnds[i];
! 
! 		if (walsnd->pid != 0 &&
! 			walsnd->state == WALSNDSTATE_STREAMING &&
! 			walsnd->sync_standby_priority > 0 &&
! 			(priority == 0 ||
! 			 priority > walsnd->sync_standby_priority) &&
! 			!XLogRecPtrIsInvalid(walsnd->flush))
  		{
! 			priority = walsnd->sync_standby_priority;
! 			syncWalSnd = walsnd;
  		}
  	}
  
--- 393,422 ----
  	 */
  	LWLockAcquire(SyncRepLock, LW_EXCLUSIVE);
  
! 	if ( sync_standby != -1 &&
! 		 (walsndctl->walsnds[sync_standby]).pid != 0 &&
! 		 (walsndctl->walsnds[sync_standby]).sync_standby_priority <= MyWalSnd->sync_standby_priority)
  	{
! 		syncWalSnd = &walsndctl->walsnds[sync_standby];
! 	}
! 	else
! 	{
! 		for (i = 0; i < max_wal_senders; i++)
  		{
! 			/* use volatile pointer to prevent code rearrangement */
! 			volatile WalSnd *walsnd = &walsndctl->walsnds[i];
! 
! 			if (walsnd->pid != 0 &&
! 				walsnd->state == WALSNDSTATE_STREAMING &&
! 				walsnd->sync_standby_priority > 0 &&
! 				(priority == 0 ||
! 				 priority > walsnd->sync_standby_priority) &&
! 				!XLogRecPtrIsInvalid(walsnd->flush))
! 			{
! 				priority = walsnd->sync_standby_priority;
! 				syncWalSnd = walsnd;
! 				walsndctl->sync_standby = i;
! 			}
  		}
  	}
  
*** a/src/backend/replication/walsender.c
--- b/src/backend/replication/walsender.c
***************
*** 1876,1883 **** pg_stat_get_wal_senders(PG_FUNCTION_ARGS)
  	MemoryContext per_query_ctx;
  	MemoryContext oldcontext;
  	int		   *sync_priority;
- 	int			priority = 0;
- 	int			sync_standby = -1;
  	int			i;
  
  	/* check to see if caller supports us returning a tuplestore */
--- 1876,1881 ----
***************
*** 1926,1941 **** pg_stat_get_wal_senders(PG_FUNCTION_ARGS)
  			 */
  			sync_priority[i] = XLogRecPtrIsInvalid(walsnd->flush) ?
  				0 : walsnd->sync_standby_priority;
- 
- 			if (walsnd->state == WALSNDSTATE_STREAMING &&
- 				walsnd->sync_standby_priority > 0 &&
- 				(priority == 0 ||
- 				 priority > walsnd->sync_standby_priority) &&
- 				!XLogRecPtrIsInvalid(walsnd->flush))
- 			{
- 				priority = walsnd->sync_standby_priority;
- 				sync_standby = i;
- 			}
  		}
  	}
  	LWLockRelease(SyncRepLock);
--- 1924,1929 ----
***************
*** 2009,2015 **** pg_stat_get_wal_senders(PG_FUNCTION_ARGS)
  			 */
  			if (sync_priority[i] == 0)
  				values[7] = CStringGetTextDatum("async");
! 			else if (i == sync_standby)
  				values[7] = CStringGetTextDatum("sync");
  			else
  				values[7] = CStringGetTextDatum("potential");
--- 1997,2003 ----
  			 */
  			if (sync_priority[i] == 0)
  				values[7] = CStringGetTextDatum("async");
! 			else if (i == WalSndCtl->sync_standby)
  				values[7] = CStringGetTextDatum("sync");
  			else
  				values[7] = CStringGetTextDatum("potential");
*** a/src/include/replication/walsender_private.h
--- b/src/include/replication/walsender_private.h
***************
*** 88,99 **** typedef struct
  	 */
  	bool		sync_standbys_defined;
  
  	WalSnd		walsnds[1];		/* VARIABLE LENGTH ARRAY */
  } WalSndCtlData;
  
  extern WalSndCtlData *WalSndCtl;
- 
- 
  extern void WalSndSetState(WalSndState state);
  
  /*
--- 88,100 ----
  	 */
  	bool		sync_standbys_defined;
  
+ 	int			sync_standby;
+ 
  	WalSnd		walsnds[1];		/* VARIABLE LENGTH ARRAY */
+ 
  } WalSndCtlData;
  
  extern WalSndCtlData *WalSndCtl;
  extern void WalSndSetState(WalSndState state);
  
  /*
