summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTeodor Sigaev2016-05-17 19:09:22 +0000
committerTeodor Sigaev2016-05-17 19:09:22 +0000
commit7c979c95a3700d0bd34c2831f49a9260d505b0f9 (patch)
treef0c2a1564028f41cc6f4b4db3fb227c941c53004 /src
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.
Diffstat (limited to 'src')
-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 8ad69f83b1f..ae874cc50d4 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;