From: Kevin Lewis Date: November 17 2008 7:59pm Subject: Re: Question on Scavenging List-Archive: http://lists.mysql.com/falcon/187 Message-Id: <4921CD34.3080308@sun.com> MIME-Version: 1.0 Content-Type: text/plain; format=flowed; charset=ISO-8859-1 Content-Transfer-Encoding: 7BIT 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 >