@@ -342,6 +342,10 @@ GenericXLogFinish(GenericXLogState *state)
342
342
343
343
START_CRIT_SECTION ();
344
344
345
+ /*
346
+ * Compute deltas if necessary, write changes to buffers, mark
347
+ * buffers dirty, and register changes.
348
+ */
345
349
for (i = 0 ;i < MAX_GENERIC_XLOG_PAGES ;i ++ )
346
350
{
347
351
PageData * pageData = & state -> pages [i ];
@@ -354,41 +358,34 @@ GenericXLogFinish(GenericXLogState *state)
354
358
page = BufferGetPage (pageData -> buffer );
355
359
pageHeader = (PageHeader )pageData -> image ;
356
360
361
+ /*
362
+ * Compute delta while we still have both the unmodified page and
363
+ * the new image. Not needed if we are logging the full image.
364
+ */
365
+ if (!(pageData -> flags & GENERIC_XLOG_FULL_IMAGE ))
366
+ computeDelta (pageData ,page , (Page )pageData -> image );
367
+
368
+ /*
369
+ * Apply the image, being careful to zero the "hole" between
370
+ * pd_lower and pd_upper in order to avoid divergence between
371
+ * actual page state and what replay would produce.
372
+ */
373
+ memcpy (page ,pageData -> image ,pageHeader -> pd_lower );
374
+ memset (page + pageHeader -> pd_lower ,0 ,
375
+ pageHeader -> pd_upper - pageHeader -> pd_lower );
376
+ memcpy (page + pageHeader -> pd_upper ,
377
+ pageData -> image + pageHeader -> pd_upper ,
378
+ BLCKSZ - pageHeader -> pd_upper );
379
+
380
+ MarkBufferDirty (pageData -> buffer );
381
+
357
382
if (pageData -> flags & GENERIC_XLOG_FULL_IMAGE )
358
383
{
359
- /*
360
- * A full-page image does not require us to supply any xlog
361
- * data. Just apply the image, being careful to zero the
362
- * "hole" between pd_lower and pd_upper in order to avoid
363
- * divergence between actual page state and what replay would
364
- * produce.
365
- */
366
- memcpy (page ,pageData -> image ,pageHeader -> pd_lower );
367
- memset (page + pageHeader -> pd_lower ,0 ,
368
- pageHeader -> pd_upper - pageHeader -> pd_lower );
369
- memcpy (page + pageHeader -> pd_upper ,
370
- pageData -> image + pageHeader -> pd_upper ,
371
- BLCKSZ - pageHeader -> pd_upper );
372
-
373
384
XLogRegisterBuffer (i ,pageData -> buffer ,
374
385
REGBUF_FORCE_IMAGE |REGBUF_STANDARD );
375
386
}
376
387
else
377
388
{
378
- /*
379
- * In normal mode, calculate delta and write it as xlog data
380
- * associated with this page.
381
- */
382
- computeDelta (pageData ,page , (Page )pageData -> image );
383
-
384
- /* Apply the image, with zeroed "hole" as above */
385
- memcpy (page ,pageData -> image ,pageHeader -> pd_lower );
386
- memset (page + pageHeader -> pd_lower ,0 ,
387
- pageHeader -> pd_upper - pageHeader -> pd_lower );
388
- memcpy (page + pageHeader -> pd_upper ,
389
- pageData -> image + pageHeader -> pd_upper ,
390
- BLCKSZ - pageHeader -> pd_upper );
391
-
392
389
XLogRegisterBuffer (i ,pageData -> buffer ,REGBUF_STANDARD );
393
390
XLogRegisterBufData (i ,pageData -> delta ,pageData -> deltaLen );
394
391
}
@@ -397,15 +394,14 @@ GenericXLogFinish(GenericXLogState *state)
397
394
/* Insert xlog record */
398
395
lsn = XLogInsert (RM_GENERIC_ID ,0 );
399
396
400
- /* Set LSNand mark buffers dirty */
397
+ /* Set LSN */
401
398
for (i = 0 ;i < MAX_GENERIC_XLOG_PAGES ;i ++ )
402
399
{
403
400
PageData * pageData = & state -> pages [i ];
404
401
405
402
if (BufferIsInvalid (pageData -> buffer ))
406
403
continue ;
407
404
PageSetLSN (BufferGetPage (pageData -> buffer ),lsn );
408
- MarkBufferDirty (pageData -> buffer );
409
405
}
410
406
END_CRIT_SECTION ();
411
407
}