/**************************************************************** * * * Copyright 2001, 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. * * * ****************************************************************/ /* This program will upgrade v4.x header to v5.0-000 database. */ #include "mdef.h" #include /* needed for handling of epoch_interval */ #include "gtm_stat.h" #include "gtm_unistd.h" #include "gtm_time.h" #include "gtm_string.h" #include "iosp.h" #include "gdsroot.h" #include "v15_gdsroot.h" #include "gtm_facility.h" #include "fileinfo.h" #include "gdsbt.h" #include "v15_gdsbt.h" #include "gdsfhead.h" #include "v15_gdsfhead.h" #include "filestruct.h" #include "v15_filestruct.h" #include "gdsblk.h" /* needed for gdsblkops.h */ #include "jnl.h" #include "mu_upgrd_dngrd_hdr.h" #include "gtmmsg.h" #include "lockconst.h" #include "wcs_phase2_commit_wait.h" LITREF char gtm_release_name[]; LITREF int4 gtm_release_name_len; /* Update header from v4.x to v5.0-000 */ void mu_upgrd_header(v15_sgmnt_data *v15_csd, sgmnt_data *csd) { time_t ctime; seq_num v15_reg_seqno; error_def(ERR_MUINFOUINT8); memset(csd, 0, SIZEOF(sgmnt_data)); MEMCPY_LIT(csd->label, GDS_LABEL); csd->blk_size = v15_csd->blk_size; csd->bplmap = v15_csd->bplmap; csd->start_vbn = v15_csd->start_vbn; csd->acc_meth = v15_csd->acc_meth; csd->max_bts = v15_csd->max_bts; csd->n_bts = v15_csd->n_bts; csd->bt_buckets = v15_csd->bt_buckets; if (v15_csd->reserved_bytes > BLK_HDR_INCREASE) csd->reserved_bytes = v15_csd->reserved_bytes - BLK_HDR_INCREASE; csd->max_rec_size = v15_csd->max_rec_size; csd->max_key_size = v15_csd->max_key_size; csd->lock_space_size = v15_csd->lock_space_size; csd->extension_size = v15_csd->extension_size; csd->def_coll = v15_csd->def_coll; csd->def_coll_ver = v15_csd->def_coll_ver; csd->std_null_coll = v15_csd->std_null_coll; /* New in V5.0-FT01 */ csd->null_subs = v15_csd->null_subs; csd->free_space = v15_csd->free_space; csd->mutex_spin_parms.mutex_hard_spin_count = v15_csd->mutex_spin_parms.mutex_hard_spin_count; csd->mutex_spin_parms.mutex_sleep_spin_count = v15_csd->mutex_spin_parms.mutex_sleep_spin_count; csd->mutex_spin_parms.mutex_spin_sleep_mask = v15_csd->mutex_spin_parms.mutex_spin_sleep_mask; csd->max_update_array_size = v15_csd->max_update_array_size; /* New from V4.0-001G */ csd->max_non_bm_update_array_size = v15_csd->max_non_bm_update_array_size; /* New from V4.0-001G */ csd->file_corrupt = v15_csd->file_corrupt; csd->minor_dbver = GDSMVCURR; /* New in V5.0-000 */ csd->wcs_phase2_commit_wait_spincnt = WCS_PHASE2_COMMIT_DEFAULT_SPINCNT; /* New from V5.3-002 */ csd->createinprogress = v15_csd->createinprogress; time(&ctime); assert(SIZEOF(ctime) >= SIZEOF(int4)); csd->creation_time4 = (int4)ctime;/* No need to propagate previous value. Take only lower order 4-bytes of current time */ csd->last_inc_backup = v15_csd->last_inc_backup; csd->last_com_backup = v15_csd->last_com_backup; csd->last_rec_backup = v15_csd->last_rec_backup; csd->reorg_restart_block = v15_csd->reorg_restart_block; /* New from V4.2 */ memcpy(csd->now_running, gtm_release_name, gtm_release_name_len + 1); /* GT.M release name */ csd->owner_node = v15_csd->owner_node; csd->image_count = v15_csd->image_count; csd->kill_in_prog = 0; csd->abandoned_kills = v15_csd->kill_in_prog; /* assert to 0 ??? */ csd->blks_to_upgrd = v15_csd->trans_hist.total_blks - v15_csd->trans_hist.free_blocks; /* New in V5.0-000 */ assert(csd->blks_to_upgrd); csd->tn_upgrd_blks_0 = 0; /* New in V5.0-000 */ csd->fully_upgraded = FALSE; /* New in V5.0-000 */ csd->desired_db_format = GDSVCURR; /* New in V5.0-000 */ csd->desired_db_format_tn = v15_csd->trans_hist.curr_tn - 1; /* New in V5.0-000 */ csd->reorg_db_fmt_start_tn = 0; /* New in V5.0-000 */ csd->certified_for_upgrade_to = v15_csd->certified_for_upgrade_to; /* New in V5.0-000 */ csd->master_map_len = MASTER_MAP_SIZE_V4; /* New in V5.0-000 */ csd->reorg_upgrd_dwngrd_restart_block = 0; /* New in V5.0-000 */ csd->creation_db_ver = v15_csd->creation_db_ver; /* Retain creation major/minor version */ csd->creation_mdb_ver = v15_csd->creation_mdb_ver; csd->trans_hist.early_tn = v15_csd->trans_hist.early_tn; csd->trans_hist.curr_tn = v15_csd->trans_hist.curr_tn; /* INCREMENT_CURR_TN comment added to note curr_tn set is done */ csd->max_tn = MAX_TN_V5; /* New in V5.0-000 */ SET_TN_WARN(csd, csd->max_tn_warn); /* New in V5.0-000 */ csd->trans_hist.last_mm_sync = v15_csd->trans_hist.last_mm_sync; csd->trans_hist.mm_tn = v15_csd->trans_hist.mm_tn; csd->trans_hist.lock_sequence = v15_csd->trans_hist.lock_sequence; csd->trans_hist.total_blks = v15_csd->trans_hist.total_blks; csd->trans_hist.free_blocks = v15_csd->trans_hist.free_blocks; csd->flush_time[0] = v15_csd->flush_time[0]; csd->flush_time[1] = v15_csd->flush_time[1]; csd->flush_trigger = v15_csd->flush_trigger; csd->n_wrt_per_flu = v15_csd->n_wrt_per_flu; csd->wait_disk_space = v15_csd->wait_disk_space; csd->defer_time = v15_csd->defer_time; #ifdef UNIX csd->semid = INVALID_SEMID; csd->shmid = INVALID_SHMID; csd->gt_sem_ctime.ctime = 0; csd->gt_shm_ctime.ctime = 0; #endif /* Note none of the counter fields are being carried over. An upgrade or downgrade will implicitly set them to zero by not initializing them. */ csd->staleness[0] = v15_csd->staleness[0]; csd->staleness[1] = v15_csd->staleness[1]; csd->ccp_tick_interval[0] = v15_csd->ccp_tick_interval[0]; csd->ccp_tick_interval[1] = v15_csd->ccp_tick_interval[1]; csd->ccp_quantum_interval[0] = v15_csd->ccp_quantum_interval[0]; csd->ccp_quantum_interval[1] = v15_csd->ccp_quantum_interval[1]; csd->ccp_response_interval[0] = v15_csd->ccp_response_interval[0]; csd->ccp_response_interval[1] = v15_csd->ccp_response_interval[1]; csd->ccp_jnl_before = v15_csd->ccp_jnl_before; csd->clustered = v15_csd->clustered; csd->unbacked_cache = v15_csd->unbacked_cache; csd->rc_srv_cnt = v15_csd->rc_srv_cnt; csd->dsid = v15_csd->dsid; csd->rc_node = v15_csd->rc_node; v15_reg_seqno = csd->reg_seqno = v15_csd->reg_seqno; csd->repl_state = v15_csd->repl_state; VMS_ONLY( csd->resync_seqno = v15_csd->resync_seqno; csd->resync_tn = v15_csd->resync_tn; csd->old_resync_seqno = v15_csd->old_resync_seqno; /* resync_seqno should never be greater the region's reg_seqno. Ensure that this is indeed the case. In PRO, * fix the fields to be at most the value of the region's reg_seqno if they are found to be greater than * reg_seqno */ assert((csd->resync_seqno <= v15_reg_seqno) && (csd->old_resync_seqno <= v15_reg_seqno)); if (csd->resync_seqno > v15_reg_seqno) csd->resync_seqno = v15_reg_seqno; if (csd->old_resync_seqno > v15_reg_seqno) csd->old_resync_seqno = v15_reg_seqno; assert(0 != csd->reg_seqno || (0 == csd->resync_seqno && 0 == csd->resync_tn && repl_closed == csd->repl_state)); assert(0 != csd->resync_seqno || (0 == csd->reg_seqno && 0 == csd->resync_tn && repl_closed == csd->repl_state)); assert(0 != csd->resync_tn || (0 == csd->reg_seqno && 0 == csd->resync_seqno && repl_closed == csd->repl_state)); if (0 == csd->reg_seqno || 0 == csd->resync_seqno || 0 == csd->resync_tn) { /* This can happen for pre-replication versions */ csd->reg_seqno = 1; csd->resync_seqno = 1; csd->resync_tn = 1; csd->old_resync_seqno = 1; csd->repl_state = repl_closed; } ) UNIX_ONLY( csd->zqgblmod_seqno = v15_csd->old_resync_seqno; csd->zqgblmod_tn = v15_csd->resync_tn; if (1 == csd->zqgblmod_seqno) { /* Special value 1 of resync seqno in dualsite version corresponds to zqgblmod_seqno of 0 in multisite */ csd->zqgblmod_seqno = 0; csd->zqgblmod_tn = 0; } assert(0 != csd->reg_seqno || (0 == csd->zqgblmod_seqno && 0 == csd->zqgblmod_tn && repl_closed == csd->repl_state)); if (0 == csd->reg_seqno) { /* This can happen for pre-replication versions */ csd->reg_seqno = 1; csd->dualsite_resync_seqno = 1; csd->zqgblmod_seqno = 0; /* see comment in mucregini.c for why initial value is 0 */ csd->zqgblmod_tn = 0; /* see comment in mucregini.c for why initial value is 0 */ csd->repl_state = repl_closed; } else { csd->dualsite_resync_seqno = v15_csd->resync_seqno; csd->pre_multisite_resync_seqno = v15_csd->resync_seqno; /* resync_seqno should never be greater the region's reg_seqno. Ensure that this is indeed the case. In PRO, * fix the fields to be at most the value of the region's reg_seqno if they are found to be greater than * reg_seqno */ assert(v15_csd->resync_seqno <= v15_reg_seqno); if (v15_csd->resync_seqno > v15_reg_seqno) csd->dualsite_resync_seqno = csd->pre_multisite_resync_seqno = v15_reg_seqno; assert(csd->dualsite_resync_seqno); if (!csd->dualsite_resync_seqno) csd->dualsite_resync_seqno = 1; } assert(!csd->multi_site_open); csd->multi_site_open = TRUE; ) csd->jnl_state = v15_csd->jnl_state; if (JNL_ALLOWED(csd)) { csd->jnl_alq = v15_csd->jnl_alq; if (!csd->jnl_alq) csd->jnl_alq = JNL_ALLOC_DEF; csd->epoch_interval = v15_csd->epoch_interval; if (!csd->epoch_interval) csd->epoch_interval = DEFAULT_EPOCH_INTERVAL; csd->alignsize = v15_csd->alignsize; if (!csd->alignsize) csd->alignsize = DISK_BLOCK_SIZE * JNL_DEF_ALIGNSIZE; csd->jnl_deq = v15_csd->jnl_deq; csd->autoswitchlimit = ALIGNED_ROUND_DOWN(JNL_ALLOC_MAX, csd->jnl_alq, csd->jnl_deq); csd->jnl_buffer_size = v15_csd->jnl_buffer_size; csd->jnl_before_image = v15_csd->jnl_before_image; csd->jnl_file_len = v15_csd->jnl_file_len; csd->jnl_sync_io = v15_csd->jnl_sync_io; csd->yield_lmt = v15_csd->yield_lmt; memcpy(csd->jnl_file_name, v15_csd->jnl_file_name, JNL_NAME_SIZE); PRINT_JNL_FIELDS(csd); UNIX_ONLY( gtm_putmsg(VARLSTCNT(6) ERR_MUINFOUINT8, 4, LEN_AND_LIT("Resync sequence number"), &csd->dualsite_resync_seqno, &csd->dualsite_resync_seqno); ) VMS_ONLY( gtm_putmsg(VARLSTCNT(6) ERR_MUINFOUINT8, 4, LEN_AND_LIT("Resync sequence number"), &csd->resync_seqno, &csd->resync_seqno); ) } memcpy(csd->reorg_restart_key, v15_csd->reorg_restart_key, SIZEOF(csd->reorg_restart_key)); /* New from V4.2 */ memcpy(csd->machine_name, v15_csd->machine_name, MAX_MCNAMELEN); csd->reserved_for_upd = UPD_RESERVED_AREA; csd->avg_blks_per_100gbl = AVG_BLKS_PER_100_GBL; csd->pre_read_trigger_factor = PRE_READ_TRIGGER_FACTOR; csd->writer_trigger_factor = UPD_WRITER_TRIGGER_FACTOR; SET_LATCH_GLOBAL(&csd->next_upgrd_warn.time_latch, LOCK_AVAILABLE); }