Re: On login trigger: take three - Mailing list pgsql-hackers
From | Pavel Stehule |
---|---|
Subject | Re: On login trigger: take three |
Date | |
Msg-id | CAFj8pRCJDh-51YPkF_DF=2pebnTEQQhs_hTcWsBSTtC20ot3Mw@mail.gmail.com Whole thread Raw |
In response to | Re: On login trigger: take three (Pavel Stehule <pavel.stehule@gmail.com>) |
List | pgsql-hackers |
čt 10. 12. 2020 v 19:09 odesílatel Pavel Stehule <pavel.stehule@gmail.com> napsal:
čt 10. 12. 2020 v 16:48 odesílatel Konstantin Knizhnik <k.knizhnik@postgrespro.ru> napsal:On 10.12.2020 18:12, Pavel Stehule wrote:My idea was a little bit different. Inside postinit initialize some global variables with info if there are event triggers or not. And later you can use this variable to start transactions and other things.There will be two access to pg_event_trigger, but it can eliminate useless and probably more expensive start_transaction and end_transaction.
Do you mean some variable in shared memory or GUCs?
It was my first idea - to use some flag in shared memory to make it possible fast check that there are not event triggers.
But this flag should be sent per database. May be I missed something, but there is no any per-database shared memory data structure in Postgres.
Certainly it is possible to organize some hash db->event_info, but it makes this patch several times more complex.My idea was a little bit different - just inside process initialization, checking existence of event triggers, and later when it is necessary to start a transaction for trigger execution. This should to reduce useless empty transaction,
but this information can be accessed via shared memory if it is necessary. Probably it doesn't need a special hash table. Maybe a special flag per process.
I am sure this is a problem on computers with slower CPU s, although I have I7, but because this feature is usually unused, then the performance impact should be minimal every time.
From my point of view it is better to have separate GUC disabling just client connection events and switch it on by default.
So only those who need this events with switch it on, other users will not pay any extra cost for it.It can work, but this design is not user friendly. The significant bottleneck should be forking new processes, and check of content some usually very small tables should be invisible. So if there is a possible way to implement some feature that can be enabled by default, then we should go this way. It can be pretty unfriendly if somebody writes a logon trigger and it will not work by default without any warning.When I tested last patch I found a problem (I have disabled assertions due performance testing)create role xx login;alter system set disable_event_triggers to on; -- better should be positive form - enable_event_triggers to on, offselect pg_reload_conf();psql -U xxThread 2.1 "postmaster" received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7f2bff438ec0 (LWP 827497)]
ResourceOwnerEnlargeCatCacheRefs (owner=0x0) at resowner.c:1025
1025 ResourceArrayEnlarge(&(owner->catrefarr));
(gdb) bt
#0 ResourceOwnerEnlargeCatCacheRefs (owner=0x0) at resowner.c:1025
#1 0x00000000008a70f8 in SearchCatCacheInternal (cache=<optimized out>, nkeys=nkeys@entry=1, v1=v1@entry=13836, v2=v2@entry=0,
v3=v3@entry=0, v4=v4@entry=0) at catcache.c:1273
#2 0x00000000008a7575 in SearchCatCache1 (cache=<optimized out>, v1=v1@entry=13836) at catcache.c:1167
#3 0x00000000008b7f80 in SearchSysCache1 (cacheId=cacheId@entry=21, key1=key1@entry=13836) at syscache.c:1122
#4 0x00000000005939cd in pg_database_ownercheck (db_oid=13836, roleid=16387) at aclchk.c:5114
#5 0x0000000000605b42 in EventTriggersDisabled () at event_trigger.c:650
#6 EventTriggerOnConnect () at event_trigger.c:839
#7 0x00000000007b46d7 in PostgresMain (argc=argc@entry=1, argv=argv@entry=0x7ffdd6256080, dbname=<optimized out>,
username=0xf82508 "tom") at postgres.c:4021
#8 0x0000000000741afd in BackendRun (port=<optimized out>, port=<optimized out>) at postmaster.c:4490
#9 BackendStartup (port=<optimized out>) at postmaster.c:4212
#10 ServerLoop () at postmaster.c:1729
#11 0x0000000000742881 in PostmasterMain (argc=argc@entry=3, argv=argv@entry=0xf44d00) at postmaster.c:1401
#12 0x00000000004f1ff7 in main (argc=3, argv=0xf44d00) at main.c:209I checked profiles, and although there is significant slowdown when there is one login trigger, it was not related to plpgsql.There is big overhead of8,98% postmaster postgres [.] guc_name_compareMaybe EventTriggerInvoke is not well optimized for very frequent execution. Overhead of plpgsql is less than 0.1%, although there is significant slowdown (when a very simple logon trigger is executed).RegardsPavel
pgsql-hackers by date: