summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/backend/postmaster/pgstat.c149
1 files changed, 40 insertions, 109 deletions
diff --git a/src/backend/postmaster/pgstat.c b/src/backend/postmaster/pgstat.c
index cd502346d3e..20eee0a7cf6 100644
--- a/src/backend/postmaster/pgstat.c
+++ b/src/backend/postmaster/pgstat.c
@@ -13,7 +13,7 @@
*
* Copyright (c) 2001-2004, PostgreSQL Global Development Group
*
- * $PostgreSQL: pgsql/src/backend/postmaster/pgstat.c,v 1.83 2004/10/25 06:27:21 neilc Exp $
+ * $PostgreSQL: pgsql/src/backend/postmaster/pgstat.c,v 1.84 2004/10/28 01:38:41 neilc Exp $
* ----------
*/
#include "postgres.h"
@@ -42,6 +42,7 @@
#include "miscadmin.h"
#include "postmaster/postmaster.h"
#include "storage/backendid.h"
+#include "storage/fd.h"
#include "storage/ipc.h"
#include "storage/pg_shmem.h"
#include "storage/pmsignal.h"
@@ -682,7 +683,7 @@ pgstat_bestart(void)
/* ----------
* pgstat_report_activity() -
*
- * Called in tcop/postgres.c to tell the collector what the backend
+ * Called from tcop/postgres.c to tell the collector what the backend
* is actually doing (usually "<IDLE>" or the start of the query to
* be executed).
* ----------
@@ -988,7 +989,7 @@ pgstat_ping(void)
/*
* Create or enlarge the pgStatTabstatMessages array
*/
-static bool
+static void
more_tabstat_space(void)
{
PgStat_MsgTabstat *newMessages;
@@ -998,39 +999,25 @@ more_tabstat_space(void)
/* Create (another) quantum of message buffers */
newMessages = (PgStat_MsgTabstat *)
- malloc(sizeof(PgStat_MsgTabstat) * TABSTAT_QUANTUM);
- if (newMessages == NULL)
- {
- ereport(LOG,
- (errcode(ERRCODE_OUT_OF_MEMORY),
- errmsg("out of memory")));
- return false;
- }
+ MemoryContextAllocZero(TopMemoryContext,
+ sizeof(PgStat_MsgTabstat) * TABSTAT_QUANTUM);
/* Create or enlarge the pointer array */
if (pgStatTabstatMessages == NULL)
msgArray = (PgStat_MsgTabstat **)
- malloc(sizeof(PgStat_MsgTabstat *) * newAlloc);
+ MemoryContextAlloc(TopMemoryContext,
+ sizeof(PgStat_MsgTabstat *) * newAlloc);
else
msgArray = (PgStat_MsgTabstat **)
- realloc(pgStatTabstatMessages,
- sizeof(PgStat_MsgTabstat *) * newAlloc);
- if (msgArray == NULL)
- {
- free(newMessages);
- ereport(LOG,
- (errcode(ERRCODE_OUT_OF_MEMORY),
- errmsg("out of memory")));
- return false;
- }
+ repalloc(pgStatTabstatMessages,
+ sizeof(PgStat_MsgTabstat *) * newAlloc);
- MemSet(newMessages, 0, sizeof(PgStat_MsgTabstat) * TABSTAT_QUANTUM);
for (i = 0; i < TABSTAT_QUANTUM; i++)
msgArray[pgStatTabstatAlloc + i] = newMessages++;
pgStatTabstatMessages = msgArray;
pgStatTabstatAlloc = newAlloc;
- return true;
+ Assert(pgStatTabstatUsed < pgStatTabstatAlloc);
}
/* ----------
@@ -1102,14 +1089,7 @@ pgstat_initstats(PgStat_Info *stats, Relation rel)
* If we ran out of message buffers, we just allocate more.
*/
if (pgStatTabstatUsed >= pgStatTabstatAlloc)
- {
- if (!more_tabstat_space())
- {
- stats->no_stats = TRUE;
- return;
- }
- Assert(pgStatTabstatUsed < pgStatTabstatAlloc);
- }
+ more_tabstat_space();
/*
* Use the first entry of the next message buffer.
@@ -1146,10 +1126,8 @@ pgstat_count_xact_commit(void)
* new xact-counters.
*/
if (pgStatTabstatAlloc == 0)
- {
- if (!more_tabstat_space())
- return;
- }
+ more_tabstat_space();
+
if (pgStatTabstatUsed == 0)
{
pgStatTabstatUsed++;
@@ -1180,10 +1158,8 @@ pgstat_count_xact_rollback(void)
* new xact-counters.
*/
if (pgStatTabstatAlloc == 0)
- {
- if (!more_tabstat_space())
- return;
- }
+ more_tabstat_space();
+
if (pgStatTabstatUsed == 0)
{
pgStatTabstatUsed++;
@@ -1529,13 +1505,8 @@ PgstatCollectorMain(int argc, char *argv[])
/*
* Create the known backends table
*/
- pgStatBeTable = (PgStat_StatBeEntry *) malloc(
+ pgStatBeTable = (PgStat_StatBeEntry *) palloc0(
sizeof(PgStat_StatBeEntry) * MaxBackends);
- if (pgStatBeTable == NULL)
- ereport(ERROR,
- (errcode(ERRCODE_OUT_OF_MEMORY),
- errmsg("out of memory in statistics collector --- abort")));
- memset(pgStatBeTable, 0, sizeof(PgStat_StatBeEntry) * MaxBackends);
readPipe = pgStatPipe[0];
@@ -1804,11 +1775,7 @@ pgstat_recvbuffer(void)
/*
* Allocate the message buffer
*/
- msgbuffer = (char *) malloc(PGSTAT_RECVBUFFERSZ);
- if (msgbuffer == NULL)
- ereport(ERROR,
- (errcode(ERRCODE_OUT_OF_MEMORY),
- errmsg("out of memory in statistics collector --- abort")));
+ msgbuffer = (char *) palloc(PGSTAT_RECVBUFFERSZ);
/*
* Loop forever
@@ -2416,7 +2383,7 @@ pgstat_read_statsfile(HTAB **dbhash, Oid onlydb,
* simply return zero for anything and the collector simply starts
* from scratch with empty counters.
*/
- if ((fpin = fopen(pgStat_fname, PG_BINARY_R)) == NULL)
+ if ((fpin = AllocateFile(pgStat_fname, PG_BINARY_R)) == NULL)
return;
/*
@@ -2437,8 +2404,7 @@ pgstat_read_statsfile(HTAB **dbhash, Oid onlydb,
{
ereport(pgStatRunningInCollector ? LOG : WARNING,
(errmsg("corrupted pgstat.stat file")));
- fclose(fpin);
- return;
+ goto done;
}
/*
@@ -2450,7 +2416,6 @@ pgstat_read_statsfile(HTAB **dbhash, Oid onlydb,
&found);
if (dbentry == NULL)
{
- fclose(fpin);
ereport(ERROR,
(errcode(ERRCODE_OUT_OF_MEMORY),
errmsg("out of memory")));
@@ -2459,8 +2424,7 @@ pgstat_read_statsfile(HTAB **dbhash, Oid onlydb,
{
ereport(pgStatRunningInCollector ? LOG : WARNING,
(errmsg("corrupted pgstat.stat file")));
- fclose(fpin);
- return;
+ goto done;
}
memcpy(dbentry, &dbbuf, sizeof(PgStat_StatDBEntry));
@@ -2479,19 +2443,10 @@ pgstat_read_statsfile(HTAB **dbhash, Oid onlydb,
hash_ctl.entrysize = sizeof(PgStat_StatTabEntry);
hash_ctl.hash = tag_hash;
hash_ctl.hcxt = use_mcxt;
- PG_TRY();
- {
- dbentry->tables = hash_create("Per-database table",
- PGSTAT_TAB_HASH_SIZE,
- &hash_ctl,
- HASH_ELEM | HASH_FUNCTION | mcxt_flags);
- }
- PG_CATCH();
- {
- fclose(fpin);
- PG_RE_THROW();
- }
- PG_END_TRY();
+ dbentry->tables = hash_create("Per-database table",
+ PGSTAT_TAB_HASH_SIZE,
+ &hash_ctl,
+ HASH_ELEM | HASH_FUNCTION | mcxt_flags);
/*
* Arrange that following 'T's add entries to this
@@ -2515,8 +2470,7 @@ pgstat_read_statsfile(HTAB **dbhash, Oid onlydb,
{
ereport(pgStatRunningInCollector ? LOG : WARNING,
(errmsg("corrupted pgstat.stat file")));
- fclose(fpin);
- return;
+ goto done;
}
/*
@@ -2529,19 +2483,15 @@ pgstat_read_statsfile(HTAB **dbhash, Oid onlydb,
(void *) &tabbuf.tableid,
HASH_ENTER, &found);
if (tabentry == NULL)
- {
- fclose(fpin);
ereport(ERROR,
(errcode(ERRCODE_OUT_OF_MEMORY),
errmsg("out of memory")));
- }
if (found)
{
ereport(pgStatRunningInCollector ? LOG : WARNING,
(errmsg("corrupted pgstat.stat file")));
- fclose(fpin);
- return;
+ goto done;
}
memcpy(tabentry, &tabbuf, sizeof(tabbuf));
@@ -2552,30 +2502,23 @@ pgstat_read_statsfile(HTAB **dbhash, Oid onlydb,
*/
case 'M':
if (betab == NULL || numbackends == NULL)
- {
- fclose(fpin);
- return;
- }
+ goto done;
if (fread(&maxbackends, 1, sizeof(maxbackends), fpin) !=
sizeof(maxbackends))
{
ereport(pgStatRunningInCollector ? LOG : WARNING,
(errmsg("corrupted pgstat.stat file")));
- fclose(fpin);
- return;
+ goto done;
}
if (maxbackends == 0)
- {
- fclose(fpin);
- return;
- }
+ goto done;
/*
* Allocate space (in TopTransactionContext too) for the
* backend table.
*/
if (use_mcxt == NULL)
- *betab = (PgStat_StatBeEntry *) malloc(
+ *betab = (PgStat_StatBeEntry *) palloc(
sizeof(PgStat_StatBeEntry) * maxbackends);
else
*betab = (PgStat_StatBeEntry *) MemoryContextAlloc(
@@ -2587,16 +2530,8 @@ pgstat_read_statsfile(HTAB **dbhash, Oid onlydb,
* 'B' A PgStat_StatBeEntry follows.
*/
case 'B':
- if (betab == NULL || numbackends == NULL)
- {
- fclose(fpin);
- return;
- }
- if (*betab == NULL)
- {
- fclose(fpin);
- return;
- }
+ if (betab == NULL || numbackends == NULL || *betab == NULL)
+ goto done;
/*
* Read it directly into the table.
@@ -2607,8 +2542,7 @@ pgstat_read_statsfile(HTAB **dbhash, Oid onlydb,
{
ereport(pgStatRunningInCollector ? LOG : WARNING,
(errmsg("corrupted pgstat.stat file")));
- fclose(fpin);
- return;
+ goto done;
}
/*
@@ -2624,28 +2558,25 @@ pgstat_read_statsfile(HTAB **dbhash, Oid onlydb,
if (numbackends != 0)
*numbackends = havebackends;
if (havebackends >= maxbackends)
- {
- fclose(fpin);
- return;
- }
+ goto done;
+
break;
/*
* 'E' The EOF marker of a complete stats file.
*/
case 'E':
- fclose(fpin);
- return;
+ goto done;
default:
ereport(pgStatRunningInCollector ? LOG : WARNING,
(errmsg("corrupted pgstat.stat file")));
- fclose(fpin);
- return;
+ goto done;
}
}
- fclose(fpin);
+done:
+ FreeFile(fpin);
}
/*