Hi,

This is the updated fix which checks if LD_LIBRARY_PATH has been changed
during jpackage executions:

http://cr.openjdk.java.net/~avoitylov/webrev.8248239.03/

The fix stores hash from LD_LIBRARY_PATH in _JPACKAGE_LAUNCHER env
variable. Until C++14 becomes mandatory for OpenJDK, a custom hash
algorithm is used because standard C++ hash requires -std=c++11 or
-std=gnu++11 compiler options.

All test/jdk/tools/jpackage tests but ModulePathTest3.java pass on Linux
x86_64, MacOSX x86_64, and Windows x86_64. The test ModulePathTest3.java
is excluded in test/jdk/ProblemList.txt (8248418 generic-all).

Thanks,

-Aleksei

On 26/06/2020 20:23, Alexey Semenyuk wrote:
> Hi Aleksei,
>
> I think the idea of partial reading data from cfg file when the
> launcher is restarted has a flaw.
> It would be better if app launcher can detect if it was restarted and
> if it was, not read cfg file at all, but pass command line arguments
> as is in JLI_Launch().
> Let my think on ideas how to address this.
>
> - Alexey
>
> On 6/26/2020 7:16 AM, Aleksei Voitylov wrote:
>> Hi Alexey,
>>
>> Thank you for looking into it. As far as using parent pid, it does not
>> seem to work as example [1] demonstrates. The parent process remains the
>> same after re-execution and does not become the current process.
>>
>> I checked passing arguments in the "ArgOption" section using several
>> cases [2, 3, 4] with the proposed fix and app re-execution. The proposed
>> fix handles this case well, and the results are the same as without the
>> fix when the app is not re-executed.
>>
>> Case [3] where only JavaOptions without ArgOptions are passed to app
>> looks suspicious because default ArgOptions are not used. But it works
>> the same way without the proposed fix, which seems like a different
>> issue. According to jpackage documentation:
>>
>>    --arguments main class arguments
>>          Command line arguments to pass to the main class if no command
>> line arguments are given to the launcher.
>>
>> I filed a separate issue [5] to handle that.
>>
>> Thanks,
>> -Aleksei
>>
>>
>> [1]
>> cd jdk-dev
>> make jdk-image
>> export PATH=build/linux-x86_64-server-release/images/jdk/bin:$PATH
>> export
>> LD_LIBRARY_PATH=build/linux-x86_64-server-release/images/jdk/lib/server
>> jpackage --dest output --name app --type app-image --module-path
>> input-modules --module com.hello/com.hello.Hello --arguments "A A2 A"
>> --verbose --java-options -Dparam1=Param1
>> ./output/app/bin/app -Dparam2=Param2 B B2 B
>> -------------
>> pid: 16007, current process: /home/sample/jdk-dev/output/app/bin/app
>> pid: 15927, parent  process: /bin/bash
>> JvmLauncher args: 10 [/home/sample/jdk-dev/output/app/bin/app
>> -Dparam1=Param1 --module-path
>> /home/sample/jdk-dev/output/app/lib/app/mods -m
>> com.hello/com.hello.Hello -Dparam2=Param2 B B2 B ]
>> pid: 16007, current process: /home/sample/jdk-dev/output/app/bin/app
>> pid: 15927, parent  process: /bin/bash
>> JvmLauncher args: 15 [/home/sample/jdk-dev/output/app/bin/app
>> -Dparam1=Param1 --module-path
>> /home/sample/jdk-dev/output/app/lib/app/mods -m
>> com.hello/com.hello.Hello -Dparam1=Param1 --module-path
>> /home/sample/jdk-dev/output/app/lib/app/mods -m
>> com.hello/com.hello.Hello -Dparam2=Param2 B B2 B ]
>> -------------
>>
>> [2]
>> jpackage --dest output --name app --type app-image --module-path
>> input-modules --module com.hello/com.hello.Hello --arguments "A A2 A"
>> --java-options -Dparam1=Param1
>> ./output/app/bin/app
>> JvmLauncher args: 9 [output/app/bin/app -Dparam1=Param1 --module-path
>> output/app/lib/app/mods -m com.hello/com.hello.Hello A A2 A ]
>> JvmLauncher args: 9 [output/app/bin/app -Dparam1=Param1 --module-path
>> output/app/lib/app/mods -m com.hello/com.hello.Hello A A2 A ]
>>
>> [3]
>> jpackage --dest output --name app --type app-image --module-path
>> input-modules --module com.hello/com.hello.Hello --arguments "A A2 A"
>> --java-options -Dparam1=Param1
>> ./output/app/bin/app -Dparam2=Param2
>> JvmLauncher args: 7 [output/app/bin/app -Dparam1=Param1 --module-path
>> output/app/lib/app/mods -m com.hello/com.hello.Hello -Dparam2=Param2 ]
>> JvmLauncher args: 7 [output/app/bin/app -Dparam1=Param1 --module-path
>> output/app/lib/app/mods -m com.hello/com.hello.Hello -Dparam2=Param2 ]
>>
>> [4]
>> jpackage --dest output --name app --type app-image --module-path
>> input-modules --module com.hello/com.hello.Hello --arguments "A A2 A"
>> --java-options -Dparam1=Param1
>> ./output/app/bin/app -Dparam2=Param2 B B2 B
>> JvmLauncher args: 10 [output/app/bin/app -Dparam1=Param1 --module-path
>> output/app/lib/app/mods -m com.hello/com.hello.Hello -Dparam2=Param2 B
>> B2 B ]
>> JvmLauncher args: 10 [output/app/bin/app -Dparam1=Param1 --module-path
>> output/app/lib/app/mods -m com.hello/com.hello.Hello -Dparam2=Param2 B
>> B2 B ]
>>
>> [5] https://bugs.openjdk.java.net/browse/JDK-8248397
>>
>>
>> On 24/06/2020 19:34, Alexey Semenyuk wrote:
>>> Aleksei,
>>>
>>> If I get it right, the fix would not work for the case when there are
>>> `arguments` properties in `ArgOptions` section of a config file.
>>> Why not just check if the parent process is the same executable as the
>>> current one and if this is the case don't read data from the config
>>> file but pass executable arguments as is in JLI_Launch() call?
>>>
>>> - Alexey
>>>
>>> On 6/24/2020 11:48 AM, Aleksei Voitylov wrote:
>>>> Hi,
>>>>
>>>> There are systems that update LD_LIBRARY_PATH or directly return
>>>> JNI_TRUE in method RequiresSetenv(const char *jvmpath) from java_md.c
>>>> file to request re-execution of the current executable. This leads to
>>>> the fact that jpackage application adds some provided arguments twice.
>>>>
>>>> Bug: https://bugs.openjdk.java.net/browse/JDK-8248239
>>>> Fix: http://cr.openjdk.java.net/~avoitylov/webrev.8248239.00/
>>>>
>>>> The root cause of the issue is that jpackage application expects one
>>>> number of arguments but JLI reexecutes them with another number of
>>>> arguments.
>>>>    For example, a jpackage application can be run with arguments:
>>>>       ./app/bin/app -Dparam2=Param2 B1 B2 B3
>>>> it adds arguments from the config file and calls JLI with arguments:
>>>>       app/bin/app -classpath  -Dparam1=Param1 -m
>>>> com.hello/com.hello.Hello
>>>> -Dparam2=Param2 B1 B2 B3
>>>> JLI re-executes the app with new arguments so the app adds some
>>>> arguments one more time after the re-execution.
>>>>       ./app/bin/app -classpath  -Dparam1=Param1 -m
>>>> com.hello/com.hello.Hello -classpath  -Dparam1=Param1 -m
>>>> com.hello/com.hello.Hello -Dparam2=Param2 B1 B2 B3
>>>>
>>>> A step by step example that illustrates the issue:
>>>>
>>>> Run jpackage to create an executable application:
>>>>     jpackage --dest output --name app --type app-image --module-path
>>>> input-modules --module com.hello/com.hello.Hello --arguments "A1 A2
>>>> A3"
>>>> --verbose --java-options -Dparam1=Param1
>>>>
>>>> Executable application with the app/lib/app/app.cfg config file is
>>>> created:
>>>> ---- app.cfg  ----
>>>> [Application]
>>>> app.name=app
>>>> app.version=1.0
>>>> app.runtime=$ROOTDIR/lib/runtime
>>>> app.identifier=com.hello
>>>> app.classpath=
>>>> app.mainmodule=com.hello/com.hello.Hello
>>>>
>>>> [JavaOptions]
>>>> java-options=-Dparam1=Param1
>>>>
>>>> [ArgOptions]
>>>> arguments=A1
>>>> arguments=A2
>>>> arguments=A3
>>>> -----------
>>>>
>>>> Run the application:
>>>>      ./output/app/bin/app -Dparam2=Param2 B1 B2 B3
>>>>
>>>> Chain of JDK methods execution:
>>>>
>>>> LinuxLauncher main()
>>>>      args: 5 [./app/bin/app -Dparam2=Param2 B1 B2 B3 ]
>>>> AppLauncher createJvmLauncher()
>>>>      args: 4 [-Dparam2=Param2 B1 B2 B3 ]
>>>> JvmLauncher.cpp Jvm::initFromConfigFile() - adds JavaOptions from
>>>> app.cfg
>>>>      args: 10 [app/bin/app -classpath  -Dparam1=Param1 -m
>>>> com.hello/com.hello.Hello -Dparam2=Param2 B1 B2 B3 ]
>>>> AppLauncher Jvm::launch() -  JLI re-executes the app
>>>> LinuxLauncher main()
>>>>     args: 10 [app/bin/app -classpath  -Dparam1=Param1 -m
>>>> com.hello/com.hello.Hello -Dparam2=Param2 B1 B2 B3 ]
>>>> AppLauncher createJvmLauncher()
>>>>      args: 9 [-classpath  -Dparam1=Param1 -m com.hello/com.hello.Hello
>>>> -Dparam2=Param2 B1 B2 B3 ]
>>>> JvmLauncher.cpp Jvm::initFromConfigFile() - adds JavaOptions from
>>>> app.cfg
>>>>      args: 15 [./app/bin/app -classpath  -Dparam1=Param1 -m
>>>> com.hello/com.hello.Hello -classpath  -Dparam1=Param1 -m
>>>> com.hello/com.hello.Hello -Dparam2=Param2 B1 B2 B3 ]
>>>>       ^^^
>>>>
>>>> Some arguments like "-classpath  -Dparam1=Param1 -m
>>>> com.hello/com.hello.Hello" are added twice.
>>>>
>>>> Tested with test/jdk/tools/jpackage/share/jdk/jpackage with no
>>>> regressions on Linux, Windows, Mac. On systems affected, the tests
>>>> now pass.
>>>>
>>>> Thanks,
>>>>
>>>> -Aleksei
>>>>
>>>>
>

Reply via email to