[ 
https://issues.apache.org/jira/browse/GEODE-7085?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16909270#comment-16909270
 ] 

ASF subversion and git services commented on GEODE-7085:
--------------------------------------------------------

Commit f58710116db1cd8c509b59a43ffa050a073234d7 in geode's branch 
refs/heads/feature/GEODE-7066 from Dan Smith
[ https://gitbox.apache.org/repos/asf?p=geode.git;h=f587101 ]

 GEODE-7085: Ensuring the bitset stays within BIT_SET_WIDTH (#3922)

Ensuring that when we call recordVersion on a RegionVersionHolder,
we appropriately move the bitSet to match the new version we are
recording, rather than trying to expand it. In particular, if new
version is greater than Integer.MAX_VALUE, we can't record than in out
integer indexed bit set.

This change rewrites addBitSetExceptions. The logic is now broken into a
BitSetExceptionIterator, which converts some or all of the bit set into
RVVException objects, and the logic to slide the bit set forward to a
new bitSetVersion.

Adding unit tests that show that large versions cause an
IndexOutOfBounds exception from recordGCVersion. Adding more unit tests
for the internal state of the bitset.

> Cannot recover from disk store if region version is greater than 
> Integer.MAX_VALUE
> ----------------------------------------------------------------------------------
>
>                 Key: GEODE-7085
>                 URL: https://issues.apache.org/jira/browse/GEODE-7085
>             Project: Geode
>          Issue Type: Bug
>          Components: membership, persistence
>            Reporter: Dan Smith
>            Assignee: Dan Smith
>            Priority: Major
>             Fix For: 1.11.0
>
>          Time Spent: 3h 10m
>  Remaining Estimate: 0h
>
> We hit an issue where a member failed to recover due to a 
> IndexOutOfBoundsException while recording a version during recovery.
> Looking closer, it looks like the issue is due to the fact that a 
> RegionVersionHolder cannot record a version greater than Integer.MAX_VALUE if 
> it just just constructed.
> When we are recovering from disk, the first thing we read from is the .drf 
> files. The first thing in those drf files is RVV information. We read the RVV 
> records and call recordRecoveredGCVersion.
> When that call gets down inside RegionVersionHolder.recordVersion, there is 
> some logic that is supposed to flush out the bitSet and advance the 
> bitSetVersion. Unfortunately it looks like flushBitSetDuringRecording is not 
> actually doing that. So if version we read from disk is greater than 
> Integer.MAX_VALUE, we wrap around and try to set a negative index in the 
> bitset.
> I can reproduce this with a unit test of RegionVersionVector that records a 
> version greater than Integer.MAX_VALUE. I’m looking into how to fix the 
> flushBitSetDuringRecording method.



--
This message was sent by Atlassian JIRA
(v7.6.14#76016)

Reply via email to