fis-gtm/sr_port/bml_init.c

71 lines
2.8 KiB
C

/****************************************************************
* *
* Copyright 2001, 2008 Fidelity Information Services, Inc *
* *
* This source code contains the intellectual property *
* of its copyright holder(s), and is made available *
* under a license. If you do not know the terms of *
* the license, please stop and do not read further. *
* *
****************************************************************/
#include "mdef.h"
#ifdef UNIX
#include <errno.h> /* for DSK_WRITE macro */
#elif defined(VMS)
#include "efn.h" /* for DSK_WRITE macro */
#else
#error UNSUPPORTED PLATFORM
#endif
#include "gdsroot.h"
#include "gdsbt.h"
#include "gdsblk.h"
#include "gdsbml.h"
#include "gtm_facility.h"
#include "fileinfo.h"
#include "gdsfhead.h"
#include "filestruct.h"
#include "jnl.h"
GBLREF gd_region *gv_cur_region;
GBLREF sgmnt_addrs *cs_addrs;
GBLREF sgmnt_data_ptr_t cs_data;
GBLREF jnl_gbls_t jgbl;
int4 bml_init(block_id bml)
{
blk_hdr_ptr_t ptr;
uint4 size;
uint4 status;
trans_num blktn;
size = BM_SIZE(cs_data->bplmap);
/* Allocate full block .. bml_newmap will set the write size, dsk_write will write part or all of it as appropriate. */
ptr = (blk_hdr_ptr_t)malloc(cs_addrs->hdr->blk_size);
/* We are about to create a local bitmap. Setting its block transaction number to the current database transaction
* number gives us a clear history of when this bitmap got created. There are two exceptions.
* 1) If before-image journaling, it implies the possibility of using backward recovery/rollback both of which can
* take the database to a transaction number MUCH BEFORE the current database transaction number. In that case, the
* recovered database will have DBTNTOOLG integrity errors since the bitmap block's transaction number will be greater
* than the post-recovery database transaction number. Since we have no control over what transaction number backward
* recovery can take the database to, we set the bitmap block transaction number to 0 (the least possible) for the
* before-image journaling case.
* 2) If in forward recovery, then the database current transaction number is not incremented in gdsfilext (the caller
* of this function) so we have to create the local bitmap blocks with curr_tn-1 in order to avoid a DBTNTOOLG error.
*/
if (JNL_ENABLED(cs_data) && cs_addrs->jnl && cs_addrs->jnl->jnl_buff && cs_addrs->jnl->jnl_buff->before_images)
blktn = 0;
else if (jgbl.forw_phase_recovery && !JNL_ENABLED(cs_data)) /* forward recovery */
blktn = cs_data->trans_hist.curr_tn - 1;
else
blktn = cs_data->trans_hist.curr_tn;
bml_newmap(ptr, size, blktn);
/* status holds the status of any error return from dsk_write */
DSK_WRITE_NOCACHE(gv_cur_region, bml, (sm_uc_ptr_t)ptr, cs_data->desired_db_format, status);
free(ptr);
return status;
}