90 lines
2.8 KiB
C
90 lines
2.8 KiB
C
/****************************************************************
|
|
* *
|
|
* Copyright 2003, 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"
|
|
|
|
#ifdef VMS
|
|
#include "iosb_disk.h"
|
|
#endif
|
|
|
|
#include "gdsroot.h"
|
|
#include "gdsblk.h"
|
|
#include "gdsbt.h"
|
|
#include "gtm_facility.h"
|
|
#include "fileinfo.h"
|
|
#include "gdsfhead.h"
|
|
#include "filestruct.h"
|
|
#include "jnl.h"
|
|
#include "buddy_list.h"
|
|
#include "hashtab_int4.h" /* needed for muprec.h */
|
|
#include "hashtab_int8.h" /* needed for muprec.h */
|
|
#include "hashtab_mname.h" /* needed for muprec.h */
|
|
#include "muprec.h"
|
|
#include "iosp.h"
|
|
#include "jnl_typedef.h"
|
|
#include "gtmmsg.h" /* for "gtm_putmsg" prototype */
|
|
#include "mur_read_file.h" /* for "mur_fread_eof" prototype */
|
|
|
|
GBLREF reg_ctl_list *mur_ctl;
|
|
GBLREF mur_gbls_t murgbl;
|
|
|
|
boolean_t mur_jctl_from_next_gen(void)
|
|
{
|
|
reg_ctl_list *rctl, *rctl_top;
|
|
jnl_ctl_list *jctl, *temp_jctl;
|
|
|
|
error_def(ERR_JNLBADRECFMT);
|
|
error_def(ERR_TEXT);
|
|
|
|
for (rctl = mur_ctl, rctl_top = mur_ctl + murgbl.reg_total; rctl < rctl_top; rctl++)
|
|
{
|
|
if (!rctl->jfh_recov_interrupted)
|
|
continue;
|
|
assert(rctl->jctl_apply_pblk == rctl->jctl_head);
|
|
jctl = rctl->jctl_apply_pblk; /* journal file that has the turn around point of interrupted recovery */
|
|
assert(rctl->jctl == jctl);
|
|
assert(NULL != rctl->jctl_alt_head); /* should have been set in mur_apply_pblk */
|
|
assert(NULL != jctl->jfh);
|
|
assert(!jctl->jfh->recover_interrupted);
|
|
for (; NULL != jctl->next_gen; jctl = jctl->next_gen)
|
|
assert(!jctl->next_gen->jfh->recover_interrupted);
|
|
while (0 != jctl->jfh->next_jnl_file_name_length)
|
|
{ /* create the linked list of journal files created by GT.M originally */
|
|
temp_jctl = (jnl_ctl_list *)malloc(SIZEOF(jnl_ctl_list));
|
|
memset(temp_jctl, 0, SIZEOF(jnl_ctl_list));
|
|
temp_jctl->jnl_fn_len = jctl->jfh->next_jnl_file_name_length;
|
|
memcpy(temp_jctl->jnl_fn, jctl->jfh->next_jnl_file_name, jctl->jfh->next_jnl_file_name_length);
|
|
if (!mur_fopen(temp_jctl))
|
|
{
|
|
free(temp_jctl);
|
|
return FALSE;
|
|
}
|
|
if (SS_NORMAL != (jctl->status = mur_fread_eof(temp_jctl, rctl)))
|
|
{
|
|
gtm_putmsg(VARLSTCNT(9) ERR_JNLBADRECFMT, 3,
|
|
temp_jctl->jnl_fn_len, temp_jctl->jnl_fn, temp_jctl->rec_offset,
|
|
ERR_TEXT, 2, LEN_AND_LIT("mur_jctl_from_next_gen"));
|
|
free(temp_jctl);
|
|
return FALSE;
|
|
}
|
|
temp_jctl->prev_gen = jctl;
|
|
temp_jctl->next_gen = NULL;
|
|
jctl->next_gen = temp_jctl;
|
|
jctl = temp_jctl;
|
|
}
|
|
rctl->jctl = jctl;
|
|
assert(jctl->reg_ctl == rctl);
|
|
}
|
|
return TRUE;
|
|
}
|