[14] RFR(M): 8211723: AppCDS: referring to a jar file in any way other than exactly how it was done during dumping doesn't work

Calvin Cheung calvin.cheung at oracle.com
Wed Jun 26 22:47:52 UTC 2019


Hi Jiangli,

Thanks for your review!

On 6/26/19, 11:14 AM, Jiangli Zhou wrote:
> Hi Calvin,
>
> Thank you for working on this. Really glad to see this finally being
> done! I meant to review this earlier, but was delayed. Thank you for
> being patient.
>
> - src/hotspot/share/classfile/classLoader.hpp
>
> 960 bool ClassLoader::update_class_path_entry_list(const char *path,
>   961                                                bool check_for_duplicates,
>   962                                                bool is_boot_append,
>   963                                                bool from_class_path_attr,
>   964                                                bool throw_exception) {
> ...
>
>   984 #if INCLUDE_CDS
>   985     if (DumpSharedSpaces || DynamicDumpSharedSpaces) {
>   986       _shared_paths_misc_info->add_nonexist_path(path);
>   987     }
>   988 #endif
>
> The above code for _shared_paths_misc_info can be eliminated now. If a
> path does not exist at dump time but exists at runtime, it should be
> caught by the runtime shared path table check. I think the new check
> you added for the shared path table does cover that case. We should
> make sure we have sufficient test cases for that. It's good to also
> add comments to the shared path table check to describe all cases.
I don't think we can remove the above code because it will also update 
the class path entry list for the jar files which are found from the 
"Class-Path" attribute of a jar manifest.

Below is the various call paths to the function (note the call from 
process_jar_manifest):

ClassLoader::update_class_path_entry_list(const char *, bool, bool, 
bool, bool) : bool
     ClassLoader::setup_app_search_path(const char *) : void
     ClassLoader::setup_boot_search_path(const char *) : void
     ClassLoaderExt::process_jar_manifest(ClassPathEntry *, bool) : void
         ClassLoader::add_to_app_classpath_entries(const char *, 
ClassPathEntry *, bool) : void
             ClassLoader::update_class_path_entry_list(const char *, 
bool, bool, bool, bool) : bool

>
>
> - src/hotspot/share/memory/filemap.hpp
>
> 63   void init(const char* name, bool is_modules_image,
> ClassPathEntry* cpe, TRAPS);
>
> The 'name' argument can be removed since it can be retrieved from
> 'cpe', as you are passing the ClassPathEntry now.
I've made the change.
>
> - src/hotspot/share/classfile/sharedPathsMiscInfo.cpp
>
> With the removal of the problematic file name string comparison, the
> SharedPathsMiscInfo::check() becomes basically a no-op now. It should
> be removed now.
>
>   156 bool SharedPathsMiscInfo::check(jint type, const char* path, bool
> is_static) {
>   157   assert(UseSharedSpaces, "runtime only");
>   158   switch (type) {
>   159   case BOOT_PATH:
>   160     break;
>   161   case NON_EXIST:
>   162     {
>   163       struct stat st;
>   164       if (os::stat(path,&st) == 0) {
>   165         // The file actually exists
>   166         // But we want it to not exist ->  fail
>   167         return fail("File must not exist");
>   168       }
>   169     }
>   170     break;
>   171   case APP_PATH:
>   172     break;
>   173   default:
>   174     return fail("Corrupted archive file header");
>   175   }
>   176
>   177   return true;
>   178 }
>
> The following function should also be removed:
>   107 bool SharedPathsMiscInfo::check(bool is_static) {
The above functions can't be removed yet due to the same reasoning as 
above. It ensures the non-existing of the jar file(s) found in the 
"Class-Path" attributes.

Call paths to the function:

SharedPathsMiscInfo::check(jint, const char *, bool) : bool
     SharedPathsMiscInfo::check(bool) : bool
         ClassLoader::check_shared_paths_misc_info(void *, int, bool) : bool
             FileMapInfo::validate_header(bool) : bool
                 FileMapInfo::initialize(bool) : bool
                     DynamicArchive::map_impl(FileMapInfo *) : address
                     
MetaspaceShared::initialize_runtime_shared_and_meta_spaces() : void
>
> There are quite some additional SharedPathsMiscInfo cleanup and
> removal needed. If you want to do those in separate changeset, that is
> also okay. The cleanups will help make the CDS code more maintainable.
I agree that cleaning up SharedPathsMiscInfo is possible but more 
thinking is required. So it should be done as a separate RFE/changeset.

>
> - src/hotspot/os/posix/os_posix.cpp
>
> 1463   ret1 = os::stat(file1,&st1);
> 1464   ret2 = os::stat(file2,&st2);
> 1465   if (ret1<  0 || ret2<  0) {
> 1466     // one of the files is invalid. So they are not the same.
> 1467     is_same = false;
> 1468   } else if (st1.st_dev != st2.st_dev || st1.st_ino != st2.st_ino) {
> 1469     // different files
> 1470     is_same = false;
> 1471   } else if (st1.st_dev == st2.st_dev&&  st1.st_ino == st2.st_ino) {
> 1472     // same files
> 1473     is_same = true;
> 1474   }
> 1475   return is_same;
>
> The 'is_same' is initialized to false, so the cases where the files
> are different do not need to be checked explicitly. We just need to
> make sure 'is_same' is set to true for the case where the two files
> are the same. So you can simplify and optimize the above a bit:
>
> if (os::stat(file1,&st1) != 0) {
>    return false;
> }
> if (os::stat(file2,&st2) != 0) {
>    return false;
> }
> if (st1.st_dev == st2.st_dev&&  st1.st_ino == st2.st_ino) {
>    is_same = true;
> }
> return is_same;
I've made the above change but checking the return status of os::stat as 
what I had before because ::stat returns -1 on failure:
   if (os::stat(file1, &st1) < 0) {
     return false;
   }

   if (os::stat(file2, &st2) < 0) {
     return false;
   }


So far I've changed:
M src/hotspot/os/posix/os_posix.cpp
M src/hotspot/share/memory/filemap.cpp
M src/hotspot/share/memory/filemap.hpp

I'll do more testing before sending an updated webrevs.

thanks,
Calvin
>
> Best regards,
>
> Jiangli


More information about the hotspot-runtime-dev mailing list