[ 
https://issues.apache.org/jira/browse/DERBY-3099?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12532053
 ] 

Knut Anders Hatlen commented on DERBY-3099:
-------------------------------------------

Here is a dump of the alloc page right before the call to addPage() in a 
successfull test run (clean trunk). Note that page 3, 4, 5 and 6 are marked as 
valid, in use pages. I had expected those pages to be free, since the update 
that overflowed to them was rolled back.

*** Alloc page ***
nextAllocPageNumber = -1
nextAllocPageOffset = 0
reserved1 = 0
reserved2 = 0
reserved3 = 0
reserved4 = 0
borrowedSpace = 80
extent = -----------------------------------------------------------------------
-------
Extent map of from page 1 to page 10216
        page 1: valid, in use page
        page 2: free page
        page 3: valid, in use page
        page 4: valid, in use page
        page 5: valid, in use page
        page 6: valid, in use page
        page 7: free page
        From 7 to 10216 are un-allocated pages
------------------------------------------------------------------------------
---------------------------------------------------
page id Page(0,Container(0, 1191405214574)) Overflow: false PageVersion: 28 
SlotsInUse: 0 DeletedRowCount: 0 PageStatus: 1 NextId: 6 firstFreeByte: 189 
freeSpace: 3899 totalSpace: 3899 spareSpace: 0 PageSize: 4096
---------------------------------------------------
Hex dump:
00000000: 0076 0000 0001 0000 0000 0000 0000 0000  .v..............
00000010: 0000 0006 0000 0000 0000 0000 0000 0000  ................
00000020: 0000 0000 0001 0000 0000 0000 0000 0000  ................
00000030: 0000 0000 0000 0000 0000 0000 ffff ffff  ................
00000040: ffff ffff 0000 0000 0000 0000 0000 0000  ................
00000050: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000060: 0000 0000 0000 0000 0000 0000 5000 0000  ............P...
00000070: 7400 0000 0000 0010 0000 0000 1400 0000  t...............
00000080: 0c00 0100 0800 0000 0000 0000 0000 0000  ................
00000090: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000000a0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000000b0: 0000 0000 0000 0000 00dc 7f30 ca00 0000  .........?.0?...
000000c0: 0000 0010 0000 0000 0000 0000 0100 0000  ................
000000d0: 0000 0027 e800 0000 0030 0000 0000 0000  .........0......
000000e0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
.
.
.
(the rest of the page is just zeros, except the checksum)

> Possible bug in interaction with buffer manager causing pages not to be freed 
> on rollback to savepoint
> ------------------------------------------------------------------------------------------------------
>
>                 Key: DERBY-3099
>                 URL: https://issues.apache.org/jira/browse/DERBY-3099
>             Project: Derby
>          Issue Type: Bug
>          Components: Services, Store
>    Affects Versions: 10.4.0.0
>            Reporter: Knut Anders Hatlen
>         Attachments: failfast.diff
>
>
> I noticed this strange behaviour when I was working on DERBY-2911. It seems 
> like the result of test case P042 in unit/T_RawStoreFactory.unit is dependent 
> on the actual contents of the buffer manager (which pages have been evicted, 
> which free entries have been reused and so on). I'm not sure if this is a bug 
> in the test or somewhere in the code, or if this is expected behaviour, but 
> it sounds a bit suspicious.
> For instance, commenting out all the test cases preceeding P042 makes P042 
> fail, even though P042 creates a new container so that it should not be 
> affected by any of the previous test cases. Also, commenting out a space 
> optimization in Clock.findFreeItem() so that freed entries are not reused 
> except when rotateClock() is called on a full cache to find a victim, causes 
> the test case to fail. A third way to make it fail, is to vary the scan 
> direction when looking for a free entry to reuse in the new buffer manager 
> (ConcurrentCache). If the scan is disabled or walks the clock from the 
> beginning to the end, the test fails, but if the clock is scanned backwards, 
> it passes.
> The code that fails in the test, is
>                       c = t_util.t_openContainer(t, segment, cid, true);
>                       Page checkNextPage = t_util.t_addPage(c);
>                       if (checkNextPage.getPageNumber() == nextPageNumber)
>                               throw T_Fail.testFailMsg(
>                                       "expect some pages to be freed by 
> update rollback");
> The expected page number is 2, and the actual page number is 7.
> Before this, a large row has been inserted on page 1 and overflows to page 2, 
> 3, 4, 5 and 6. Also, page 7 has been added manually before all the updates 
> were rolled back so that the pages from 2 up to 7 should be unallocated. Page 
> 7 is then added and removed, and the transaction is committed. After 
> reopening the container, the test expects the pages from 2 up to 7 to be 
> free, and that t_addPage() should allocate page number 2.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to