Correcting the bitmap traversal in Transaction::rollbackSavepoint() did
not resolve the problem of failed thaws.
What's happening is that rolled back savepoints are written to the
serial log, as they should be, but are then subsequently assigned to one
or more record versions by Transaction::releaseSavepoint().
When these record versions are chilled, they are never gophered because
their assigned savepoint is marked in the serial log as rolled back.
Transaction::releaseSavepoint() is called after
Transaction::createSavepoint(), e.g. in Statement::start(), and it moves
pending records to the previous savepoint. This is a problem if the
previous savepoint was rolled back.
Why are the rolled back savepoints still around in the first place? Look
at the bottom of Transaction::rollbackSavepoint() and tell me what you
// Move skipped savepoints object to the free list
// Leave the target savepoint empty, but connected to the transaction.
if (savePoint->id > savePointId)
savePoints = savePoint->next;
savePoint->next = freeSavePoints;
freeSavePoints = savePoint;
savePoint = savePoints;
savePoint = savePoint->next;
|• Rolled back savepoints||Christopher Powers||6 Nov|