fis-gtm/sr_port/dse_chng_fhead.c

767 lines
26 KiB
C

/****************************************************************
* *
* Copyright 2001, 2012 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. *
* *
****************************************************************/
/*******************************************************************************
*
* MODULE NAME: CHANGE_FHEAD
*
* CALLING SEQUENCE: void change_fhead()
*
* DESCRIPTION: This module changes values of certain fields
* of the file header. The only range-checking
* takes place on input, not in this routine, allowing
* the user maximum control.
*
* HISTORY:
*
*******************************************************************************/
#include "gtm_string.h"
#include "mdef.h"
#include "gtm_stdlib.h"
#include "gtm_unistd.h"
#include "gtm_stdio.h"
#include "gdsroot.h"
#include "gtm_facility.h"
#include "fileinfo.h"
#include "gdsbt.h"
#include "gdsfhead.h"
#include "filestruct.h"
#include "cli.h"
#include "timersp.h"
#include "jnl.h"
#include "util.h"
#include "gtm_caseconv.h"
#include "gt_timer.h"
#include "timers.h"
#include "send_msg.h"
#include "dse.h"
#include "gtmmsg.h"
#ifdef GTM_CRYPT
#include "gtmcrypt.h"
#endif
GBLREF VSIG_ATOMIC_T util_interrupt;
GBLREF sgmnt_addrs *cs_addrs;
GBLREF sgmnt_data *cs_data;
GBLREF gd_region *gv_cur_region;
GBLREF uint4 process_id;
GBLREF uint4 image_count;
LITREF char *gtm_dbversion_table[];
error_def(ERR_FREEZE);
error_def(ERR_BLKSIZ512);
error_def(ERR_DBRDONLY);
error_def(ERR_SIZENOTVALID8);
error_def(ERR_FREEZECTRL);
void dse_chng_fhead(void)
{
int4 x, index_x, save_x, fname_len;
unsigned short buf_len;
boolean_t was_crit, was_hold_onto_crit, corrupt_file_present;
boolean_t override = FALSE;
int4 nocrit_present;
int4 location_present, value_present, size_present, size;
uint4 location;
boolean_t max_tn_present, max_tn_warn_present, curr_tn_present, change_tn;
gtm_uint64_t value, old_value;
seq_num seq_no;
trans_num tn, prev_tn, max_tn_old, max_tn_warn_old, curr_tn_old, max_tn_new, max_tn_warn_new, curr_tn_new;
char temp_str[256], temp_str1[256], buf[MAX_LINE], *fname_ptr;
int gethostname_res;
sm_uc_ptr_t chng_ptr;
const char *freeze_msg[] = { "UNFROZEN", "FROZEN" } ;
# ifdef GTM_CRYPT
char hash_buff[GTMCRYPT_HASH_LEN];
int gtmcrypt_errno;
# endif
DCL_THREADGBL_ACCESS;
SETUP_THREADGBL_ACCESS;
if (gv_cur_region->read_only)
rts_error(VARLSTCNT(4) ERR_DBRDONLY, 2, DB_LEN_STR(gv_cur_region));
memset(temp_str, 0, 256);
memset(temp_str1, 0, 256);
memset(buf, 0, MAX_LINE);
was_crit = cs_addrs->now_crit;
/* If the user requested DSE CHANGE -FILE -CORRUPT, then skip the check in grab_crit, which triggers an rts_error, as this
* is one of the ways of turning off the file_corrupt flag in the file header
*/
TREF(skip_file_corrupt_check) = corrupt_file_present = (CLI_PRESENT == cli_present("CORRUPT_FILE"));
nocrit_present = (CLI_NEGATED == cli_present("CRIT"));
DSE_GRAB_CRIT_AS_APPROPRIATE(was_crit, was_hold_onto_crit, nocrit_present, cs_addrs, gv_cur_region);
TREF(skip_file_corrupt_check) = FALSE; /* Now that grab_crit is done, reset the global variable */
if (CLI_PRESENT == cli_present("OVERRIDE"))
override = TRUE;
# ifdef VMS
if (cs_data->freeze && (cs_data->freeze != process_id ||
cs_data->image_count != image_count) && !override)
# endif
# ifdef UNIX
if (cs_data->freeze && (cs_data->image_count != process_id)
&& !override)
# endif
{
DSE_REL_CRIT_AS_APPROPRIATE(was_crit, was_hold_onto_crit, nocrit_present, cs_addrs, gv_cur_region);
util_out_print("Region: !AD is frozen by another user, not releasing freeze.",
TRUE, REG_LEN_STR(gv_cur_region));
rts_error(VARLSTCNT(4) ERR_FREEZE, 2, REG_LEN_STR(gv_cur_region));
return;
}
prev_tn = cs_addrs->ti->curr_tn;
location_present = FALSE;
if (CLI_PRESENT == cli_present("LOCATION"))
{
location_present = TRUE;
if (!cli_get_hex("LOCATION", &location))
{
DSE_REL_CRIT_AS_APPROPRIATE(was_crit, was_hold_onto_crit, nocrit_present, cs_addrs, gv_cur_region);
return;
}
}
if (CLI_PRESENT == cli_present("HEXLOCATION"))
{
location_present = TRUE;
if (!cli_get_hex("HEXLOCATION", &location))
{
DSE_REL_CRIT_AS_APPROPRIATE(was_crit, was_hold_onto_crit, nocrit_present, cs_addrs, gv_cur_region);
return;
}
}
if (CLI_PRESENT == cli_present("DECLOCATION"))
{
location_present = TRUE;
if (!cli_get_int("DECLOCATION", (int4 *)&location))
{
DSE_REL_CRIT_AS_APPROPRIATE(was_crit, was_hold_onto_crit, nocrit_present, cs_addrs, gv_cur_region);
return;
}
}
size_present = FALSE;
if (CLI_PRESENT == cli_present("SIZE"))
{
size_present = TRUE;
if (!cli_get_int("SIZE", &size))
{
DSE_REL_CRIT_AS_APPROPRIATE(was_crit, was_hold_onto_crit, nocrit_present, cs_addrs, gv_cur_region);
return;
}
}
value_present = FALSE;
if (CLI_PRESENT == cli_present("VALUE"))
{
value_present = TRUE;
if (!cli_get_hex64("VALUE", (gtm_uint64_t *)&value))
{
DSE_REL_CRIT_AS_APPROPRIATE(was_crit, was_hold_onto_crit, nocrit_present, cs_addrs, gv_cur_region);
return;
}
}
if (CLI_PRESENT == cli_present("HEXVALUE"))
{
value_present = TRUE;
if (!cli_get_hex64("HEXVALUE", &value))
{
DSE_REL_CRIT_AS_APPROPRIATE(was_crit, was_hold_onto_crit, nocrit_present, cs_addrs, gv_cur_region);
return;
}
}
if (CLI_PRESENT == cli_present("DECVALUE"))
{
value_present = TRUE;
if (!cli_get_uint64("DECVALUE", (gtm_uint64_t *)&value))
{
DSE_REL_CRIT_AS_APPROPRIATE(was_crit, was_hold_onto_crit, nocrit_present, cs_addrs, gv_cur_region);
return;
}
}
if (TRUE == location_present)
{
if (FALSE == size_present)
size = SIZEOF(int4);
if (!((SIZEOF(char) == size) || (SIZEOF(short) == size) || (SIZEOF(int4) == size) ||
(SIZEOF(gtm_int64_t) == size)))
{
DSE_REL_CRIT_AS_APPROPRIATE(was_crit, was_hold_onto_crit, nocrit_present, cs_addrs, gv_cur_region);
rts_error(VARLSTCNT(1) ERR_SIZENOTVALID8);
}
if ((0 > (int4)size) || ((uint4)SGMNT_HDR_LEN < (uint4)location)
|| ((uint4)SGMNT_HDR_LEN < ((uint4)location + (uint4)size)))
util_out_print("Error: Cannot modify any location outside the file-header", TRUE);
else if (0 != location % size)
util_out_print("Error: Location !UL [0x!XL] should be a multiple of Size !UL",
TRUE, location, location, size, size);
else
{
chng_ptr = (sm_uc_ptr_t)cs_data + location;
if (SIZEOF(char) == size)
{
SPRINTF(temp_str, "!UB [0x!XB]");
old_value = *(sm_uc_ptr_t)chng_ptr;
}
else if (SIZEOF(short) == size)
{
SPRINTF(temp_str, "!UW [0x!XW]");
old_value = *(sm_ushort_ptr_t)chng_ptr;
}
else if (SIZEOF(int4) == size)
{
SPRINTF(temp_str, "!UL [0x!XL]");
old_value = *(sm_uint_ptr_t)chng_ptr;
}
else if (SIZEOF(gtm_int64_t) == size)
{
SPRINTF(temp_str, "!@UQ [0x!@XQ]");
old_value = *(qw_num_ptr_t)chng_ptr;
}
if (value_present)
{
if (SIZEOF(char) == size)
*(sm_uc_ptr_t)chng_ptr = (unsigned char) value;
else if (SIZEOF(short) == size)
*(sm_ushort_ptr_t)chng_ptr = (unsigned short) value;
else if (SIZEOF(int4) == size)
*(sm_uint_ptr_t)chng_ptr = (unsigned int) value;
else if (SIZEOF(gtm_int64_t) == size)
*(qw_num_ptr_t)chng_ptr = value;
} else
value = old_value;
SPRINTF(temp_str1, "Location !UL [0x!XL] : Old Value = %s : New Value = %s : Size = !UB [0x!XB]",
temp_str, temp_str);
if (SIZEOF(int4) >= size)
util_out_print(temp_str1, TRUE, location, location, (uint4)old_value, (uint4)old_value,
(uint4)value, (uint4)value, size, size);
else
util_out_print(temp_str1, TRUE, location, location, &old_value, &old_value,
&value, &value, size, size);
}
}
if ((CLI_PRESENT == cli_present("TOTAL_BLKS")) && (cli_get_hex("TOTAL_BLKS", (uint4 *)&x)))
cs_addrs->ti->total_blks = x;
if ((CLI_PRESENT == cli_present("BLOCKS_FREE")) && (cli_get_hex("BLOCKS_FREE", (uint4 *)&x)))
cs_addrs->ti->free_blocks = x;
if ((CLI_PRESENT == cli_present("BLK_SIZE")) && (cli_get_int("BLK_SIZE", &x)))
{
if (!(x % DISK_BLOCK_SIZE) && (0 != x))
cs_data->blk_size = x;
else
{
cs_data->blk_size = ((x/DISK_BLOCK_SIZE) + 1) * DISK_BLOCK_SIZE;
gtm_putmsg(VARLSTCNT(4) ERR_BLKSIZ512, 2, x, cs_data->blk_size);
}
}
if ((CLI_PRESENT == cli_present("RECORD_MAX_SIZE")) && (cli_get_int("RECORD_MAX_SIZE", &x)))
{
cs_data->max_rec_size = x;
gv_cur_region->max_rec_size = x;
}
if ((CLI_PRESENT == cli_present("KEY_MAX_SIZE")) && (cli_get_int("KEY_MAX_SIZE", &x)))
{
if (cs_data->max_key_size > x)
cs_data->maxkeysz_assured = FALSE;
cs_data->max_key_size = x;
gv_cur_region->max_key_size = x;
}
if ((CLI_PRESENT == cli_present("INHIBIT_KILLS")) && (cli_get_int("INHIBIT_KILLS", &x)))
{
cs_addrs->nl->inhibit_kills = x;
}
if (CLI_PRESENT == cli_present("INTERRUPTED_RECOV"))
{
x = cli_t_f_n("INTERRUPTED_RECOV");
if (1 == x)
cs_data->recov_interrupted = TRUE;
else if (0 == x)
cs_data->recov_interrupted = FALSE;
}
if ((CLI_PRESENT == cli_present("REFERENCE_COUNT")) && (cli_get_int("REFERENCE_COUNT", &x)))
cs_addrs->nl->ref_cnt = x;
if ((CLI_PRESENT == cli_present("RESERVED_BYTES")) && (cli_get_int("RESERVED_BYTES", &x)))
cs_data->reserved_bytes = x;
if ((CLI_PRESENT == cli_present("DEF_COLLATION")) && (cli_get_int("DEF_COLLATION", &x)))
cs_data->def_coll = x;
if (CLI_PRESENT == cli_present("NULL_SUBSCRIPTS"))
{
x = cli_n_a_e("NULL_SUBSCRIPTS");
if (-1 != x)
gv_cur_region->null_subs = cs_data->null_subs = (unsigned char)x;
}
if (CLI_PRESENT == cli_present("CERT_DB_VER"))
{
buf_len = SIZEOF(buf);
if (cli_get_str("CERT_DB_VER", buf, &buf_len))
{
lower_to_upper((uchar_ptr_t)buf, (uchar_ptr_t)buf, buf_len);
for (index_x=0; index_x < GDSVLAST ; index_x++)
if (0 == STRCMP(buf, gtm_dbversion_table[index_x]))
{
cs_data->certified_for_upgrade_to = (enum db_ver)index_x;
break;
}
if (GDSVLAST <= index_x)
util_out_print("Invalid value for CERT_DB_VER qualifier", TRUE);
}
}
if (CLI_PRESENT == cli_present("DB_WRITE_FMT"))
{
buf_len = SIZEOF(buf);
if (cli_get_str("DB_WRITE_FMT", buf, &buf_len))
{
lower_to_upper((uchar_ptr_t)buf, (uchar_ptr_t)buf, buf_len);
for (index_x=0; index_x < GDSVLAST ; index_x++)
if (0 == STRCMP(buf, gtm_dbversion_table[index_x]))
{
cs_data->desired_db_format = (enum db_ver)index_x;
cs_data->fully_upgraded = FALSE;
break;
}
if (GDSVLAST <= index_x)
util_out_print("Invalid value for DB_WRITE_FMT qualifier", TRUE);
}
}
/* ---------- Begin ------ CURRENT_TN/MAX_TN/WARN_MAX_TN processing -------- */
max_tn_old = cs_data->max_tn;
if ((CLI_PRESENT == cli_present("MAX_TN")) && (cli_get_hex64("MAX_TN", &max_tn_new)))
max_tn_present = TRUE;
else
{
max_tn_present = FALSE;
max_tn_new = max_tn_old;
}
max_tn_warn_old = cs_data->max_tn_warn;
if ((CLI_PRESENT == cli_present("WARN_MAX_TN")) && (cli_get_hex64("WARN_MAX_TN", &max_tn_warn_new)))
max_tn_warn_present = TRUE;
else
{
max_tn_warn_present = FALSE;
max_tn_warn_new = max_tn_warn_old;
}
curr_tn_old = cs_addrs->ti->curr_tn;
if ((CLI_PRESENT == cli_present("CURRENT_TN")) && (cli_get_hex64("CURRENT_TN", &curr_tn_new)))
curr_tn_present = TRUE;
else
{
curr_tn_present = FALSE;
curr_tn_new = curr_tn_old;
}
change_tn = TRUE;
if (max_tn_present)
{
if (max_tn_new < max_tn_warn_new)
{
change_tn = FALSE;
util_out_print("MAX_TN value cannot be less than the current/specified value of WARN_MAX_TN", TRUE);
}
}
if (max_tn_warn_present)
{
if (!max_tn_present && (max_tn_warn_new > max_tn_new))
{
change_tn = FALSE;
util_out_print("WARN_MAX_TN value cannot be greater than the current/specified value of MAX_TN", TRUE);
}
if (max_tn_warn_new < curr_tn_new)
{
change_tn = FALSE;
util_out_print("WARN_MAX_TN value cannot be less than the current/specified value of CURRENT_TN", TRUE);
}
}
if (curr_tn_present)
{
if (!max_tn_warn_present && (curr_tn_new > max_tn_warn_new))
{
change_tn = FALSE;
util_out_print("CURRENT_TN value cannot be greater than the current/specified value of WARN_MAX_TN", TRUE);
}
}
if (change_tn)
{
if (max_tn_present)
cs_data->max_tn = max_tn_new;
if (max_tn_warn_present)
cs_data->max_tn_warn = max_tn_warn_new;
if (curr_tn_present)
cs_addrs->ti->curr_tn = cs_addrs->ti->early_tn = curr_tn_new;
assert(max_tn_new == cs_data->max_tn);
assert(max_tn_warn_new == cs_data->max_tn_warn);
assert(curr_tn_new == cs_addrs->ti->curr_tn);
assert(max_tn_new >= max_tn_warn_new);
assert(max_tn_warn_new >= curr_tn_new);
} else
{
/* if (max_tn_present)
util_out_print("MAX_TN value not changed", TRUE);
if (max_tn_warn_present)
util_out_print("WARN_MAX_TN value not changed", TRUE);
if (curr_tn_present)
util_out_print("CURRENT_TN value not changed", TRUE);
*/
assert(max_tn_old == cs_data->max_tn);
assert(max_tn_warn_old == cs_data->max_tn_warn);
assert(curr_tn_old == cs_addrs->ti->curr_tn);
}
/* ---------- End ------ CURRENT_TN/MAX_TN/WARN_MAX_TN processing -------- */
if (CLI_PRESENT == cli_present("REG_SEQNO") && cli_get_hex64("REG_SEQNO", (gtm_uint64_t *)&seq_no))
cs_data->reg_seqno = seq_no;
UNIX_ONLY(
if (CLI_PRESENT == cli_present("STRM_NUM"))
{
assert(CLI_PRESENT == cli_present("STRM_REG_SEQNO"));
if (cli_get_int("STRM_NUM", &x) && (0 <= x) && (MAX_SUPPL_STRMS > x)
&& (CLI_PRESENT == cli_present("STRM_REG_SEQNO"))
&& cli_get_hex64("STRM_REG_SEQNO", (gtm_uint64_t *)&seq_no))
cs_data->strm_reg_seqno[x] = seq_no;
}
)
VMS_ONLY(
if (CLI_PRESENT == cli_present("RESYNC_SEQNO") && cli_get_hex64("RESYNC_SEQNO", (gtm_uint64_t *)&seq_no))
cs_data->resync_seqno = seq_no;
if (CLI_PRESENT == cli_present("RESYNC_TN") && cli_get_hex64("RESYNC_TN", &tn))
cs_data->resync_tn = tn;
)
UNIX_ONLY(
if (CLI_PRESENT == cli_present("ZQGBLMOD_SEQNO") && cli_get_hex64("ZQGBLMOD_SEQNO", (gtm_uint64_t *)&seq_no))
cs_data->zqgblmod_seqno = seq_no;
if (CLI_PRESENT == cli_present("ZQGBLMOD_TN") && cli_get_hex64("ZQGBLMOD_TN", &tn))
cs_data->zqgblmod_tn = tn;
)
if (CLI_PRESENT == cli_present("STDNULLCOLL"))
{
if ( -1 != (x = cli_t_f_n("STDNULLCOLL")))
gv_cur_region->std_null_coll = cs_data->std_null_coll = x;
}
if (corrupt_file_present)
{
x = cli_t_f_n("CORRUPT_FILE");
if (1 == x)
cs_data->file_corrupt = TRUE;
else if (0 == x)
cs_data->file_corrupt = FALSE;
}
if ((CLI_PRESENT == cli_present("TIMERS_PENDING")) && (cli_get_int("TIMERS_PENDING", &x)))
cs_addrs->nl->wcs_timers = x - 1;
change_fhead_timer("FLUSH_TIME", cs_data->flush_time,
(dba_bg == cs_data->acc_meth ? TIM_FLU_MOD_BG : TIM_FLU_MOD_MM), FALSE);
if ((CLI_PRESENT == cli_present("WRITES_PER_FLUSH")) && (cli_get_int("WRITES_PER_FLUSH", &x)))
cs_data->n_wrt_per_flu = x;
if ((CLI_PRESENT == cli_present("TRIGGER_FLUSH")) && (cli_get_int("TRIGGER_FLUSH", &x)))
cs_data->flush_trigger = x;
if ((CLI_PRESENT == cli_present("GOT2V5ONCE")) && (cli_get_int("GOT2V5ONCE", &x)))
cs_data->db_got_to_v5_once = (boolean_t)x;
change_fhead_timer("STALENESS_TIMER", cs_data->staleness, 5000, TRUE);
change_fhead_timer("TICK_INTERVAL", cs_data->ccp_tick_interval, 100, TRUE);
change_fhead_timer("QUANTUM_INTERVAL", cs_data->ccp_quantum_interval, 1000, FALSE);
change_fhead_timer("RESPONSE_INTERVAL", cs_data->ccp_response_interval, 60000, FALSE);
if ((CLI_PRESENT == cli_present("B_BYTESTREAM")) && (cli_get_hex64("B_BYTESTREAM", &tn)))
cs_data->last_inc_backup = tn;
if ((CLI_PRESENT == cli_present("B_COMPREHENSIVE")) && (cli_get_hex64("B_COMPREHENSIVE", &tn)))
cs_data->last_com_backup = tn;
if ((CLI_PRESENT == cli_present("B_DATABASE")) && (cli_get_hex64("B_DATABASE", &tn)))
cs_data->last_com_backup = tn;
if ((CLI_PRESENT == cli_present("B_INCREMENTAL")) && (cli_get_hex64("B_INCREMENTAL", &tn)))
cs_data->last_inc_backup = tn;
if ((CLI_PRESENT == cli_present("WAIT_DISK")) && (cli_get_int("WAIT_DISK", &x)))
cs_data->wait_disk_space = (x >= 0 ? x : 0);
if (((CLI_PRESENT == cli_present("HARD_SPIN_COUNT")) && cli_get_int("HARD_SPIN_COUNT", &x))
UNIX_ONLY( || ((CLI_PRESENT == cli_present("MUTEX_HARD_SPIN_COUNT")) && cli_get_int("MUTEX_HARD_SPIN_COUNT", &x)))
) /* Unix should be backward compatible, accept MUTEX_ prefix qualifiers as well */
{
if (0 < x)
cs_data->mutex_spin_parms.mutex_hard_spin_count = x;
else
util_out_print("Error: HARD SPIN COUNT should be a non zero positive number", TRUE);
}
if (((CLI_PRESENT == cli_present("SLEEP_SPIN_COUNT")) && cli_get_int("SLEEP_SPIN_COUNT", &x))
UNIX_ONLY( || ((CLI_PRESENT == cli_present("MUTEX_SLEEP_SPIN_COUNT")) && cli_get_int("MUTEX_SLEEP_SPIN_COUNT", &x)))
) /* Unix should be backward compatible, accept MUTEX_ prefix qualifiers as well */
{
if (0 < x)
cs_data->mutex_spin_parms.mutex_sleep_spin_count = x;
else
util_out_print("Error: SLEEP SPIN COUNT should be a non zero positive number", TRUE);
}
if (((CLI_PRESENT == cli_present("SPIN_SLEEP_TIME")) && cli_get_int("SPIN_SLEEP_TIME", &x))
UNIX_ONLY( || ((CLI_PRESENT == cli_present("MUTEX_SPIN_SLEEP_TIME")) && cli_get_int("MUTEX_SPIN_SLEEP_TIME", &x)))
) /* Unix should be backward compatible, accept MUTEX_ prefix qualifiers as well */
{
if (x < 0)
util_out_print("Error: SPIN SLEEP TIME should be non negative", TRUE);
else
{
save_x = x;
for (index_x = 0; 0 != x; x >>= 1, index_x++);
if (index_x <= 1)
x = index_x;
else if ((1 << (index_x - 1)) == save_x)
x = save_x - 1;
else
x = (1 << index_x) - 1;
if (x > 999999)
util_out_print("Error: SPIN SLEEP TIME should be less than one million micro seconds", TRUE);
else
cs_data->mutex_spin_parms.mutex_spin_sleep_mask = x;
}
}
UNIX_ONLY(
if ((CLI_PRESENT == cli_present("COMMITWAIT_SPIN_COUNT")) && cli_get_int("COMMITWAIT_SPIN_COUNT", &x))
{
if (0 <= x)
cs_data->wcs_phase2_commit_wait_spincnt = x;
else
util_out_print("Error: COMMITWAIT SPIN COUNT should be a positive number", TRUE);
}
)
if ((CLI_PRESENT == cli_present("B_RECORD")) && (cli_get_hex64("B_RECORD", &tn)))
cs_data->last_rec_backup = tn;
if ((CLI_PRESENT == cli_present("BLKS_TO_UPGRADE")) && (cli_get_hex("BLKS_TO_UPGRADE", (uint4 *)&x)))
{
cs_data->blks_to_upgrd = x;
cs_data->fully_upgraded = FALSE;
}
if ((CLI_PRESENT == cli_present("MBM_SIZE")) && (cli_get_int("MBM_SIZE", &x)))
cs_data->master_map_len = x * DISK_BLOCK_SIZE;
if (cs_data->clustered)
{
if (cs_addrs->ti->curr_tn == prev_tn)
{
CHECK_TN(cs_addrs, cs_data, cs_addrs->ti->curr_tn);/* can issue rts_error TNTOOLARGE */
cs_addrs->ti->early_tn++;
INCREMENT_CURR_TN(cs_data);
}
}
if ((CLI_PRESENT == cli_present("RC_SRV_COUNT")) && (cli_get_int("RC_SRV_COUNT", &x)))
cs_data->rc_srv_cnt = x;
if (CLI_PRESENT == cli_present("FREEZE"))
{
x = cli_t_f_n("FREEZE");
if (1 == x)
{
while (REG_ALREADY_FROZEN == region_freeze(gv_cur_region, TRUE, override, FALSE))
{
hiber_start(1000);
if (util_interrupt)
{
gtm_putmsg(VARLSTCNT(1) ERR_FREEZECTRL);
break;
}
}
}
else if (0 == x)
{
if (REG_ALREADY_FROZEN == region_freeze(gv_cur_region, FALSE, override, FALSE))
{
util_out_print("Region: !AD is frozen by another user, not releasing freeze.",
TRUE, REG_LEN_STR(gv_cur_region));
}
}
if (x != !(cs_data->freeze))
util_out_print("Region !AD is now !AD", TRUE, REG_LEN_STR(gv_cur_region), LEN_AND_STR(freeze_msg[x]));
cs_addrs->persistent_freeze = x; /* secshr_db_clnup() shouldn't clear the freeze up */
}
if (CLI_PRESENT == cli_present("FULLY_UPGRADED") && cli_get_int("FULLY_UPGRADED", &x))
{
cs_data->fully_upgraded = (boolean_t)x;
if (x)
cs_data->db_got_to_v5_once = TRUE;
}
if (CLI_PRESENT == cli_present("GVSTATSRESET"))
{
/* Clear statistics in NODE-LOCAL first */
# define TAB_GVSTATS_REC(COUNTER,TEXT1,TEXT2) cs_addrs->nl->gvstats_rec.COUNTER = 0;
# include "tab_gvstats_rec.h"
# undef TAB_GVSTATS_REC
/* Do it in the file-header next */
gvstats_rec_cnl2csd(cs_addrs);
}
if (CLI_PRESENT == cli_present("ONLINE_NBB"))
{
buf_len = SIZEOF(buf);
if (cli_get_str("ONLINE_NBB", buf, &buf_len))
{
lower_to_upper((uchar_ptr_t)buf, (uchar_ptr_t)buf, buf_len);
if (0 == STRCMP(buf, "NOT_IN_PROGRESS"))
cs_addrs->nl->nbb = BACKUP_NOT_IN_PROGRESS;
else
{
if (('0' == buf[0]) && ('\0' == buf[1]))
x = 0;
else
{
x = ATOI(buf);
if (0 == x)
x = -2;
}
if (x < -1)
util_out_print("Invalid value for online_nbb qualifier", TRUE);
else
cs_addrs->nl->nbb = x;
}
}
}
if (CLI_PRESENT == cli_present("ABANDONED_KILLS"))
{
buf_len = SIZEOF(buf);
if (cli_get_str("ABANDONED_KILLS", buf, &buf_len))
{
lower_to_upper((uchar_ptr_t)buf, (uchar_ptr_t)buf, buf_len);
if (0 == STRCMP(buf, "NONE"))
cs_data->abandoned_kills = 0;
else
{
if (('0' == buf[0]) && ('\0' == buf[1]))
x = 0;
else
{
x = ATOI(buf);
if (0 == x)
x = -1;
}
if (0 > x)
util_out_print("Invalid value for abandoned_kills qualifier", TRUE);
else
cs_data->abandoned_kills = x;
}
}
}
if (CLI_PRESENT == cli_present("KILL_IN_PROG"))
{
buf_len = SIZEOF(buf);
if (cli_get_str("KILL_IN_PROG", buf, &buf_len))
{
lower_to_upper((uchar_ptr_t)buf, (uchar_ptr_t)buf, buf_len);
if (0 == STRCMP(buf, "NONE"))
cs_data->kill_in_prog = 0;
else
{
if (('0' == buf[0]) && ('\0' == buf[1]))
x = 0;
else
{
x = ATOI(buf);
if (0 == x)
x = -1;
}
if (0 > x)
util_out_print("Invalid value for kill_in_prog qualifier", TRUE);
else
cs_data->kill_in_prog = x;
}
}
}
if (CLI_PRESENT == cli_present("MACHINE_NAME"))
{
buf_len = SIZEOF(buf);
if (cli_get_str("MACHINE_NAME", buf, &buf_len))
{
lower_to_upper((uchar_ptr_t)buf, (uchar_ptr_t)buf, buf_len);
if (0 == STRCMP(buf, "CURRENT"))
{
memset(cs_data->machine_name, 0, MAX_MCNAMELEN);
GETHOSTNAME(cs_data->machine_name, MAX_MCNAMELEN, gethostname_res);
}
else if (0 == STRCMP(buf, "CLEAR"))
memset(cs_data->machine_name, 0, MAX_MCNAMELEN);
else
util_out_print("Invalid value for the machine_name qualifier", TRUE);
} else
util_out_print("Error: cannot get value for !AD.", TRUE, LEN_AND_LIT("MACHINE_NAME"));
}
# ifdef GTM_CRYPT
if (CLI_PRESENT == cli_present("ENCRYPTION_HASH"))
{
if (1 < cs_addrs->nl->ref_cnt)
{
util_out_print("Cannot reset encryption hash in file header while !XL other processes are "
"accessing the database.",
TRUE,
cs_addrs->nl->ref_cnt - 1);
return;
}
fname_ptr = (char *)gv_cur_region->dyn.addr->fname;
fname_len = gv_cur_region->dyn.addr->fname_len;
ASSERT_ENCRYPTION_INITIALIZED;
/* Now generate the new hash to be placed in the database file header. */
GTMCRYPT_HASH_GEN(cs_addrs, fname_ptr, fname_len, hash_buff, gtmcrypt_errno);
if (0 != gtmcrypt_errno)
GTMCRYPT_REPORT_ERROR(gtmcrypt_errno, gtm_putmsg, fname_len, fname_ptr);
memcpy(cs_data->encryption_hash, hash_buff, GTMCRYPT_HASH_LEN);
DEBUG_ONLY(GTMCRYPT_HASH_CHK(cs_addrs, cs_data->encryption_hash, gtmcrypt_errno));
assert(0 == gtmcrypt_errno);
}
# endif
# ifdef UNIX
if (CLI_PRESENT == cli_present("JNL_YIELD_LIMIT") && cli_get_int("JNL_YIELD_LIMIT", &x))
{
if (0 > x)
util_out_print("YIELD_LIMIT cannot be NEGATIVE", TRUE);
else if (MAX_YIELD_LIMIT < x)
util_out_print("YIELD_LIMIT cannot be greater than !UL", TRUE, MAX_YIELD_LIMIT);
else
cs_data->yield_lmt = x;
}
if (CLI_PRESENT == cli_present("QDBRUNDOWN"))
{
cs_data->mumps_can_bypass = TRUE;
util_out_print("Database file !AD now has quick database rundown flag set to TRUE", TRUE,
DB_LEN_STR(gv_cur_region));
}
else if (CLI_NEGATED == cli_present("QDBRUNDOWN"))
{
cs_data->mumps_can_bypass = FALSE;
util_out_print("Database file !AD now has quick database rundown flag set to FALSE", TRUE,
DB_LEN_STR(gv_cur_region));
}
# endif
if (CLI_PRESENT == cli_present(UNIX_ONLY("JNL_SYNCIO") VMS_ONLY("JNL_CACHE")))
{
x = cli_t_f_n(UNIX_ONLY("JNL_SYNCIO") VMS_ONLY("JNL_CACHE"));
if (1 == x)
cs_data->jnl_sync_io = UNIX_ONLY(TRUE) VMS_ONLY(FALSE);
else if (0 == x)
cs_data->jnl_sync_io = UNIX_ONLY(FALSE) VMS_ONLY(TRUE);
}
if ((CLI_PRESENT == cli_present("AVG_BLKS_READ")) && (cli_get_int("AVG_BLKS_READ", &x)))
{
if (x <= 0)
util_out_print("Invalid value for AVG_BLKS_READ qualifier", TRUE);
else
cs_data->avg_blks_per_100gbl = x;
}
if ((CLI_PRESENT == cli_present("PRE_READ_TRIGGER_FACTOR")) && (cli_get_int("PRE_READ_TRIGGER_FACTOR", &x)))
{
if ((x < 0) || (x > 100))
util_out_print("Invalid value for PRE_READ_TRIGGER_FACTOR qualifier", TRUE);
else
cs_data->pre_read_trigger_factor = x;
}
if ((CLI_PRESENT == cli_present("UPD_RESERVED_AREA")) && (cli_get_int("UPD_RESERVED_AREA", &x)))
{
if ((x < 0) || (x > 100))
util_out_print("Invalid value for UPD_RESERVED_AREA qualifier", TRUE);
else
cs_data->reserved_for_upd = x;
}
if ((CLI_PRESENT == cli_present("UPD_WRITER_TRIGGER_FACTOR")) && (cli_get_int("UPD_WRITER_TRIGGER_FACTOR", &x)))
{
if ((x < 0) || (x > 100))
util_out_print("Invalid value for UPD_WRITER_TRIGGER_FACTOR qualifier", TRUE);
else
cs_data->writer_trigger_factor = x;
}
DSE_REL_CRIT_AS_APPROPRIATE(was_crit, was_hold_onto_crit, nocrit_present, cs_addrs, gv_cur_region);
return;
}