gfphoenix78 opened a new pull request, #1605:
URL: https://github.com/apache/cloudberry/pull/1605

   When ALTER TABLE ... SET WITH (reorganize=true) runs concurrently with COPY 
TO, COPY may return 0 rows instead of all rows.  The root cause is a 
snapshot/lock ordering problem: PortalRunUtility() pushes the active snapshot 
before calling DoCopy(), so the snapshot predates any concurrent reorganize 
that had not yet committed.  After COPY TO blocks on AccessExclusiveLock and 
the reorganize commits, the stale snapshot cannot see the new physical files 
(xmin = reorganize_xid is invisible) while the old physical files have already 
been removed, yielding 0 rows.
   
   Three code paths are fixed:
   
   1. Relation-based COPY TO (copy.c, DoCopy): After table_openrv() acquires 
AccessShareLock — which blocks until any concurrent reorganize commits — pop 
and re-push the active snapshot so it reflects all committed data at lock-grant 
time.
   
   2. Query-based COPY TO, RLS COPY TO, and CTAS (copyto.c, BeginCopy): After 
pg_analyze_and_rewrite() -> AcquireRewriteLocks() acquires all direct relation 
locks, refresh the snapshot.  This covers COPY (SELECT ...) TO, COPY on 
RLS-protected tables (internally rewritten to a query), and CREATE TABLE AS 
SELECT.
   
   3. Partitioned table COPY TO (copy.c, DoCopy): Before entering BeginCopy, 
call find_all_inheritors() to eagerly acquire AccessShareLock on all child 
partitions.  Child partition locks are normally acquired later in ExecutorStart 
-> ExecInitAppend, after PushCopiedSnapshot has already embedded a stale 
snapshot. Locking all children upfront ensures the snapshot refresh in fixes 1 
and 2 covers all concurrent child-partition reorganize commits.
   
   In REPEATABLE READ or SERIALIZABLE isolation, GetTransactionSnapshot() 
returns the same transaction-level snapshot, so the Pop/Push is a harmless 
no-op.
   
   Tests added:
   - src/test/isolation2/sql/copy_to_concurrent_reorganize.sql Tests 2.1-2.5 
for relation-based, query-based, partitioned, RLS, and CTAS paths across heap, 
AO row, and AO column storage.
   - contrib/pax_storage/src/test/isolation2/sql/pax/ 
copy_to_concurrent_reorganize.sql Same coverage for PAX columnar storage.
   
   See: Issue#1545 <https://github.com/apache/cloudberry/issues/1545>
   
   <!-- Thank you for your contribution to Apache Cloudberry (Incubating)! -->
   
   Fixes #ISSUE_Number
   
   ### What does this PR do?
   <!-- Brief overview of the changes, including any major features or fixes -->
   
   ### Type of Change
   - [ ] Bug fix (non-breaking change)
   - [ ] New feature (non-breaking change)
   - [ ] Breaking change (fix or feature with breaking changes)
   - [ ] Documentation update
   
   ### Breaking Changes
   <!-- Remove if not applicable. If yes, explain impact and migration path -->
   
   ### Test Plan
   <!-- How did you test these changes? -->
   - [ ] Unit tests added/updated
   - [ ] Integration tests added/updated
   - [ ] Passed `make installcheck`
   - [ ] Passed `make -C src/test installcheck-cbdb-parallel`
   
   ### Impact
   <!-- Remove sections that don't apply -->
   **Performance:**
   <!-- Any performance implications? -->
   
   **User-facing changes:**
   <!-- Any changes visible to users? -->
   
   **Dependencies:**
   <!-- New dependencies or version changes? -->
   
   ### Checklist
   - [ ] Followed [contribution 
guide](https://cloudberry.apache.org/contribute/code)
   - [ ] Added/updated documentation
   - [ ] Reviewed code for security implications
   - [ ] Requested review from [cloudberry 
committers](https://github.com/orgs/apache/teams/cloudberry-committers)
   
   ### Additional Context
   <!-- Any other information that would help reviewers? Remove if none -->
   
   ### CI Skip Instructions
   <!--
   To skip CI builds, add the appropriate CI skip identifier to your PR title.
   The identifier must:
   - Be in square brackets []
   - Include the word "ci" and either "skip" or "no"
   - Only use for documentation-only changes or when absolutely necessary
   -->
   
   ---
   <!-- Join our community:
   - Mailing list: 
[[email protected]](https://lists.apache.org/[email protected])
 (subscribe: [email protected])
   - Discussions: https://github.com/apache/cloudberry/discussions -->
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to