fis-gtm/sr_port/mu_reduce_level.c

88 lines
2.8 KiB
C

/****************************************************************
* *
* Copyright 2001, 2009 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. *
* *
****************************************************************/
/* mu_reduce_level.c: Reduce level overwriting root with it's star-record-only child block. */
#include "mdef.h"
#include "gtm_string.h"
#include "cdb_sc.h"
#include "gdsroot.h"
#include "gdsblk.h"
#include "gtm_facility.h"
#include "fileinfo.h"
#include "gdsbt.h"
#include "gdsfhead.h"
#include "filestruct.h"
#include "gdsblkops.h"
#include "gdskill.h"
#include "gdscc.h"
#include "jnl.h"
#include "copy.h"
#include "muextr.h"
#include "mu_reorg.h"
/* Include prototypes */
#include "t_write.h"
#include "mupip_reorg.h"
GBLREF gv_namehead *gv_target;
GBLREF sgmnt_data_ptr_t cs_data;
GBLREF uint4 update_array_size; /* for the BLK_* macros */
GBLREF char *update_array, *update_array_ptr;
GBLREF unsigned int t_tries;
GBLREF uint4 t_err;
/**************************************************************************************
Input Parameters:
(GBL_DEF) gv_target: For reference block's history
Output Parameters:
kill_set_ptr : List of blocks to be freed
***************************************************************************************/
enum cdb_sc mu_reduce_level(kill_set *kill_set_ptr)
{
int level;
int old_blk_sz;
int blk_seg_cnt, blk_size;
blk_segment *bs_ptr1, *bs_ptr2;
sm_uc_ptr_t old_blk_base, save_blk;
level = gv_target->hist.depth;
if (1 == level)
return cdb_sc_oprnotneeded;
blk_size = cs_data->blk_size;
kill_set_ptr->used = 0;
memset(kill_set_ptr, 0, SIZEOF(kill_set));
CHECK_AND_RESET_UPDATE_ARRAY; /* reset update_array_ptr to update_array */
old_blk_base = gv_target->hist.h[level].buffaddr;
old_blk_sz = ((blk_hdr_ptr_t)(old_blk_base))->bsiz;
if (SIZEOF(blk_hdr) + BSTAR_REC_SIZE != old_blk_sz)
return cdb_sc_oprnotneeded;
old_blk_base = gv_target->hist.h[level-1].buffaddr;
old_blk_sz = ((blk_hdr_ptr_t)(old_blk_base))->bsiz;
BLK_ADDR(save_blk, old_blk_sz - SIZEOF(blk_hdr), unsigned char);
memcpy(save_blk, old_blk_base + SIZEOF(blk_hdr), old_blk_sz - SIZEOF(blk_hdr));
BLK_INIT(bs_ptr2, bs_ptr1);
BLK_SEG(bs_ptr2, save_blk, old_blk_sz - SIZEOF(blk_hdr));
if (!BLK_FINI(bs_ptr2, bs_ptr1))
{
assert(t_tries < CDB_STAGNATE);
return cdb_sc_blkmod;
}
t_write(&gv_target->hist.h[level], (unsigned char *)bs_ptr1, 0, 0, level - 1, TRUE, TRUE, GDS_WRITE_KILLTN);
kill_set_ptr->blk[kill_set_ptr->used].flag = 0;
kill_set_ptr->blk[kill_set_ptr->used].level = 0;
kill_set_ptr->blk[kill_set_ptr->used++].block = gv_target->hist.h[level-1].blk_num;
return cdb_sc_normal;
}