diff options
Diffstat (limited to 'src/backend/access/gin/ginfast.c')
-rw-r--r-- | src/backend/access/gin/ginfast.c | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/src/backend/access/gin/ginfast.c b/src/backend/access/gin/ginfast.c index 615730b8e55..5f624cf6fac 100644 --- a/src/backend/access/gin/ginfast.c +++ b/src/backend/access/gin/ginfast.c @@ -31,6 +31,7 @@ #include "postmaster/autovacuum.h" #include "storage/indexfsm.h" #include "storage/lmgr.h" +#include "storage/predicate.h" #include "utils/builtins.h" /* GUC parameter */ @@ -245,6 +246,13 @@ ginHeapTupleFastInsert(GinState *ginstate, GinTupleCollector *collector) metabuffer = ReadBuffer(index, GIN_METAPAGE_BLKNO); metapage = BufferGetPage(metabuffer); + /* + * An insertion to the pending list could logically belong anywhere in + * the tree, so it conflicts with all serializable scans. All scans + * acquire a predicate lock on the metabuffer to represent that. + */ + CheckForSerializableConflictIn(index, NULL, metabuffer); + if (collector->sumsize + collector->ntuples * sizeof(ItemIdData) > GinListPageSize) { /* |