Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

8261455: Automatically generate the CDS archive if necessary #6920

Closed
wants to merge 11 commits into from

Conversation

yminqi
Copy link
Contributor

@yminqi yminqi commented Dec 23, 2021

This patch is re-coded after serial fixes related: 8275846, 8276787, 8279018 etc.
original description(PR 5997):
----------------------------------------------------------------------------------
When shared archive (dynamic archive) failed to map due to damage of the archive file, dump/run jdk version mismatch or non-existence file etc, the new patch will automatically create a new shared archive if -XX:+AutoCreateSharedArchive specified with the name based on SharedArchiveFile.
This is a revised patch based on the old PR: 5077 and after bug 8273152 integrated.
-----------------------------------------------------------------------------------

Tests: tier1,tier2,tier3,tier4

Thanks
Yumin


Progress

  • Change must not contain extraneous whitespace
  • Commit message must refer to an issue
  • Change must be properly reviewed
  • Change requires a CSR request to be approved

Issues

  • JDK-8261455: Automatically generate the CDS archive if necessary
  • JDK-8272331: Automatically generate the CDS archive if necessary (CSR)

Reviewers

Reviewing

Using git

Checkout this PR locally:
$ git fetch https://git.openjdk.java.net/jdk pull/6920/head:pull/6920
$ git checkout pull/6920

Update a local copy of the PR:
$ git checkout pull/6920
$ git pull https://git.openjdk.java.net/jdk pull/6920/head

Using Skara CLI tools

Checkout this PR locally:
$ git pr checkout 6920

View PR using the GUI difftool:
$ git pr show -t 6920

Using diff file

Download this PR as a diff file:
https://git.openjdk.java.net/jdk/pull/6920.diff

@bridgekeeper
Copy link

bridgekeeper bot commented Dec 23, 2021

👋 Welcome back minqi! A progress list of the required criteria for merging this PR into master will be added to the body of your pull request. There are additional pull request commands available for use with this pull request.

@openjdk
Copy link

openjdk bot commented Dec 23, 2021

@yminqi The following label will be automatically applied to this pull request:

  • hotspot-runtime

When this pull request is ready to be reviewed, an "RFR" email will be sent to the corresponding mailing list. If you would like to change these labels, use the /label pull request command.

@openjdk openjdk bot added the hotspot-runtime hotspot-runtime-dev@openjdk.org label Dec 23, 2021
@yminqi yminqi marked this pull request as ready for review December 23, 2021 00:30
@openjdk openjdk bot added the rfr Pull request is ready for review label Dec 23, 2021
@mlbridge
Copy link

mlbridge bot commented Dec 23, 2021

Copy link
Member

@iklam iklam left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi Yumin, looks good. I have some preliminary comments.

bool FileMapInfo::validate_archive() const {
if (!os::file_exists(_full_path)) {
return false;
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is the above check necessary? If the file doesn't exist, will check_archive() below return false?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It is needed here --- when open a file of name is NULL, os::open first does is checking:
if (strlen(path) > MAX_PATH - 1) {
errno = ENAMETOOLONG;
return -1;
}
It will crash on NULL. Removing it will cause many tests fail. os:file_exists will first check if it is NULL.
I will add comment for it.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we shouldn't be checking a FileMapInfo when its _file_path is NULL. I added the following assert:

bool FileMapInfo::validate_archive() const {
+ assert(_full_path != NULL, "huh");
  if (!os::file_exists(_full_path)) {
    return false;
  }

and it crashes here (with dynamicArchive/HelloDynamic.java):

 9 FileMapInfo::validate_archive 
10 FileMapInfo::FileMapInfo 
11 DynamicArchiveBuilder::init_header 
12 DynamicArchiveBuilder::doit 
13 VM_PopulateDynamicDumpSharedSpace::doit 
14 VM_Operation::evaluate 
15 VMThread::evaluate_operation 
16 VMThread::inner_execute 
17 VMThread::loop 
...

At this point, we are writing the archive, so we shouldn't check the validity of the (output) archive, because we are going to overwrite it. And why is it NULL?

By the way, you added FileMapInfo::validate_archive() for doing this inside FileMapInfo::FileMapInfo():

  bool valid = validate_archive();
  if (!valid && !_is_static && AutoCreateSharedArchive) {
    // regenerate shared archive at exit
    DynamicDumpSharedSpaces = true;
    ArchiveClassesAtExit = _full_path;
  }

But the above block of code doesn't seem necessary, as it's already checked here inside FileMapInfo::initialize():

      FileMapInfo::fail_continue("Initialize dynamic archive failed.");
      if (AutoCreateSharedArchive) {
        DynamicDumpSharedSpaces = true;
        ArchiveClassesAtExit = Arguments::GetSharedDynamicArchivePath();
      }
      return false;

src/hotspot/share/cds/dynamicArchive.cpp Outdated Show resolved Hide resolved
@@ -3140,6 +3140,17 @@ jint Arguments::finalize_vm_init_args(bool patch_mod_javabase) {
DynamicDumpSharedSpaces = true;
}

if (AutoCreateSharedArchive) {
if (SharedArchiveFile == NULL) {
log_info(cds)("-XX:+AutoCreateSharedArchive must work with a valid SharedArchiveFile");
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The log message should be consistent with other existing messages. E.g.,

 fatal("-XX:+VerifyHeavyMonitors requires -XX:+UseHeavyMonitors");

So we should have:

 -XX:+AutoCreateSharedArchive requires -XX:SharedArchiveFile

return JNI_ERR;
}
if (ArchiveClassesAtExit != NULL) {
log_info(cds)("-XX:+AutoCreateSharedArchive does not work with ArchiveClassesAtExit");
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These should be log_warning(). Otherwise the VM will exit without no apparent reason:

$ java -XX:+AutoCreateSharedArchive -version
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.

bool FileMapInfo::validate_archive() const {
if (!os::file_exists(_full_path)) {
return false;
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we shouldn't be checking a FileMapInfo when its _file_path is NULL. I added the following assert:

bool FileMapInfo::validate_archive() const {
+ assert(_full_path != NULL, "huh");
  if (!os::file_exists(_full_path)) {
    return false;
  }

and it crashes here (with dynamicArchive/HelloDynamic.java):

 9 FileMapInfo::validate_archive 
10 FileMapInfo::FileMapInfo 
11 DynamicArchiveBuilder::init_header 
12 DynamicArchiveBuilder::doit 
13 VM_PopulateDynamicDumpSharedSpace::doit 
14 VM_Operation::evaluate 
15 VMThread::evaluate_operation 
16 VMThread::inner_execute 
17 VMThread::loop 
...

At this point, we are writing the archive, so we shouldn't check the validity of the (output) archive, because we are going to overwrite it. And why is it NULL?

By the way, you added FileMapInfo::validate_archive() for doing this inside FileMapInfo::FileMapInfo():

  bool valid = validate_archive();
  if (!valid && !_is_static && AutoCreateSharedArchive) {
    // regenerate shared archive at exit
    DynamicDumpSharedSpaces = true;
    ArchiveClassesAtExit = _full_path;
  }

But the above block of code doesn't seem necessary, as it's already checked here inside FileMapInfo::initialize():

      FileMapInfo::fail_continue("Initialize dynamic archive failed.");
      if (AutoCreateSharedArchive) {
        DynamicDumpSharedSpaces = true;
        ArchiveClassesAtExit = Arguments::GetSharedDynamicArchivePath();
      }
      return false;

auto warning_continue = FileMapInfo::fail_continue;
warning_continue("The shared archive file version %d which is not current version %d",
gen_header._version, CURRENT_CDS_ARCHIVE_VERSION);
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There's no need to add warning_continue. FileMapInfo::fail_continue means:

  • when running with -Xshare:auto, print a warning and continue
  • when running with -Xshare:on, print an error and exit

All other calls of FileMapInfo::fail_continue expects this behavior.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Grammar: should be

The shared archive file version %d does not match the required version %d

@@ -1020,6 +1024,10 @@ MapArchiveResult MetaspaceShared::map_archives(FileMapInfo* static_mapinfo, File
assert(static_mapinfo->mapping_end_offset() == dynamic_mapinfo->mapping_base_offset(), "no gap");
}

if (AutoCreateSharedArchive && static_mapinfo != NULL && dynamic_mapinfo == NULL) {
warning("AutoCreateSharedArchive will be ignored for static archive");
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

To be consistent, we should use log_warning(cds). Also, the message is unclear. Here, foo.jsa is a static archive:

$ java -XX:+AutoCreateSharedArchive -XX:SharedArchiveFile=foo.jsa -cp HelloWorld.jar HelloWorld
Java HotSpot(TM) 64-Bit Server VM warning: AutoCreateSharedArchive will be ignored for static archive
Hello World

I think it's better to print out:

AutoCreateSharedArchive is ignored because foo.jsa is a static archive

@iklam
Copy link
Member

iklam commented Jan 3, 2022

I tried switching between two builds and the VM crashes:

$ rm bar.jsa
$ /bld/fastdebug/images/jdk/bin/java -XX:+AutoCreateSharedArchive \
   -XX:SharedArchiveFile=bar.jsa -cp HelloWorld.jar HelloWorld
Java HotSpot(TM) 64-Bit Server VM warning: AutoCreateSharedArchive will be ignored for static archive
Hello World

NOTE: the warning is incorrectly printed.

$ /bld/slowdebug/images/jdk/bin/java -XX:+AutoCreateSharedArchive \
   -XX:SharedArchiveFile=bar.jsa -cp HelloWorld.jar HelloWorld
Hello World

[0.002s][info][cds] Opening shared archive: bar.jsa
[0.069s][info][cds] Opening shared archive: /bld/fastdebug/images/jdk/lib/server/classes.jsa
[0.069s][info][cds] trying to map /bld/fastdebug/images/jdk/lib/server/classes.jsa
[0.069s][info][cds] Opened archive /bld/fastdebug/images/jdk/lib/server/classes.jsa.
[0.069s][info][cds] _jvm_ident expected: Java HotSpot(TM) 64-Bit Server VM (slowdebug ....
[0.069s][info][cds]              actual: Java HotSpot(TM) 64-Bit Server VM (fastdebug ....
[0.069s][info][cds] UseSharedSpaces: The shared archive file was created by a different version or build of HotSpot
[0.069s][info][cds] UseSharedSpaces: Initialize static archive failed.
[0.069s][info][cds] UseSharedSpaces: Unable to map shared spaces
Hello World
[1.048s][info][cds] Regenerate MethodHandle Holder classes...
[1.048s][info][cds] Nothing to regenerate for holder classes
[1.048s][info][cds] Regenerate MethodHandle Holder classes...done
# To suppress the following error report, specify this argument
# after -XX: or in .hotspotrc:  SuppressErrorAt=/arguments.hpp:647
#
# A fatal error has been detected by the Java Runtime Environment:
#
#  Internal Error (/jdk2/sek/open/src/hotspot/share/runtime/arguments.hpp:647), pid=2165765, tid=2165766
#  assert(Arguments::is_dumping_archive()) failed: dump time only

I think you can test this by:

  • create a static archive s.jsa
  • create a dynamic archive d.jsa base on s.jsa
  • corrupt the _jvm_ident of s.jsa
  • run with -XX:+AutoCreateSharedArchive -XX:SharedArchiveFile=s.jsa:d.jsa ...

@iklam
Copy link
Member

iklam commented Jan 3, 2022

Another problem: VM crashes when the default base archive cannot be mapped:

$ ls -l /bld/fastdebug/images/jdk/lib/server/classes.jsa
-r--r--r-- 1 iklam dba 13815808 Jan  2 23:22 /bld/fastdebug/images/jdk/lib/server/classes.jsa
$ rm -f /bld/fastdebug/images/jdk/lib/server/classes.jsa
$ touch /bld/fastdebug/images/jdk/lib/server/classes.jsa
$ ls -l /bld/fastdebug/images/jdk/lib/server/classes.jsa
-rw-r--r-- 1 iklam dba 0 Jan  2 23:51 /bld/fastdebug/images/jdk/lib/server/classes.jsa
$ rm -f bar.jsa

$ /bld/fastdebug/images/jdk/bin/java -XX:+AutoCreateSharedArchive \
   -XX:SharedArchiveFile=bar.jsa -cp HelloWorld.jar HelloWorld
#  ...
#  assert(ArchiveClassesAtExit != nullptr) failed: sanity
#

I am not sure if there's a good way of testing this inside jtreg. Maybe we can follow open/test/hotspot/jtreg/runtime/cds/appcds/MoveJDKTest.java and make a copy of the JDK and then corrupt its default base archive.

@openjdk openjdk bot removed the rfr Pull request is ready for review label Jan 7, 2022
DynamicDumpSharedSpaces = true;
ArchiveClassesAtExit = const_cast<char *>(SharedArchiveFile);
SharedArchivePath = get_default_shared_archive_path();
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we should set SharedArchiveFile=NULL here. That way, when foo.jsa doesn't exist, the two command lines are equivalent:

  • java -XX:ArchiveClassesAtExit=foo.jsa ...
  • java -XX:SharedArchiveFile=foo.jsa -XX:+AutoCreateSharedArchive ...

and we can revert the changes on line 3602, to make the code easier to understand.

@openjdk openjdk bot added the rfr Pull request is ready for review label Jan 10, 2022
Copy link
Member

@iklam iklam left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Some test comments

auto warning_continue = FileMapInfo::fail_continue;
warning_continue("The shared archive file version %d which is not current version %d",
gen_header._version, CURRENT_CDS_ARCHIVE_VERSION);
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Grammar: should be

The shared archive file version %d does not match the required version %d


// Now rename classes.jsa to old-classes.jsa
String dstDir = java_home_dst + File.separator + "lib" + File.separator + "server";
CDSTestUtils.renameModulesFile(dstDir, "classes.jsa", "old-classes.jsa");
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This API needs to be updated -- it doesn't rename the modules file. How about:

CDSTestUtils.rename(File fromFile, File toFile)

* 10 Case (A)
*
* 10.01 run with non-existing archive should automatically create dynamic archive.
* If the JDK's default CDS archive cannot be loaded, print out warning, run continue without shared archive and no shared archive created at exit.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The test cases are called "10.01" here but "10.1" before. This makes it hard to do a text search. Could you make the numbering consistent?

Copy link
Member

@iklam iklam left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have reviewed all the files. The changes look good overall. Just a few small nits.

assert(ArchiveClassesAtExit != NULL, "Must be already set");
const char* archive_name =
(ArchiveClassesAtExit != nullptr) ? ArchiveClassesAtExit : Arguments::GetSharedDynamicArchivePath();
assert(archive_name != NULL, "Must be already set");
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The above change doesn't seem necessary. ArchiveClassesAtExit should be already set to non-null if AutoCreateArchive was set but the dynamic archive cannot be mapped.

}
if (DynamicDumpSharedSpaces) {
DynamicDumpSharedSpaces = false;
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think there's no need to put the above checks in 'if' blocks. I would suggest replacing the above six lines with:

// The base archive cannot be mapped. We cannot dump the dynamic shared archive.
AutoCreateSharedArchive = false;
DynamicDumpSharedSpaces = false;

// turn AutoCreateSharedArchive off if successfully mapped
if (AutoCreateSharedArchive) {
AutoCreateSharedArchive = false;
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No need for the 'if' check.

return false;
}
GenericCDSFileMapHeader* header = file_helper.get_generic_file_header();
if (header->_magic != CDS_DYNAMIC_ARCHIVE_MAGIC) {
assert(header->_magic == CDS_ARCHIVE_MAGIC, "must be");
if (AutoCreateSharedArchive) {
warning("AutoCreateSharedArchive is ignored because %s is a static archive", archive_name);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should use log_warning(cds) for all new warning messages.

* Copyright (c) 1997, 2021, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1997, 2022, Oracle and/or its affiliates. All rights reserved.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You can revert the copyright header change since there's no other changes in this file.

if (jsaFile.exists()) {
jsaFile.delete();
}
System.out.println("======= run with no default shared archive should no create shared archive at exit");
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Typo: should no create -> should not create

* -XX:SharedArchiveFile can be specified in two styles:
*
* (A) Test with default base archive -XX:+SharedArchiveFile=<archive>
* (B) Test with the base archive is specified: -XX:SharedArchiveFile=<base>:<top>
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The "is" is extra.

* create dynamic archive at exit with -XX:-VerifySharedSpaces
* not create dynamic archive at exit with -XX:+VerifySharedSpaces
*
* 16 run with an archive of only containing magic in the file (size of 4 bytes)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please delete the "of" after "archive".

* 21 Mismatched versions
* 21.01 if version of top archive is higher than CDS_GENERIC_HEADER_SUPPORTED_MIN_VERSION, the archive cannot be shared and will be
* regenerated at exit.
* 21.02 if version of top archive is lower than CDS_GENERIC_HEADER_SUPPORTED_MIN_VERSION, the archive cannot be shared abd will be
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

s/abd/and

String appJar = ClassFileInstaller.getJarPath("hello.jar");
boolean fileModified = false;

String VerifySharedSpaces = verifyOn ? "-XX:+VerifySharedSpaces" : "-XX:-VerifySharedSpaces";
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A local variable name usually starts with lowercase.
Suggest changing VerifySharedSpaces to verifySharedSpaces.

ft2 = Files.getLastModifiedTime(Paths.get(modMagic));
fileModified = !ft1.equals(ft2);
if (fileModified) {
throw new RuntimeException("Shared archive " + modMagic + " should automatically be generated");
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should the message be: “… should not be automatically generated”?

ft2 = Files.getLastModifiedTime(Paths.get(magicOnly));
fileModified = !ft1.equals(ft2);
if (!fileModified) {
throw new RuntimeException("Shared archive " + magicOnly + " should not be created at exit");
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should the message be: “… should be created at exit”?

ft2 = Files.getLastModifiedTime(Paths.get(TOP_NAME));
fileModified = !ft1.equals(ft2);
if (fileModified) {
throw new RuntimeException("Shared archive " + TOP_NAME + " should be created at exit");
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should the message be: “…should not be created at exit”?

Copy link
Member

@calvinccheung calvinccheung left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good. Some minor nits.

Copy link
Member

@iklam iklam left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@openjdk
Copy link

openjdk bot commented Jan 12, 2022

@yminqi This change now passes all automated pre-integration checks.

ℹ️ This project also has non-automated pre-integration requirements. Please see the file CONTRIBUTING.md for details.

After integration, the commit message for the final commit will be:

8261455: Automatically generate the CDS archive if necessary

Reviewed-by: iklam, ccheung

You can use pull request commands such as /summary, /contributor and /issue to adjust it as needed.

At the time when this comment was updated there had been 45 new commits pushed to the master branch:

  • ddddec7: 8274243: Implement fast-path for ASCII-compatible CharsetEncoders on aarch64
  • 8fed8ab: 8278065: Refactor subclassAudits to use ClassValue
  • f54ce84: 8238161: use os::fopen in HS code where possible
  • ff0cb98: 8279536: jdk/nio/zipfs/ZipFSOutputStreamTest.java timed out
  • ece98d8: 8278461: Use Executable.getSharedParameterTypes() instead of Executable.getParameterTypes() in trusted code
  • 525b20f: 8279676: Dubious YMM register clearing in x86_64 arraycopy stubs
  • 4f0b650: 8278581: Improve reference processing statistics log output
  • bd339aa: 8277627: Fix copyright years in some jvmci files
  • 319d230: 8277463: JFileChooser with Metal L&F doesn't show non-canonical UNC path in - Look in
  • 13bfb49: 6496103: isFileHidingEnabled return false by default
  • ... and 35 more: https://git.openjdk.java.net/jdk/compare/dee447f8ae788c6c1f6cd1e1fcb93faceab37b6c...master

As there are no conflicts, your changes will automatically be rebased on top of these commits when integrating. If you prefer to avoid this automatic rebasing, please check the documentation for the /integrate command for further details.

➡️ To integrate this PR with the above commit message to the master branch, type /integrate in a new comment.

@openjdk openjdk bot added the ready Pull request is ready to be integrated label Jan 12, 2022
Copy link
Member

@calvinccheung calvinccheung left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@yminqi
Copy link
Contributor Author

yminqi commented Jan 13, 2022

@iklam @calvinccheung
Thanks for review!

@yminqi
Copy link
Contributor Author

yminqi commented Jan 13, 2022

/integrate

@openjdk
Copy link

openjdk bot commented Jan 13, 2022

Going to push as commit 1228b2f.
Since your change was applied there have been 47 commits pushed to the master branch:

  • d70545d: 8258603: c1 IR::verify is expensive
  • 0a094d7: 8268081: Upgrade Unicode Data Files to 14.0.0
  • ddddec7: 8274243: Implement fast-path for ASCII-compatible CharsetEncoders on aarch64
  • 8fed8ab: 8278065: Refactor subclassAudits to use ClassValue
  • f54ce84: 8238161: use os::fopen in HS code where possible
  • ff0cb98: 8279536: jdk/nio/zipfs/ZipFSOutputStreamTest.java timed out
  • ece98d8: 8278461: Use Executable.getSharedParameterTypes() instead of Executable.getParameterTypes() in trusted code
  • 525b20f: 8279676: Dubious YMM register clearing in x86_64 arraycopy stubs
  • 4f0b650: 8278581: Improve reference processing statistics log output
  • bd339aa: 8277627: Fix copyright years in some jvmci files
  • ... and 37 more: https://git.openjdk.java.net/jdk/compare/dee447f8ae788c6c1f6cd1e1fcb93faceab37b6c...master

Your commit was automatically rebased without conflicts.

@openjdk openjdk bot added the integrated Pull request has been integrated label Jan 13, 2022
@openjdk openjdk bot closed this Jan 13, 2022
@openjdk openjdk bot removed ready Pull request is ready to be integrated rfr Pull request is ready for review labels Jan 13, 2022
@openjdk
Copy link

openjdk bot commented Jan 13, 2022

@yminqi Pushed as commit 1228b2f.

💡 You may see a message that your pull request was closed with unmerged commits. This can be safely ignored.

@yminqi yminqi deleted the jdk-8261455 branch January 13, 2022 00:24
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
hotspot-runtime hotspot-runtime-dev@openjdk.org integrated Pull request has been integrated
3 participants