Index: src/backend/postmaster/bgwriter.c
===================================================================
--- src/backend/postmaster/bgwriter.c	(head)
+++ src/backend/postmaster/bgwriter.c	(working copy)
@@ -675,6 +675,15 @@
 	}
 }
 
+static void
+print_progress(const char* what, double progress, double xlog, double time, XLogRecPtr recptr)
+{
+	elog(LOG, "LDC:%s\t%f\t%f\t%f\t(diff xlogid=%d, xrecoff=%d)",
+		what, progress, xlog, time,
+		(int32) (recptr.xlogid - ckpt_start_recptr.xlogid),
+		(int32) (recptr.xrecoff - ckpt_start_recptr.xrecoff));
+}
+
 /*
  * IsCheckpointOnSchedule -- are we on schedule to finish this checkpoint
  *		 in time?
@@ -721,12 +730,6 @@
 		 ((double) (int32) (recptr.xrecoff - ckpt_start_recptr.xrecoff)) / XLogSegSize) /
 		CheckPointSegments;
 
-	if (progress < elapsed_xlogs)
-	{
-		ckpt_cached_elapsed = elapsed_xlogs;
-		return false;
-	}
-
 	/*
 	 * Check progress against time elapsed and checkpoint_timeout.
 	 */
@@ -734,13 +737,22 @@
 	elapsed_time = ((double) (now.tv_sec - ckpt_start_time) +
 					now.tv_usec / 1000000.0) / CheckPointTimeout;
 
+	if (progress < elapsed_xlogs)
+	{
+		ckpt_cached_elapsed = elapsed_xlogs;
+		print_progress("XLOG", progress, elapsed_xlogs, elapsed_time, recptr);
+		return false;
+	}
+
 	if (progress < elapsed_time)
 	{
 		ckpt_cached_elapsed = elapsed_time;
+		print_progress("TIME", progress, elapsed_xlogs, elapsed_time, recptr);
 		return false;
 	}
 
 	/* It looks like we're on schedule. */
+	print_progress("OK", progress, elapsed_xlogs, elapsed_time, recptr);
 	return true;
 }
 
