diff --git a/src/backend/access/gin/ginfast.c b/src/backend/access/gin/ginfast.c new file mode 100644 index c5732c3..81f6efa *** a/src/backend/access/gin/ginfast.c --- b/src/backend/access/gin/ginfast.c *************** *** 24,29 **** --- 24,30 ---- #include "miscadmin.h" #include "utils/memutils.h" #include "utils/rel.h" + #include "storage/lmgr.h" /* GUC parameter */ int gin_pending_list_limit = 0; *************** ginInsertCleanup(GinState *ginstate, *** 745,750 **** --- 746,757 ---- KeyArray datums; BlockNumber blkno; + if (vac_delay) + LockRelation(index,ShareUpdateExclusiveLock); + else + if (!ConditionalLockRelation(index,ShareUpdateExclusiveLock)) + return; + metabuffer = ReadBuffer(index, GIN_METAPAGE_BLKNO); LockBuffer(metabuffer, GIN_SHARE); metapage = BufferGetPage(metabuffer); *************** ginInsertCleanup(GinState *ginstate, *** 754,759 **** --- 761,767 ---- { /* Nothing to do */ UnlockReleaseBuffer(metabuffer); + UnlockRelation(index,ShareUpdateExclusiveLock); return; } *************** ginInsertCleanup(GinState *ginstate, *** 929,934 **** --- 937,944 ---- page = BufferGetPage(buffer); } + UnlockRelation(index,ShareUpdateExclusiveLock); + ReleaseBuffer(metabuffer); /* Clean up temporary space */