summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTeodor Sigaev2016-05-17 19:09:22 +0000
committerTeodor Sigaev2016-05-17 19:09:22 +0000
commit7c979c95a3700d0bd34c2831f49a9260d505b0f9 (patch)
treef0c2a1564028f41cc6f4b4db3fb227c941c53004
parentb09cd2e50a69182ef38ad67ac77d06a87236c5b0 (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.c19
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;