Commit Graph

367 Commits

Author SHA1 Message Date
Diego Fronza
a071516a0f PG-286: Check for NULL return on hash_search before using object.
Check if hash_search() function returns NULL before attempting to
use the object in hash_entry_alloc().
2021-12-30 09:47:06 -03:00
Diego Fronza
59c321ebc5 PG-286: Reduce calls to pgstat_fetch_stat_numbackends().
After couple CPU profiling sessions with perf, it was detected that the
function pgstat_fetch_stat_numbackends() is very expensive, reading the
implementation on PostgreSQL's backend_status.c just confirmed that.

We use that function on pg_stat_monitor to retrieve the application name
and IP address of the client, we now cache the results in order to avoid
calling it for every query being processed.
2021-12-30 09:47:06 -03:00
Diego Fronza
d32dea0daa PG-286: Fix query buffer overflow management.
If pgsm_overflow_target is ON (default, 1) and the query buffer
overflows, we now dump the buffer and keep track of how many times
pg_stat_monitor changed bucket since that.

If an overflow happen again before pg_stat_monitor cycle through
pgsm_max_buckets buckets (default 10), then we don't dump the buffer
again, but instead report an error, this ensures that only one dump file
of size pgsm_query_shared_buffer will be in disk at any time, avoiding
slowing down queries to the pg_stat_monitor view.

As soon as pg_stat_monitor cycles through all buckets, we remove the
dump file and reset the counter (pgss->n_bucket_cycles).
2021-12-30 09:47:06 -03:00
Diego Fronza
1b51defc68 PG-286: Small performance improvements.
pgss_ExecutorEnd: Avoid unnecessary memset(plan_info, 0, ...).
We only use this object if the condition below is true, in which case we
already initialize all the fields in the object, also we now store the
plan string length (plan_info.plan_len) to avoid calling strlen on it
again later:
if (queryDesc->operation == CMD_SELECT && PGSM_QUERY_PLAN) {
... here we initialize plan_info

If the condition is false, then we pass a NULL PlanInfo* to the
pgss_store to avoid more unnecessary processing.

pgss_planner_hook: Similar, avoid memset(plan_info, 0, ...) this object
is not used here, so we pass NULL to pgss_store.

pg_get_application_name: Remove call to strlen, snprintf already give us
the calculated string length, so we just return it.

pg_get_client_addr: Cache localhost, avoid calling
ntohl(inet_addr("127.0.0.1")) all the time.

pgss_update_entry: Make use of PlanInfo->plan_len, avoiding a call to
strlen again.

intarray_get_datum: Init the string by setting the first byte to '\0'.
2021-12-30 09:47:06 -03:00
Diego Fronza
ad1187b9da PG-286: Avoid duplicate queries in text buffer.
The memory area reserved for query text (pgsm_query_shared_buffer) was
divided evenly for each bucket, this allowed to have the same query,
e.g. "SELECT 1", duplicated in different buckets, thus wasting space.

This commit fix the query text duplication by adding a new hash table
whose only purpose is to verify if a given query is already added to the
buffer (by using the queryID).

This allows different buckets that share the same query to point to a
unique entry in the query buffer (pgss_qbuf).

When pg_stat_monitor moves to a new bucket id, by avoiding adding a
query that already exists in the buffer it can also save some CPU time.
2021-12-30 09:47:04 -03:00
Diego Fronza
8ea02b0f2a PG-228: Fix hash table creation flags on PG <= 13.
Before PostgreSQL 14, HASH_STRINGS flag was not available when creating
a hash table with ShmemInitHash().

Use HASH_BLOBS for previous PostgreSQL versions.
2021-12-30 09:46:15 -03:00
Diego Fronza
6f353a5596 PG-228: Add severity to the internal message logging API.
Add support to include the severity of messages added to the
pg_stat_monitor_errors view.
2021-12-30 09:46:15 -03:00
Diego Fronza
c37713b9d5 PG-228: Add new view, pg_stat_monitor_errors.
The pg_stat_monitor_errors view was created in order to help inspecting
internal errors that may occur in pg_stat_monitor module itself, it
contains the error message, its severity, the last time the error occurred
and the number of times that any given error ocurred.

Implementation details:
 - A new lwlock was added to the pgssSharedState structure in order to
   control access to the errors hash table.
 - Increased RequestNamedLWLockTranche() no. of locks requested to 2.
 - The function GetNamedLWLockTranche() returns an array of locks, we
   use the first lock for controlling access to the usual buckets hash
   table, and the second one to control access to the errors hash table.
 - During module initialization (_PG_init) we increased the amount of
   shared memory space requested to include space to the new errors hash
   table: RequestAddinShmemSpace(... + pgsm_errors_size())
 - The implementation in pgsm_errors.c simple uses a hash table to track
   error messages, the message is also used as the key.
2021-12-30 09:46:12 -03:00
Ibrar Ahmed
10f305b4b1 Merge pull request #156 from umairshahid/patch-1
Update README.md
2021-12-28 20:53:19 +05:00
Umair Shahid
150df586ee Update README.md
Proposed changes for https://jira.percona.com/browse/PG-155
2021-12-28 17:58:36 +04:00
Ibrar Ahmed
91073aad78 Merge pull request #150 from darkfronza/PG-290_fix_crash_higher_debug_level_master
PG-290: Fix crash when enabling debugging log level on PostgreSQL.
2021-12-07 15:17:39 -05:00
Diego Fronza
3433c77d9d PG-290: Fix crash when enabling debugging log level on PostgreSQL.
There were couple issues to handle, the main one was that our log hook
(pgsm_emit_log_hook) was being called after the shared memory hook
completed (pgss_shmem_startup) but before PostgreSQL boostraping code
finished, thus triggering the following assertion during a call to
LWLockAcquire():
Assert(!(proc == NULL && IsUnderPostmaster));

proc is a pointer to MyProc, a PostgreSQL's shared global variable that
was not yet initalized by PostgreSQL.

We must also check for a NULL pointer return in pg_get_backend_status()
the pgstat_fetch_stat_local_beentry() function may return a NULL pointer
during initialization, in which case we use "127.0.0.1" for the client
address, and "postmaster" for application name.
2021-12-06 15:39:34 -03:00
EvgeniyPatlan
fb7220cdf1 Merge pull request #149 from percona/fix_packaging
Fix rpm packaging
2021-12-06 16:34:15 +02:00
Evgeniy Patlan
5d526fbbd4 Fix rpm packaging 2021-12-06 14:43:51 +02:00
Oleksandr Miroshnychenko
d05f6d8e3b Merge pull request #143 from vorsel/1.0.0-2
DISTPG-7 update debian rules for 1.0.0-rc.1 version
1.0.0-rc.1
2021-11-29 10:51:54 +02:00
Oleksandr Miroshnychenko
3b155bd643 DISTPG-7 fir debian rules for 1.0.0-rc.1 version 2021-11-26 16:47:00 +02:00
Ibrar Ahmed
8fe7676923 PG-284: Bump version to 1.0.0-rc.1. 2021-11-24 18:55:13 +00:00
Ibrar Ahmed
269c8bc62c Merge pull request #142 from nastena1606/PG-285-Doc-order-of-extensions
PG-285 Doc: Order of modules
2021-11-24 16:52:31 +05:00
Anastasia Alexadrova
f7275071cd PG-285 Doc: Order of modules
Added a note about strict order of modules for PG 13 and earlier versions

modified:   README.md
2021-11-24 12:47:06 +02:00
Ibrar Ahmed
a1e9526b51 Merge pull request #141 from darkfronza/PG-234_fix_load_of_pgsm_and_pgss
PG-234: Fix loading both pg_stat_monitor and pg_stat_statements.
2021-11-24 13:32:49 +05:00
Diego Fronza
47e84f96c3 PG-234: Fix loading both pg_stat_monitor and pg_stat_statements.
If both modules are loaded then pg_stat_monitor detects that and avoid
calling standard_ProcessUtility() in ProcessUtility_hook hook, as
calling it twice is an error and triggers an assertion on PostgreSQL.

On PostgreSQL 13, pg_stat_monitor must be loaded after
pg_stat_statements, as pg_stat_statements doesn't do such verifications,
it end calling standard_ProcessUtility() and other functions even if
another module is registered, that is an error.

They fixed this problem with pg_stat_statements in PostgreSQL 14 and onward.
2021-11-22 15:13:30 -03:00
Ibrar Ahmed
96fde5931c Merge pull request #140 from nastena1606/PG-210-Doc-Update-column-names-for-PG14-master
PG-210 Doc: Updated column names depending on PG version
2021-11-17 16:58:00 +05:00
Anastasia Alexadrova
bb7fd54b74 PG-210 Doc: Updated column names depending on PG version
added a footenote about toplevel being available starting from PG14 only

modified:   docs/COMPARISON.md
	modified:   docs/REFERENCE.md
2021-11-17 13:27:56 +02:00
Ibrar Ahmed
ac2aaec72f Merge pull request #139 from EvgeniyPatlan/master
DISTPG-307: update pg_stat_stat_monitor
2021-11-17 11:28:23 +05:00
Evgeniy Patlan
892a117487 DISTPG-307 update pg_stat_stat_monitor 2021-11-17 07:52:52 +02:00
Ibrar Ahmed
6cf798416e Update README.md 2021-11-17 01:42:55 +05:00
Ibrar Ahmed
973cb16d34 Update README.md 2021-11-17 01:42:10 +05:00
Ibrar Ahmed
0248c1fe5e Rename workflows. 2021-11-16 20:41:04 +00:00
Ibrar Ahmed
ff7d82be6e Update README.md 2021-11-17 01:38:24 +05:00
Ibrar Ahmed
a0c848749c Update README.md 2021-11-17 01:36:38 +05:00
Ibrar Ahmed
88523792f5 Rename workflows. 2021-11-16 20:30:34 +00:00
Ibrar Ahmed
5e2b107471 Update README.md 2021-11-17 01:20:08 +05:00
Ibrar Ahmed
b5cbd98ae8 Update and rename pg11test.yml to postgresql-11-build.yml 2021-11-17 01:19:32 +05:00
Ibrar Ahmed
5d06977110 Merge pull request #138 from darkfronza/PG-277_fix_regression_pgsm_overflow_target_defaults
PG-277: Fix regression tests (pgsm_overflow_target defaults).
2021-11-17 01:13:42 +05:00
Diego Fronza
c577750538 PG-277: Fix regression tests (pgsm_overflow_target defaults).
Adjust guc_1.out to match guc.out defaults for pgsm_overflow_target.
2021-11-16 16:31:44 -03:00
Ibrar Ahmed
d3725790d4 Regression Fix. 2021-11-16 12:01:46 +00:00
Ibrar Ahmed
74dd7c80d8 Regression Fix. 2021-11-16 11:46:15 +00:00
Ibrar Ahmed
c8d7209149 PG-273: pg_stat_monitor_hook_stats disable to end user. 2021-11-16 11:38:21 +00:00
Ibrar Ahmed
680c7fda42 PG-210: Add new column toplevel. 2021-11-16 11:23:59 +00:00
Ibrar Ahmed
5f6177daa3 PG-210: Add new column toplevel. 2021-11-16 10:48:11 +00:00
Ibrar Ahmed
6ea5a8991c Merge pull request #135 from percona/devel
Devel
2021-11-14 20:15:30 +05:00
Ibrar Ahmed
351f4e4644 Merge pull request #134 from darkfronza/PG-276_fix_regression_tests
PG-276: Fix regression tests.
2021-11-14 20:15:10 +05:00
Diego Fronza
0a45fc740f PG-276: Fix regression tests.
The guc_1.out is used for PG >= 13, where query track planning is
available, so it has been restored.
2021-11-12 16:55:51 -03:00
Ibrar Ahmed
192ec4e470 Merge pull request #133 from percona/devel
Devel
2021-11-13 00:37:52 +05:00
Ibrar Ahmed
85b7cabf50 Merge pull request #132 from darkfronza/PG-275_fix_regression_tests
PG-275: Fix regression tests.
2021-11-13 00:37:29 +05:00
Diego Fronza
3be31d67e9 PG-275: Fix regression tests.
Removal of redundant file guc_1.out.

Adjusted guc.out to match query planning disabled by default.
2021-11-12 14:42:17 -03:00
Ibrar Ahmed
f1166c306a Merge pull request #130 from darkfronza/PG-272_fix_server_crash
PG-272: Fix server crash when calling pg_stat_monitor_reset().
2021-11-12 20:42:29 +05:00
Ibrar Ahmed
0148409b33 Merge pull request #131 from percona/devel
Devel
2021-11-12 20:41:37 +05:00
Ibrar Ahmed
22fab87dec Merge pull request #129 from darkfronza/PG-220_fix_pgsm_overflow_target
PG-220: fix pgsm overflow target
2021-11-12 20:40:33 +05:00
Diego Fronza
997639c067 PG-272: Fix server crash when calling pg_stat_monitor_reset().
The loop that resets the query buffers was incorrecly using MAX_BUCKETS
to indicate the number of buckets to clear, which defaults to 10. If a
user lowers this value the loop would access a pointer beyond the number
of query buffers allocated.

Fix the problem by using the correct PGSM_MAX_BUCKETS GUC as the limit
to the loop.
2021-11-12 10:58:56 -03:00