/**************************************************************** * * * Copyright 2009, 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. * * * ****************************************************************/ #ifndef DB_SNAPSHOT_H #define DB_SNAPSHOT_H #include "gtm_limits.h" #define SNAPSHOT_HDR_LABEL "SNAPSHOTV1" #define SET_FAST_INTEG(X) ((X)->proc_property |= 0x0001) #define SET_NORM_INTEG(X) ((X)->proc_property &= 0xfffe) #define FASTINTEG_IN_PROG(X) ((X)->proc_property & 0x0001) /* Possible states when snapshot is being init'ed */ typedef enum { SNAPSHOT_NOT_INITED = 0, SNAPSHOT_SHM_ATTACH_FAIL, SHADOW_FIL_OPEN_FAIL, BEFORE_SHADOW_FIL_CREAT, AFTER_SHADOW_FIL_CREAT, AFTER_SHM_CREAT, SNAPSHOT_INIT_DONE, SS_NUM_PROC_STATUS } ss_proc_status; typedef struct snapshot_info_struct { uint4 ss_pid; /* PID of the process doing the snapshot */ trans_num snapshot_tn; /* Transaction number at which the snapshot started */ uint4 db_blk_size; /* Database block size */ uint4 free_blks; /* Free blocks at the time of snapshot */ uint4 total_blks; /* Total blocks at the time of snapshot */ char shadow_file[GTM_PATH_MAX]; /* Temporary file that will contain the before images */ int4 shadow_vbn; /* Starting VBN of the shadow file */ long ss_shmid; /* Shared memory identifier created by snapshot initiating process */ int ss_shmsize; /* Size of the shared memory newly created by snapshot initiating process */ } snapshot_info_t; typedef struct shm_snapshot_struct { snapshot_info_t ss_info; volatile uint4 failure_errno; /* the status code of the failure. */ volatile pid_t failed_pid; /* the process_id that encountered the snapshot failure */ int in_use; boolean_t preserve_snapshot; global_latch_t bitmap_latch; /* latch to be passed on to add_inter while modifying the shadow bitmap */ trans_num ss_tn_count; /* count of transactions after the snapshot started */ } shm_snapshot_t; typedef shm_snapshot_t *shm_snapshot_ptr_t; /* Utilities (MUPIP, DSE, LKE) specific snapshot structure */ typedef struct util_snapshot_struct { unsigned char *master_map; sgmnt_data_ptr_t header; gtm_uint64_t native_size; } util_snapshot_t; typedef struct snapshot_context_struct { int shdw_fd; /* open file descriptor for the shadow file */ long nl_shmid; long attach_shmid; int ss_shmcycle; uint4 total_blks; uint4 failure_errno; shm_snapshot_ptr_t ss_shm_ptr; sm_uc_ptr_t start_shmaddr; void *bitmap_addr; int4 shadow_vbn; char shadow_file[GTM_PATH_MAX]; ss_proc_status cur_state; /* the property of process triggering snapshot. At present only last bit is used to indicate property of integ process: * 0x0000: Normal Integ, 0x0001:Fast Integ */ uint4 proc_property; } snapshot_context_t; typedef struct snapshot_filehdr_struct { char label[SIZEOF(SNAPSHOT_HDR_LABEL) - 1]; snapshot_info_t ss_info; int4 shadow_file_len; unsigned char filler[976]; } snapshot_filhdr_t; typedef snapshot_filhdr_t *snapshot_filhdr_ptr_t; typedef util_snapshot_t *util_snapshot_ptr_t; typedef snapshot_context_t *snapshot_context_ptr_t; #define DEFAULT_INIT_SS_CTX(lcl_ss_ctx) \ { \ lcl_ss_ctx->shdw_fd = FD_INVALID; \ lcl_ss_ctx->nl_shmid = INVALID_SHMID; \ lcl_ss_ctx->attach_shmid = INVALID_SHMID; \ lcl_ss_ctx->ss_shmcycle = 0; \ lcl_ss_ctx->total_blks = 0; \ lcl_ss_ctx->failure_errno = 0; \ lcl_ss_ctx->ss_shm_ptr = NULL; \ lcl_ss_ctx->start_shmaddr = lcl_ss_ctx->bitmap_addr = NULL; \ lcl_ss_ctx->shadow_vbn = 0; \ memset(lcl_ss_ctx->shadow_file, 0, GTM_PATH_MAX); \ lcl_ss_ctx->cur_state = SNAPSHOT_NOT_INITED; \ } #define SS_DEFAULT_INIT_INFO(ss_ptr) \ { \ ss_ptr->ss_info.ss_pid = 0; \ ss_ptr->ss_info.snapshot_tn = 0; \ ss_ptr->ss_info.db_blk_size = 0; \ ss_ptr->ss_info.free_blks = 0; \ ss_ptr->ss_info.total_blks = 0; \ memset(ss_ptr->ss_info.shadow_file, 0, GTM_PATH_MAX); \ ss_ptr->ss_info.ss_shmid = INVALID_SHMID; \ ss_ptr->ss_info.ss_shmsize = 0; \ } #define SS_DEFAULT_INIT_POOL(ss_shm_ptr) \ { \ SS_DEFAULT_INIT_INFO(ss_shm_ptr); \ ss_shm_ptr->failure_errno = 0; \ ss_shm_ptr->failed_pid = 0; \ ss_shm_ptr->in_use = 0; \ ss_shm_ptr->preserve_snapshot = FALSE; \ ss_shm_ptr->ss_tn_count = 0; \ } #define MAX_SNAPSHOTS 1 #define SNAPSHOT_HDR_SIZE SIZEOF(snapshot_filhdr_t) #define SINGLE_SHM_SNAPSHOT_SIZE ROUND_UP(SIZEOF(shm_snapshot_t), OS_PAGE_SIZE) #define SS_CTX_CAST(X) ((snapshot_context_ptr_t)(X)) #define BLKS_PER_WORD 32 #define SS_GETSTARTPTR(CSA) (((sm_uc_ptr_t)CSA->shmpool_buffer) + SHMPOOL_BUFFER_SIZE) #define SS_IDX2ABS(CSA, N) ((shm_snapshot_ptr_t)(SS_GETSTARTPTR(CSA) + SNAPSHOT_SECTION_SIZE)) #ifdef DEBUG # define DBG_ENSURE_PTR_WITHIN_SS_BOUNDS(CSA, PTR) \ assert((PTR) >= SS_GETSTARTPTR(CSA) && ((PTR) < SS_GETSTARTPTR(CSA) + SHMPOOL_SECTION_SIZE)) #else # define DBG_ENSURE_PTR_WITHIN_SS_BOUNDS(CSA, PTR) #endif #ifdef GTM_SNAPSHOT # define SNAPSHOT_SECTION_SIZE (ROUND_UP((MAX_SNAPSHOTS * SINGLE_SHM_SNAPSHOT_SIZE), OS_PAGE_SIZE)) #else # define SNAPSHOT_SECTION_SIZE 0 #endif #define SHMPOOL_SECTION_SIZE (ROUND_UP((SHMPOOL_BUFFER_SIZE + SNAPSHOT_SECTION_SIZE), OS_PAGE_SIZE)) boolean_t ss_initiate(gd_region *, util_snapshot_ptr_t, snapshot_context_ptr_t *, boolean_t, char *); void ss_release(snapshot_context_ptr_t *); boolean_t ss_get_block(sgmnt_addrs *, block_id, sm_uc_ptr_t); void ss_read_block(snapshot_context_ptr_t, block_id, sm_uc_ptr_t); boolean_t ss_write_block(sgmnt_addrs *, block_id, cache_rec_ptr_t, sm_uc_ptr_t, snapshot_context_ptr_t); void ss_set_shdw_bitmap(sgmnt_addrs *, snapshot_context_ptr_t, block_id); boolean_t ss_chk_shdw_bitmap(sgmnt_addrs *, snapshot_context_ptr_t, block_id); boolean_t ss_create_context(snapshot_context_ptr_t, int); boolean_t ss_destroy_context(snapshot_context_ptr_t ); void ss_anal_shdw_file(char *, int); void ss_initiate_call_on_signal(void); #endif