I agree, the test is a piece of art - nice example to start from for
future test development.
Ship it!
Thanks,
Serguei
On 2/6/13 12:08 PM, Daniel D. Daugherty wrote:
Greetings,
I've revised the tests based on Coleen's and Serguei's feedback
in Code Review Round 0.
Here is the URL for the webrev for Code Review Round 1:
http://cr.openjdk.java.net/~dcubed/8007420-webrev/1-jdk8-tl/
Summary of the changes:
- RedefineAbstractClass.sh - cleaned up the header comment
- RedefineAbstractClass.sh
- more clear description of what's being tested
- add comments describing what the guarantee failure looks like
- add checks for proper pre-RedefineClasses output
- add checks for proper post-RedefineClasses output
- RedefineSubclassWithTwoInterfacesApp.java
- RedefineSubclassWithTwoInterfacesRemote.java
- refactor the test app's echo() method call into echo1() and
echo2() so it is easier to check for the failure mode
- RedefineSubclassWithTwoInterfacesImpl.java
- RedefineSubclassWithTwoInterfacesImpl_1.java
- add comment to explain why these sources are identical
Diffs are below since the webrev above is relative to JDK8-T&L
and everything is "new".
Dan
Here are diffs (ignoring whitespace) to make it clear what has
changed between Code Review Round 0 and Code Review Round 1:
$ diff -w test/com/sun/jdi/RedefineAbstractClass.sh{.cr0,}
31a32
> # @author Daniel D. Daugherty
$ diff -w
test/java/lang/instrument/RedefineSubclassWithTwoInterfaces.sh{.cr0,}
26c26,27
< # @summary Redefining a subclass that implements two interfaces is
broken.
---
> # @summary Redefine a subclass that implements two interfaces and
> # verify that the right methods are called.
101a103,104
>
> echo "INFO: <begin output.log>"
102a106,107
> echo "INFO: <end output.log>"
>
108,112c113,127
< MESG="guarantee"
< grep "$MESG" output.log
< result=$?
< if [ "$result" = 0 ]; then
< echo "FAIL: found '$MESG' in the test output"
---
> # When this bug manifests, RedefineClasses() will fail to update
> # one of the itable entries to refer to the new method. The log
> # will include the following line when the bug occurs:
> #
> # guarantee(false) failed: OLD and/or OBSOLETE method(s) found
> #
> # If this guarantee happens, the test should fail in the status
> # check above, but just in case it doesn't, we check for "guarantee".
> #
>
> FAIL_MESG="guarantee"
> grep "$FAIL_MESG" output.log
> status=$?
> if [ "$status" = 0 ]; then
> echo "FAIL: found '$FAIL_MESG' in the test output."
115c130,131
< echo "PASS: did NOT find '$MESG' in the test output"
---
> echo "INFO: did NOT find '$FAIL_MESG' in the test output."
> # be optimistic here
118a135,164
> PASS1_MESG="before any redefines"
> cnt=`grep "$PASS1_MESG" output.log | grep 'version-0' | wc -l`
> case "$cnt" in
> 2)
> echo "INFO: found 2 version-0 '$PASS1_MESG' mesgs."
> ;;
> *)
> echo "FAIL: did NOT find 2 version-0 '$PASS1_MESG' mesgs."
> echo "INFO: grep '$PASS1_MESG' output:"
> grep "$PASS1_MESG" output.log
> result=1
> esac
>
> PASS2_MESG="after redefine"
> cnt=`grep "$PASS2_MESG" output.log | grep 'version-1' | wc -l`
> case "$cnt" in
> 2)
> echo "INFO: found 2 version-1 '$PASS2_MESG' mesgs."
> ;;
> *)
> echo "FAIL: did NOT find 2 version-1 '$PASS2_MESG' mesgs."
> echo "INFO: grep '$PASS2_MESG' output:"
> grep "$PASS2_MESG" output.log
> result=1
> esac
>
> if [ "$result" = 0 ]; then
> echo "PASS: test passed both positive and negative output checks."
> fi
>
$ diff
test/java/lang/instrument/RedefineSubclassWithTwoInterfacesApp.java{.cr0,}
43,45c43,45
< // make an echo() call before any redefinitions:
< mesg = remote.echo("test message #0");
< System.out.println("RedefineSubclassWithTwoInterfacesApp: mesg='"
---
> // make echo() calls before any redefinitions:
> mesg = remote.echo1("test message #1.1");
> System.out.println("RedefineSubclassWithTwoInterfacesApp: echo1 mesg='"
46a47,49
> mesg = remote.echo2("test message #2.1");
> System.out.println("RedefineSubclassWithTwoInterfacesApp: echo2 mesg='"
> + mesg + "' before any redefines");
54,56c57,62
< mesg = remote.echo("test message #1");
< System.out.println("RedefineSubclassWithTwoInterfacesApp: mesg='"
< + mesg + "' after redefine #1");
---
> mesg = remote.echo1("test message #1.2");
> System.out.println("RedefineSubclassWithTwoInterfacesApp: echo1 mesg='"
> + mesg + "' after redefine");
> mesg = remote.echo2("test message #2.2");
> System.out.println("RedefineSubclassWithTwoInterfacesApp: echo2 mesg='"
> + mesg + "' after redefine");
$ diff
test/java/lang/instrument/RedefineSubclassWithTwoInterfacesImpl.java{.cr0,}
23a24,27
> // Reproducing this bug only requires an EMCP version of the
> // RedefineSubclassWithTwoInterfacesImpl class so
> // RedefineSubclassWithTwoInterfacesImpl.java and
> // RedefineSubclassWithTwoInterfacesImpl_1.java are identical.
$ diff
test/java/lang/instrument/RedefineSubclassWithTwoInterfacesImpl_1.java{.cr0,}
23a24,27
> // Reproducing this bug only requires an EMCP version of the
> // RedefineSubclassWithTwoInterfacesImpl class so
> // RedefineSubclassWithTwoInterfacesImpl.java and
> // RedefineSubclassWithTwoInterfacesImpl_1.java are identical.
$ diff
test/java/lang/instrument/RedefineSubclassWithTwoInterfacesRemote.java{.cr0,}
40,41c40,41
< public String echo(String s) {
< return "intf1<" + intf1.echo(s) + "> intf2< " +
intf2.echo(s) + ">";
---
> public String echo1(String s) {
> return "intf1<" + intf1.echo(s) + ">";
42a43,46
>
> public String echo2(String s) {
> return "intf2<" + intf2.echo(s) + ">";
> }
On 2/1/13 4:55 PM, Daniel D. Daugherty wrote:
And here is the webrev for the new tests (relative to JDK8-T&L):
http://cr.openjdk.java.net/~dcubed/8007420-webrev/0-jdk8-tl/
As always, comments and suggestions are welcome.
Dan
On 2/1/13 4:39 PM, Daniel D. Daugherty wrote:
> There are two new tests that will be pushed to the JDK repos using
> a different bug ID (not yet filed):
New bug is now filed:
8007420 add test for 6805864 to com/sun/jdi, add test for 7182152
to java/lang/instrument
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=8007420
https://jbs.oracle.com/bugs/browse/JDK-8007420
Of course, the tests cannot be pushed until the HSX changes have made
it into a promoted build and thus available to JDK8-T&L.
Dan
On 2/1/13 12:55 PM, Daniel D. Daugherty wrote:
Greetings,
I have a fix for the following JVM/TI bug:
7182152 Instrumentation hot swap test incorrect monitor count
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7182152
https://jbs.oracle.com/bugs/browse/JDK-7182152
The fix for the bug in the product code is one line:
src/share/vm/oops/klassVtable.cpp:
@@ -992,18 +1020,50 @@
// RC_TRACE macro has an embedded ResourceMark
RC_TRACE(0x00200000, ("itable method update: %s(%s)",
new_method->name()->as_C_string(),
new_method->signature()->as_C_string()));
}
- break;
+ // cannot 'break' here; see for-loop comment above.
}
ime++;
}
}
}
and is applicable to JDK7u10/HSX-23.6 and JDK7u14/HSX-24. Coleen
already fixed the bug as part of the Perm Gen Removal (PGR) project
in HSX-25. Yes, we found a 1-line bug fix buried in the monster PGR
changeset. Many thanks to Coleen for her help in this bug hunt!
The rest of the code in the webrevs are:
- additional JVM/TI tracing code backported from Coleen's PGR
changeset
- additional JVM/TI tracing code added by me and forward ported to
HSX-25
- a new -XX:TraceRedefineClasses=16384 flag value for finding these
elusive old or obsolete methods
- exposure of some printing code to the PRODUCT build so that the new
tracing is available in a PRODUCT build
You might be wondering why the new tracing code is exposed in a
PRODUCT
build. Well, it appears that more and more PRODUCT bits deployments
are
using JVM/TI RedefineClasses() and/or RetransformClasses() at run-time
to instrument their systems. This bug (7182152) was only
intermittently
reproducible in the WLS environment in which it occurred so I made the
tracing available in a PRODUCT build to assist in the hunt.
Raj from the WLS team has also verified that the HSX-23.6 version of
fix resolves the issue in his environment. Thanks Raj!
Here are the URLs for the three webrevs:
http://cr.openjdk.java.net/~dcubed/7182152-webrev/0-hsx23.6/
http://cr.openjdk.java.net/~dcubed/7182152-webrev/0-hsx24/
http://cr.openjdk.java.net/~dcubed/7182152-webrev/0-hsx25/
I have run the following test suites from the JPDA stack on the
JDK7u10/HSX-23.6 version of the fix with
-XX:TraceRedefineClasses=16384
specified:
sdk-jdi
sdk-jdi_closed
sdk-jli
vm-heapdump
vm-hprof
vm-jdb
vm-jdi
vm-jdwp
vm-jvmti
vm-sajdi
The tested configs are:
{Solaris-X86, WinXP}
X {Client VM, Server VM}
X {-Xmixed, -Xcomp}
X {product, fastdebug}
With the 1-liner fix in place, the new tracing code does not find any
instances of this failure mode in any of the above test suites.
Without
the the 1-liner fix in place, the new tracing code finds one instance
of this failure mode in the above test suites:
test/java/lang/instrument/IsModifiableClassAgent.java
There are two new tests that will be pushed to the JDK repos using
a different bug ID (not yet filed):
test/com/sun/jdi/RedefineAbstractClass.sh
test/java/lang/instrument/RedefineSubclassWithTwoInterfaces.sh
There will be a separate review request for the new tests.
I'm currently running the JPDA stack of tests on the JDK7u14/HSX-24
and JDK8-B75/HSX-25 versions of the fix. That testing will likely
take all weekend to complete.
Thanks, in advance, for any comments and/or suggestions.
Dan