@@ -342,6 +342,10 @@ GenericXLogFinish(GenericXLogState *state)
342342
343343START_CRIT_SECTION ();
344344
345+ /*
346+ * Compute deltas if necessary, write changes to buffers, mark
347+ * buffers dirty, and register changes.
348+ */
345349for (i = 0 ;i < MAX_GENERIC_XLOG_PAGES ;i ++ )
346350{
347351PageData * pageData = & state -> pages [i ];
@@ -354,41 +358,34 @@ GenericXLogFinish(GenericXLogState *state)
354358page = BufferGetPage (pageData -> buffer );
355359pageHeader = (PageHeader )pageData -> image ;
356360
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+
357382if (pageData -> flags & GENERIC_XLOG_FULL_IMAGE )
358383{
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-
373384XLogRegisterBuffer (i ,pageData -> buffer ,
374385REGBUF_FORCE_IMAGE |REGBUF_STANDARD );
375386}
376387else
377388{
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-
392389XLogRegisterBuffer (i ,pageData -> buffer ,REGBUF_STANDARD );
393390XLogRegisterBufData (i ,pageData -> delta ,pageData -> deltaLen );
394391}
@@ -397,15 +394,14 @@ GenericXLogFinish(GenericXLogState *state)
397394/* Insert xlog record */
398395lsn = XLogInsert (RM_GENERIC_ID ,0 );
399396
400- /* Set LSNand mark buffers dirty */
397+ /* Set LSN */
401398for (i = 0 ;i < MAX_GENERIC_XLOG_PAGES ;i ++ )
402399{
403400PageData * pageData = & state -> pages [i ];
404401
405402if (BufferIsInvalid (pageData -> buffer ))
406403continue ;
407404PageSetLSN (BufferGetPage (pageData -> buffer ),lsn );
408- MarkBufferDirty (pageData -> buffer );
409405}
410406END_CRIT_SECTION ();
411407}