diff options
Diffstat (limited to 'src/backend/access/transam/generic_xlog.c')
-rw-r--r-- | src/backend/access/transam/generic_xlog.c | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/src/backend/access/transam/generic_xlog.c b/src/backend/access/transam/generic_xlog.c index 6e213e2f60c..8ad69f83b1f 100644 --- a/src/backend/access/transam/generic_xlog.c +++ b/src/backend/access/transam/generic_xlog.c @@ -52,7 +52,9 @@ typedef struct Buffer buffer; /* registered buffer */ int flags; /* flags for this buffer */ int deltaLen; /* space consumed in delta field */ - char image[BLCKSZ]; /* copy of page image for modification */ + char *image; /* copy of page image for modification, + * do not do it in-place to have aligned + * memory chunk */ char delta[MAX_DELTA_SIZE]; /* delta between page images */ } PageData; @@ -268,7 +270,15 @@ GenericXLogStart(Relation relation) 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].buffer = InvalidBuffer; + } return state; } @@ -422,6 +432,8 @@ GenericXLogFinish(GenericXLogState *state) lsn = InvalidXLogRecPtr; } + for (i = 0; i < MAX_GENERIC_XLOG_PAGES; i++) + pfree(state->pages[i].image); pfree(state); return lsn; |