
If you were logged in you would be able to see more operations.
|
|
|
QA Status: |
Cannot be tested
|
In VIO_chase_record_version:
if (!(rpb->rpb_flags & rpb_chained) && rpb->rpb_flags & rpb_gc_active)
{
if (!rpb->rpb_transaction_nr) {
state = tra_active;
}
if (state == tra_committed) {
state = TRA_pc_active(tdbb, rpb->rpb_transaction_nr) ? tra_precommitted : tra_dead;
}
if (state == tra_dead) {
rpb->rpb_flags &= ~rpb_gc_active;
}
}
If state is dead and record has rpb_gc_active flag turned on, this flag is reset and starts new iteration of chasing.
On new iteration if ATT_NO_CLEANUP flag turned on, version is read from disk again and compared with saved version:
record_param temp = *rpb;
...
VIO_data(tdbb, rpb, pool);
rpb->rpb_page = temp.rpb_page;
rpb->rpb_line = temp.rpb_line;
if (!(DPM_fetch(tdbb, rpb, LCK_read)))
{
if (!DPM_get(tdbb, rpb, LCK_read)) {
return false;
}
break;
}
if (rpb->rpb_b_page != temp.rpb_b_page || rpb->rpb_b_line != temp.rpb_b_line ||
rpb->rpb_f_page != temp.rpb_f_page || rpb->rpb_f_line != temp.rpb_f_line ||
rpb->rpb_flags != temp.rpb_flags)
{
CCH_RELEASE(tdbb, &rpb->getWindow(tdbb));
if (!DPM_get(tdbb, rpb, LCK_read)) {
return false;
}
break;
}
"rpb" and "temp" versions can differ only by rpb_gc_active flag which was reset from saved version on previous iteration. Because of this current version considered as changed and it processed again. And so on. Loop inside VIO_chase_record_version becomes infinite.
|
Description
|
In VIO_chase_record_version:
if (!(rpb->rpb_flags & rpb_chained) && rpb->rpb_flags & rpb_gc_active)
{
if (!rpb->rpb_transaction_nr) {
state = tra_active;
}
if (state == tra_committed) {
state = TRA_pc_active(tdbb, rpb->rpb_transaction_nr) ? tra_precommitted : tra_dead;
}
if (state == tra_dead) {
rpb->rpb_flags &= ~rpb_gc_active;
}
}
If state is dead and record has rpb_gc_active flag turned on, this flag is reset and starts new iteration of chasing.
On new iteration if ATT_NO_CLEANUP flag turned on, version is read from disk again and compared with saved version:
record_param temp = *rpb;
...
VIO_data(tdbb, rpb, pool);
rpb->rpb_page = temp.rpb_page;
rpb->rpb_line = temp.rpb_line;
if (!(DPM_fetch(tdbb, rpb, LCK_read)))
{
if (!DPM_get(tdbb, rpb, LCK_read)) {
return false;
}
break;
}
if (rpb->rpb_b_page != temp.rpb_b_page || rpb->rpb_b_line != temp.rpb_b_line ||
rpb->rpb_f_page != temp.rpb_f_page || rpb->rpb_f_line != temp.rpb_f_line ||
rpb->rpb_flags != temp.rpb_flags)
{
CCH_RELEASE(tdbb, &rpb->getWindow(tdbb));
if (!DPM_get(tdbb, rpb, LCK_read)) {
return false;
}
break;
}
"rpb" and "temp" versions can differ only by rpb_gc_active flag which was reset from saved version on previous iteration. Because of this current version considered as changed and it processed again. And so on. Loop inside VIO_chase_record_version becomes infinite. |
Show » |
|
I trink I have had this problem last week in one of our customers with 2.5.2 upd 1