*** a/src/backend/access/transam/xlog.c
--- b/src/backend/access/transam/xlog.c
***************
*** 7706,7715 **** CreateRestartPoint(int flags)
  	}
  
  	/*
! 	 * Currently, there is no need to truncate pg_subtrans during recovery. If
! 	 * we did do that, we will need to have called StartupSUBTRANS() already
! 	 * and then TruncateSUBTRANS() would go here.
  	 */
  
  	/* All real work is done, but log before releasing lock. */
  	if (log_checkpoints)
--- 7706,7719 ----
  	}
  
  	/*
! 	 * Truncate pg_subtrans if possible.  We can throw away all data before
! 	 * the oldest XMIN of any running transaction.	No future transaction will
! 	 * attempt to reference any pg_subtrans entry older than that (see Asserts
! 	 * in subtrans.c).	When hot standby is disabled, though, we mustn't do
! 	 * this because StartupSUBTRANS hasn't been called yet.
  	 */
+ 	if (EnableHotStandby)
+ 		TruncateSUBTRANS(GetOldestXmin(true, false));
  
  	/* All real work is done, but log before releasing lock. */
  	if (log_checkpoints)
