Re: generic plans and "initial" pruning
Amit Langote <amitlangote09@gmail.com>
Attachments
- v35-0003-Track-opened-range-table-relations-in-a-List-in-.patch (application/octet-stream) patch v35-0003
- v35-0002-Move-AcquireExecutorLocks-s-responsibility-into-.patch (application/octet-stream) patch v35-0002
- v35-0001-Add-field-to-store-partitioned-relids-to-Append-.patch (application/octet-stream) patch v35-0001
On Thu, Mar 2, 2023 at 10:52 PM Amit Langote <amitlangote09@gmail.com> wrote: > I think I have figured out what might be going wrong on that cfbot > animal after building with the same CPPFLAGS as that animal locally. > I had forgotten to update _out/_readRangeTblEntry() to account for the > patch's change that a view's RTE_SUBQUERY now also preserves relkind > in addition to relid and rellockmode for the locking consideration. > > Also, I noticed that a multi-query Portal execution with rules was > failing (thanks to a regression test added in a7d71c41db) because of > the snapshot used for the 2nd query onward not being updated for > command ID change under patched model of multi-query Portal execution. > To wit, under the patched model, all queries in the multi-query Portal > case undergo ExecutorStart() before any of it is run with > ExecutorRun(). The patch hadn't changed things however to update the > snapshot's command ID for the 2nd query onwards, which caused the > aforementioned test case to fail. > > This new model does however mean that the 2nd query onwards must use > PushCopiedSnapshot() given the current requirement of > UpdateActiveSnapshotCommandId() that the snapshot passed to it must > not be referenced anywhere else. The new model basically requires > that each query's QueryDesc points to its own copy of the > ActiveSnapshot. That may not be a thing in favor of the patched model > though. For now, I haven't been able to come up with a better > alternative. Here's a new version addressing the following 2 points. * Like views, I realized that non-leaf relations of partition trees scanned by an Append/MergeAppend would need to be locked separately, because ExecInitNode() traversal of the plan tree would not account for them. That is, they are not opened using ExecGetRangeTableRelation() or ExecOpenScanRelation(). One exception is that some (if not all) of those non-leaf relations may be referenced in PartitionPruneInfo and so locked as part of initializing the corresponding PartitionPruneState, but I decided not to complicate the code to filter out such relations from the set locked separately. To carry the set of relations to lock, the refactoring patch 0001 re-introduces the List of Bitmapset field named allpartrelids into Append/MergeAppend nodes, which we had previously removed on the grounds that those relations need not be locked separately (commits f2343653f5b, f003a7522bf). * I decided to initialize QueryDesc.planstate even in the cases where ExecInitNode() traversal is aborted in the middle on detecting CachedPlan invalidation such that it points to a partially initialized PlanState tree. My earlier thinking that each PlanState node need not be visited for resource cleanup in such cases was naive after all. To that end, I've fixed the ExecEndNode() subroutines of all Plan node types to account for potentially uninitialized fields. There are a couple of cases where I'm a bit doubtful though. In ExecEndCustomScan(), there's no indication in CustomScanState whether it's OK to call EndCustomScan() when BeginCustomScan() may not have been called. For ForeignScanState, I've assumed that ForeignScanState.fdw_state being set can be used as a marker that BeginForeignScan would have been called, though maybe that's not a solid assumption. I'm also attaching a new (small) patch 0003 that eliminates the loop-over-rangetable in ExecCloseRangeTableRelations() in favor of iterating over a new List field of EState named es_opened_relations, which is populated by ExecGetRangeTableRelation() with only the relations that were opened. This speeds up ExecCloseRangeTableRelations() significantly for the cases with many runtime-prunable partitions. -- Thanks, Amit Langote EDB: http://www.enterprisedb.com
Commits
-
Stamp 19beta1.
- 4b0bf0788b06 19 (unreleased) cited
-
Revert "Don't lock partitions pruned by initial pruning"
- 1722d5eb05d8 18.0 landed
-
Ensure first ModifyTable rel initialized if all are pruned
- 28317de723b6 18.0 cited
-
Fix bug in cbc127917 to handle nested Append correctly
- cbb9086c9ef6 18.0 landed
-
Remove unstable test suite added by 525392d57
- 4f1b6e5bb4fe 18.0 landed
-
Don't lock partitions pruned by initial pruning
- 525392d5727f 18.0 landed
-
Fix an oversight in cbc127917 to handle MERGE correctly
- 75dfde13639a 18.0 landed
-
Track unpruned relids to avoid processing pruned relations
- cbc127917e04 18.0 landed
-
Perform runtime initial pruning outside ExecInitNode()
- d47cbf474ecb 18.0 landed
-
Move PartitionPruneInfo out of plan nodes into PlannedStmt
- bb3ec16e14de 18.0 landed
-
Fix setrefs.c's failure to do expression processing on prune steps.
- bf826ea06297 18.0 cited
-
Remove obsolete executor cleanup code
- d060e921ea5a 17.0 landed
-
Revert "Move PartitionPruneInfo out of plan nodes into PlannedStmt"
- 5472743d9e85 16.0 landed
-
Move PartitioPruneInfo out of plan nodes into PlannedStmt
- ec386948948c 16.0 landed
-
Refactor and cleanup runtime partition prune code a little
- 297daa9d4353 15.0 landed
-
Remove some unnecessary fields from Plan trees.
- 52ed730d511b 12.0 cited
-
Remove more redundant relation locking during executor startup.
- f2343653f5b2 12.0 cited
-
Shut down Gather's children before shutting down Gather itself.
- acf555bc53ac 10.0 cited