An updated patch for the track_activity_query_size GUC variable.
Made sure it's a context diff this time around, as per the wiki documentation.
Cheers, T
*** a/doc/src/sgml/config.sgml --- b/doc/src/sgml/config.sgml *************** *** 3331,3336 **** COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv; --- 3331,3349 ---- </listitem> </varlistentry> + <varlistentry id="guc-track-active-query-size" xreflabel="track_active_query_size"> + <term><varname>track_active_query_size</varname> (<type>integer</type>)</term> + <indexterm> + <primary><varname>track_active_query_size</> configuration parameter</primary> + </indexterm> + <listitem> + Specifies the maximum number of characters used to track the currently + executing command for each active session. This parameter has a value + of 1024 by default. + Only superusers can change this setting. + </listitem> + </varlistentry> + <varlistentry id="guc-track-counts" xreflabel="track_counts"> <term><varname>track_counts</varname> (<type>boolean</type>)</term> <indexterm> *** a/src/backend/postmaster/pgstat.c --- b/src/backend/postmaster/pgstat.c *************** *** 101,106 **** --- 101,107 ---- bool pgstat_track_activities = false; bool pgstat_track_counts = false; int pgstat_track_functions = TRACK_FUNC_OFF; + int pgstat_track_activity_query_size = PGBE_DEFAULT_ACTIVITY_SIZE; /* * BgWriter global statistics counters (unused in other processes). *************** *** 2010,2015 **** pgstat_fetch_global(void) --- 2011,2017 ---- static PgBackendStatus *BackendStatusArray = NULL; static PgBackendStatus *MyBEEntry = NULL; + static char* BackendActivityBuffer = NULL; /* *************** *** 2025,2031 **** BackendStatusShmemSize(void) } /* ! * Initialize the shared status array during postmaster startup. */ void CreateSharedBackendStatus(void) --- 2027,2052 ---- } /* ! * Ensures that every element of BackendStatusArray has a valid st_activity ! * pointer. ! */ ! static void ! pgstat_initialize_activity_pointers(void) ! { ! Size i; ! PgBackendStatus* beentry = BackendStatusArray; ! char* buffer = BackendActivityBuffer; ! ! for (i = 0; i < MaxBackends; i++) { ! beentry->st_activity = buffer; ! buffer += pgstat_track_activity_query_size; ! beentry++; ! } ! } ! ! /* ! * Initialize the shared status array & activity buffer during postmaster ! * startup. */ void CreateSharedBackendStatus(void) *************** *** 2044,2049 **** CreateSharedBackendStatus(void) --- 2065,2081 ---- */ MemSet(BackendStatusArray, 0, size); } + + size = mul_size(pgstat_track_activity_query_size, MaxBackends); + BackendActivityBuffer = (char*) + ShmemInitStruct("Backend Activity Buffer", size, &found); + + if (!found) + { + MemSet(BackendActivityBuffer, 0, size); + } + + pgstat_initialize_activity_pointers(); } *************** *** 2128,2134 **** pgstat_bestart(void) beentry->st_waiting = false; beentry->st_activity[0] = '\0'; /* Also make sure the last byte in the string area is always 0 */ ! beentry->st_activity[PGBE_ACTIVITY_SIZE - 1] = '\0'; beentry->st_changecount++; Assert((beentry->st_changecount & 1) == 0); --- 2160,2166 ---- beentry->st_waiting = false; beentry->st_activity[0] = '\0'; /* Also make sure the last byte in the string area is always 0 */ ! beentry->st_activity[pgstat_track_activity_query_size - 1] = '\0'; beentry->st_changecount++; Assert((beentry->st_changecount & 1) == 0); *************** *** 2188,2194 **** pgstat_report_activity(const char *cmd_str) start_timestamp = GetCurrentStatementStartTimestamp(); len = strlen(cmd_str); ! len = pg_mbcliplen(cmd_str, len, PGBE_ACTIVITY_SIZE - 1); /* * Update my status entry, following the protocol of bumping --- 2220,2226 ---- start_timestamp = GetCurrentStatementStartTimestamp(); len = strlen(cmd_str); ! len = pg_mbcliplen(cmd_str, len, pgstat_track_activity_query_size - 1); /* * Update my status entry, following the protocol of bumping *************** *** 2267,2272 **** pgstat_read_current_status(void) --- 2299,2305 ---- volatile PgBackendStatus *beentry; PgBackendStatus *localtable; PgBackendStatus *localentry; + char *localactivity; int i; Assert(!pgStatRunningInCollector); *************** *** 2278,2283 **** pgstat_read_current_status(void) --- 2311,2319 ---- localtable = (PgBackendStatus *) MemoryContextAlloc(pgStatLocalContext, sizeof(PgBackendStatus) * MaxBackends); + localactivity = (char *) + MemoryContextAlloc(pgStatLocalContext, + pgstat_track_activity_query_size * MaxBackends); localNumBackends = 0; beentry = BackendStatusArray; *************** *** 2296,2305 **** pgstat_read_current_status(void) int save_changecount = beentry->st_changecount; /* ! * XXX if PGBE_ACTIVITY_SIZE is really large, it might be best to ! * use strcpy not memcpy for copying the activity string? */ memcpy(localentry, (char *) beentry, sizeof(PgBackendStatus)); if (save_changecount == beentry->st_changecount && (save_changecount & 1) == 0) --- 2332,2345 ---- int save_changecount = beentry->st_changecount; /* ! * XXX if pgstat_track_activity_query_size is really large, ! * it might be best to use strcpy not memcpy for copying the ! * activity string? */ memcpy(localentry, (char *) beentry, sizeof(PgBackendStatus)); + memcpy(localactivity, (char *) beentry->st_activity, + pgstat_track_activity_query_size); + localentry->st_activity = localactivity; if (save_changecount == beentry->st_changecount && (save_changecount & 1) == 0) *************** *** 2314,2322 **** pgstat_read_current_status(void) if (localentry->st_procpid > 0) { localentry++; localNumBackends++; } ! } /* Set the pointer only after completion of a valid table */ localBackendStatusTable = localtable; --- 2354,2363 ---- if (localentry->st_procpid > 0) { localentry++; + localactivity += pgstat_track_activity_query_size; localNumBackends++; } ! } /* Set the pointer only after completion of a valid table */ localBackendStatusTable = localtable; *** a/src/backend/utils/misc/guc.c --- b/src/backend/utils/misc/guc.c *************** *** 1311,1316 **** static struct config_int ConfigureNamesInt[] = --- 1311,1325 ---- }, { + {"track_activity_query_size", PGC_POSTMASTER, RESOURCES_MEM, + gettext_noop("Sets the maximum number of characters that will be displayed for pg_stat_activity.current_query."), + NULL, + }, + &pgstat_track_activity_query_size, + PGBE_DEFAULT_ACTIVITY_SIZE, 100, 102400, NULL, NULL + }, + + { {"temp_buffers", PGC_USERSET, RESOURCES_MEM, gettext_noop("Sets the maximum number of temporary buffers used by each session."), NULL, *** a/src/backend/utils/misc/postgresql.conf.sample --- b/src/backend/utils/misc/postgresql.conf.sample *************** *** 364,369 **** --- 364,370 ---- #track_activities = on #track_counts = on #track_functions = none # none, pl, all + #track_active_query_size = 1024 #update_process_title = on *** a/src/include/pgstat.h --- b/src/include/pgstat.h *************** *** 509,516 **** typedef struct PgStat_GlobalStats * ---------- */ ! /* Max length of st_activity string ... perhaps replace with a GUC var? */ ! #define PGBE_ACTIVITY_SIZE 1024 /* ---------- * PgBackendStatus --- 509,516 ---- * ---------- */ ! /* Default length of st_activity string (see backend_activity_size GUC) */ ! #define PGBE_DEFAULT_ACTIVITY_SIZE 1024 /* ---------- * PgBackendStatus *************** *** 551,557 **** typedef struct PgBackendStatus bool st_waiting; /* current command string; MUST be null-terminated */ ! char st_activity[PGBE_ACTIVITY_SIZE]; } PgBackendStatus; /* --- 551,557 ---- bool st_waiting; /* current command string; MUST be null-terminated */ ! char *st_activity; } PgBackendStatus; /* *************** *** 578,583 **** typedef struct PgStat_FunctionCallUsage --- 578,584 ---- extern bool pgstat_track_activities; extern bool pgstat_track_counts; extern int pgstat_track_functions; + extern int pgstat_track_activity_query_size; /* * BgWriter statistics counters are updated directly by bgwriter and bufmgr
-- Sent via pgsql-patches mailing list (pgsql-patches@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-patches