fis-gtm/sr_port/bml_status_check.c

79 lines
2.5 KiB
C

/****************************************************************
* *
* Copyright 2007, 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"
#include "gdsroot.h"
#include "gdskill.h"
#include "gtm_facility.h"
#include "fileinfo.h"
#include "gdsbt.h"
#include "gdsfhead.h"
#include "filestruct.h"
#include "gdsblk.h"
#include "gdsbml.h"
#include "gdscc.h"
#include "mm_read.h"
#include "bml_status_check.h"
#define MAX_FFS_SIZE 32
GBLREF sgmnt_addrs *cs_addrs;
/* Checks that a block that we have acquired is marked RECYCLED/FREE in the database
* and that an existing block that we are updating is marked BUSY in the database.
* For BG, the check is done only if the bitmap block is available in the cache AND is not being concurrently updated.
*/
void bml_status_check(cw_set_element *cs)
{
block_id bmlblk, blk;
cache_rec_ptr_t bmlcr;
blk_hdr_ptr_t bmlbuff;
boolean_t is_mm;
int4 bml_status;
is_mm = (dba_mm == cs_addrs->hdr->acc_meth);
assert(gds_t_create != cs->mode);
if ((gds_t_acquired == cs->mode) || (gds_t_write == cs->mode))
{
bmlblk = ROUND_DOWN2(cs->blk, BLKS_PER_LMAP);
assert(IS_BITMAP_BLK(bmlblk));
blk = cs->blk - bmlblk;
assert(blk);
if (!is_mm)
{
bmlcr = db_csh_get(bmlblk);
bmlbuff = ((NULL != bmlcr) && (CR_NOTVALID != (sm_long_t)bmlcr)
&& (0 > bmlcr->read_in_progress) && !bmlcr->in_tend)
? (blk_hdr_ptr_t)GDS_REL2ABS(bmlcr->buffaddr)
: NULL;
} else
{
bmlbuff = (blk_hdr_ptr_t)mm_read(bmlblk);
/* mm_read would have incremented the GVSTATS n_dsk_read counter. But we dont want that to happen
* because this function is invoked only in debug builds and yet we want the same counter
* value for both pro and dbg builds. So undo that action immediately.
*/
INCR_GVSTATS_COUNTER(cs_addrs, cs_addrs->nl, n_dsk_read, (gtm_uint64_t)-1);/* note the -1 causes the undo */
assert(NULL != bmlbuff);
}
if (NULL != bmlbuff)
{
assert(LCL_MAP_LEVL == bmlbuff->levl);
assert(BM_SIZE(cs_addrs->hdr->bplmap) == bmlbuff->bsiz);
GET_BM_STATUS(bmlbuff, blk, bml_status);
assert(BLK_MAPINVALID != bml_status);
assert((gds_t_acquired != cs->mode) || (BLK_BUSY != bml_status));
assert((gds_t_acquired == cs->mode) || (BLK_BUSY == bml_status));
}
}
}