Re: Progress report of CREATE INDEX for nested partitioned tables - Mailing list pgsql-hackers
From | Tomas Vondra |
---|---|
Subject | Re: Progress report of CREATE INDEX for nested partitioned tables |
Date | |
Msg-id | 31ee17da-8705-9afc-9451-5374a5e51aff@enterprisedb.com Whole thread Raw |
In response to | Re: Progress report of CREATE INDEX for nested partitioned tables (Ilya Gladyshev <ilya.v.gladyshev@gmail.com>) |
Responses |
Re: Progress report of CREATE INDEX for nested partitioned tables
Re: Progress report of CREATE INDEX for nested partitioned tables |
List | pgsql-hackers |
On 1/9/23 09:44, Ilya Gladyshev wrote: > On Sun, 2023-01-08 at 10:48 -0600, Justin Pryzby wrote: >> On Sat, Dec 17, 2022 at 08:30:02AM -0600, Justin Pryzby wrote: >>> ... >>> >>> @committers: Is it okay to add nparts_done to IndexStmt ? >> >> Any hint about this ? >> AFAIK fields added at the end of a struct is seen as acceptable from the ABI point of view. It's not risk-free, but we did that multiple times when fixing bugs, IIRC. The primary risk is old extensions (built on older minor version) running on new server, getting confused by new fields (and implied shifts in the structs). But fields at the end should be safe - the extension simply ignores the stuff at the end. The one problem would be arrays of structs, because even a field at the end changes the array stride. But I don't think we do that with IndexStmt ... Of course, if the "old" extension itself allocates the struct and passes it to core code, that might still be an issue, because it'll allocate a smaller struct, and core might see bogus data at the end. On the other hand, new extensions on old server may get confused too, because it may try setting a field that does not exist. So ultimately it's about weighing risks vs. benefits - evaluating whether fixing the issue is actually worth it. The question is if/how many such extensions messing with IndexStmt in this way actually exist. That is, allocate IndexStmt (or array of it). I haven't found any, but maybe some extensions for index or partition management do it? Not sure. But ... Do we actually need the new parts_done field? I mean, we already do track the value - at PROGRESS_CREATEIDX_PARTITIONS_DONE index in the st_progress_param array. Can't we simply read it from there? Then we would not have ABI issues with the new field added to IndexStmt. >> This should be resolved before the "CIC on partitioned tables" patch, >> which I think is otherwise done. > > I suggest that we move on with the IndexStmt patch and see what the > committers have to say about it. I have brushed the patch up a bit, > fixing TODOs and adding docs as per our discussion above. > I did take a look at the patch, so here are my 2c: 1) num_leaf_partitions says it's "excluding foreign tables" but then it uses RELKIND_HAS_STORAGE() which excludes various others relkinds, e.g. partitioned tables etc. Minor, but perhaps a bit confusing. 2) I'd probably say count_leaf_partitions() instead. 3) The new part in DefineIndex counting leaf partitions should have a comment before if (!OidIsValid(parentIndexId)) { ... } 4) It's a bit confusing that one of the branches in DefineIndex just sets stmt->parts_done without calling pgstat_progress_update_param (while the other one does both). AFAICS the call is not needed because we already updated it during the recursive DefineIndex call, but maybe the comment should mention that? As for the earlier discussion about the "correct" behavior for leaf vs. non-leaf partitions and whether to calculate partitions in advance: * I agree it's desirable to count partitions in advance, instead of adding incrementally. The view is meant to provide "overview" of the CREATE INDEX progress, and imagine you get partitions_total partitions_done 10 9 so that you believe you're ~90% done. But then it jumps to the next child and now you get partitions_total partitions_done 20 10 which makes the view a bit useless for it's primary purpose, IMHO. * I don't care very much about leaf vs. non-leaf partitions. If we exclude non-leaf ones, fine with me. But the number of non-leaf ones should be much smaller than leaf ones, and if the partition already has a matching index that distorts the tracking too. Furthermore the partitions may have different size etc. so the progress is only approximate anyway. I wonder if we could improve this to track the size of partitions for total/done? That'd make leaf/non-leaf distinction unnecessary, because non-leaf partitions have size 0. regards -- Tomas Vondra EnterpriseDB: http://www.enterprisedb.com The Enterprise PostgreSQL Company
pgsql-hackers by date: