110 lines
3.7 KiB
C
110 lines
3.7 KiB
C
|
/****************************************************************
|
||
|
* *
|
||
|
* Copyright 2007, 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. *
|
||
|
* *
|
||
|
****************************************************************/
|
||
|
|
||
|
#include "mdef.h"
|
||
|
#include "gtm_string.h"
|
||
|
#include "gtm_inet.h"
|
||
|
|
||
|
#include <stddef.h> /* for offsetof() macro */
|
||
|
|
||
|
#ifdef VMS
|
||
|
#include <descrip.h> /* Required for gtmsource.h */
|
||
|
#endif
|
||
|
|
||
|
#include "gdsroot.h"
|
||
|
#include "gtm_facility.h"
|
||
|
#include "fileinfo.h"
|
||
|
#include "gdsbt.h"
|
||
|
#include "gdsblk.h"
|
||
|
#include "gdsfhead.h"
|
||
|
#include "filestruct.h"
|
||
|
#include "ccp.h"
|
||
|
#include "iosp.h"
|
||
|
#include "jnl.h"
|
||
|
#include "repl_msg.h"
|
||
|
#include "gtmsource.h"
|
||
|
#include "min_max.h"
|
||
|
#include "sleep_cnt.h"
|
||
|
#include "jnl_write.h"
|
||
|
#include "copy.h"
|
||
|
|
||
|
GBLREF jnlpool_ctl_ptr_t temp_jnlpool_ctl;
|
||
|
|
||
|
GBLREF uint4 process_id;
|
||
|
GBLREF sm_uc_ptr_t jnldata_base;
|
||
|
GBLREF jnlpool_addrs jnlpool;
|
||
|
GBLREF jnlpool_ctl_ptr_t jnlpool_ctl;
|
||
|
GBLREF jnl_gbls_t jgbl;
|
||
|
|
||
|
/* This function does a subset of what "jnl_write" does. While "jnl_write" writes the journal record to the journal buffer,
|
||
|
* journal file and journal pool, this function writes the journal records ONLY TO the journal pool. This function should
|
||
|
* be invoked only if replication state is WAS_ON (repl_was_open) and journaling state is jnl_closed.
|
||
|
*
|
||
|
* jpc : Journal private control
|
||
|
* rectype : Record type
|
||
|
* jnl_rec : This contains fixed part of a variable size record or the complete fixed size records.
|
||
|
* jfb : For SET/KILL/ZKILL records entire record is formatted in this.
|
||
|
*/
|
||
|
void jnl_write_poolonly(jnl_private_control *jpc, enum jnl_record_type rectype, jnl_record *jnl_rec, jnl_format_buffer *jfb)
|
||
|
{
|
||
|
int4 align_rec_len, rlen, rlen_with_align, srclen, dstlen;
|
||
|
jnl_buffer_ptr_t jb;
|
||
|
sgmnt_addrs *csa;
|
||
|
struct_jrec_align align_rec;
|
||
|
uint4 status;
|
||
|
jrec_suffix suffix;
|
||
|
boolean_t nowrap;
|
||
|
struct_jrec_blk *jrec_blk;
|
||
|
uint4 jnlpool_size;
|
||
|
uchar_ptr_t jnlrecptr;
|
||
|
DEBUG_ONLY(uint4 lcl_dskaddr;)
|
||
|
uchar_ptr_t tmp_buff;
|
||
|
|
||
|
error_def(ERR_JNLWRTNOWWRTR);
|
||
|
error_def(ERR_JNLWRTDEFER);
|
||
|
|
||
|
assert(NULL != jnl_rec);
|
||
|
assert(rectype > JRT_BAD && rectype < JRT_RECTYPES && JRT_ALIGN != rectype);
|
||
|
assert(jrt_is_replicated[rectype]);
|
||
|
assert((NULL != jnlpool.jnlpool_ctl) && (NULL != jnlpool_ctl)); /* ensure we haven't yet detached from the jnlpool */
|
||
|
assert((&FILE_INFO(jnlpool.jnlpool_dummy_reg)->s_addrs)->now_crit); /* ensure we have the jnl pool lock */
|
||
|
csa = &FILE_INFO(jpc->region)->s_addrs;
|
||
|
assert(!JNL_ENABLED(csa) && REPL_WAS_ENABLED(csa));
|
||
|
assert(csa->now_crit || (csa->hdr->clustered && csa->nl->ccp_state == CCST_CLOSED));
|
||
|
jb = jpc->jnl_buff;
|
||
|
++jb->reccnt[rectype];
|
||
|
rlen = jnl_rec->prefix.forwptr;
|
||
|
assert(0 == rlen % JNL_REC_START_BNDRY);
|
||
|
jb->bytcnt += rlen;
|
||
|
DEBUG_ONLY(jgbl.cu_jnl_index++;)
|
||
|
jnlpool_size = temp_jnlpool_ctl->jnlpool_size;
|
||
|
dstlen = jnlpool_size - temp_jnlpool_ctl->write;
|
||
|
if (jrt_fixed_size[rectype])
|
||
|
jnlrecptr = (uchar_ptr_t)jnl_rec;
|
||
|
# ifdef GTM_CRYPT
|
||
|
else if(csa->hdr->is_encrypted && IS_SET_KILL_ZKILL_ZTRIG_ZTWORM(rectype))
|
||
|
jnlrecptr = (uchar_ptr_t)jfb->alt_buff;
|
||
|
# endif
|
||
|
else
|
||
|
jnlrecptr = (uchar_ptr_t)jfb->buff;
|
||
|
|
||
|
if (rlen <= dstlen) /* dstlen & srclen >= rlen (most frequent case) */
|
||
|
memcpy(jnldata_base + temp_jnlpool_ctl->write, jnlrecptr, rlen);
|
||
|
else /* dstlen < rlen <= srclen */
|
||
|
{
|
||
|
memcpy(jnldata_base + temp_jnlpool_ctl->write, jnlrecptr, dstlen);
|
||
|
memcpy(jnldata_base, jnlrecptr + dstlen, rlen - dstlen);
|
||
|
}
|
||
|
temp_jnlpool_ctl->write += rlen;
|
||
|
if (temp_jnlpool_ctl->write >= jnlpool_size)
|
||
|
temp_jnlpool_ctl->write -= jnlpool_size;
|
||
|
}
|