*
* Copyright (c) 2001-2006, PostgreSQL Global Development Group
*
- * $PostgreSQL: pgsql/src/backend/postmaster/pgstat.c,v 1.126 2006/05/19 19:08:26 alvherre Exp $
+ * $PostgreSQL: pgsql/src/backend/postmaster/pgstat.c,v 1.127 2006/05/30 02:35:39 momjian Exp $
* ----------
*/
#include "postgres.h"
#include <arpa/inet.h>
#include <signal.h>
#include <time.h>
-#include <sys/stat.h>
#include "pgstat.h"
* Timer definitions.
* ----------
*/
+#define PGSTAT_STAT_INTERVAL 500 /* How often to write the status file;
+ * in milliseconds. */
-/* How often to write the status file, in milliseconds. */
-#define PGSTAT_STAT_INTERVAL (5*60*1000)
-
-/*
- * How often to attempt to restart a failed statistics collector; in ms.
- * Must be at least PGSTAT_STAT_INTERVAL.
- */
-#define PGSTAT_RESTART_INTERVAL (5*60*1000)
+#define PGSTAT_RESTART_INTERVAL 60 /* How often to attempt to restart a
+ * failed statistics collector; in
+ * seconds. */
/* ----------
* Amount of space reserved in pgstat_recvbuffer().
static void pgstat_write_statsfile(void);
static void pgstat_read_statsfile(HTAB **dbhash, Oid onlydb,
PgStat_StatBeEntry **betab,
- int *numbackends, bool rewrite);
+ int *numbackends);
static void backend_read_statsfile(void);
static void pgstat_setheader(PgStat_MsgHdr *hdr, StatMsgType mtype);
static void pgstat_send(void *msg, int len);
-static void pgstat_send_rewrite(void);
static void pgstat_recv_bestart(PgStat_MsgBestart *msg, int len);
static void pgstat_recv_beterm(PgStat_MsgBeterm *msg, int len);
#endif
}
-/*
- * pgstat_send_rewrite() -
- *
- * Send a command to the collector to rewrite the stats file.
- * ----------
- */
-static void
-pgstat_send_rewrite(void)
-{
- PgStat_MsgRewrite msg;
-
- if (pgStatSock < 0)
- return;
-
- pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_REWRITE);
- pgstat_send(&msg, sizeof(msg));
-}
-
/* ----------
* PgstatBufferMain() -
fd_set rfds;
int readPipe;
int len = 0;
- struct itimerval timeout, canceltimeout;
+ struct itimerval timeout;
bool need_timer = false;
MyProcPid = getpid(); /* reset MyProcPid */
timeout.it_value.tv_sec = PGSTAT_STAT_INTERVAL / 1000;
timeout.it_value.tv_usec = PGSTAT_STAT_INTERVAL % 1000;
- /* Values set to zero will cancel the active timer */
- MemSet(&canceltimeout, 0, sizeof(struct itimerval));
-
/*
* Read in an existing statistics stats file or initialize the stats to
* zero.
*/
pgStatRunningInCollector = true;
- pgstat_read_statsfile(&pgStatDBHash, InvalidOid, NULL, NULL, false);
+ pgstat_read_statsfile(&pgStatDBHash, InvalidOid, NULL, NULL);
/*
* Create the known backends table
pgstat_recv_analyze((PgStat_MsgAnalyze *) &msg, nread);
break;
- case PGSTAT_MTYPE_REWRITE:
- need_statwrite = true;
- /* Disable the timer - it will be restarted on next data update */
- setitimer(ITIMER_REAL, &canceltimeout, NULL);
- break;
-
default:
break;
}
*/
static void
pgstat_read_statsfile(HTAB **dbhash, Oid onlydb,
- PgStat_StatBeEntry **betab, int *numbackends, bool rewrite)
+ PgStat_StatBeEntry **betab, int *numbackends)
{
PgStat_StatDBEntry *dbentry;
PgStat_StatDBEntry dbbuf;
MemoryContext use_mcxt;
int mcxt_flags;
-
- if (rewrite)
- {
- /*
- * To force a rewrite of the stats file from the collector, send
- * a REWRITE message to the stats collector. Then wait for the file
- * to change. On Unix, we wait for the inode to change (as the file
- * is renamed into place from a different file). Win32 has no concept
- * of inodes, so we wait for the date on the file to change instead.
- * We can do this on win32 because we have high-res timing on the
- * file dates, but we can't on unix, because it has 1sec resolution
- * on the fields in struct stat.
- */
- int i;
-#ifndef WIN32
- struct stat st1, st2;
-
- if (stat(PGSTAT_STAT_FILENAME, &st1))
- {
- /* Assume no file there yet */
- st1.st_ino = 0;
- }
- st2.st_ino = 0;
-#else
- WIN32_FILE_ATTRIBUTE_DATA fd1, fd2;
-
- if (!GetFileAttributesEx(PGSTAT_STAT_FILENAME, GetFileExInfoStandard, &fd1))
- {
- fd1.ftLastWriteTime.dwLowDateTime = 0;
- fd1.ftLastWriteTime.dwHighDateTime = 0;
- }
- fd2.ftLastWriteTime.dwLowDateTime = 0;
- fd2.ftLastWriteTime.dwHighDateTime = 0;
-#endif
-
-
- /* Send rewrite message */
- pgstat_send_rewrite();
-
- /* Now wait for the file to change */
- for (i=0; i < 50; i++)
- {
-#ifndef WIN32
- if (!stat(PGSTAT_STAT_FILENAME, &st2))
- {
- if (st2.st_ino != st1.st_ino)
- break;
- }
-#else
- if (GetFileAttributesEx(PGSTAT_STAT_FILENAME, GetFileExInfoStandard, &fd2))
- {
- if (fd1.ftLastWriteTime.dwLowDateTime != fd2.ftLastWriteTime.dwLowDateTime ||
- fd1.ftLastWriteTime.dwHighDateTime != fd2.ftLastWriteTime.dwHighDateTime)
- break;
- }
-#endif
-
- pg_usleep(50000);
- }
- if (i >= 50)
- ereport(WARNING,
- (errmsg("pgstat update timeout")));
- /* Fallthrough and read the old file anyway - old data better than no data */
- }
-
/*
* If running in the collector or the autovacuum process, we use the
* DynaHashCxt memory context. If running in a backend, we use the
return;
Assert(!pgStatRunningInCollector);
pgstat_read_statsfile(&pgStatDBHash, InvalidOid,
- &pgStatBeTable, &pgStatNumBackends, true);
+ &pgStatBeTable, &pgStatNumBackends);
}
else
{
{
Assert(!pgStatRunningInCollector);
pgstat_read_statsfile(&pgStatDBHash, MyDatabaseId,
- &pgStatBeTable, &pgStatNumBackends, true);
+ &pgStatBeTable, &pgStatNumBackends);
pgStatDBHashXact = topXid;
}
}