2020年8月4日(火) 14:54 Stelios Sfakianakis <sgs...@gmail.com>: > On 4 Aug 2020, at 06:25, Ian Lawrence Barwick <barw...@gmail.com> wrote: > > 2020年8月4日(火) 1:24 Stelios Sfakianakis <sgs...@gmail.com>: > > Hi, > >>> I am trying to implement a FDW in Postgres for accessing a web api and I >>> would like to keep information like for example the total number of >>> requests submiited. Ideally these data should be kept “per-user” and of >>> course with the proper locking to eliminate race conditions. So the >>> question I have is how to design such a global (but per user and database) >>> state, using the C FDW API of Postgres. I have gone through the API and for >>> example I see various fdw_private fields in the query planning structures >>> and callbacks but these do not seem to be relevant to my requirements. >>> Another possiblity seems to be to use shared memory >>> (https://www.postgresql.org/docs/12/xfunc-c.html#id-1.8.3.13.14) but it is >>> even less clear how to do it. > > >> Shared memory would probably work; you'd need to load the FDW via >> "shared_preload_libraries" and have the FDW handler function(s) update >> shared memory with whatever statistics you want to track. You could >> then define SQL functions to retrieve the stored values, and possibly >> persist them over server restarts by storing/retrieving them from a >> file. > >> Look at "pg_stat_statements" for a good example of how to do that kind of >> thing. > > Thank you Ian for the prompt reply! I will certainly have a look at > pg_stat_statements > > I also came across mysql_fdw (https://github.com/EnterpriseDB/mysql_fdw) that > features a connection pool shared across queries. It uses a hash table with > the serverid and userid as lookup key : > https://github.com/EnterpriseDB/mysql_fdw/blob/REL-2_5_4/connection.c#L55
This is essentially the same as what "postgres_fdw" and similar FDW implementations do. > The hash table is allocated in the cache memory context but it worries me > that 1) no locks are used, 2) the "ConnectionHash" variable is declared > static so in the multi-process architecture of Postgres could have been the > case that multiple copies of this exist when the shared library of mysql_fdw > is loaded? The hash table is specific to each running backend so will only be accessed by that process. Pre-loading a shared library just gives the library an opportunity to set up shared memory etc. You can always try adding one of the FDW libraries to "shared_preload_libraries" and see what happens (theoretically nothing). Regards Ian Barwick > > Best regards > Stelios > > > Regards > > Ian Barwick > > -- > Ian Barwick https://www.2ndQuadrant.com/ > PostgreSQL Development, 24x7 Support, Training & Services > >