|
suites.All and derbyall ran cleanly with the d3116-1 patch.
Hi Knut Anders.
Patch d3116-1 looks correct to me, but it seems a little overkill to always reinitiate the byte[] in StoredPage. Could you achieve the same thing by moving the initSpace call from StoredPage#usePageBuffer to StoredPage#createPage? Alternatively make initSpace protected and call StoredPage#initSpace from CachedPage#setPageArray when the page is reused? Another bug? In StoredPage#initSpace, slotEntrySize is used when setting maxFieldSize. However, initSpace is called before slotEntrySize has been updated in usePageBuffer. Not related to your patch: There is a problem with the Javadoc in AllocPage (unclosed paragraph "<p"). Fixing that would show more javadoc in the html files. Thanks for looking at the patch, Jørgen!
> it seems a little overkill to always reinitiate the byte[] in StoredPage. Note that setPageBuffer() doesn't reallocate the byte array, it only sets the reference to the byte array and refreshes some of the instance variables. I think the cost of these operations is negligible compared to the cost of evicting the old page and initializing the new one. > Could you achieve the same thing by moving the initSpace call from StoredPage#usePageBuffer to StoredPage#createPage? That might be possible, but then I think we would also have to move it into StoredPage.initFromData() as the same problem may occur if you read an alloc page from disk instead of creating a new one. It also seems like initSpace() depends on other variables initialized in usePageBuffer() (slotEntrySize in particular) so we'd probably end up with moving most of the code in usePageBuffer() into initSpace() anyway. > Another bug? In StoredPage#initSpace, slotEntrySize is used when setting maxFieldSize. However, initSpace is called before slotEntrySize has been updated in usePageBuffer. This is supposed to be fixed in the current trunk (see > Not related to your patch: There is a problem with the Javadoc in AllocPage (unclosed paragraph "<p"). Fixing that would show more javadoc in the html files. Good catch! I fixed the tag and checked it in. Now I see one more line in the javadoc, but still there's much of it that doesn't show up. Perhaps there's a problem with the custom javadoc tags (format_id, purpose, etc)? Uploading a new patch which resolves a conflict with a recent commit. The new patch also contains an assert which exposes the bug in the lack of a test for it.
- Without the fixes, the assert will cause database creation to fail. - With the fix in AllocPage.createPage(), unit/T_RawStoreFactory.unit will fail when an AllocPage is evicted from the page cache to make room for an AllocPage with a different borrowedSpace value. - With the fix in CachedPage.setPageArray(), unit/T_RawStoreFactory.unit passes. I'm re-running derbyall and suites.All now. Since there were no more comments on the previous patch, I intend to commit the updated patch to trunk and 10.4 if all the tests pass. Committed to trunk with revision 644698.
Committed to 10.4 with revision 644967.
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
What this patch does, is:
- in AllocPage.createPage(), set borrowedSpace before super.createPage() is called so that getMaxFreeSpace() returns the correct value when totalSpace is initialized
- in CachedPage.setPageArray(), call usePageBuffer() also when the old buffer is reused. This ensures that totalSpace is recalculated when a page object is reused.