Re: brininsert optimization opportunity
Tomas Vondra <tomas.vondra@enterprisedb.com>
From: Tomas Vondra <tomas.vondra@enterprisedb.com>
To: Richard Guo <guofenglinux@gmail.com>,
Soumyadeep Chakraborty <soumyadeep2007@gmail.com>
Cc: Matthias van de Meent <boekewurm+postgres@gmail.com>,
Alvaro Herrera <alvherre@alvh.no-ip.org>,
pgsql-hackers <pgsql-hackers@postgresql.org>,
Ashwin Agrawal <ashwinstar@gmail.com>
Date: 2023-11-27T10:34:56Z
Lists: pgsql-hackers
On 11/27/23 08:37, Richard Guo wrote: > > On Mon, Nov 27, 2023 at 1:53 PM Soumyadeep Chakraborty > <soumyadeep2007@gmail.com <mailto:soumyadeep2007@gmail.com>> wrote: > > On Sun, Nov 26, 2023 at 9:28 PM Richard Guo <guofenglinux@gmail.com > <mailto:guofenglinux@gmail.com>> wrote: > > It seems that we have an oversight in this commit. If there is no > tuple > > that has been inserted, we wouldn't have an available insert state in > > the clean up phase. So the Assert in brininsertcleanup() is not > always > > right. For example: > > > > regression=# update brin_summarize set value = brin_summarize.value; > > server closed the connection unexpectedly > > I wasn't able to repro the issue on > 86b64bafc19c4c60136a4038d2a8d1e6eecc59f2. > with UPDATE/INSERT: > > This could be because since c5b7ba4e67aeb5d6f824b74f94114d99ed6e42b7, > we have moved ExecOpenIndices() > from ExecInitModifyTable() to ExecInsert(). Since we never open the > indices if nothing is > inserted, we would never attempt to close them with ExecCloseIndices() > while the ii_AmCache > is NULL (which is what causes this assertion failure). > > > AFAICS we would also open the indices from ExecUpdate(). So if we > update the table in a way that no new tuples are inserted, we will have > this issue. As I showed previously, the query below crashes for me on > latest master (dc9f8a7983). > > regression=# update brin_summarize set value = brin_summarize.value; > server closed the connection unexpectedly > > There are other code paths that call ExecOpenIndices(), such as > ExecMerge(). I believe it's not hard to create queries that trigger > this Assert for those cases. > FWIW I can readily reproduce it like this: drop table t; create table t (a int); insert into t values (1); create index on t using brin (a); update t set a = a; I however wonder if maybe we should do the check in index_insert_cleanup and not in the AM callback. That seems simpler / better, because the AM callbacks then can't make this mistake. regards -- Tomas Vondra EnterpriseDB: http://www.enterprisedb.com The Enterprise PostgreSQL Company
Commits
Same data as JSON:
GET /api/v1/messages/:b64id/commits
the thread's linked commits as JSON, with link sources.
API reference →
-
Add missing index_insert_cleanup calls
- 41d2c6f952ed 17.0 landed
-
Fix a couple typos in BRIN code
- 95d14b7ae26d 17.0 landed
-
Check if ii_AmCache is NULL in aminsertcleanup
- a82ee7ef3aac 17.0 landed
-
Use fipshash in brin_multi test
- 86b64bafc19c 17.0 cited
-
Reuse BrinDesc and BrinRevmap in brininsert
- c1ec02be1d79 17.0 landed
-
Consider fillfactor when estimating relation size
- 29cf61ade3f2 17.0 cited
-
Postpone some stuff out of ExecInitModifyTable.
- c5b7ba4e67ae 14.0 cited