diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/access/transam/gtm.c | 50 | ||||
-rw-r--r-- | src/backend/pgxc/pool/execRemote.c | 76 | ||||
-rw-r--r-- | src/backend/tcop/postgres.c | 56 | ||||
-rw-r--r-- | src/backend/tcop/pquery.c | 6 | ||||
-rw-r--r-- | src/backend/utils/misc/guc.c | 25 | ||||
-rw-r--r-- | src/include/tcop/tcopprot.h | 3 | ||||
-rw-r--r-- | src/include/utils/guc.h | 5 |
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; |