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; }