fis-gtm/sr_port/mur_multi_rehash.c

74 lines
2.3 KiB
C

/****************************************************************
* *
* Copyright 2003, 2011 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 "error.h"
#include "gdsroot.h"
#include "gdsblk.h"
#include "gdsbt.h"
#include "gtm_facility.h"
#include "fileinfo.h"
#include "gdsfhead.h"
#include "filestruct.h"
#include "jnl.h"
#include "hashtab_int4.h"
#include "hashtab_int8.h"
#include "hashtab_mname.h"
#include "buddy_list.h"
#include "muprec.h"
GBLREF mur_gbls_t murgbl;
#define MUR_ENOUGH_COMPLETE_TRANS(MURGBL) ((MURGBL).broken_cnt <= ((MURGBL).token_table.count >> 2)) /* 75% resolved completely */
void mur_multi_rehash(void)
{
multi_struct *multi, *next_multi;
hash_table_int8 temp_table;
ht_ent_int8 *newent, *curent, *topent;
DEBUG_ONLY(int brkn_cnt;)
/* see if re-hashing of broken entries can reduce the size of the hash-table leading to faster processing times */
if (MUR_ENOUGH_COMPLETE_TRANS(murgbl)) /* are enough entries fully resolved to justify cost of re-hashing? */
{ /* re-hash broken entries */
DEBUG_ONLY(brkn_cnt = 0;)
ESTABLISH(hashtab_rehash_ch);
/* enough size to acommodate broken transactions */
init_hashtab_int8(&temp_table, murgbl.broken_cnt * 100.0 / HT_LOAD_FACTOR, HASHTAB_COMPACT, HASHTAB_SPARE_TABLE);
REVERT;
for (curent = murgbl.token_table.base, topent = murgbl.token_table.top; curent < topent; curent++)
{
if (HTENT_VALID_INT8(curent, multi_struct, multi))
{
for (next_multi = multi; NULL != next_multi; multi = next_multi)
{
next_multi = (multi_struct *)multi->next;
if (0 < multi->partner) /* re-hash only broken transactions */
{
multi->next = NULL;
if (!add_hashtab_int8(&temp_table, &multi->token, multi, &newent))
{
assert(NULL != newent->value);
multi->next = (multi_struct *)newent->value;
newent->value = (char *)multi;
}
DEBUG_ONLY(brkn_cnt++;)
}
}
}
}
free_hashtab_int8(&murgbl.token_table);
murgbl.token_table = temp_table;
assert(brkn_cnt == murgbl.broken_cnt);
}
return;
}