summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/backend/access/transam/gtm.c50
-rw-r--r--src/backend/pgxc/pool/execRemote.c76
-rw-r--r--src/backend/tcop/postgres.c56
-rw-r--r--src/backend/tcop/pquery.c6
-rw-r--r--src/backend/utils/misc/guc.c25
-rw-r--r--src/include/tcop/tcopprot.h3
-rw-r--r--src/include/utils/guc.h5
7 files changed, 195 insertions, 26 deletions
diff --git a/src/backend/access/transam/gtm.c b/src/backend/access/transam/gtm.c
index 4b6e3d591f..62c648842e 100644
--- a/src/backend/access/transam/gtm.c
+++ b/src/backend/access/transam/gtm.c
@@ -22,6 +22,8 @@
#include "gtm/gtm_c.h"
#include "postmaster/autovacuum.h"
#include "storage/backendid.h"
+#include "tcop/tcopprot.h"
+#include "utils/guc.h"
#include "utils/lsyscache.h"
/* To access sequences */
@@ -138,6 +140,11 @@ GlobalTransactionId
BeginTranGTM(GTM_Timestamp *timestamp)
{
GlobalTransactionId xid = InvalidGlobalTransactionId;
+ struct rusage start_r;
+ struct timeval start_t;
+
+ if (log_gtm_stats)
+ ResetUsageCommon(&start_r, &start_t);
CheckConnection();
// TODO Isolation level
@@ -157,6 +164,9 @@ BeginTranGTM(GTM_Timestamp *timestamp)
if (xid)
IsXidFromGTM = true;
currentGxid = xid;
+
+ if (log_gtm_stats)
+ ShowUsageCommon("BeginTranGTM", &start_r, &start_t);
return xid;
}
@@ -190,9 +200,15 @@ CommitTranGTM(GlobalTransactionId gxid, int waited_xid_count,
GlobalTransactionId *waited_xids)
{
int ret;
+ struct rusage start_r;
+ struct timeval start_t;
if (!GlobalTransactionIdIsValid(gxid))
return 0;
+
+ if (log_gtm_stats)
+ ResetUsageCommon(&start_r, &start_t);
+
CheckConnection();
ret = -1;
if (conn)
@@ -216,6 +232,9 @@ CommitTranGTM(GlobalTransactionId gxid, int waited_xid_count,
CloseGTM();
currentGxid = InvalidGlobalTransactionId;
+
+ if (log_gtm_stats)
+ ShowUsageCommon("CommitTranGTM", &start_r, &start_t);
return ret;
}
@@ -229,9 +248,15 @@ CommitPreparedTranGTM(GlobalTransactionId gxid,
GlobalTransactionId *waited_xids)
{
int ret = 0;
+ struct rusage start_r;
+ struct timeval start_t;
if (!GlobalTransactionIdIsValid(gxid) || !GlobalTransactionIdIsValid(prepared_gxid))
return ret;
+
+ if (log_gtm_stats)
+ ResetUsageCommon(&start_r, &start_t);
+
CheckConnection();
ret = -1;
if (conn)
@@ -253,6 +278,10 @@ CommitPreparedTranGTM(GlobalTransactionId gxid,
waited_xid_count, waited_xids);
}
currentGxid = InvalidGlobalTransactionId;
+
+ if (log_gtm_stats)
+ ShowUsageCommon("CommitPreparedTranGTM", &start_r, &start_t);
+
return ret;
}
@@ -320,10 +349,16 @@ int
PrepareTranGTM(GlobalTransactionId gxid)
{
int ret;
+ struct rusage start_r;
+ struct timeval start_t;
if (!GlobalTransactionIdIsValid(gxid))
return 0;
CheckConnection();
+
+ if (log_gtm_stats)
+ ResetUsageCommon(&start_r, &start_t);
+
ret = -1;
if (conn)
ret = prepare_transaction(conn, gxid);
@@ -341,6 +376,10 @@ PrepareTranGTM(GlobalTransactionId gxid)
ret = prepare_transaction(conn, gxid);
}
currentGxid = InvalidGlobalTransactionId;
+
+ if (log_gtm_stats)
+ ShowUsageCommon("PrepareTranGTM", &start_r, &start_t);
+
return ret;
}
@@ -380,7 +419,14 @@ GTM_Snapshot
GetSnapshotGTM(GlobalTransactionId gxid, bool canbe_grouped)
{
GTM_Snapshot ret_snapshot = NULL;
+ struct rusage start_r;
+ struct timeval start_t;
+
CheckConnection();
+
+ if (log_gtm_stats)
+ ResetUsageCommon(&start_r, &start_t);
+
if (conn)
ret_snapshot = get_snapshot(conn, gxid, canbe_grouped);
if (ret_snapshot == NULL)
@@ -390,6 +436,10 @@ GetSnapshotGTM(GlobalTransactionId gxid, bool canbe_grouped)
if (conn)
ret_snapshot = get_snapshot(conn, gxid, canbe_grouped);
}
+
+ if (log_gtm_stats)
+ ShowUsageCommon("GetSnapshotGTM", &start_r, &start_t);
+
return ret_snapshot;
}
diff --git a/src/backend/pgxc/pool/execRemote.c b/src/backend/pgxc/pool/execRemote.c
index ec7d57d8d0..a92f5aef68 100644
--- a/src/backend/pgxc/pool/execRemote.c
+++ b/src/backend/pgxc/pool/execRemote.c
@@ -36,6 +36,7 @@
#include "libpq/libpq.h"
#include "miscadmin.h"
#include "pgxc/execRemote.h"
+#include "tcop/tcopprot.h"
#include "executor/nodeSubplan.h"
#include "nodes/nodeFuncs.h"
#include "pgstat.h"
@@ -3230,8 +3231,8 @@ ExecRemoteUtility(RemoteQuery *node)
/*
* Do not set global_session if it is a utility statement.
- * Avoids CREATE NODE error on cluster configuration.
- */
+ * Avoids CREATE NODE error on cluster configuration.
+ */
pgxc_connections = get_exec_connections(NULL, node->exec_nodes, exec_type,
exec_direct_type != EXEC_DIRECT_UTILITY);
@@ -3604,6 +3605,12 @@ AtEOXact_Remote(void)
void
PreCommit_Remote(char *prepareGID, char *nodestring, bool preparedLocalNode)
{
+ struct rusage start_r;
+ struct timeval start_t;
+
+ if (log_gtm_stats)
+ ResetUsageCommon(&start_r, &start_t);
+
/*
* Made node connections persistent if we are committing transaction
* that touched temporary tables. We never drop that flag, so after some
@@ -3635,6 +3642,9 @@ PreCommit_Remote(char *prepareGID, char *nodestring, bool preparedLocalNode)
}
else
pgxc_node_remote_commit();
+
+ if (log_gtm_stats)
+ ShowUsageCommon("PreCommit_Remote", &start_r, &start_t);
}
/*
@@ -3669,6 +3679,11 @@ PreAbort_Remote(void)
PGXCNodeHandle *clean_nodes[NumCoords + NumDataNodes];
int node_count = 0;
int i;
+ struct rusage start_r;
+ struct timeval start_t;
+
+ if (log_gtm_stats)
+ ResetUsageCommon(&start_r, &start_t);
all_handles = get_current_handles();
/*
@@ -3755,6 +3770,9 @@ PreAbort_Remote(void)
pfree_pgxc_all_handles(all_handles);
+ if (log_gtm_stats)
+ ShowUsageCommon("PreAbort_Remote", &start_r, &start_t);
+
return true;
}
@@ -3776,6 +3794,11 @@ PrePrepare_Remote(char *prepareGID, bool localNode, bool implicit)
{
/* Always include local node if running explicit prepare */
char *nodestring;
+ struct rusage start_r;
+ struct timeval start_t;
+
+ if (log_gtm_stats)
+ ResetUsageCommon(&start_r, &start_t);
/*
* Primary session is doing 2PC, just commit secondary processes and exit
@@ -3804,8 +3827,12 @@ PrePrepare_Remote(char *prepareGID, bool localNode, bool implicit)
GetAuxilliaryTransactionId(),
GetTopGlobalTransactionId());
pfree(nodestring);
- return NULL;
+ nodestring = NULL;
}
+
+ if (log_gtm_stats)
+ ShowUsageCommon("PrePrepare_Remote", &start_r, &start_t);
+
return nodestring;
}
@@ -3816,8 +3843,17 @@ PrePrepare_Remote(char *prepareGID, bool localNode, bool implicit)
void
PostPrepare_Remote(char *prepareGID, bool implicit)
{
+ struct rusage start_r;
+ struct timeval start_t;
+
+ if (log_gtm_stats)
+ ResetUsageCommon(&start_r, &start_t);
+
if (!implicit)
PrepareTranGTM(GetTopGlobalTransactionId());
+
+ if (log_gtm_stats)
+ ShowUsageCommon("PostPrepare_Remote", &start_r, &start_t);
}
/*
@@ -4346,7 +4382,7 @@ ExecRemoteQuery(RemoteQueryState *node)
}
if (combiner->tuplesortstate)
- {
+ {
if (tuplesort_gettupleslot((Tuplesortstate *) combiner->tuplesortstate,
true, resultslot))
return resultslot;
@@ -4833,6 +4869,11 @@ ExecInitRemoteSubplan(RemoteSubplan *node, EState *estate, int eflags)
RemoteSubplanState *remotestate;
ResponseCombiner *combiner;
CombineType combineType;
+ struct rusage start_r;
+ struct timeval start_t;
+
+ if (log_remotesubplan_stats)
+ ResetUsageCommon(&start_r, &start_t);
remotestate = makeNode(RemoteSubplanState);
combiner = (ResponseCombiner *) remotestate;
@@ -5131,6 +5172,9 @@ ExecInitRemoteSubplan(RemoteSubplan *node, EState *estate, int eflags)
list_length(remotestate->execNodes) > 1)
combiner->merge_sort = true;
+ if (log_remotesubplan_stats)
+ ShowUsageCommon("ExecInitRemoteSubplan", &start_r, &start_t);
+
return remotestate;
}
@@ -5382,6 +5426,8 @@ ExecRemoteSubplan(RemoteSubplanState *node)
RemoteSubplan *plan = (RemoteSubplan *) combiner->ss.ps.plan;
EState *estate = combiner->ss.ps.state;
TupleTableSlot *resultslot = combiner->ss.ps.ps_ResultTupleSlot;
+ struct rusage start_r;
+ struct timeval start_t;
/*
* We allow combiner->conn_count == 0 after node initialization
@@ -5397,6 +5443,9 @@ ExecRemoteSubplan(RemoteSubplanState *node)
combiner->cursor_count == 0)
return NULL;
+ if (log_remotesubplan_stats)
+ ResetUsageCommon(&start_r, &start_t);
+
primary_mode_phase_two:
if (!node->bound)
{
@@ -5642,13 +5691,21 @@ primary_mode_phase_two:
{
if (tuplesort_gettupleslot((Tuplesortstate *) combiner->tuplesortstate,
true, resultslot))
+ {
+ if (log_remotesubplan_stats)
+ ShowUsageCommon("ExecRemoteSubplan", &start_r, &start_t);
return resultslot;
+ }
}
else
{
TupleTableSlot *slot = FetchTuple(combiner);
if (!TupIsNull(slot))
+ {
+ if (log_remotesubplan_stats)
+ ShowUsageCommon("ExecRemoteSubplan", &start_r, &start_t);
return slot;
+ }
else if (combiner->probing_primary)
/* phase1 is successfully completed, run on other nodes */
goto primary_mode_phase_two;
@@ -5656,6 +5713,9 @@ primary_mode_phase_two:
if (combiner->errorMessage)
pgxc_node_report_error(combiner);
+ if (log_remotesubplan_stats)
+ ShowUsageCommon("ExecRemoteSubplan", &start_r, &start_t);
+
return NULL;
}
@@ -5701,6 +5761,11 @@ ExecEndRemoteSubplan(RemoteSubplanState *node)
ResponseCombiner *combiner = (ResponseCombiner *)node;
RemoteSubplan *plan = (RemoteSubplan *) combiner->ss.ps.plan;
int i;
+ struct rusage start_r;
+ struct timeval start_t;
+
+ if (log_remotesubplan_stats)
+ ResetUsageCommon(&start_r, &start_t);
if (outerPlanState(node))
ExecEndNode(outerPlanState(node));
@@ -5875,6 +5940,9 @@ ExecEndRemoteSubplan(RemoteSubplanState *node)
ValidateAndCloseCombiner(combiner);
pfree(node);
+
+ if (log_remotesubplan_stats)
+ ShowUsageCommon("ExecEndRemoteSubplan", &start_r, &start_t);
}
/*
diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c
index 1a40987132..5632beb44e 100644
--- a/src/backend/tcop/postgres.c
+++ b/src/backend/tcop/postgres.c
@@ -5063,14 +5063,20 @@ static struct rusage Save_r;
static struct timeval Save_t;
void
+ResetUsageCommon(struct rusage *save_r, struct timeval *save_t)
+{
+ getrusage(RUSAGE_SELF, save_r);
+ gettimeofday(save_t, NULL);
+}
+
+void
ResetUsage(void)
{
- getrusage(RUSAGE_SELF, &Save_r);
- gettimeofday(&Save_t, NULL);
+ ResetUsageCommon(&Save_r, &Save_t);
}
void
-ShowUsage(const char *title)
+ShowUsageCommon(const char *title, struct rusage *save_r, struct timeval *save_t)
{
StringInfoData str;
struct timeval user,
@@ -5082,17 +5088,17 @@ ShowUsage(const char *title)
gettimeofday(&elapse_t, NULL);
memcpy((char *) &user, (char *) &r.ru_utime, sizeof(user));
memcpy((char *) &sys, (char *) &r.ru_stime, sizeof(sys));
- if (elapse_t.tv_usec < Save_t.tv_usec)
+ if (elapse_t.tv_usec < save_t->tv_usec)
{
elapse_t.tv_sec--;
elapse_t.tv_usec += 1000000;
}
- if (r.ru_utime.tv_usec < Save_r.ru_utime.tv_usec)
+ if (r.ru_utime.tv_usec < save_r->ru_utime.tv_usec)
{
r.ru_utime.tv_sec--;
r.ru_utime.tv_usec += 1000000;
}
- if (r.ru_stime.tv_usec < Save_r.ru_stime.tv_usec)
+ if (r.ru_stime.tv_usec < save_r->ru_stime.tv_usec)
{
r.ru_stime.tv_sec--;
r.ru_stime.tv_usec += 1000000;
@@ -5110,12 +5116,12 @@ ShowUsage(const char *title)
appendStringInfoString(&str, "! system usage stats:\n");
appendStringInfo(&str,
"!\t%ld.%06ld elapsed %ld.%06ld user %ld.%06ld system sec\n",
- (long) (elapse_t.tv_sec - Save_t.tv_sec),
- (long) (elapse_t.tv_usec - Save_t.tv_usec),
- (long) (r.ru_utime.tv_sec - Save_r.ru_utime.tv_sec),
- (long) (r.ru_utime.tv_usec - Save_r.ru_utime.tv_usec),
- (long) (r.ru_stime.tv_sec - Save_r.ru_stime.tv_sec),
- (long) (r.ru_stime.tv_usec - Save_r.ru_stime.tv_usec));
+ (long) (elapse_t.tv_sec - save_t->tv_sec),
+ (long) (elapse_t.tv_usec - save_t->tv_usec),
+ (long) (r.ru_utime.tv_sec - save_r->ru_utime.tv_sec),
+ (long) (r.ru_utime.tv_usec - save_r->ru_utime.tv_usec),
+ (long) (r.ru_stime.tv_sec - save_r->ru_stime.tv_sec),
+ (long) (r.ru_stime.tv_usec - save_r->ru_stime.tv_usec));
appendStringInfo(&str,
"!\t[%ld.%06ld user %ld.%06ld sys total]\n",
(long) user.tv_sec,
@@ -5125,28 +5131,28 @@ ShowUsage(const char *title)
#if defined(HAVE_GETRUSAGE)
appendStringInfo(&str,
"!\t%ld/%ld [%ld/%ld] filesystem blocks in/out\n",
- r.ru_inblock - Save_r.ru_inblock,
+ r.ru_inblock - save_r->ru_inblock,
/* they only drink coffee at dec */
- r.ru_oublock - Save_r.ru_oublock,
+ r.ru_oublock - save_r->ru_oublock,
r.ru_inblock, r.ru_oublock);
appendStringInfo(&str,
"!\t%ld/%ld [%ld/%ld] page faults/reclaims, %ld [%ld] swaps\n",
- r.ru_majflt - Save_r.ru_majflt,
- r.ru_minflt - Save_r.ru_minflt,
+ r.ru_majflt - save_r->ru_majflt,
+ r.ru_minflt - save_r->ru_minflt,
r.ru_majflt, r.ru_minflt,
- r.ru_nswap - Save_r.ru_nswap,
+ r.ru_nswap - save_r->ru_nswap,
r.ru_nswap);
appendStringInfo(&str,
"!\t%ld [%ld] signals rcvd, %ld/%ld [%ld/%ld] messages rcvd/sent\n",
- r.ru_nsignals - Save_r.ru_nsignals,
+ r.ru_nsignals - save_r->ru_nsignals,
r.ru_nsignals,
- r.ru_msgrcv - Save_r.ru_msgrcv,
- r.ru_msgsnd - Save_r.ru_msgsnd,
+ r.ru_msgrcv - save_r->ru_msgrcv,
+ r.ru_msgsnd - save_r->ru_msgsnd,
r.ru_msgrcv, r.ru_msgsnd);
appendStringInfo(&str,
"!\t%ld/%ld [%ld/%ld] voluntary/involuntary context switches\n",
- r.ru_nvcsw - Save_r.ru_nvcsw,
- r.ru_nivcsw - Save_r.ru_nivcsw,
+ r.ru_nvcsw - save_r->ru_nvcsw,
+ r.ru_nivcsw - save_r->ru_nivcsw,
r.ru_nvcsw, r.ru_nivcsw);
#endif /* HAVE_GETRUSAGE */
@@ -5161,6 +5167,12 @@ ShowUsage(const char *title)
pfree(str.data);
}
+void
+ShowUsage(const char *title)
+{
+ ShowUsageCommon(title, &Save_r, &Save_t);
+}
+
/*
* on_proc_exit handler to log end of session
*/
diff --git a/src/backend/tcop/pquery.c b/src/backend/tcop/pquery.c
index a0d7cc2b4d..c6e0356647 100644
--- a/src/backend/tcop/pquery.c
+++ b/src/backend/tcop/pquery.c
@@ -1359,7 +1359,11 @@ PortalRunSelect(Portal portal,
QueryDesc *queryDesc;
ScanDirection direction;
uint32 nprocessed;
+ struct rusage start_r;
+ struct timeval start_t;
+ if (log_executor_stats)
+ ResetUsageCommon(&start_r, &start_t);
/*
* NB: queryDesc will be NULL if we are fetching from a held cursor or a
* completed utility query; can't use it in that path.
@@ -1481,6 +1485,8 @@ PortalRunSelect(Portal portal,
}
}
+ if (log_executor_stats)
+ ShowUsageCommon("PortalRunSelect", &start_r, &start_t);
return nprocessed;
}
diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
index aed3037462..027add0015 100644
--- a/src/backend/utils/misc/guc.c
+++ b/src/backend/utils/misc/guc.c
@@ -467,6 +467,11 @@ bool log_planner_stats = false;
bool log_executor_stats = false;
bool log_statement_stats = false; /* this is sort of all three
* above together */
+#ifdef XCP
+bool log_gtm_stats = false;
+bool log_remotesubplan_stats = false;
+#endif
+
bool log_btree_build_stats = false;
char *event_source;
@@ -1242,6 +1247,26 @@ static struct config_bool ConfigureNamesBool[] =
false,
check_log_stats, NULL, NULL
},
+#ifdef XCP
+ {
+ {"log_remotesubplan_stats", PGC_SUSET, STATS_MONITORING,
+ gettext_noop("Writes remote subplan performance statistics to the server log."),
+ NULL
+ },
+ &log_remotesubplan_stats,
+ false,
+ NULL, NULL, NULL
+ },
+ {
+ {"log_gtm_stats", PGC_SUSET, STATS_MONITORING,
+ gettext_noop("Writes GTM performance statistics to the server log."),
+ NULL
+ },
+ &log_gtm_stats,
+ false,
+ NULL, NULL, NULL
+ },
+#endif
#ifdef BTREE_BUILD_STATS
{
{"log_btree_build_stats", PGC_SUSET, DEVELOPER_OPTIONS,
diff --git a/src/include/tcop/tcopprot.h b/src/include/tcop/tcopprot.h
index 96c5b8b3d4..5abc26e864 100644
--- a/src/include/tcop/tcopprot.h
+++ b/src/include/tcop/tcopprot.h
@@ -77,7 +77,10 @@ extern void PostgresMain(int argc, char *argv[],
const char *username) pg_attribute_noreturn();
extern long get_stack_depth_rlimit(void);
extern void ResetUsage(void);
+extern void ResetUsageGeneric(struct rusage *save_r, struct timeval *save_t);
extern void ShowUsage(const char *title);
+extern void ShowUsageCommon(const char *title, struct rusage *save_r,
+ struct timeval *save_t);
extern int check_log_duration(char *msec_str, bool was_logged);
extern void set_debug_options(int debug_flag,
GucContext context, GucSource source);
diff --git a/src/include/utils/guc.h b/src/include/utils/guc.h
index f6b2d13b3d..60586f406b 100644
--- a/src/include/utils/guc.h
+++ b/src/include/utils/guc.h
@@ -247,6 +247,11 @@ extern bool log_executor_stats;
extern bool log_statement_stats;
extern bool log_btree_build_stats;
+#ifdef XCP
+extern bool log_gtm_stats;
+extern bool log_remotesubplan_stats;
+#endif
+
extern PGDLLIMPORT bool check_function_bodies;
extern bool default_with_oids;
extern bool SQL_inheritance;