diff options
Diffstat (limited to 'src/backend/access/gist')
-rw-r--r-- | src/backend/access/gist/gist.c | 10 | ||||
-rw-r--r-- | src/backend/access/gist/gistutil.c | 21 | ||||
-rw-r--r-- | src/backend/access/gist/gistvacuum.c | 8 |
3 files changed, 29 insertions, 10 deletions
diff --git a/src/backend/access/gist/gist.c b/src/backend/access/gist/gist.c index 2742969c6af..405934caad1 100644 --- a/src/backend/access/gist/gist.c +++ b/src/backend/access/gist/gist.c @@ -22,8 +22,6 @@ #include "storage/indexfsm.h" #include "utils/memutils.h" -const XLogRecPtr XLogRecPtrForTemp = {1, 1}; - /* Working state for gistbuild and its callback */ typedef struct { @@ -132,7 +130,7 @@ gistbuild(PG_FUNCTION_ARGS) PageSetTLI(page, ThisTimeLineID); } else - PageSetLSN(page, XLogRecPtrForTemp); + PageSetLSN(page, GetXLogRecPtrForTemp()); UnlockReleaseBuffer(buffer); @@ -423,7 +421,7 @@ gistplacetopage(GISTInsertState *state, GISTSTATE *giststate) { for (ptr = dist; ptr; ptr = ptr->next) { - PageSetLSN(ptr->page, XLogRecPtrForTemp); + PageSetLSN(ptr->page, GetXLogRecPtrForTemp()); } } @@ -491,7 +489,7 @@ gistplacetopage(GISTInsertState *state, GISTSTATE *giststate) PageSetTLI(state->stack->page, ThisTimeLineID); } else - PageSetLSN(state->stack->page, XLogRecPtrForTemp); + PageSetLSN(state->stack->page, GetXLogRecPtrForTemp()); if (state->stack->blkno == GIST_ROOT_BLKNO) state->needInsertComplete = false; @@ -1027,7 +1025,7 @@ gistnewroot(Relation r, Buffer buffer, IndexTuple *itup, int len, ItemPointer ke PageSetTLI(page, ThisTimeLineID); } else - PageSetLSN(page, XLogRecPtrForTemp); + PageSetLSN(page, GetXLogRecPtrForTemp()); END_CRIT_SECTION(); } diff --git a/src/backend/access/gist/gistutil.c b/src/backend/access/gist/gistutil.c index 78eb3787252..a2e8fe0cfb9 100644 --- a/src/backend/access/gist/gistutil.c +++ b/src/backend/access/gist/gistutil.c @@ -677,3 +677,24 @@ gistoptions(PG_FUNCTION_ARGS) PG_RETURN_BYTEA_P(result); PG_RETURN_NULL(); } + +/* + * Temporary GiST indexes are not WAL-logged, but we need LSNs to detect + * concurrent page splits anyway. GetXLogRecPtrForTemp() provides a fake + * sequence of LSNs for that purpose. Each call generates an LSN that is + * greater than any previous value returned by this function in the same + * session. + */ +XLogRecPtr +GetXLogRecPtrForTemp(void) +{ + static XLogRecPtr counter = {0, 1}; + + counter.xrecoff++; + if (counter.xrecoff == 0) + { + counter.xlogid++; + counter.xrecoff++; + } + return counter; +} diff --git a/src/backend/access/gist/gistvacuum.c b/src/backend/access/gist/gistvacuum.c index 975f9d8c56f..0433b47ae1e 100644 --- a/src/backend/access/gist/gistvacuum.c +++ b/src/backend/access/gist/gistvacuum.c @@ -138,7 +138,7 @@ gistDeleteSubtree(GistVacuum *gv, BlockNumber blkno) PageSetTLI(page, ThisTimeLineID); } else - PageSetLSN(page, XLogRecPtrForTemp); + PageSetLSN(page, GetXLogRecPtrForTemp()); END_CRIT_SECTION(); @@ -245,7 +245,7 @@ vacuumSplitPage(GistVacuum *gv, Page tempPage, Buffer buffer, IndexTuple *addon, else { for (ptr = dist; ptr; ptr = ptr->next) - PageSetLSN(BufferGetPage(ptr->buffer), XLogRecPtrForTemp); + PageSetLSN(BufferGetPage(ptr->buffer), GetXLogRecPtrForTemp()); } for (ptr = dist; ptr; ptr = ptr->next) @@ -460,7 +460,7 @@ gistVacuumUpdate(GistVacuum *gv, BlockNumber blkno, bool needunion) pfree(rdata); } else - PageSetLSN(page, XLogRecPtrForTemp); + PageSetLSN(page, GetXLogRecPtrForTemp()); } END_CRIT_SECTION(); @@ -774,7 +774,7 @@ gistbulkdelete(PG_FUNCTION_ARGS) pfree(rdata); } else - PageSetLSN(page, XLogRecPtrForTemp); + PageSetLSN(page, GetXLogRecPtrForTemp()); END_CRIT_SECTION(); } |