diff --git a/doc/src/sgml/high-availability.sgml b/doc/src/sgml/high-availability.sgml
index 41e6491f59..45980e4f81 100644
--- a/doc/src/sgml/high-availability.sgml
+++ b/doc/src/sgml/high-availability.sgml
@@ -1939,8 +1939,8 @@ if (!triggered)
    <para>
     You can control whether a log message is produced when the startup process
     is waiting longer than <varname>deadlock_timeout</varname> for recovery
-    conflicts. This is controled by the <xref linkend="guc-log-recovery-conflict-waits"/>
-    parameter. 
+    conflicts. This is controlled by the
+    <xref linkend="guc-log-recovery-conflict-waits"/> parameter.
    </para>
 
    <para>
diff --git a/src/backend/storage/ipc/standby.c b/src/backend/storage/ipc/standby.c
index 57f18c79e3..912e9409f4 100644
--- a/src/backend/storage/ipc/standby.c
+++ b/src/backend/storage/ipc/standby.c
@@ -296,7 +296,8 @@ ResolveRecoveryConflictWithVirtualXIDs(VirtualTransactionId *waitlist,
 	if (!VirtualTransactionIdIsValid(*waitlist))
 		return;
 
-	if (report_waiting)
+	/* Set the wait start timestamp for reporting */
+	if (report_waiting && (logged_recovery_conflict || update_process_title))
 		waitStart = GetCurrentTimestamp();
 	new_status = NULL;			/* we haven't changed the ps display */
 
@@ -308,38 +309,43 @@ ResolveRecoveryConflictWithVirtualXIDs(VirtualTransactionId *waitlist,
 		/* wait until the virtual xid is gone */
 		while (!VirtualXactLock(*waitlist, false))
 		{
-			TimestampTz ts = 0;
-
-			if (report_waiting && (!logged_recovery_conflict || new_status == NULL))
-				ts = GetCurrentTimestamp();
-
-			/*
-			 * Log the recovery conflict.  To prevent to log the same report
-			 * multiple times, we log the recovery conflict only once.
-			 */
-			if (log_recovery_conflict_waits &&
-				TimestampDifferenceExceeds(waitStart, ts, DeadlockTimeout))
+			if (waitStart > 0)
 			{
-				LogRecoveryConflict(reason, waitStart, waitlist);
-				logged_recovery_conflict = true;
-			}
+				TimestampTz cur_ts = 0;
+				bool maybe_log_conflict =
+					(log_recovery_conflict_waits && !logged_recovery_conflict);
+				bool maybe_update_pstitle =
+					(update_process_title && new_status == NULL);
+
+				/* Get the current timestamp if not report yet */
+				if (maybe_log_conflict || maybe_update_pstitle)
+					cur_ts = GetCurrentTimestamp();
+
+				/* Log the recovery conflict if necessary */
+				if (maybe_log_conflict &&
+					TimestampDifferenceExceeds(waitStart, cur_ts, DeadlockTimeout))
+				{
+					LogRecoveryConflict(reason, waitStart, waitlist);
+					logged_recovery_conflict = true;
+				}
 
-			/*
-			 * Report via ps if we have been waiting for more than 500 msec
-			 * (should that be configurable?)
-			 */
-			if (update_process_title && new_status == NULL && report_waiting &&
-				TimestampDifferenceExceeds(waitStart, ts, 500))
-			{
-				const char *old_status;
-				int			len;
-
-				old_status = get_ps_display(&len);
-				new_status = (char *) palloc(len + 8 + 1);
-				memcpy(new_status, old_status, len);
-				strcpy(new_status + len, " waiting");
-				set_ps_display(new_status);
-				new_status[len] = '\0'; /* truncate off " waiting" */
+				/*
+				 * Report via ps if we have been waiting for more than 500 msec
+				 * (should that be configurable?)
+				 */
+				if (maybe_update_pstitle &&
+					TimestampDifferenceExceeds(waitStart, cur_ts, 500))
+				{
+					const char *old_status;
+					int			len;
+
+					old_status = get_ps_display(&len);
+					new_status = (char *) palloc(len + 8 + 1);
+					memcpy(new_status, old_status, len);
+					strcpy(new_status + len, " waiting");
+					set_ps_display(new_status);
+					new_status[len] = '\0'; /* truncate off " waiting" */
+				}
 			}
 
 			/* Is it time to kill it? */
@@ -522,8 +528,8 @@ ResolveRecoveryConflictWithLock(LOCKTAG locktag)
 		/*
 		 * Prevent ResolveRecoveryConflictWithVirtualXIDs() from reporting
 		 * "waiting" in PS display and logging recovery conflict by disabling
-		 * its argument report_waiting because the callers have already reported
-		 * that.
+		 * its argument report_waiting because the callers may have already
+		 * reported that.
 		 */
 		ResolveRecoveryConflictWithVirtualXIDs(backends,
 											   PROCSIG_RECOVERY_CONFLICT_LOCK,
