From: Patrick J. P. G. <pat...@us...> - 2000-11-30 14:27:46
|
Update of /cvsroot/firebird/interbase/jrd In directory slayer.i.sourceforge.net:/tmp/cvs-serv3505/interbase/jrd Modified Files: dpm.e ods.h pag.c pag.h Log Message: Bug #116733 Too Many Generators Corrupt Database. Change written to the spec.s attached to the bug report. Summary: Added pgc_pgp Generators Per Page and used this new field when calculating page and offset for each generator. ...pat Index: dpm.e =================================================================== RCS file: /cvsroot/firebird/interbase/jrd/dpm.e,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -C2 -r1.1.1.1 -r1.2 *** dpm.e 2000/08/03 20:49:50 1.1.1.1 --- dpm.e 2000/11/30 14:27:32 1.2 *************** *** 22,25 **** --- 22,33 ---- */ + /* + * Modified by: Patrick J. P. Griffin + * Date: 11/29/2000 + * Problem: Bug 116733 Too many generators corrupt database. + * DPM_gen_id was not calculating page and offset correctly. + * Change: Corrected routine to use new variables from PAG_init. + */ + #include "../jrd/ib_stdio.h" #include "../jrd/ibsetjmp.h" *************** *** 1094,1098 **** **************************************/ DBB dbb; ! PPG page; WIN window; VCL vector; --- 1102,1106 ---- **************************************/ DBB dbb; ! GPG page; WIN window; VCL vector; *************** *** 1112,1132 **** #endif ! sequence = generator / dbb->dbb_pcontrol->pgc_ppp; ! offset = generator % dbb->dbb_pcontrol->pgc_ppp; if (!(vector = dbb->dbb_gen_id_pages) || ! sequence >= vector->vcl_count) { DPM_scan_pages (tdbb); if (!(vector = dbb->dbb_gen_id_pages) || ! sequence >= vector->vcl_count) { ! page = (PPG) DPM_allocate (tdbb, &window); ! page->ppg_header.pag_type = pag_ids; ! page->ppg_sequence = sequence; CCH_must_write (&window); CCH_RELEASE (tdbb, &window); DPM_pages (tdbb, 0, pag_ids, (ULONG) sequence, window.win_page); ! vector = (VCL) ALL_vector (dbb->dbb_permanent, &dbb->dbb_gen_id_pages, sequence + 1); vector->vcl_long [sequence] = window.win_page; } --- 1120,1149 ---- #endif ! sequence = generator / dbb->dbb_pcontrol->pgc_gpg; ! offset = generator % dbb->dbb_pcontrol->pgc_gpg; if (!(vector = dbb->dbb_gen_id_pages) || ! (sequence >= vector->vcl_count) || ! !(vector->vcl_long [sequence])) { DPM_scan_pages (tdbb); if (!(vector = dbb->dbb_gen_id_pages) || ! (sequence >= vector->vcl_count) || ! !(vector->vcl_long [sequence])) { ! page = (GPG) DPM_allocate (tdbb, &window); ! page->gpg_header.pag_type = pag_ids; ! page->gpg_sequence = sequence; CCH_must_write (&window); CCH_RELEASE (tdbb, &window); DPM_pages (tdbb, 0, pag_ids, (ULONG) sequence, window.win_page); ! if (!(vector = dbb->dbb_gen_id_pages)) ! { ! vector = dbb->dbb_gen_id_pages = (VCL) ALLOCPV (type_vcl, sequence + 1); ! vector->vcl_count = sequence + 1; ! } ! else ! if (sequence >= vector->vcl_count) ! vector = (VCL) ALL_extend(&dbb->dbb_gen_id_pages, sequence + 1); vector->vcl_long [sequence] = window.win_page; } *************** *** 1137,1145 **** #ifdef READONLY_DATABASE if (dbb->dbb_flags & DBB_read_only) ! page = (PPG) CCH_FETCH (tdbb, &window, LCK_read, pag_ids); else ! page = (PPG) CCH_FETCH (tdbb, &window, LCK_write, pag_ids); #else ! page = (PPG) CCH_FETCH (tdbb, &window, LCK_write, pag_ids); #endif /* READONLY_DATABASE */ --- 1154,1162 ---- #ifdef READONLY_DATABASE if (dbb->dbb_flags & DBB_read_only) ! page = (GPG) CCH_FETCH (tdbb, &window, LCK_read, pag_ids); else ! page = (GPG) CCH_FETCH (tdbb, &window, LCK_write, pag_ids); #else ! page = (GPG) CCH_FETCH (tdbb, &window, LCK_write, pag_ids); #endif /* READONLY_DATABASE */ *************** *** 1152,1158 **** */ if ( dbb->dbb_ods_version >= ODS_VERSION10) ! ptr = ((SINT64 *)(page->ppg_page)) + offset; else ! lptr = ((SLONG *)(page->ppg_page)) + offset; if (val || initialize) --- 1169,1175 ---- */ if ( dbb->dbb_ods_version >= ODS_VERSION10) ! ptr = ((SINT64 *)(page->gpg_values)) + offset; else ! lptr = ((SLONG *)(((PPG) page)->ppg_page)) + offset; if (val || initialize) Index: ods.h =================================================================== RCS file: /cvsroot/firebird/interbase/jrd/ods.h,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -C2 -r1.1.1.1 -r1.2 *** ods.h 2000/08/03 20:51:01 1.1.1.1 --- ods.h 2000/11/30 14:27:32 1.2 *************** *** 22,25 **** --- 22,34 ---- */ + /* + * Modified by: Patrick J. P. Griffin + * Date: 11/29/2000 + * Problem: Bug 116733 Too many generators corrupt database. + * DPM_gen_id was not calculating page and offset correctly. + * Change: Add typedef struct gpg to properly document the layout + * of the generator page. + */ + #ifndef _JRD_ODS_H_ #define _JRD_ODS_H_ *************** *** 367,370 **** --- 376,392 ---- UCHAR tip_transactions [1]; } *TIP; + + /* Generator Page */ + + typedef struct gpg { + struct pag gpg_header; + SLONG gpg_sequence; /* Sequence number */ + SLONG gpg_waste1; /* overhead carried for backward compatibility */ + USHORT gpg_waste2; /* overhead carried for backward compatibility */ + USHORT gpg_waste3; /* overhead carried for backward compatibility */ + USHORT gpg_waste4; /* overhead carried for backward compatibility */ + USHORT gpg_waste5; /* overhead carried for backward compatibility */ + SINT64 gpg_values [1]; /* Generator vector */ + } *GPG; /* Record header */ Index: pag.c =================================================================== RCS file: /cvsroot/firebird/interbase/jrd/pag.c,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -r1.3 -r1.4 *** pag.c 2000/10/12 02:52:17 1.3 --- pag.c 2000/11/30 14:27:32 1.4 *************** *** 22,25 **** --- 22,34 ---- */ + /* + * Modified by: Patrick J. P. Griffin + * Date: 11/29/2000 + * Problem: Bug 116733 Too many generators corrupt database. + * DPM_gen_id was not calculating page and offset correctly. + * Change: Caculate pgc_gpg, number of generators per page, + * for use in DPM_gen_id. + */ + #include "../jrd/ib_stdio.h" #include <string.h> *************** *** 1192,1195 **** --- 1201,1212 ---- control->pgc_tpt = (dbb->dbb_page_size - OFFSETA (TIP, tip_transactions)) * 4; control->pgc_pip = 1; + /* dbb_ods_version can be 0 when a new database is being created */ + if ((dbb->dbb_ods_version == 0) || (dbb->dbb_ods_version >= ODS_VERSION10)) + control->pgc_gpg = (dbb->dbb_page_size - OFFSETA (GPG, gpg_values)) / sizeof (((GPG)0)->gpg_values); + else + control->pgc_gpg = (dbb->dbb_page_size - OFFSETA (PPG, ppg_page)) / sizeof (((PPG)0)->ppg_page); + + + /* Compute the number of data pages per pointer page. Each data page Index: pag.h =================================================================== RCS file: /cvsroot/firebird/interbase/jrd/pag.h,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -C2 -r1.1.1.1 -r1.2 *** pag.h 2000/08/03 20:51:07 1.1.1.1 --- pag.h 2000/11/30 14:27:32 1.2 *************** *** 22,25 **** --- 22,35 ---- */ + /* + * Modified by: Patrick J. P. Griffin + * Date: 11/29/2000 + * Problem: Bug 116733 Too many generators corrupt database. + * DPM_gen_id was not calculating page and offset correctly. + * Change: Add pgc_gpg, number of generators per page, + * for use in DPM_gen_id. + */ + + #ifndef _JRD_PAG_H_ #define _JRD_PAG_H_ *************** *** 35,38 **** --- 45,49 ---- int pgc_bytes; /* Number of bytes of bit in PIP */ int pgc_tpt; /* Transactions per TIP */ + int pgc_gpg; /* Generators per generator page */ } *PGC; |