356 lines
9.2 KiB
C
356 lines
9.2 KiB
C
/****************************************************************
|
|
* *
|
|
* Copyright 2001, 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 V010_JNL_H_INCLUDED
|
|
#define V010_JNL_H_INCLUDED
|
|
|
|
#ifndef V010_JNLSP_H_INCLUDED
|
|
#include "v010_jnlsp.h"
|
|
#endif
|
|
|
|
#define JNL_LABEL_TEXT "GDSJNL06A"
|
|
|
|
#define JNL_ALLOC_DEF 100
|
|
#define JNL_ALLOC_MIN 10
|
|
/* #define JNL_ALLOC_MAX 16777216 moved to jnlsp.h */
|
|
#define JNL_BUFFER_DEF 128
|
|
/* JNL_BUFFER_MIN database block size / 512 + 1 */
|
|
#define JNL_BUFFER_MAX 2016
|
|
/* JNL_EXTEND_DEF allocation size / 10 */
|
|
#define JNL_EXTEND_DEF_PERC 0.1
|
|
#define JNL_EXTEND_MIN 0
|
|
#define JNL_EXTEND_MAX 65535
|
|
#define JNL_MIN_WRITE 32768
|
|
#define JNL_MAX_WRITE 65536
|
|
#define JNL_EXT_DEF ".MJL"
|
|
#define JNL_REC_TRAILER 0xFE
|
|
#define JNL_MAX_FLUSH_TRIES 512
|
|
#define JNL_WRT_START_MASK ~511
|
|
#define JNL_WRT_END_MASK ~7
|
|
|
|
#define JNL_ENABLED(X) ((X)->jnl_state == jnl_open) /* If TRUE, journal records are to be written */
|
|
#define JNL_ALLOWED(X) ((X)->jnl_state != jnl_notallowed) /* If TRUE, journalling is allowed for the file */
|
|
|
|
#define PADDED PADDING
|
|
|
|
#ifdef BIGENDIAN
|
|
#define THREE_LOW_BYTES(x) ((uchar_ptr_t)((uchar_ptr_t)&x + 1))
|
|
#else
|
|
#define THREE_LOW_BYTES(x) ((uchar_ptr_t)(&x))
|
|
#endif
|
|
|
|
|
|
enum jnl_record_type
|
|
{
|
|
#define JNL_TABLE_ENTRY(A,B,C,D) A,
|
|
#include "v12_jnl_rec_table.h"
|
|
#undef JNL_TABLE_ENTRY
|
|
|
|
JRT_RECTYPES /* Total number of journal record types */
|
|
};
|
|
|
|
|
|
enum jnl_state_codes
|
|
{
|
|
jnl_notallowed,
|
|
jnl_closed,
|
|
jnl_open,
|
|
};
|
|
|
|
typedef struct
|
|
{
|
|
int4 min_write_size, /* if unwritten data gets to this size, write it */
|
|
max_write_size, /* maximum size of any single write */
|
|
size; /* buffer size */
|
|
unsigned short epoch_size; /* How many transactions per epoch */
|
|
bool before_images; /* If TRUE, before-image processing is enabled */
|
|
char filler;
|
|
/* end not volatile QUAD */
|
|
volatile int4 free; /* relative index of first byte to write in buffer */
|
|
volatile uint4 freeaddr, /* virtual on-disk address which will correspond to free, when it is written */
|
|
lastaddr, /* previous freeaddr */
|
|
filesize; /* highest virtual address available in the file */
|
|
/* end mainline QUAD */
|
|
volatile int4 blocked;
|
|
int4 filler_int4;
|
|
volatile int4 dsk; /* relative index of 1st byte to write to disk;
|
|
* if free == dsk, buffer is empty */
|
|
volatile int4 wrtsize; /* size of write in progress */
|
|
volatile uint4 dskaddr, /* virtual on-disk address corresponding to dsk */
|
|
now_writer, /* current owner of io_in_prog */
|
|
image_count; /* for VMS is_proc_alive */
|
|
volatile struct /* must be at least word aligned for memory coherency */
|
|
{
|
|
short cond;
|
|
unsigned short length;
|
|
int4 dev_specific;
|
|
} iosb;
|
|
int4 filler_int; /* end ast QUAD */
|
|
volatile int4 qiocnt, /* Number of qio's issued */
|
|
bytcnt, /* Number of bytes written */
|
|
errcnt, /* Number of errors during writing */
|
|
reccnt[JRT_RECTYPES]; /* Number of records written per opcode */
|
|
volatile trans_num epoch_tn; /* Transaction number for current epoch */
|
|
double filler_q1; /* QUAD reset to insure memory coherency of the following int */
|
|
int io_in_prog; /* If 1, write is in progress (NOTE: must manipulate
|
|
only with interlocked instructions */
|
|
double filler_q2; /* QUAD reset to insure quadword alignment in comment below */
|
|
global_latch_t jb_latch; /* needed by aswp on HPPA, 16 bytes */
|
|
CACHELINE_PAD(SIZEOF(global_latch_t), 1) /* ; supplied by macro */
|
|
/************************************************************************************/
|
|
/* Important: must keep header structure quadword aligned for buffers used in QIO's */
|
|
/************************************************************************************/
|
|
unsigned char buff[1]; /* Actually buff[size] */
|
|
} jnl_buffer;
|
|
|
|
#ifdef DB64
|
|
# ifdef __osf__
|
|
# pragma pointer_size(save)
|
|
# pragma pointer_size(long)
|
|
# else
|
|
# error UNSUPPORTED PLATFORM
|
|
# endif
|
|
#endif
|
|
|
|
typedef jnl_buffer *jnl_buffer_ptr_t;
|
|
|
|
#ifdef DB64
|
|
# ifdef __osf__
|
|
# pragma pointer_size(restore)
|
|
# endif
|
|
#endif
|
|
|
|
typedef struct jnl_private_control_struct
|
|
{
|
|
jnl_buffer_ptr_t jnl_buff; /* pointer to shared memory */
|
|
gd_region *region; /* backpointer to region head */
|
|
fd_type channel, /* output channel, aka fd in UNIX */
|
|
old_channel; /* VMS only - for dealing with deferred deassign */
|
|
gd_id fileid; /* used for UNIX only */
|
|
vms_lock_sb *jnllsb; /* VMS only */
|
|
bool free_update_inprog; /* M VMS only */
|
|
unsigned char regnum; /* M index for 'tokens' */
|
|
unsigned char filler_char[2];
|
|
uint4 pini_addr, /* virtual on-disk address for JRT_PINI record, if journalling */
|
|
lastwrite, /* M used by jnl_wait */
|
|
new_freeaddr; /* M VMS only */
|
|
int4 temp_free; /* M Temp copy of free relative index until full write done */
|
|
double filler_q0; /* reset QUAD end mainline */
|
|
int4 new_dsk; /* A VMS only */
|
|
uint4 new_dskaddr, /* A VMS only */
|
|
status; /* A for error reporting */
|
|
bool dsk_update_inprog; /* A VMS only */
|
|
volatile bool qio_active; /* A This process, referenced but not used in UNIX */
|
|
char filler1[2]; /* prior 3 fields are maintained by AST - preserve memory coherency */
|
|
} jnl_private_control;
|
|
|
|
typedef enum
|
|
{
|
|
JNL_KILL,
|
|
JNL_SET,
|
|
JNL_ZKILL
|
|
} jnl_action_code;
|
|
|
|
typedef enum
|
|
{
|
|
/* 00 */ MUEXT_NULL,
|
|
/* 01 */ MUEXT_PINI,
|
|
/* 02 */ MUEXT_PFIN,
|
|
/* 03 */ MUEXT_EOF,
|
|
/* 04 */ MUEXT_KILL,
|
|
/* 05 */ MUEXT_SET,
|
|
/* 06 */ MUEXT_ZTSTART,
|
|
/* 07 */ MUEXT_ZTCOMMIT,
|
|
/* 08 */ MUEXT_TSTART,
|
|
/* 09 */ MUEXT_TCOMMIT,
|
|
/* 10 */ MUEXT_ZKILL,
|
|
|
|
MUEXT_MAX_TYPES
|
|
} muextract_type;
|
|
|
|
typedef struct
|
|
{
|
|
gv_key *key;
|
|
mstr val;
|
|
jnl_action_code operation;
|
|
} jnl_action;
|
|
|
|
|
|
typedef struct
|
|
{
|
|
sgmnt_addrs *fence_list;
|
|
int level;
|
|
short total_regions,
|
|
region_count;
|
|
uint4 token;
|
|
} jnl_fence_control;
|
|
|
|
typedef struct
|
|
{
|
|
char label[SIZEOF(JNL_LABEL_TEXT) - 1];
|
|
jnl_process_vector who_created,
|
|
who_opened;
|
|
uint4 end_of_data;
|
|
int4 max_record_length;
|
|
uint4 bov_timestamp,
|
|
eov_timestamp;
|
|
bool before_images;
|
|
unsigned char data_file_name_length;
|
|
char data_file_name[255];
|
|
} jnl_file_header;
|
|
|
|
typedef struct
|
|
{
|
|
int4 status,
|
|
alloc,
|
|
extend,
|
|
buffer;
|
|
trans_num tn;
|
|
char *fn,
|
|
*jnl,
|
|
*jnl_def;
|
|
short rsize,
|
|
fn_len,
|
|
jnl_len,
|
|
jnl_def_len;
|
|
bool before_images;
|
|
} jnl_create_info;
|
|
|
|
|
|
/* Journal record definitions */
|
|
|
|
typedef struct
|
|
{
|
|
unsigned short length;
|
|
char text[1]; /* Actually text[length] */
|
|
} jnl_string;
|
|
|
|
|
|
struct jrec_pini_struct
|
|
{
|
|
jnl_process_vector process_vector;
|
|
};
|
|
|
|
struct jrec_pfin_struct
|
|
{
|
|
jnl_process_vector process_vector;
|
|
uint4 pini_addr;
|
|
trans_num tn;
|
|
};
|
|
|
|
struct jrec_tcom_struct
|
|
{
|
|
uint4 pini_addr;
|
|
uint4 short_time;
|
|
trans_num tn;
|
|
uint4 token,
|
|
participants;
|
|
};
|
|
|
|
struct jrec_kill_set_struct
|
|
{
|
|
uint4 pini_addr;
|
|
uint4 short_time;
|
|
trans_num tn;
|
|
jnl_string mumps_node;
|
|
/* Note: for SET, mumps data follows mumps_node */
|
|
};
|
|
|
|
struct jrec_tp_kill_set_struct
|
|
{
|
|
uint4 pini_addr;
|
|
uint4 short_time;
|
|
trans_num tn;
|
|
uint4 token;
|
|
jnl_string mumps_node;
|
|
/* Note: for FSET, GSET, TSET, and USET, mumps data follows mumps_node */
|
|
};
|
|
|
|
struct jrec_pblk_struct
|
|
{
|
|
uint4 pini_addr;
|
|
uint4 short_time;
|
|
block_id blknum;
|
|
unsigned short bsiz;
|
|
char blk_contents[1]; /* Actually blk_contents[bsiz] */
|
|
};
|
|
|
|
struct jrec_epoch_struct
|
|
{
|
|
uint4 pini_addr;
|
|
uint4 short_time;
|
|
trans_num tn;
|
|
};
|
|
|
|
struct jrec_eof_struct
|
|
{
|
|
jnl_process_vector process_vector;
|
|
trans_num tn;
|
|
};
|
|
|
|
typedef union
|
|
{
|
|
struct jrec_pini_struct jrec_pini;
|
|
struct jrec_pfin_struct jrec_pfin;
|
|
struct jrec_tcom_struct jrec_tcom,
|
|
jrec_ztcom;
|
|
struct jrec_kill_set_struct jrec_kill,
|
|
jrec_set,
|
|
jrec_zkill;
|
|
struct jrec_tp_kill_set_struct jrec_fkill,
|
|
jrec_gkill,
|
|
jrec_tkill,
|
|
jrec_ukill,
|
|
jrec_fset,
|
|
jrec_gset,
|
|
jrec_tset,
|
|
jrec_uset,
|
|
jrec_fzkill,
|
|
jrec_gzkill,
|
|
jrec_tzkill,
|
|
jrec_uzkill;
|
|
struct jrec_pblk_struct jrec_pblk;
|
|
struct jrec_epoch_struct jrec_epoch;
|
|
struct jrec_eof_struct jrec_eof;
|
|
} jrec_union;
|
|
|
|
|
|
typedef struct
|
|
{
|
|
char jrec_type; /* Actually, enum jnl_record_type */
|
|
unsigned int jrec_backpointer : 24; /* Offset to beginning of last record */
|
|
} jrec_prefix;
|
|
|
|
typedef struct
|
|
{
|
|
/* Prefix: */
|
|
char jrec_type; /* Actually, enum jnl_record_type */
|
|
unsigned int jrec_backpointer : 24; /* Offset to beginning of last record */
|
|
/* Journal record: */
|
|
jrec_union val;
|
|
/* Suffix follows journal record */
|
|
} jnl_record;
|
|
|
|
typedef struct
|
|
{
|
|
unsigned int backptr : 24;
|
|
unsigned int suffix_code : 8;
|
|
} jrec_suffix;
|
|
|
|
#define JREC_PREFIX_SIZE SIZEOF(jrec_prefix)
|
|
#define JREC_SUFFIX_SIZE SIZEOF(jrec_suffix)
|
|
#define JNL_SHARE_SIZE(X) (JNL_ALLOWED(X) ? ((DIVIDE_ROUND_UP(JNL_NAME_EXP_SIZE + SIZEOF(jnl_buffer), OS_PAGELET_SIZE) \
|
|
+ ((sgmnt_data_ptr_t)X)->jnl_buffer_size) * OS_PAGELET_SIZE) : 0)
|
|
/* pass address of jnl_buffer to get address of expanded jnl file name */
|
|
#define JNL_NAME_EXP_PTR(X) ((sm_uc_ptr_t)(X) - JNL_NAME_EXP_SIZE)
|
|
|
|
#endif
|