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 | 2 | 
3 files changed, 26 insertions, 7 deletions
| diff --git a/src/backend/access/gist/gist.c b/src/backend/access/gist/gist.c index cec08c72267..4a5d4bf6f10 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 03c5773d4d3..a23047642fd 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 abd3d999565..33f7c8c76ae 100644 --- a/src/backend/access/gist/gistvacuum.c +++ b/src/backend/access/gist/gistvacuum.c @@ -268,7 +268,7 @@ gistbulkdelete(PG_FUNCTION_ARGS)  					pfree(rdata);  				}  				else -					PageSetLSN(page, XLogRecPtrForTemp); +					PageSetLSN(page, GetXLogRecPtrForTemp());  				END_CRIT_SECTION();  			} | 
