79 lines
2.5 KiB
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));
|
|
}
|
|
}
|
|
}
|