Re: wrong fds used for refilenodes after pg_upgrade relfilenode changes Reply-To: - Mailing list pgsql-hackers
From | Robert Haas |
---|---|
Subject | Re: wrong fds used for refilenodes after pg_upgrade relfilenode changes Reply-To: |
Date | |
Msg-id | CA+TgmoZEc0Xj90-9MFym843yu_1C537ZZZJC725jEo9W+Gzitw@mail.gmail.com Whole thread Raw |
In response to | Re: wrong fds used for refilenodes after pg_upgrade relfilenode changes Reply-To: (Andres Freund <andres@anarazel.de>) |
Responses |
Re: wrong fds used for refilenodes after pg_upgrade relfilenode changes Reply-To:
|
List | pgsql-hackers |
On Wed, Mar 2, 2022 at 3:00 PM Andres Freund <andres@anarazel.de> wrote: > On 2022-03-02 14:52:01 -0500, Robert Haas wrote: > > - I am having some trouble understanding clearly what 0001 is doing. > > I'll try to study it further. > > It tests for the various scenarios I could think of that could lead to FD > reuse, to state the obvious ;). Anything particularly unclear. As I understand it, the basic idea of this test is: 1. create a database called 'conflict_db' containing a table called 'large' 2. also create a table called 'replace_sb' in the postgres db. 3. have a long running transaction open in 'postgres' database that repeatedly accesses the 'replace_sb' table to evict the 'conflict_db' table, sometimes causing write-outs 4. try to get it to write out the data to a stale file descriptor by fiddling with various things, and then detect the corruption that results 5. use both a primary and a standby not because they are intrinsically necessary but because you want to test that both cases work As to (1) and (2), I note that 'large' is not a hugely informative table name, especially when it's the smaller of the two test tables. And also, the names are all over the place. The table names don't have much to do with each other (large, replace_sb) and they're completely unrelated to the database names (postgres, conflict_db). And then you have Perl functions whose names also don't make it obvious what we're talking about. I can't remember that verify() is the one that accesses conflict.db large while cause_eviction() is the one that accesses postgres.replace_sb for more than like 15 seconds. It'd make it a lot easier if the table names, database names, and Perl function names had some common elements. As to (5), the identifiers are just primary and standby, without mentioning the database name, which adds to the confusion, and there are no comments explaining why we have two nodes. Also, some of the comments seem like they might be in the wrong place: +# Create template database with a table that we'll update, to trigger dirty +# rows. Using a template database + preexisting rows makes it a bit easier to +# reproduce, because there's no cache invalidations generated. Right after this comment, we create a table and then a template database just after, so I think we're not avoiding any invalidations at this point. We're avoiding them at later points where the comments aren't talking about this. I think it would be helpful to find a way to divide the test case up into sections that are separated from each other visually, and explain the purpose of each test a little more in a comment. For example I'm struggling to understand the exact purpose of this bit: +$node_primary->safe_psql('conflict_db', "VACUUM FULL large;"); +$node_primary->safe_psql('conflict_db', "UPDATE large SET datab = 3;"); + +verify($node_primary, $node_standby, 3, + "restored contents as expected"); I'm all for having test coverage of VACUUM FULL, but it isn't clear to me what this does that is related to FD reuse. Similarly for the later ones. I generally grasp that you are trying to make sure that things are OK with respect to FD reuse in various scenarios, but I couldn't explain to you what we'd be losing in terms of test coverage if we removed this line: +$node_primary->safe_psql('conflict_db', "UPDATE large SET datab = 7;"); I am not sure how much all of this potential cleanup matters because I'm pretty skeptical that this would be stable in the buildfarm. It relies on a lot of assumptions about timing and row sizes and details of when invalidations are sent that feel like they might not be entirely predictable at the level you would need to have this consistently pass everywhere. Perhaps I am too pessimistic? -- Robert Haas EDB: http://www.enterprisedb.com
pgsql-hackers by date: