fis-gtm/sr_port/gvcst_tp_init.c

109 lines
4.5 KiB
C

/****************************************************************
* *
* Copyright 2003, 2010 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 "gtm_string.h"
#include "gdsroot.h"
#include "gdsblk.h"
#include "gtm_facility.h"
#include "fileinfo.h"
#include "gdsbt.h"
#include "gdsfhead.h"
#include "filestruct.h"
#include "gdscc.h"
#include "gdskill.h"
#include "jnl.h"
#include "buddy_list.h" /* needed for tp.h */
#include "hashtab_int4.h" /* needed for tp.h */
#include "hashtab.h"
#include "tp.h"
#include "tp_timeout.h"
#include "gvcst_protos.h" /* for gvcst_tp_init prototype */
/* Initialize the TP structures we will be using for the successive TP operations */
void gvcst_tp_init(gd_region *greg)
{
sgm_info *si;
sgmnt_addrs *csa;
csa = (sgmnt_addrs *)&FILE_INFO(greg)->s_addrs;
if (NULL == csa->sgm_info_ptr)
{
si = csa->sgm_info_ptr = (sgm_info *)malloc(SIZEOF(sgm_info));
assert(32768 > SIZEOF(sgm_info));
memset(si, 0, SIZEOF(sgm_info));
si->tp_hist_size = TP_MAX_MM_TRANSIZE;
si->cur_tp_hist_size = INIT_CUR_TP_HIST_SIZE; /* should be very much less than si->tp_hist_size */
assert(si->cur_tp_hist_size <= si->tp_hist_size);
si->blks_in_use = (hash_table_int4 *)malloc(SIZEOF(hash_table_int4));
init_hashtab_int4(si->blks_in_use, BLKS_IN_USE_INIT_ELEMS, HASHTAB_COMPACT, HASHTAB_SPARE_TABLE);
/* See comment in tp.h about cur_tp_hist_size for details */
si->first_tp_hist = si->last_tp_hist =
(srch_blk_status *)malloc(SIZEOF(srch_blk_status) * si->cur_tp_hist_size);
si->cw_set_list = (buddy_list *)malloc(SIZEOF(buddy_list));
initialize_list(si->cw_set_list, SIZEOF(cw_set_element), CW_SET_LIST_INIT_ALLOC);
si->tlvl_cw_set_list = (buddy_list *)malloc(SIZEOF(buddy_list));
initialize_list(si->tlvl_cw_set_list, SIZEOF(cw_set_element), TLVL_CW_SET_LIST_INIT_ALLOC);
si->tlvl_info_list = (buddy_list *)malloc(SIZEOF(buddy_list));
initialize_list(si->tlvl_info_list, SIZEOF(tlevel_info), TLVL_INFO_LIST_INIT_ALLOC);
si->new_buff_list = (buddy_list *)malloc(SIZEOF(buddy_list));
initialize_list(si->new_buff_list, SIZEOF(que_ent) + csa->hdr->blk_size, NEW_BUFF_LIST_INIT_ALLOC);
si->recompute_list = (buddy_list *)malloc(SIZEOF(buddy_list));
initialize_list(si->recompute_list, SIZEOF(key_cum_value), RECOMPUTE_LIST_INIT_ALLOC);
/* The size of the si->cr_array can go up to TP_MAX_MM_TRANSIZE, but usually is quite less.
* Therefore, initially allocate a small array and expand as needed later.
*/
if (dba_bg == greg->dyn.addr->acc_meth)
{
si->cr_array_size = si->cur_tp_hist_size;
si->cr_array = (cache_rec_ptr_ptr_t)malloc(SIZEOF(cache_rec_ptr_t) * si->cr_array_size);
} else
{
si->cr_array_size = 0;
si->cr_array = NULL;
}
si->fresh_start = TRUE;
} else
si = csa->sgm_info_ptr;
si->gv_cur_region = greg;
si->tp_csa = csa;
si->tp_csd = csa->hdr;
si->start_tn = csa->ti->curr_tn;
if (JNL_ALLOWED(csa))
{
si->total_jnl_rec_size = csa->min_total_tpjnl_rec_size; /* Reinitialize total_jnl_rec_size */
/* Since the following jnl-mallocs are independent of any dynamically-changeable parameter of the
* database, we can as well use the existing malloced jnl structures if at all they exist.
*/
if (NULL == si->jnl_tail)
{
si->jnl_tail = &si->jnl_head;
si->jnl_list = (buddy_list *)malloc(SIZEOF(buddy_list));
initialize_list(si->jnl_list, SIZEOF(jnl_format_buffer), JNL_LIST_INIT_ALLOC);
si->format_buff_list = (buddy_list *)malloc(SIZEOF(buddy_list));
/* Minimum value of elemSize is 8 due to alignment requirements of the returned memory location.
* Therefore, we request an elemSize of 8 bytes for the format-buffer and will convert as much
* bytes as we need into as many 8-byte multiple segments (see code in jnl_format).
*/
initialize_list(si->format_buff_list, JFB_ELE_SIZE,
DIVIDE_ROUND_UP(JNL_FORMAT_BUFF_INIT_ALLOC, JFB_ELE_SIZE));
}
} else if (NULL != si->jnl_tail)
{ /* journaling is currently disallowed although it was allowed (non-zero si->jnl_tail)
* during the prior use of this region. Free up unnecessary region-specific structures now.
*/
FREEUP_BUDDY_LIST(si->jnl_list);
FREEUP_BUDDY_LIST(si->format_buff_list);
si->jnl_tail = NULL;
}
}