Re: [PoC] Improve dead tuple storage for lazy vacuum - Mailing list pgsql-hackers
From | John Naylor |
---|---|
Subject | Re: [PoC] Improve dead tuple storage for lazy vacuum |
Date | |
Msg-id | CANWCAZbJAxuw6HC+Tc3p90mCZMKCaHknfrfzxMK5G0P6qp2PwQ@mail.gmail.com Whole thread Raw |
In response to | Re: [PoC] Improve dead tuple storage for lazy vacuum (Masahiko Sawada <sawada.mshk@gmail.com>) |
Responses |
Re: [PoC] Improve dead tuple storage for lazy vacuum
|
List | pgsql-hackers |
On Thu, Mar 7, 2024 at 10:35 PM Masahiko Sawada <sawada.mshk@gmail.com> wrote: > > I've attached the remaining patches for CI. I've made some minor > changes in separate patches and drafted the commit message for > tidstore patch. > > While reviewing the tidstore code, I thought that it would be more > appropriate to place tidstore.c under src/backend/lib instead of > src/backend/common/access since the tidstore is no longer implemented > only for heap or other access methods, and it might also be used by > executor nodes in the future. What do you think? That's a heck of a good question. I don't think src/backend/lib is right -- it seems that's for general-purpose data structures. Something like backend/utils is also too general. src/backend/access/common has things for tuple descriptors, toast, sessions, and I don't think tidstore is out of place here. I'm not sure there's a better place, but I could be convinced otherwise. v68-0001: I'm not sure if commit messages are much a subject of review, and it's up to the committer, but I'll share a couple comments just as something to think about, not something I would ask you to change: I think it's a bit distracting that the commit message talks about the justification to use it for vacuum. Let's save that for the commit with actual vacuum changes. Also, I suspect saying there are a "wide range" of uses is over-selling it a bit, and that paragraph is a bit awkward aside from that. + /* Collect TIDs extracted from the key-value pair */ + result->num_offsets = 0; + This comment has nothing at all to do with this line. If the comment is for several lines following, some of which are separated by blank lines, there should be a blank line after the comment. Also, why isn't tidstore_iter_extract_tids() responsible for setting that to zero? + ts->context = CurrentMemoryContext; As far as I can tell, this member is never accessed again -- am I missing something? + /* DSA for tidstore will be detached at the end of session */ No other test module pins the mapping, but that doesn't necessarily mean it's wrong. Is there some advantage over explicitly detaching? +-- Add tids in random order. I don't see any randomization here. I do remember adding row_number to remove whitespace in the output, but I don't remember a random order. On that subject, the row_number was an easy trick to avoid extra whitespace, but maybe we should just teach the setting function to return blocknumber rather than null? +Datum +tidstore_create(PG_FUNCTION_ARGS) +{ ... + tidstore = TidStoreCreate(max_bytes, dsa); +Datum +tidstore_set_block_offsets(PG_FUNCTION_ARGS) +{ .... + TidStoreSetBlockOffsets(tidstore, blkno, offs, noffs); These names are too similar. Maybe the test module should do s/tidstore_/test_/ or similar. +/* Sanity check if we've called tidstore_create() */ +static void +check_tidstore_available(void) +{ + if (tidstore == NULL) + elog(ERROR, "tidstore is not initialized"); +} I don't find this very helpful. If a developer wiped out the create call, wouldn't the test crash and burn pretty obviously? In general, the .sql file is still very hard-coded. Functions are created that contain a VALUES statement. Maybe it's okay for now, but wanted to mention it. Ideally, we'd have some randomized tests, without having to display it. That could be in addition to (not replacing) the small tests we have that display input. (see below) v68-0002: @@ -329,6 +381,13 @@ TidStoreIsMember(TidStore *ts, ItemPointer tid) ret = (page->words[wordnum] & ((bitmapword) 1 << bitnum)) != 0; +#ifdef TIDSTORE_DEBUG + if (!TidStoreIsShared(ts)) + { + bool ret_debug = ts_debug_is_member(ts, tid);; + Assert(ret == ret_debug); + } +#endif This only checking the case where we haven't returned already. In particular... + /* no entry for the blk */ + if (page == NULL) + return false; + + wordnum = WORDNUM(off); + bitnum = BITNUM(off); + + /* no bitmap for the off */ + if (wordnum >= page->nwords) + return false; ...these results are not checked. More broadly, it seems like the test module should be able to test everything that the debug-build array would complain about. Including ordered iteration. This may require first saving our test input to a table. We could create a cursor on a query that fetches the ordered input from the table and verifies that the tid store iterate produces the same ordered set, maybe with pl/pgSQL. Or something like that. Seems like not a whole lot of work. I can try later in the week, if you like. v68-0005/6 look ready to squash v68-0008 - I'm not a fan of captilizing short comment fragments. I use the style of either: short lower-case phrases, or full sentences including capitalization, correct grammar and period. I see these two styles all over the code base, as appropriate. + /* Remain attached until end of backend */ We'll probably want this comment, if in fact we want this behavior. + /* + * Note that funcctx->call_cntr is incremented in SRF_RETURN_NEXT + * before return. + */ I'm not sure what this is trying to say or why it's relevant, since it's been a while since I've written a SRF in C. That's all I have for now, and I haven't looked at the vacuum changes this time.
pgsql-hackers by date: