I made these modifications and the following compiles, runs, and fails on
geode.
I added the following to RegionVersionVectorJUnitTest:
@Test
public void testInitialized() {
RegionVersionHolder<String> vh1 = new RegionVersionHolder<>("vh1");
vh1.recordVersion(56);
vh1.recordVersion(57);
vh1.recordVersion(58);
vh1.recordVersion(59);
vh1.recordVersion(60);
assertTrue(vh1.contains(57));
vh1 = vh1.clone();
assertTrue(vh1.contains(57));
System.out.println("This node init, vh1="+vh1);
RegionVersionHolder<String> vh2 = new RegionVersionHolder<>("vh2");
for(int i=1;i<57;i++) {
vh2.recordVersion(i);
}
vh2 = vh2.clone();
System.out.println("GII node init, vh2="+vh2);
vh1.initializeFrom(vh2);
// assertTrue(vh1.contains(57)); // fails
vh1 = vh1.clone();
System.out.println("After initialize, vh1="+vh1);
vh1.recordVersion(58);
vh1.recordVersion(59);
vh1.recordVersion(60);
System.out.println("After initialize and record version, vh1="+vh1);
vh1 = vh1.clone();
vh1.recordVersion(57);
System.out.println("After initialize and record version after clone,
vh1="+vh1);
assertTrue(vh1.contains(57)); //FAILS
}
On Tue, May 23, 2017 at 9:37 AM, Kirk Lund <[email protected]> wrote:
> Are you sure you're using Geode? The signature of
> RegionVersionHolder#recordVersion
> in Geode is:
>
> RegionVersionHolder#recordVersion(long)
>
> I recommend checking out develop branch of Geode, write a test to confirm
> your bug and then submit that test with a Jira ticket.
>
> On Tue, May 23, 2017 at 7:10 AM, Suranjan Kumar <[email protected]>
> wrote:
>
> > Hi Bruce/Dan,
> >
> > #1. I see some issues due to introduction of special exceptions in the
> > RegionVersionHolder. In some cases, it is leading to RegionVersionHolder
> > data structure corruption causing wrong contains(version) results.
> >
> > This happens because we set the version to max of currentVersion or
> newly
> > recorded one. But do not try to fix the special exception present if any.
> >
> > It is easily reproducible even in junit tests.
> > The corruption of holder data stricture causes even future record
> operation
> > to fail.
> > For example the following test fails:
> >
> > public void testInitialized() {
> >
> > RegionVersionHolder vh1 = new RegionVersionHolder(member);
> > vh1.recordVersion(56, null);
> > vh1.recordVersion(57, null);
> > vh1.recordVersion(58, null);
> > vh1.recordVersion(59, null);
> > vh1.recordVersion(60, null);
> > vh1 = vh1.clone();
> > System.out.println("This node init, vh1="+vh1);
> >
> > RegionVersionHolder vh2 = new RegionVersionHolder(member);
> > for(int i=1;i<57;i++) {
> > vh2.recordVersion(i,null);
> > }
> > vh2 = vh2.clone();
> > System.out.println("GII node init, vh2="+vh2);
> >
> > vh1.initializeFrom(vh2);
> > vh1 = vh1.clone();
> > System.out.println("After initialize, vh1="+vh1);
> >
> >
> > vh1.recordVersion(58,null);
> > vh1.recordVersion(59,null);
> > vh1.recordVersion(60,null);
> >
> > System.out.println("After initialize and record version, vh1="+vh1);
> >
> > vh1 = vh1.clone();
> > vh1.recordVersion(57,null);
> > System.out.println("After initialize and record version after clone,
> > vh1="+vh1);
> >
> > assertTrue(vh1.contains(57)); //FAILS
> > }
> >
> >
> > #2. I have observed that
> > RegionVersionHolder#initializeFrom(RegionVersionHolder<T> source)
> > doesn't not record already recorded version in itself contrary to what
> > the comment above the method claims. In fact the junit tests also
> > verifies the same so I couldn't understand the rationale behind it. It
> > just adds an special exception if any higher version was already
> > recorded by self.
> > Shouldn't the resulting holder after initializing from a source
> > contain records for both the holders? If not then why do we even need
> > special exception.
> >
> > If possible could you please let me know your thoughts on this.
> >
> > Regards,
> > Suranjan Kumar
> >
>