Skip to content

Fix assert failure triggered by "CREATE INDEX CONCURRENTLY"#1845

Open
fairyfar wants to merge 1 commit into
apache:mainfrom
fairyfar:main
Open

Fix assert failure triggered by "CREATE INDEX CONCURRENTLY"#1845
fairyfar wants to merge 1 commit into
apache:mainfrom
fairyfar:main

Conversation

@fairyfar

@fairyfar fairyfar commented Jul 9, 2026

Copy link
Copy Markdown
Contributor

What does this PR do?

When resource groups are enabled, StartTransaction() may have taken a catalog snapshot
within GetResGroupIdForRole, and xmin is not InvalidTransactionId. Therefore, it does
not meet the status requirements for "CREATE INDEX CONCURRENTLY".

Reproduction method:

  1. Compile Debug version and enable assert.
./configure --enable-debug --enable-cassert
  1. Enable resource group management.
gp_resource_manager='group'
  1. Test Case
create table t(a text, b text);
-- crash:
create index concurrently t_idx on t(a, b);
-- "ERROR:  relation "t_idx" already exists". Indicates that the transaction has been successfully committed.
create index concurrently t_idx on t(a, b);
  1. Test Results
[fairyfar@bogon cloudberry]$ psql postgres
psql (16.9, server 16.9)
Type "help" for help.

postgres=# create table t(a text, b text);
NOTICE:  Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'a' as the Apache Cloudberry data distribution key for this table.
HINT:  The 'DISTRIBUTED BY' clause determines the distribution of data. Make sure column(s) chosen are the optimal data distribution key to minimize skew.
CREATE TABLE
postgres=# create index concurrently t_idx on t(a, b);
FATAL:  Unexpected internal error (assert.c:46)
DETAIL:  ("MyProc->xid == InvalidTransactionId && MyProc->xmin == InvalidTransactionId", File: "indexcmds.c", Line: 5459)
server closed the connection unexpectedly
        This probably means the server terminated abnormally
        before or while processing the request.
The connection to the server was lost. Attempting reset: Failed.
The connection to the server was lost. Attempting reset: Failed.
!?> \q

[fairyfar@bogon cloudberry]$ psql postgres
psql (16.9, server 16.9)
Type "help" for help.

postgres=# create index concurrently t_idx on t(a, b);
ERROR:  relation "t_idx" already exists

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

Test Plan

  • Unit tests added/updated
  • Integration tests added/updated
  • Passed make installcheck
  • Passed make -C src/test installcheck-cbdb-parallel

Impact

Performance:

User-facing changes:

Dependencies:

Checklist

Additional Context

CI Skip Instructions


When resource groups are enabled, StartTransaction() may have taken a catalog snapshot
within GetResGroupIdForRole, and xmin is not InvalidTransactionId. Therefore, it does
not meet the status requirements for "CREATE INDEX CONCURRENTLY".
* which may install xmin in the current process. Use the AUTHOID
* syscache to fetch pg_authid tuple for the given role Oid.
*/
tuple = SearchSysCache1(AUTHOID, ObjectIdGetDatum(roleid));

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you add related test create index concurrently t_idx on t(a, b); ?

@fairyfar

fairyfar commented Jul 9, 2026

Copy link
Copy Markdown
Contributor Author

I'm very sorry. The test case of ic-resgroup-v2 failed. It's related to this commit. Let me analyze the reasons.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants