Re: [7u-dev] Request for approval for JDK-7175464 - entrySetView field is never updated in NavigableSubMap

2013-02-10 Thread Peter Levart

Hi Martin,

It seems that adding a default method Comparator.reverseOrder() had an 
impact on the code in Collections.


In he following code in Collections:

private static class ReverseComparator
implements ComparatorComparableObject, Serializable {

private static final long serialVersionUID = 7207038068494060240L;

static final ReverseComparator REVERSE_ORDER
= new ReverseComparator();

public int compare(ComparableObject c1, ComparableObject c2) {
return c2.compareTo(c1);
}

private Object readResolve() { return reverseOrder(); }
}

...the method readResolve() now calls default Comparator.reverseOrder(), 
but previously it called the static Collections.reverseOrder()



Regards, Peter

On 02/10/2013 08:49 AM, Martin Buchholz wrote:

[adding lambda-dev]

Here's another refinement to the test case, which shows that a serial clone
of Collections.reverseOrder in lambda8 creates a new instance of a new
class with the opposite order (which I can't explain):

When run against latest lambda-b76, it gives this output:

x=java.util.Collections$ReverseComparator@3710b205
y=java.util.Collections$ReverseComparator2@e9b8b810
x: 1 -1
y: -1 1

import java.util.*;
import java.io.*;

public class ReverseOrder {
 public static void main(String[] args) throws Throwable {
 Comparator x = Collections.reverseOrder();
 Comparator y = serialClone(x);
 System.out.printf(x=%s%n, x);
 System.out.printf(y=%s%n, y);
 System.out.printf(x: %d %d%n, x.compare(0,1), x.compare(1,0));
 System.out.printf(y: %d %d%n, y.compare(0,1), y.compare(1,0));
 }

 static byte[] serialBytes(Object o) {
 try {
 ByteArrayOutputStream bos = new ByteArrayOutputStream();
 ObjectOutputStream oos = new ObjectOutputStream(bos);
 oos.writeObject(o);
 oos.flush();
 oos.close();
 return bos.toByteArray();
 } catch (Throwable t) {
 throw new Error(t);
 }
 }

 @SuppressWarnings(unchecked)
 static T T serialClone(T o) {
 try {
 ObjectInputStream ois = new ObjectInputStream
 (new ByteArrayInputStream(serialBytes(o)));
 T clone = (T) ois.readObject();
 return clone;
 } catch (Throwable t) {
 throw new Error(t);
 }
 }
}


On Sat, Feb 9, 2013 at 3:31 PM, Martin Buchholz marti...@google.com wrote:


On Sat, Feb 9, 2013 at 3:09 PM, Martin Buchholz marti...@google.comwrote:


It looks to me like Collections.reverseOrder no longer deserializes to
the same object.  It also looks like the definition for that in
Collections.java hasn't changed recently.  So I suspect that there has been
some serious incompatible change to deserialization itself.
(It's another matter whether that could break TreeSet).
(I have long lobbied for more cross-jdk testing focused on seriallization)

The program below demonstrates the different behavior between jdk7 and
jdk8:



Oops - correction - this is not a difference between jdk7 and jdk8, but
between jdk8 and lambda8, More specifically, lambda-8-b74 fails,
while jdk8-b74 succeeds.  Have lambdadukes messed with serialization?




import java.util.*;
import java.io.*;

public class ReverseOrder {
 public static void main(String[] args) throws Throwable {
 Comparator c = Collections.reverseOrder();
 if (c != serialClone(c))
 throw new Error(String.format(c=%s clone=%s,
   c, serialClone(c)));
 }

  static byte[] serialBytes(Object o) {
 try {
 ByteArrayOutputStream bos = new ByteArrayOutputStream();
 ObjectOutputStream oos = new ObjectOutputStream(bos);
 oos.writeObject(o);
 oos.flush();
 oos.close();
 return bos.toByteArray();
 } catch (Throwable t) {
 throw new Error(t);
 }
 }

 @SuppressWarnings(unchecked)
 static T T serialClone(T o) {
 try {
 ObjectInputStream ois = new ObjectInputStream
 (new ByteArrayInputStream(serialBytes(o)));
 T clone = (T) ois.readObject();
 return clone;
 } catch (Throwable t) {
 throw new Error(t);
  }
 }
}


On Fri, Feb 8, 2013 at 3:16 PM, Mike Duigou mike.dui...@oracle.comwrote:


Thank you for catching this Doug. I missed your original post on this
topic during my Christmas vacation. (
http://mail.openjdk.java.net/pipermail/core-libs-dev/2012-December/013127.htmlfor
 those following along at home)

I will definitely hold off and follow up on the potentially bad patch to
Java 8. I have created an issue to resolve the test breakage, JDK-8007889

Mike

On Feb 8 2013, at 11:43 , Doug Lea wrote:


On 02/08/13 14:33, Mike Duigou wrote:

Hello all;

I would like to backport this 

Re: [7u-dev] Request for approval for JDK-7175464 - entrySetView field is never updated in NavigableSubMap

2013-02-10 Thread Alan Bateman

On 09/02/2013 23:31, Martin Buchholz wrote:

On Sat, Feb 9, 2013 at 3:09 PM, Martin Buchholzmarti...@google.com  wrote:


It looks to me like Collections.reverseOrder no longer deserializes to the
same object.  It also looks like the definition for that in
Collections.java hasn't changed recently.  So I suspect that there has been
some serious incompatible change to deserialization itself.
(It's another matter whether that could break TreeSet).
(I have long lobbied for more cross-jdk testing focused on seriallization)

The program below demonstrates the different behavior between jdk7 and
jdk8:



Oops - correction - this is not a difference between jdk7 and jdk8, but
between jdk8 and lambda8, More specifically, lambda-8-b74 fails,
while jdk8-b74 succeeds.  Have lambdadukes messed with serialization?


Collections.ReverseComparator's readResolve is:

private Object readResolve() { return reverseOrder(); }

so I assume it's the new Comparator.reverseOrder() that is used now 
rather than Collections.reverseOrder() as before. Ha, this means it's 
returning a compator to reverse itself.


This one aside, this is another issue with serialization that has come 
about because of default methods and because declared methods are used 
in the computation of the default serial version UID. Mike and Stuart 
are looking into that one (I think it came up on the lambda-dev list 
recently).


-Alan





Re: [7u-dev] Request for approval for JDK-7175464 - entrySetView field is never updated in NavigableSubMap

2013-02-10 Thread Martin Buchholz
Alright, now that the problem (if not the solution) is well understood, I
leave it to you.

Martin

On Sun, Feb 10, 2013 at 2:54 AM, Alan Bateman alan.bate...@oracle.comwrote:

 On 09/02/2013 23:31, Martin Buchholz wrote:

 On Sat, Feb 9, 2013 at 3:09 PM, Martin Buchholzmarti...@google.com
  wrote:

  It looks to me like Collections.reverseOrder no longer deserializes to
 the
 same object.  It also looks like the definition for that in
 Collections.java hasn't changed recently.  So I suspect that there has
 been
 some serious incompatible change to deserialization itself.
 (It's another matter whether that could break TreeSet).
 (I have long lobbied for more cross-jdk testing focused on
 seriallization)

 The program below demonstrates the different behavior between jdk7 and
 jdk8:


  Oops - correction - this is not a difference between jdk7 and jdk8, but
 between jdk8 and lambda8, More specifically, lambda-8-b74 fails,
 while jdk8-b74 succeeds.  Have lambdadukes messed with serialization?

  Collections.ReverseComparator'**s readResolve is:


 private Object readResolve() { return reverseOrder(); }

 so I assume it's the new Comparator.reverseOrder() that is used now rather
 than Collections.reverseOrder() as before. Ha, this means it's returning a
 compator to reverse itself.

 This one aside, this is another issue with serialization that has come
 about because of default methods and because declared methods are used in
 the computation of the default serial version UID. Mike and Stuart are
 looking into that one (I think it came up on the lambda-dev list recently).

 -Alan






Re: [7u-dev] Request for approval for JDK-7175464 - entrySetView field is never updated in NavigableSubMap

2013-02-10 Thread Mike Duigou
Thank you Doug, Martin, Peter and Alan for efforts your in tracking this down. 
Even though it's not implicated, I am going to hold off on the OpenJDK7u-dev 
push of 7175464 for a few days to allow for some additional testing.

Mike

On Feb 10 2013, at 19:52 , Martin Buchholz wrote:

 Alright, now that the problem (if not the solution) is well understood, I 
 leave it to you.
 
 Martin
 
 On Sun, Feb 10, 2013 at 2:54 AM, Alan Bateman alan.bate...@oracle.com wrote:
 On 09/02/2013 23:31, Martin Buchholz wrote:
 On Sat, Feb 9, 2013 at 3:09 PM, Martin Buchholzmarti...@google.com  wrote:
 
 It looks to me like Collections.reverseOrder no longer deserializes to the
 same object.  It also looks like the definition for that in
 Collections.java hasn't changed recently.  So I suspect that there has been
 some serious incompatible change to deserialization itself.
 (It's another matter whether that could break TreeSet).
 (I have long lobbied for more cross-jdk testing focused on seriallization)
 
 The program below demonstrates the different behavior between jdk7 and
 jdk8:
 
 
 Oops - correction - this is not a difference between jdk7 and jdk8, but
 between jdk8 and lambda8, More specifically, lambda-8-b74 fails,
 while jdk8-b74 succeeds.  Have lambdadukes messed with serialization?
 
 Collections.ReverseComparator's readResolve is:
 
 
 private Object readResolve() { return reverseOrder(); }
 
 so I assume it's the new Comparator.reverseOrder() that is used now rather 
 than Collections.reverseOrder() as before. Ha, this means it's returning a 
 compator to reverse itself.
 
 This one aside, this is another issue with serialization that has come about 
 because of default methods and because declared methods are used in the 
 computation of the default serial version UID. Mike and Stuart are looking 
 into that one (I think it came up on the lambda-dev list recently).
 
 -Alan
 
 
 
 



Re: [7u-dev] Request for approval for JDK-7175464 - entrySetView field is never updated in NavigableSubMap

2013-02-09 Thread Martin Buchholz
It looks to me like Collections.reverseOrder no longer deserializes to the
same object.  It also looks like the definition for that in
Collections.java hasn't changed recently.  So I suspect that there has been
some serious incompatible change to deserialization itself.
(It's another matter whether that could break TreeSet).
(I have long lobbied for more cross-jdk testing focused on seriallization)

The program below demonstrates the different behavior between jdk7 and jdk8:

import java.util.*;
import java.io.*;

public class ReverseOrder {
public static void main(String[] args) throws Throwable {
Comparator c = Collections.reverseOrder();
if (c != serialClone(c))
throw new Error(String.format(c=%s clone=%s,
  c, serialClone(c)));
}

static byte[] serialBytes(Object o) {
try {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(o);
oos.flush();
oos.close();
return bos.toByteArray();
} catch (Throwable t) {
throw new Error(t);
}
}

@SuppressWarnings(unchecked)
static T T serialClone(T o) {
try {
ObjectInputStream ois = new ObjectInputStream
(new ByteArrayInputStream(serialBytes(o)));
T clone = (T) ois.readObject();
return clone;
} catch (Throwable t) {
throw new Error(t);
}
}
}


On Fri, Feb 8, 2013 at 3:16 PM, Mike Duigou mike.dui...@oracle.com wrote:

 Thank you for catching this Doug. I missed your original post on this
 topic during my Christmas vacation. (
 http://mail.openjdk.java.net/pipermail/core-libs-dev/2012-December/013127.htmlfor
  those following along at home)

 I will definitely hold off and follow up on the potentially bad patch to
 Java 8. I have created an issue to resolve the test breakage, JDK-8007889

 Mike

 On Feb 8 2013, at 11:43 , Doug Lea wrote:

  On 02/08/13 14:33, Mike Duigou wrote:
  Hello all;
 
  I would like to backport this change from Java 8. It has been baking in
 JDK8 for about two months with no problems.
 
 
  I think it may have problems.
  As I mentioned in a post a few months ago, it seems
  to be responsible for breakage in a TCK/JCK test;
  One derived from a jsr166 tck test at
 
 http://gee.cs.oswego.edu/cgi-bin/viewcvs.cgi/jsr166/src/test/tck/TreeSubSetTest.java?view=log
 
  You need the file for context, but it looks like:
 
 public void testDescendingSerialization() throws Exception {
 NavigableSet x = dset5();
 NavigableSet y = serialClone(x);
 
 assertTrue(x != y);
 assertEquals(x.size(), y.size());
 assertEquals(x.toString(), y.toString());
 assertEquals(x, y);
 assertEquals(y, x);
 while (!x.isEmpty()) {
 assertFalse(y.isEmpty());
 assertEquals(x.pollFirst(), y.pollFirst());
 }
 assertTrue(y.isEmpty());
 }
 
 
  http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7175464
 
  http://hg.openjdk.java.net/jdk8/jdk8/jdk/rev/bf6ceb6b8f80
 
  The change was previously reviewed by Alan Bateman, Paul Sandoz and
 David Holmes before going in to Java 8.
 
  Mike
 
 




Re: [7u-dev] Request for approval for JDK-7175464 - entrySetView field is never updated in NavigableSubMap

2013-02-09 Thread Martin Buchholz
On Sat, Feb 9, 2013 at 3:09 PM, Martin Buchholz marti...@google.com wrote:

 It looks to me like Collections.reverseOrder no longer deserializes to the
 same object.  It also looks like the definition for that in
 Collections.java hasn't changed recently.  So I suspect that there has been
 some serious incompatible change to deserialization itself.
 (It's another matter whether that could break TreeSet).
 (I have long lobbied for more cross-jdk testing focused on seriallization)

 The program below demonstrates the different behavior between jdk7 and
 jdk8:


Oops - correction - this is not a difference between jdk7 and jdk8, but
between jdk8 and lambda8, More specifically, lambda-8-b74 fails,
while jdk8-b74 succeeds.  Have lambdadukes messed with serialization?



 import java.util.*;
 import java.io.*;

 public class ReverseOrder {
 public static void main(String[] args) throws Throwable {
 Comparator c = Collections.reverseOrder();
 if (c != serialClone(c))
 throw new Error(String.format(c=%s clone=%s,
   c, serialClone(c)));
 }

 static byte[] serialBytes(Object o) {
 try {
 ByteArrayOutputStream bos = new ByteArrayOutputStream();
 ObjectOutputStream oos = new ObjectOutputStream(bos);
 oos.writeObject(o);
 oos.flush();
 oos.close();
 return bos.toByteArray();
 } catch (Throwable t) {
 throw new Error(t);
 }
 }

 @SuppressWarnings(unchecked)
 static T T serialClone(T o) {
 try {
 ObjectInputStream ois = new ObjectInputStream
 (new ByteArrayInputStream(serialBytes(o)));
 T clone = (T) ois.readObject();
 return clone;
 } catch (Throwable t) {
 throw new Error(t);
 }
 }
 }


 On Fri, Feb 8, 2013 at 3:16 PM, Mike Duigou mike.dui...@oracle.comwrote:

 Thank you for catching this Doug. I missed your original post on this
 topic during my Christmas vacation. (
 http://mail.openjdk.java.net/pipermail/core-libs-dev/2012-December/013127.htmlfor
  those following along at home)

 I will definitely hold off and follow up on the potentially bad patch to
 Java 8. I have created an issue to resolve the test breakage, JDK-8007889

 Mike

 On Feb 8 2013, at 11:43 , Doug Lea wrote:

  On 02/08/13 14:33, Mike Duigou wrote:
  Hello all;
 
  I would like to backport this change from Java 8. It has been baking
 in JDK8 for about two months with no problems.
 
 
  I think it may have problems.
  As I mentioned in a post a few months ago, it seems
  to be responsible for breakage in a TCK/JCK test;
  One derived from a jsr166 tck test at
 
 http://gee.cs.oswego.edu/cgi-bin/viewcvs.cgi/jsr166/src/test/tck/TreeSubSetTest.java?view=log
 
  You need the file for context, but it looks like:
 
 public void testDescendingSerialization() throws Exception {
 NavigableSet x = dset5();
 NavigableSet y = serialClone(x);
 
 assertTrue(x != y);
 assertEquals(x.size(), y.size());
 assertEquals(x.toString(), y.toString());
 assertEquals(x, y);
 assertEquals(y, x);
 while (!x.isEmpty()) {
 assertFalse(y.isEmpty());
 assertEquals(x.pollFirst(), y.pollFirst());
 }
 assertTrue(y.isEmpty());
 }
 
 
  http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7175464
 
  http://hg.openjdk.java.net/jdk8/jdk8/jdk/rev/bf6ceb6b8f80
 
  The change was previously reviewed by Alan Bateman, Paul Sandoz and
 David Holmes before going in to Java 8.
 
  Mike
 
 





Re: [7u-dev] Request for approval for JDK-7175464 - entrySetView field is never updated in NavigableSubMap

2013-02-09 Thread Martin Buchholz
[adding lambda-dev]

Here's another refinement to the test case, which shows that a serial clone
of Collections.reverseOrder in lambda8 creates a new instance of a new
class with the opposite order (which I can't explain):

When run against latest lambda-b76, it gives this output:

x=java.util.Collections$ReverseComparator@3710b205
y=java.util.Collections$ReverseComparator2@e9b8b810
x: 1 -1
y: -1 1

import java.util.*;
import java.io.*;

public class ReverseOrder {
public static void main(String[] args) throws Throwable {
Comparator x = Collections.reverseOrder();
Comparator y = serialClone(x);
System.out.printf(x=%s%n, x);
System.out.printf(y=%s%n, y);
System.out.printf(x: %d %d%n, x.compare(0,1), x.compare(1,0));
System.out.printf(y: %d %d%n, y.compare(0,1), y.compare(1,0));
}

static byte[] serialBytes(Object o) {
try {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(o);
oos.flush();
oos.close();
return bos.toByteArray();
} catch (Throwable t) {
throw new Error(t);
}
}

@SuppressWarnings(unchecked)
static T T serialClone(T o) {
try {
ObjectInputStream ois = new ObjectInputStream
(new ByteArrayInputStream(serialBytes(o)));
T clone = (T) ois.readObject();
return clone;
} catch (Throwable t) {
throw new Error(t);
}
}
}


On Sat, Feb 9, 2013 at 3:31 PM, Martin Buchholz marti...@google.com wrote:



 On Sat, Feb 9, 2013 at 3:09 PM, Martin Buchholz marti...@google.comwrote:

 It looks to me like Collections.reverseOrder no longer deserializes to
 the same object.  It also looks like the definition for that in
 Collections.java hasn't changed recently.  So I suspect that there has been
 some serious incompatible change to deserialization itself.
 (It's another matter whether that could break TreeSet).
 (I have long lobbied for more cross-jdk testing focused on seriallization)

 The program below demonstrates the different behavior between jdk7 and
 jdk8:


 Oops - correction - this is not a difference between jdk7 and jdk8, but
 between jdk8 and lambda8, More specifically, lambda-8-b74 fails,
 while jdk8-b74 succeeds.  Have lambdadukes messed with serialization?



 import java.util.*;
 import java.io.*;

 public class ReverseOrder {
 public static void main(String[] args) throws Throwable {
 Comparator c = Collections.reverseOrder();
 if (c != serialClone(c))
 throw new Error(String.format(c=%s clone=%s,
   c, serialClone(c)));
 }

  static byte[] serialBytes(Object o) {
 try {
 ByteArrayOutputStream bos = new ByteArrayOutputStream();
 ObjectOutputStream oos = new ObjectOutputStream(bos);
 oos.writeObject(o);
 oos.flush();
 oos.close();
 return bos.toByteArray();
 } catch (Throwable t) {
 throw new Error(t);
 }
 }

 @SuppressWarnings(unchecked)
 static T T serialClone(T o) {
 try {
 ObjectInputStream ois = new ObjectInputStream
 (new ByteArrayInputStream(serialBytes(o)));
 T clone = (T) ois.readObject();
 return clone;
 } catch (Throwable t) {
 throw new Error(t);
  }
 }
 }


 On Fri, Feb 8, 2013 at 3:16 PM, Mike Duigou mike.dui...@oracle.comwrote:

 Thank you for catching this Doug. I missed your original post on this
 topic during my Christmas vacation. (
 http://mail.openjdk.java.net/pipermail/core-libs-dev/2012-December/013127.htmlfor
  those following along at home)

 I will definitely hold off and follow up on the potentially bad patch to
 Java 8. I have created an issue to resolve the test breakage, JDK-8007889

 Mike

 On Feb 8 2013, at 11:43 , Doug Lea wrote:

  On 02/08/13 14:33, Mike Duigou wrote:
  Hello all;
 
  I would like to backport this change from Java 8. It has been baking
 in JDK8 for about two months with no problems.
 
 
  I think it may have problems.
  As I mentioned in a post a few months ago, it seems
  to be responsible for breakage in a TCK/JCK test;
  One derived from a jsr166 tck test at
 
 http://gee.cs.oswego.edu/cgi-bin/viewcvs.cgi/jsr166/src/test/tck/TreeSubSetTest.java?view=log
 
  You need the file for context, but it looks like:
 
 public void testDescendingSerialization() throws Exception {
 NavigableSet x = dset5();
 NavigableSet y = serialClone(x);
 
 assertTrue(x != y);
 assertEquals(x.size(), y.size());
 assertEquals(x.toString(), y.toString());
 assertEquals(x, y);
 assertEquals(y, x);
 while (!x.isEmpty()) {
 assertFalse(y.isEmpty());