Hi, All.
We investigate a problem with server hanging on backup on of our damaged
database with -g option when it try to chase a dead record version.
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_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;
}
In our case "rpb" and "temp" versions are 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.
If I compare rpb_flags like this it solves the problem:
rpb->rpb_flags != temp.rpb_flags &&
!(state == tra_dead &&
rpb->rpb_flags == (temp.rpb_flags | rpb_gc_active))
Could you review this solution and its possible problems?
We can provide access the damaged database, but it size is around 115
Gbytes.
Best regards,
Dmitry Starodubov
------------------------------------------------------------------------------
Minimize network downtime and maximize team effectiveness.
Reduce network management and security costs.Learn how to hire
the most talented Cisco Certified professionals. Visit the
Employer Resources Portal
http://www.cisco.com/web/learning/employer_resources/index.html
Firebird-Devel mailing list, web interface at
https://lists.sourceforge.net/lists/listinfo/firebird-devel