diff options
Diffstat (limited to 'src/backend/access/gin/ginfast.c')
-rw-r--r-- | src/backend/access/gin/ginfast.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/src/backend/access/gin/ginfast.c b/src/backend/access/gin/ginfast.c index a7a49b36fd0..4dcfdf2ac63 100644 --- a/src/backend/access/gin/ginfast.c +++ b/src/backend/access/gin/ginfast.c @@ -244,9 +244,10 @@ ginHeapTupleFastInsert(GinState *ginstate, GinTupleCollector *collector) /* * 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. + * predicate lock on the metabuffer to represent that. Therefore we'll + * check for conflicts in, but not until we have the page locked and are + * ready to modify the page. */ - CheckForSerializableConflictIn(index, NULL, metabuffer); if (collector->sumsize + collector->ntuples * sizeof(ItemIdData) > GinListPageSize) { @@ -290,6 +291,8 @@ ginHeapTupleFastInsert(GinState *ginstate, GinTupleCollector *collector) LockBuffer(metabuffer, GIN_EXCLUSIVE); metadata = GinPageGetMeta(metapage); + CheckForSerializableConflictIn(index, NULL, metabuffer); + if (metadata->head == InvalidBlockNumber) { /* @@ -352,6 +355,8 @@ ginHeapTupleFastInsert(GinState *ginstate, GinTupleCollector *collector) char *ptr; char *collectordata; + CheckForSerializableConflictIn(index, NULL, metabuffer); + buffer = ReadBuffer(index, metadata->tail); LockBuffer(buffer, GIN_EXCLUSIVE); page = BufferGetPage(buffer); |