On Mon, Dec 14, 2020, 9:47 PM Bharath Rupireddy <bharath.rupireddyforpostg...@gmail.com> wrote: > > On Mon, Dec 14, 2020 at 8:03 PM Fujii Masao <masao.fu...@oss.nttdata.com> > wrote: > > > We will not output if the invalidated entry has no active connection[2], > > > so if we fix the connection leak issue with the above discussed fix i.e > > > closing all the invalidated connections at the end of next xact, there > > > are less chances that we will output invalidated entries in the > > > postgres_fdw_get_connections() output. Only case we may show up > > > invalidated connections(which have active connections entry->conn) in the > > > postgres_fdw_get_connections() output is as follows: > > > > > > 1) say we have few cached active connections exists in session 1 > > > 2) drop the user mapping (in another session) associated with any of the > > > cached connections to make that entry invalid > > > 3) run select * from postgres_fdw_get_connections(); in session 1. At > > > the start of the xact, the invalidation message gets processed and the > > > corresponding entry gets marked as invalid. If we allow invalid > > > connections (that have entry->conn) to show up in the output, then we > > > show them in the result of the query. At the end of xact, we close these > > > invalid connections, in this case, user might think that he still have > > > invalid connections active. > > > > What about the case where the transaction started at the above 1) at > > session 1, and postgres_fdw_get_connections() in the above 3) is called > > within that transaction at session 1? In this case, > > postgres_fdw_get_connections() can return even invalidated connections? > > In that case, since the user mapping would have been dropped in > another session and we are in the middle of a txn in session 1, the > entries would not get marked as invalid until the invalidation message > gets processed by the session 1 which may happen if the session 1 > opens a sub txn, if not then for postgres_fdw_get_connections() the > entries will still be active as they would not have been marked as > invalid yet and postgres_fdw_get_connections() would return them in > the output.
One more point for the above scenario: if the user mapping is dropped in another session, then cache lookup for that entry in the postgres_fdw_get_connections() returns a null tuple which I plan to not throw an error, but just to skip in that case and continue. But if the user mapping is not dropped in another session but altered, then postgres_fdw_get_connections() still can show that in the output. With Regards, Bharath Rupireddy. EnterpriseDB: http://www.enterprisedb.com