diff options
author | Teodor Sigaev | 2016-05-17 19:09:22 +0000 |
---|---|---|
committer | Teodor Sigaev | 2016-05-17 19:09:22 +0000 |
commit | 7c979c95a3700d0bd34c2831f49a9260d505b0f9 (patch) | |
tree | f0c2a1564028f41cc6f4b4db3fb227c941c53004 | |
parent | b09cd2e50a69182ef38ad67ac77d06a87236c5b0 (diff) |
Allocate all page images at once in generic wal interface
That reduces number of allocation.
Per gripe from Michael Paquier and Tom Lane suggestion.
-rw-r--r-- | src/backend/access/transam/generic_xlog.c | 19 |
1 files changed, 9 insertions, 10 deletions
diff --git a/src/backend/access/transam/generic_xlog.c b/src/backend/access/transam/generic_xlog.c index 8ad69f83b1..ae874cc50d 100644 --- a/src/backend/access/transam/generic_xlog.c +++ b/src/backend/access/transam/generic_xlog.c @@ -61,8 +61,14 @@ typedef struct /* State of generic xlog record construction */ struct GenericXLogState { - bool isLogged; + /* + * page's images. Should be first in this struct to have MAXALIGN'ed + * images addresses, because some code working with pages directly aligns + * addresses, not an offsets from begining of page + */ + char images[MAX_GENERIC_XLOG_PAGES * BLCKSZ]; PageData pages[MAX_GENERIC_XLOG_PAGES]; + bool isLogged; }; static void writeFragment(PageData *pageData, OffsetNumber offset, @@ -267,16 +273,11 @@ GenericXLogStart(Relation relation) int i; state = (GenericXLogState *) palloc(sizeof(GenericXLogState)); - state->isLogged = RelationNeedsWAL(relation); + for (i = 0; i < MAX_GENERIC_XLOG_PAGES; i++) { - /* - * pre-alloc page's images to prevent allocation in - * GenericXLogRegisterBuffer() which could be called in different - * memory context(s) - */ - state->pages[i].image = palloc(BLCKSZ); + state->pages[i].image = state->images + BLCKSZ * i; state->pages[i].buffer = InvalidBuffer; } @@ -432,8 +433,6 @@ GenericXLogFinish(GenericXLogState *state) lsn = InvalidXLogRecPtr; } - for (i = 0; i < MAX_GENERIC_XLOG_PAGES; i++) - pfree(state->pages[i].image); pfree(state); return lsn; |