static void
backend_read_statsfile(void)
{
+ TimestampTz cur_ts;
TimestampTz min_ts;
int count;
+ int last_delay_errno = 0;
/* already read it? */
if (pgStatDBHash)
* PGSTAT_STAT_INTERVAL; and we don't want to lie to the collector about
* what our cutoff time really is.
*/
+ cur_ts = GetCurrentTimestamp();
if (IsAutoVacuumWorkerProcess())
- min_ts = TimestampTzPlusMilliseconds(GetCurrentTimestamp(),
- -PGSTAT_RETRY_DELAY);
+ min_ts = TimestampTzPlusMilliseconds(cur_ts, -PGSTAT_RETRY_DELAY);
else
- min_ts = TimestampTzPlusMilliseconds(GetCurrentTimestamp(),
- -PGSTAT_STAT_INTERVAL);
+ min_ts = TimestampTzPlusMilliseconds(cur_ts, -PGSTAT_STAT_INTERVAL);
/*
* Loop until fresh enough stats file is available or we ran out of time.
file_ts >= min_ts)
break;
+ /* Make debugging printouts once we've waited unreasonably long */
+ if (count >= PGSTAT_POLL_LOOP_COUNT/2)
+ {
+ TimestampTz now_ts = GetCurrentTimestamp();
+
+#ifdef HAVE_INT64_TIMESTAMP
+ elog(WARNING, "pgstat waiting for " INT64_FORMAT " usec (%d loops), file timestamp " INT64_FORMAT " target timestamp " INT64_FORMAT " last errno %d",
+ now_ts - cur_ts, count,
+ file_ts, min_ts,
+ last_delay_errno);
+#else
+ elog(WARNING, "pgstat waiting for %.6f sec (%d loops), file timestamp %.6f target timestamp %.6f last errno %d",
+ now_ts - cur_ts, count,
+ file_ts, min_ts,
+ last_delay_errno);
+#endif
+ }
+
/* Not there or too old, so kick the collector and wait a bit */
+ errno = 0;
pgstat_send_inquiry(min_ts);
pg_usleep(PGSTAT_RETRY_DELAY * 1000L);
+ last_delay_errno = errno;
}
if (count >= PGSTAT_POLL_LOOP_COUNT)