389 lines
17 KiB
C
389 lines
17 KiB
C
/****************************************************************
|
|
* *
|
|
* Copyright 2005, 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. *
|
|
* *
|
|
****************************************************************/
|
|
|
|
#ifndef __V15_GDSFHEAD_H__
|
|
#define __V15_GDSFHEAD_H__
|
|
|
|
/* gdsfhead.h as of journal format 15 (last GT.M V4 format) */
|
|
/* this requires gdsroot.h gtm_facility.h fileinfo.h gdsbt.h */
|
|
|
|
typedef struct v15_gd_segment_struct
|
|
{
|
|
unsigned short sname_len;
|
|
unsigned char sname[MAX_SN_LEN];
|
|
unsigned short fname_len;
|
|
unsigned char fname[MAX_FN_LEN + 1];
|
|
unsigned short blk_size;
|
|
unsigned short ext_blk_count;
|
|
uint4 allocation;
|
|
struct CLB *cm_blk;
|
|
unsigned char defext[4];
|
|
short defer_time; /* Was passed in cs_addrs */
|
|
unsigned char buckets; /* Was passed in FAB */
|
|
unsigned char windows; /* Was passed in FAB */
|
|
uint4 lock_space;
|
|
uint4 global_buffers; /* Was passed in FAB */
|
|
uint4 reserved_bytes; /* number of bytes to be left in every database block */
|
|
enum db_acc_method acc_meth;
|
|
file_control *file_cntl;
|
|
struct v15_gd_region_struct *repl_list;
|
|
} v15_gd_segment;
|
|
|
|
typedef union
|
|
{
|
|
int4 offset; /* relative offset to segment */
|
|
v15_gd_segment *addr; /* absolute address of segment */
|
|
} v15_gd_seg_addr;
|
|
|
|
typedef struct v15_gd_region_struct
|
|
{
|
|
unsigned short rname_len;
|
|
unsigned char rname[MAX_RN_LEN];
|
|
unsigned short max_key_size;
|
|
uint4 max_rec_size;
|
|
v15_gd_seg_addr dyn;
|
|
v15_gd_seg_addr stat;
|
|
bool open;
|
|
bool lock_write;
|
|
bool null_subs;
|
|
unsigned char jnl_state;
|
|
|
|
/* deleted gbl_lk_root and lcl_lk_root, obsolete fields */
|
|
|
|
uint4 jnl_alq;
|
|
unsigned short jnl_deq;
|
|
short jnl_buffer_size;
|
|
bool jnl_before_image;
|
|
bool opening;
|
|
bool read_only;
|
|
bool was_open;
|
|
unsigned char cmx_regnum;
|
|
unsigned char def_coll;
|
|
unsigned char filler[1];
|
|
unsigned char jnl_file_len;
|
|
unsigned char jnl_file_name[JNL_NAME_SIZE];
|
|
|
|
/* VMS file id struct goes to OS specific struct */
|
|
/* VMS lock structure for reference goes to OS specific struct */
|
|
|
|
int4 node;
|
|
int4 sec_size;
|
|
} v15_gd_region;
|
|
|
|
typedef struct
|
|
{
|
|
CNTR4DCL(evnt_cnt,100);
|
|
v15_trans_num evnt_tn;
|
|
} v15_bg_trc_rec;
|
|
|
|
typedef struct
|
|
{
|
|
int4 curr_count; /* count for this invocation of shared memory */
|
|
int4 cumul_count; /* count from the creation of database (not including this invocation) */
|
|
} v15_db_csh_acct_rec;
|
|
|
|
#define TAB_DB_CSH_ACCT_REC(A,B,C) v15_##A,
|
|
enum v15_db_csh_acct_rec_type
|
|
{
|
|
#include "v15_tab_db_csh_acct_rec.h"
|
|
v15_n_db_csh_acct_rec_types
|
|
};
|
|
#undef TAB_DB_CSH_ACCT_REC
|
|
|
|
#define TAB_BG_TRC_REC(A,B) v15_##B,
|
|
enum v15_bg_trc_rec_fixed_type
|
|
{
|
|
#include "v15_tab_bg_trc_rec_fixed.h"
|
|
v15_n_bg_trc_rec_fixed_types
|
|
};
|
|
enum v15_bg_trc_rec_variable_type
|
|
{
|
|
#include "v15_tab_bg_trc_rec_variable.h"
|
|
v15_n_bg_trc_rec_variable_types
|
|
};
|
|
#undef TAB_BG_TRC_REC
|
|
|
|
/* This is the structure describing a segment. It is used as a database file
|
|
* header (for MM or BG access methods). The overloaded fields for MM and BG are
|
|
* n_bts, bt_buckets, cur_lru_cache_rec_off, cache_lru_cycle.
|
|
*/
|
|
|
|
typedef struct v15_sgmnt_data_struct
|
|
{
|
|
unsigned char label[GDS_LABEL_SZ];
|
|
int4 n_bts; /* number of cache record/blocks */
|
|
int filler_bt_header_off[2];
|
|
int filler_bt_base_off[2];
|
|
int filler_th_base_off[2];
|
|
int filler_cache_off[2];
|
|
int filler_cur_lru_cache_rec_off[2];
|
|
enum db_acc_method acc_meth; /* Access method (BG or MM). This is static data defined
|
|
* at file creation.
|
|
*/
|
|
short start_vbn; /* starting virtual block number. */
|
|
bool createinprogress;
|
|
bool file_corrupt; /* If this flag is set it shuts the file down. No process
|
|
* (except DSE) can successfully map this section after
|
|
* the flag is set to TRUE. Processes that already have it
|
|
* mapped should produce an error the next time that they use
|
|
* the file. The flag can only be reset by the DSE utility.
|
|
*/
|
|
int4 total_blks_filler; /* Marks old total_blks spot, needed for gvcst_init compatablility code */
|
|
file_info created; /* Who created this file */
|
|
uint4 lkwkval; /* Incremented for each lock wake up */
|
|
int4 yield_lmt; /* maximum number of times a process yields to get optimal jnl writes */
|
|
uint4 lock_space_size;/* Number of bytes to be used for locks (in database for bg) */
|
|
uint4 owner_node; /* Node on cluster that "owns" the file */
|
|
uint4 free_space; /* Space in file header not being used */
|
|
uint4 max_bts; /* Maximum number of bt records allowed in file */
|
|
uint4 extension_size; /* Number of gds data blocks to extend by */
|
|
int4 blk_size; /* Block size for the file. This is static data defined when
|
|
* the file is created (via MUPIP). This should correspond to the
|
|
* process'es gde description of the file. If it doesn't, the number
|
|
* in the file header should be used.
|
|
*/
|
|
int4 max_rec_size; /* maximum record size allowed for this file */
|
|
int4 max_key_size; /* maximum key size allowed for this file */
|
|
bool null_subs;
|
|
bool lock_write;
|
|
bool ccp_jnl_before; /* used for clustered to pass if jnl file has before images */
|
|
bool clustered;
|
|
bool flush_done;
|
|
bool unbacked_cache; /* see mupip_set_file for usage */
|
|
short bplmap; /* Blocks per local map (bitmap). This is static data defined when
|
|
* the file is created (via MUPIP).
|
|
*/
|
|
int4 bt_buckets; /* Number of buckets in bt table */
|
|
CNTR4DCL(filler_ref_cnt,10); /* reference count. How many people are using the database */
|
|
CNTR4DCL(n_wrt_per_flu,11); /* Number of writes per flush call */
|
|
/* overloaded for BG and MM */
|
|
/************* ACCOUNTING INFOMATION ********************************/
|
|
int4 n_retries[CDB_MAX_TRIES];
|
|
/* Counts of the number of retries it took to commit a transaction */
|
|
int4 n_puts; /* number of puts (non-tp only) */
|
|
int4 n_kills; /* number of kills */
|
|
int4 n_queries; /* number of $Query's */
|
|
int4 n_gets; /* number of MUMPS GETS */
|
|
int4 n_order; /* number of orders */
|
|
int4 n_zprevs; /* number of $ZPrevious's */
|
|
int4 n_data; /* number of datas */
|
|
int4 wc_rtries; /* write cache read tries */
|
|
int4 wc_rhits; /* write cache read hits */
|
|
/* Note that the below field was placed here because these were previously used locations that (likely)
|
|
have a value. For this reason, this value should not be counted upon as a true creation date/time
|
|
but as a token whose value is somewhat unique amongst multiple generations of the same file. It's
|
|
only real purpose is to lend uniqueness to the ftok test in dbinit() where our test system has
|
|
created the same file with the same ftok and other matching inode/etc criteria but it is NOT the
|
|
same file -- only an extremely similar one whose use of old shared memory created integrity errors. */
|
|
union
|
|
{
|
|
v15_time_t date_time; /* When file was created */
|
|
int filler[2]; /* Filler to make sure above is okay even if takes 2 words on some platform */
|
|
} creation;
|
|
CNTR4DCL(filler_wcs_active_lvl,14); /* (n_wcrs / 2) - entries in wcq_active (trips wcs_wtstart) */
|
|
bool filler_wc_blocked; /* former location of wc_blocked as bool */
|
|
char root_level; /* current level of the root */
|
|
short filler_short; /* filler added to ensure alignment, can be reused */
|
|
int4 flush_time[2];
|
|
v15_trans_num last_inc_backup;
|
|
v15_trans_num last_com_backup;
|
|
int4 staleness[2]; /* timer value */
|
|
int4 filler_wc_in_free; /* number of write cache records in free queue */
|
|
int4 ccp_tick_interval[2]; /* quantum to release write mode if no write occurs and others are queued
|
|
* These three values are all set at creation by mupip_create
|
|
*/
|
|
int4 flu_outstanding;
|
|
int4 free_blocks_filler; /* Marks old free_blocks spot, needed for gvcst_init compatablility code */
|
|
int4 tp_cdb_sc_blkmod[7]; /* notes down the number of times each place got a cdb_sc_blkmod in tp */
|
|
v15_trans_num last_rec_backup;
|
|
int4 ccp_quantum_interval[2]; /* delta timer for ccp quantum */
|
|
int4 ccp_response_interval[2]; /* delta timer for ccp mailbox response */
|
|
uint4 jnl_alq;
|
|
unsigned short jnl_deq;
|
|
short jnl_buffer_size; /* in pages */
|
|
bool jnl_before_image;
|
|
unsigned char jnl_state; /* Current journaling state */
|
|
bool filler_glob_sec_init[1];/* glob_sec_init field moved to node_local */
|
|
unsigned char jnl_file_len; /* journal file name length */
|
|
unsigned char jnl_file_name[JNL_NAME_SIZE]; /* journal file name */
|
|
v15_th_index trans_hist; /* transaction history - if moved from 2nd fileheader block, change TH_BLOCK */
|
|
int4 cache_lru_cycle; /* no longer maintained, but field is preserved in case needed in future */
|
|
int4 filler_mm_extender_pid; /* pid of the process executing gdsfilext in MM mode */
|
|
int4 filler_db_latch; /* moved - latch for interlocking on tandem */
|
|
int4 reserved_bytes; /* Database blocks will always leave this many bytes unused */
|
|
CNTR4DCL(filler_in_wtstart,15); /* Count of processes in wcs_wtstart */
|
|
short defer_time; /* defer write ; 0 => immediate, -1 => infinite defer,
|
|
>0 => defer_time * flush_time[0] is actual defer time
|
|
DEFAULT value of defer_time = 1 implying a write-timer every
|
|
csd->flush_time[0] seconds */
|
|
unsigned char def_coll; /* Default collation type for new globals */
|
|
unsigned char def_coll_ver; /* Default collation type version */
|
|
boolean_t std_null_coll; /* 0 -> GT.M null collation,i,e, null subs collate between numeric and string
|
|
* 1-> standard null collation i.e. null subs collate before numeric and string */
|
|
uint4 image_count; /* Is used for Data Base Freezing. */
|
|
/* Set to PROCESS_ID on UNIX and */
|
|
/* to IMAGE_COUNT on VMS */
|
|
uint4 freeze; /* Set to PROCESS_ID on VMS and */
|
|
/* to GETUID on UNIX in order */
|
|
/* to "freeze" the Write Cache. */
|
|
int4 rc_srv_cnt; /* Count of RC servers accessing database */
|
|
short dsid; /* DSID value, non-zero when being accessed by RC */
|
|
short rc_node;
|
|
uint4 autoswitchlimit; /* limit in disk blocks (max 4GB) when jnl should be auto switched */
|
|
int4 epoch_interval; /* Time between successive epochs in epoch-seconds */
|
|
int4 n_tp_retries[7]; /* indexed by t_tries and incremented by 1 for all regions in restarting TP */
|
|
/* The need for having tab_bg_trc_rec_fixed.h and tab_bg_trc_rec_variable.h is because
|
|
* of now_running and kill_in_prog coming in between the bg_trc_rec fields.
|
|
* In V5.0, this should be rearranged to have a contiguous space for bg_trc_rec fields
|
|
*/
|
|
/* Include all the bg_trc_rec_fixed accounting fields below */
|
|
#define TAB_BG_TRC_REC(A,B) v15_bg_trc_rec fixed_##B;
|
|
#include "v15_tab_bg_trc_rec_fixed.h"
|
|
#undef TAB_BG_TRC_REC
|
|
char now_running[MAX_REL_NAME]; /* for active version stamp */
|
|
int4 kill_in_prog; /* counter for multi-crit kills that are not done yet */
|
|
/* Note that TAB_BG_TRC_REC and TAB_DB_CSH_ACCT_REC grow in opposite directions */
|
|
/* Include all the bg_trc_rec_variable accounting fields below */
|
|
#define TAB_BG_TRC_REC(A,B) v15_bg_trc_rec var_##B;
|
|
#include "v15_tab_bg_trc_rec_variable.h"
|
|
#undef TAB_BG_TRC_REC
|
|
/* Note that when there is an overflow in the sum of the sizes of the bg_trc_rec_variable
|
|
* types and the db_csh_acct_rec types (due to introduction of new types of accounting
|
|
* fields), the character array common_filler below will become a negative sized array
|
|
* which will signal a compiler error (rather than an undecipherable runtime error).
|
|
*/
|
|
char common_filler[584 - SIZEOF(v15_bg_trc_rec) * v15_n_bg_trc_rec_variable_types
|
|
- SIZEOF(v15_db_csh_acct_rec) * v15_n_db_csh_acct_rec_types];
|
|
/* Include all the db cache accounting fields below */
|
|
#define TAB_DB_CSH_ACCT_REC(A,B,C) v15_db_csh_acct_rec acct_##A;
|
|
#include "v15_tab_db_csh_acct_rec.h"
|
|
#undef TAB_DB_CSH_ACCT_REC
|
|
unsigned char reorg_restart_key[256]; /* 1st key of a leaf block where reorg was done last time */
|
|
uint4 alignsize; /* alignment size for JRT_ALIGN */
|
|
block_id reorg_restart_block;
|
|
/******* following three members (filler_{jnl_file,dbfid}, filler_ino_t) together occupy 64 bytes on all platforms *******/
|
|
/* this area which was previously used for the field "jnl_file" is now moved to node_local */
|
|
union
|
|
{
|
|
gds_file_id jnl_file_id; /* needed on UNIX to hold space */
|
|
unix_file_id u; /* from gdsroot.h even for VMS */
|
|
} filler_jnl_file;
|
|
union
|
|
{
|
|
gds_file_id vmsfid; /* not used, just hold space */
|
|
unix_file_id u; /* For unix ftok error detection */
|
|
} filler_dbfid;
|
|
/* jnl_file and dbfid use ino_t, so place them together */
|
|
#ifndef INO_T_LONG
|
|
char filler_ino_t[8]; /* this filler is not needed for those platforms that have the
|
|
size of ino_t 8 bytes -- defined in mdefsp.h (Sun only for now) */
|
|
#endif
|
|
/*************************************************************************************/
|
|
|
|
mutex_spin_parms_struct mutex_spin_parms;
|
|
int4 mutex_filler1;
|
|
int4 mutex_filler2;
|
|
int4 mutex_filler3;
|
|
int4 mutex_filler4;
|
|
/* semid/shmid/sem_ctime/shm_ctime are UNIX only */
|
|
int4 semid; /* Since int may not be of fixed size, int4 is used */
|
|
int4 shmid; /* Since int may not be of fixed size, int4 is used */
|
|
union
|
|
{
|
|
time_t ctime; /* For current GTM code sem_ctime field corresponds to creation time */
|
|
int4 filler[2]; /* Filler to make sure above is okay even if takes 2 words on some platform */
|
|
} gt_sem_ctime;
|
|
union
|
|
{
|
|
time_t ctime; /* For current GTM code sem_ctime field corresponds to creation time */
|
|
int4 filler[2]; /* Filler to make sure above is okay even if takes 2 words on some platform */
|
|
} gt_shm_ctime;
|
|
boolean_t recov_interrupted; /* whether a MUPIP JOURNAL -RECOVER/ROLLBACK command on this db got interrupted */
|
|
int4 intrpt_recov_jnl_state; /* journaling state at start of interrupted recover/rollback */
|
|
int4 intrpt_recov_repl_state; /* replication state at start of interrupted recover/rollback */
|
|
jnl_tm_t intrpt_recov_tp_resolve_time; /* since-time for the interrupted recover */
|
|
seq_num intrpt_recov_resync_seqno; /* resync/fetchresync jnl_seqno of interrupted rollback */
|
|
uint4 n_puts_duplicate; /* number of duplicate sets in non-TP */
|
|
uint4 n_tp_updates; /* number of TP transactions that incremented the db curr_tn for this region */
|
|
uint4 n_tp_updates_duplicate; /* number of TP transactions that did purely duplicate sets in this region */
|
|
char filler3[932];
|
|
int4 filler_highest_lbm_blk_changed; /* Records highest local bit map block that
|
|
changed so we know how much of master bit
|
|
map to write out. Modified only under crit */
|
|
char filler_3k_64[60]; /* get to 64 byte aligned */
|
|
char filler1_wc_var_lock[16]; /* moved to node_local */
|
|
char filler_3k_128[48]; /* 3k + 128 - cache line on HPPA */
|
|
char filler2_db_latch[16]; /* moved to node_local */
|
|
char filler_3k_192[48]; /* 3k + 192 - cache line on HPPA */
|
|
char filler_4096[832]; /* Fill out so map sits on 8K boundary */
|
|
char filler_unique_id[32];
|
|
char machine_name[MAX_MCNAMELEN];
|
|
int4 flush_trigger;
|
|
int4 cache_hits;
|
|
int4 max_update_array_size; /* maximum size of update array needed for one non-TP set/kill */
|
|
int4 max_non_bm_update_array_size; /* maximum size of update array excepting bitmaps */
|
|
int4 n_tp_retries_conflicts[7]; /* indexed by t_tries and incremented for conflicting region in TP */
|
|
volatile boolean_t wc_blocked; /* write cache blocked until recover done due to process being stopped */
|
|
/* in MM mode it is used to call wcs_recover during a file extension */
|
|
char filler_rep[176]; /* Leave room for non-replication fields */
|
|
|
|
/******* REPLICATION RELATED FIELDS ***********/
|
|
seq_num reg_seqno; /* the jnl seqno of the last update to this region -- 8-byte aligned */
|
|
seq_num resync_seqno; /* Replication related field. The resync-seqno to be sent to the secondary */
|
|
v15_trans_num resync_tn; /* tn for this region
|
|
* corresponding to
|
|
* resync_seqno - used in
|
|
* replication lost
|
|
* transactions handling */
|
|
uint4 repl_resync_tn_filler; /* to accommodate 8 byte
|
|
* resync_tn in the future */
|
|
seq_num old_resync_seqno; /* maintained to find out if
|
|
* transactions were sent
|
|
* from primary to secondary
|
|
* - used in replication */
|
|
int4 repl_state; /* state of replication whether "on" or "off" */
|
|
int4 wait_disk_space; /* seconds to wait for diskspace before giving up */
|
|
int4 jnl_sync_io; /* drives sync I/O ('direct' if applicable) for journals, if set */
|
|
char filler_5104[452];
|
|
enum db_ver creation_db_ver; /* Major DB version at time of creation */
|
|
enum mdb_ver creation_mdb_ver; /* Minor DB version at time of creation */
|
|
enum db_ver certified_for_upgrade_to; /* Version the database is certified for upgrade to */
|
|
int filler_5k; /* Fill out to 5K */
|
|
/******* SECSHR_DB_CLNUP RELATED FIELDS ***********/
|
|
int4 secshr_ops_index;
|
|
int4 secshr_ops_array[255]; /* taking up 1K */
|
|
char filler_7k[1024]; /* Fill out so map sits on 8K boundary */
|
|
char filler_8k[1024]; /* Fill out so map sits on 8K boundary */
|
|
unsigned char master_map[MASTER_MAP_SIZE_V4]; /* This map must be aligned on a block size boundary */
|
|
/* Master bitmap. Tells whether the local bitmaps have any free blocks or not. */
|
|
} v15_sgmnt_data;
|
|
|
|
/* End of gdsfhead.h */
|
|
|
|
#ifdef DB64
|
|
# ifdef __osf__
|
|
# pragma pointer_size(save)
|
|
# pragma pointer_size(long)
|
|
# else
|
|
# error UNSUPPORTED PLATFORM
|
|
# endif
|
|
#endif
|
|
|
|
typedef v15_sgmnt_data *v15_sgmnt_data_ptr_t;
|
|
|
|
#ifdef DB64
|
|
# ifdef __osf__
|
|
# pragma pointer_size(restore)
|
|
# endif
|
|
#endif
|
|
|
|
#endif
|