Just to follow up on this thread, there IS a problem in
Table::expungeRecordVersions(). But not what I thought below. Jim was
able to explain to me on Saturday how garbage collection is supposed to
work. Today, I saw that it was not working correctly and invented a
testcase that would show the problem.
I just documented it in Bug#40801.
Note that since the scavenger only starts pruning and garbage collecting
old record versions when the record cache threshold is reached, we would
rarely ever see this in testing. But it would be seen in the real world...
Kevin Lewis wrote:
> Jim,
>
> I see what appears to be a possible problem in
> Table::expungeRecordVersions(). It seems like this is supposed to
> release a long string of old invisible record versions. The oldest
> visible record is sent into it and the priorRecord chain from there down
> is scavenged. It does this by detaching the priorRecord from the one
> sent in, doing garbage collection on that prior, and releasing its
> useCount. The useCount is always 1 due to the priorRecord pointer. So
> the release at the end of Table::expungeRecordVersions() causes it to
> be deleted. Its destructor will release all the priorRecords from there
> to the end of the chain.
>
> But where is the garbage collection done on each of these other prior
> records?
>
> If I am right that the garbage collection is never done, then index
> pages and blob records are left in the pages, filling up the tablespace.
>
> Kevin
>