Hi Chris,

looks good, thanks!

one minor nit, in SATestUtils::skipIfCannotAttach, you have two exception 
messages which start with 'SA attach not expected to work.', and one w/ 'SA 
Attach not expected to work.' (w/ Attach instead of attach), it'd be nicer to 
have them uniform. 

Cheers,
-- Igor

> On Mar 15, 2020, at 4:35 PM, Chris Plummer <chris.plum...@oracle.com> wrote:
> 
> Hi Igor,
> 
> Thanks for the review. Here's and updated webrev with all of the suggestions 
> from you and Serguei:
> 
> http://cr.openjdk.java.net/~cjplummer/8238268/webrev.01/index.html 
> <http://cr.openjdk.java.net/~cjplummer/8238268/webrev.01/index.html>
> 
> Also some comments inline below.
> 
> On 3/13/20 9:26 AM, Igor Ignatyev wrote:
>> HI Chris,
>> 
>> overall looks good to me, a few comments though:
>> 1. since you removed vm.hasSAandCanAttach from VMProps, you also need to 
>> remove it from all TEST.ROOT files which mention it (test/jdk/TEST.ROOT and 
>> test/hotspot/jtreg/TEST.ROOT) so people won't be confused by undefined 
>> property and jtreg will be able to properly report invalid usages of it if 
>> any.
> Ok, but it's unclear to me what requires.properties is even for, and what is 
> the impact of extra or missing properties. What kind of test would catch 
> these errors?
jtreg uses 'requires.properties' as a list of extra variables for @require 
expressions, if a test uses a name which isn't in 'requires.properties' (or 
known to jtreg), jtreg won't execute such test and will set its status to Error 
w/ 'invalid name ...' message.

>> 
>> 2. in SATestUtils::canAddPrivileges, could you please add some meaningful 
>> message to the RuntimeException at L#102?
>> 
> Ok.
> 
>            throw new RuntimeException("sudo process interrupted", e);
> 
>> 3. SATestUtils::checkAttachOk method name is somewhat misleading (hence you 
>> had to put comment every time you used it), I'd recommend you to rename to 
>> smth like skipIfCannotAttach().
> Ok, but I still left the comment in place.
>> 
>> 4. in SATestUtils::checkAttachOk's javadoc, it would be better to use 
>> @throws tag like:
>>> +    /**
>>> +     * Checks if SA Attach is expected to work.
>>> +.    * @throws SkippedException ifSA Attach is not expected to work.
>>> +     */
>> 
>> 
> Ok.
>> 5. it also might make sense to catch IOException within 
>> SATestUtils::checkAttachOk and throw it as Error or RuntimeException.
>> 
> Ok.
>> I've briefly looked at all the changed tests and they look good.
> 
> Thanks!
> 
> Chris
>> 
>> Thanks,
>> -- Igor 
>> 
>> 
>>> On Mar 12, 2020, at 11:06 PM, Chris Plummer <chris.plum...@oracle.com 
>>> <mailto:chris.plum...@oracle.com>> wrote:
>>> 
>>> Hi Serguei,
>>> 
>>> Thanks for the review!
>>> 
>>> Can I get one more reviewer please?
>>> 
>>> thanks,
>>> 
>>> Chris
>>> 
>>> On 3/12/20 12:06 AM, serguei.spit...@oracle.com 
>>> <mailto:serguei.spit...@oracle.com> wrote:
>>>> Hi Chris,
>>>> 
>>>> 
>>>> On 3/12/20 00:03, Chris Plummer wrote:
>>>>> Hi Serguei,
>>>>> 
>>>>> That check used to be in Platform.shouldSAAttach(), which essentially was 
>>>>> moved to SATestUtils.checkAttachOk() and reworked some. It was necessary 
>>>>> in Platform.shouldSAAttach() since that was used to evaluation 
>>>>> vm.hasSAandCanAttach (which is now gone). When I moved everything to 
>>>>> SATestUtils.checkAttachOk(), I recall thinking it wasn't really necessary 
>>>>> since all tests that call it should have @require vm.hasSA, but left it 
>>>>> in anyway just to be extra safe. I'm still inclined to just leave it in, 
>>>>> but would not be opposed to removing it.
>>>> 
>>>> I agree, it is more safe to keep it, at list for now.
>>>> 
>>>> 
>>>> Thanks,
>>>> Serguei
>>>> 
>>>>> thanks,
>>>>> 
>>>>> Chris
>>>>> 
>>>>> On 3/11/20 11:20 PM, serguei.spit...@oracle.com 
>>>>> <mailto:serguei.spit...@oracle.com> wrote:
>>>>>> Hi Chris,
>>>>>> 
>>>>>> I've made another pass today.
>>>>>> It looks good to me.
>>>>>> 
>>>>>> I have just one minor questions.
>>>>>> 
>>>>>> There is some overlap between the requires vm.hasSA check and 
>>>>>> checkAttachOk:
>>>>>> +    public static  void checkAttachOk() throws IOException {
>>>>>> +        if (!Platform.hasSA()) {
>>>>>> +            throw new SkippedException("SA not supported.");
>>>>>> +        }
>>>>>> In the former case, the test is not run but in the latter the 
>>>>>> SkippedException is thrown.
>>>>>> As I see, all tests with the checkAttachOk call use requires vm.hasSA as 
>>>>>> well.
>>>>>> It can be that the first check "if (!Platform.hasSA())" in the 
>>>>>> checkAttachOk is redundant.
>>>>>> It is okay and more safe in general but generates little confusion.
>>>>>> I'm okay if you don't do anything with this but wanted to know your view.
>>>>>> 
>>>>>> Thanks,
>>>>>> Serguei
>>>>>> 
>>>>>> 
>>>>>> On 3/10/20 18:57, Chris Plummer wrote:
>>>>>>> On 3/10/20 6:07 PM, serguei.spit...@oracle.com 
>>>>>>> <mailto:serguei.spit...@oracle.com> wrote:
>>>>>>>> Hi Chris,
>>>>>>>> 
>>>>>>>> Overall, this looks as a right direction to me while it is not easy to 
>>>>>>>> verify all the details.
>>>>>>> Yes, there are a lot of tests with quite a few different types of 
>>>>>>> changes. I did a lot of testing and verified that when the tests pass, 
>>>>>>> they pass for the right reasons (really ran the test, skipped due to 
>>>>>>> lack of privileges, or skipped due to running signed on OSX 10.14 or 
>>>>>>> later). I also verified locally running as root, running with a cached 
>>>>>>> sudo, and running without sudo.
>>>>>>>> I'll make another pass tomorrow. 
>>>>>>> Thanks!
>>>>>>>> 
>>>>>>>> A couple of quick nits so far:
>>>>>>>> 
>>>>>>>> http://cr.openjdk.java.net/~cjplummer/8238268/webrev.00/test/hotspot/jtreg/serviceability/sa/TestCpoolForInvokeDynamic.java.udiff.html
>>>>>>>>  
>>>>>>>> <http://cr.openjdk.java.net/~cjplummer/8238268/webrev.00/test/hotspot/jtreg/serviceability/sa/TestCpoolForInvokeDynamic.java.udiff.html>
>>>>>>>> http://cr.openjdk.java.net/~cjplummer/8238268/webrev.00/test/hotspot/jtreg/serviceability/sa/TestDefaultMethods.java.udiff.html
>>>>>>>>  
>>>>>>>> <http://cr.openjdk.java.net/~cjplummer/8238268/webrev.00/test/hotspot/jtreg/serviceability/sa/TestDefaultMethods.java.udiff.html>
>>>>>>>> http://cr.openjdk.java.net/~cjplummer/8238268/webrev.00/test/hotspot/jtreg/serviceability/sa/TestHeapDumpForInvokeDynamic.java.udiff.html
>>>>>>>>  
>>>>>>>> <http://cr.openjdk.java.net/~cjplummer/8238268/webrev.00/test/hotspot/jtreg/serviceability/sa/TestHeapDumpForInvokeDynamic.java.udiff.html>
>>>>>>>> http://cr.openjdk.java.net/~cjplummer/8238268/webrev.00/test/hotspot/jtreg/serviceability/sa/TestInstanceKlassSizeForInterface.java.udiff.html
>>>>>>>>  
>>>>>>>> <http://cr.openjdk.java.net/~cjplummer/8238268/webrev.00/test/hotspot/jtreg/serviceability/sa/TestInstanceKlassSizeForInterface.java.udiff.html>
>>>>>>>> http://cr.openjdk.java.net/~cjplummer/8238268/webrev.00/test/hotspot/jtreg/serviceability/sa/TestJhsdbJstackMixed.java.udiff.html
>>>>>>>>  
>>>>>>>> <http://cr.openjdk.java.net/~cjplummer/8238268/webrev.00/test/hotspot/jtreg/serviceability/sa/TestJhsdbJstackMixed.java.udiff.html>
>>>>>>>> http://cr.openjdk.java.net/~cjplummer/8238268/webrev.00/test/hotspot/jtreg/serviceability/sa/TestRevPtrsForInvokeDynamic.java.udiff.html
>>>>>>>>  
>>>>>>>> <http://cr.openjdk.java.net/~cjplummer/8238268/webrev.00/test/hotspot/jtreg/serviceability/sa/TestRevPtrsForInvokeDynamic.java.udiff.html>
>>>>>>>>  import jdk.test.lib.Utils;
>>>>>>>> -import jdk.test.lib.Asserts;
>>>>>>>> +import jdk.test.lib.SA.SATestUtils;
>>>>>>>> Need to swap these exports.
>>>>>>>> 
>>>>>>>> 
>>>>>>> Ok
>>>>>>>> http://cr.openjdk.java.net/~cjplummer/8238268/webrev.00/test/lib/jdk/test/lib/SA/SATestUtils.java.frames.html
>>>>>>>>  
>>>>>>>> <http://cr.openjdk.java.net/~cjplummer/8238268/webrev.00/test/lib/jdk/test/lib/SA/SATestUtils.java.frames.html>
>>>>>>>>   48         if (SATestUtils.needsPrivileges()) {
>>>>>>>>   49             cmdStringList = 
>>>>>>>> SATestUtils.addPrivileges(cmdStringList);
>>>>>>>> The method calls are local, so the class name can be omitted in the 
>>>>>>>> method names:
>>>>>>>>   SATestUtils.needsPrivileges and SATestUtils.addPrivileges.
>>>>>>> Ok
>>>>>>>> 
>>>>>>>> 
>>>>>>>>   94        try {
>>>>>>>>   95            if (echoProcess.waitFor(60, TimeUnit.SECONDS) == 
>>>>>>>> false) {
>>>>>>>>   96                // Due to using the "-n" option, sudo should 
>>>>>>>> complete almost immediately. 60 seconds
>>>>>>>>   97                // is more than generous. If it didn't complete in 
>>>>>>>> that time, something went very wrong.
>>>>>>>>   98                echoProcess.destroyForcibly();
>>>>>>>>   99                throw new RuntimeException("Timed out waiting for 
>>>>>>>> sudo to execute.");
>>>>>>>>  100            }
>>>>>>>>  101         } catch (InterruptedException e) {
>>>>>>>>  102            throw new RuntimeException(e);
>>>>>>>>  103         }
>>>>>>>> The lines 101/103 are misaligned.
>>>>>>> Ok.
>>>>>>>> 
>>>>>>>> 
>>>>>>>> Thanks,
>>>>>>>> Serguei
>>>>>>>> 
>>>>>>> Thanks,
>>>>>>> 
>>>>>>> Chris
>>>>>>>> 
>>>>>>>> 
>>>>>>>> On 3/9/20 19:29, Chris Plummer wrote:
>>>>>>>>> Hi, 
>>>>>>>>> 
>>>>>>>>> Please help review the following: 
>>>>>>>>> 
>>>>>>>>> https://bugs.openjdk.java.net/browse/JDK-8238268 
>>>>>>>>> <https://bugs.openjdk.java.net/browse/JDK-8238268> 
>>>>>>>>> http://cr.openjdk.java.net/~cjplummer/8238268/webrev.00/ 
>>>>>>>>> <http://cr.openjdk.java.net/~cjplummer/8238268/webrev.00/> 
>>>>>>>>> 
>>>>>>>>> I'll try to give enough background first to make it easier to 
>>>>>>>>> understand the changes. On OSX you must run SA tests that attach to a 
>>>>>>>>> live process as root or using sudo. For example: 
>>>>>>>>> 
>>>>>>>>>   sudo make run-test 
>>>>>>>>> TEST=serviceability/sa/ClhsdbJstackXcompStress.java 
>>>>>>>>> 
>>>>>>>>> Whether running as root or under sudo, the check to allow the test to 
>>>>>>>>> run is done with: 
>>>>>>>>> 
>>>>>>>>>     private static boolean canAttachOSX() { 
>>>>>>>>>           return userName.equals("root"); 
>>>>>>>>>     } 
>>>>>>>>> 
>>>>>>>>> Any test using "@requires vm.hasSAandCanAttach" must pass this check 
>>>>>>>>> via Platform.shouldSAAttach(), which for OSX returns: 
>>>>>>>>> 
>>>>>>>>>              return canAttachOSX() && !isSignedOSX(); 
>>>>>>>>> 
>>>>>>>>> So if running as root the "@requires vm.hasSAandCanAttach" passes, 
>>>>>>>>> otherwise it does not. However, using a root login to run tests is 
>>>>>>>>> not a very desirable, nor is issuing a "sudo make run-test" (any 
>>>>>>>>> created file ends up with root ownership). Because of this support 
>>>>>>>>> was previously added for just running the attaching process using 
>>>>>>>>> sudo, not the entire test. This was only done for the 20 or so tests 
>>>>>>>>> that use ClhsdbLauncher. These tests use "@requires vm.hasSA", and 
>>>>>>>>> then while running the test will do a "sudo" check if canAttachOSX() 
>>>>>>>>> returns false: 
>>>>>>>>> 
>>>>>>>>>         if (!Platform.shouldSAAttach()) { 
>>>>>>>>>             if (Platform.isOSX()) { 
>>>>>>>>>                 if (Platform.isSignedOSX()) { 
>>>>>>>>>                     throw new SkippedException("SA attach not 
>>>>>>>>> expected to work. JDK is signed."); 
>>>>>>>>>                 } else if (SATestUtils.canAddPrivileges()) { 
>>>>>>>>>                     needPrivileges = true; 
>>>>>>>>>                 } 
>>>>>>>>>             } 
>>>>>>>>>             if (!needPrivileges)  { 
>>>>>>>>>                // Skip the test if we don't have enough permissions 
>>>>>>>>> to attach 
>>>>>>>>>                // and cannot add privileges. 
>>>>>>>>>                throw new SkippedException( 
>>>>>>>>>                    "SA attach not expected to work. Insufficient 
>>>>>>>>> privileges."); 
>>>>>>>>>            } 
>>>>>>>>>         } 
>>>>>>>>> 
>>>>>>>>> So basically it does a runtime check of vm.hasSAandCanAttach, and if 
>>>>>>>>> it fails then checks if running with sudo will work. This allows for 
>>>>>>>>> either a passwordless sudo to be used when running clhsdb, or for the 
>>>>>>>>> user to be prompted for the sudo password (note I've remove support 
>>>>>>>>> for the latter with my changes). 
>>>>>>>>> 
>>>>>>>>> That brings us to the CR that is being fixed. ClhsdbLauncher tests 
>>>>>>>>> support sudo and will therefore run with our CI testing on OSX, but 
>>>>>>>>> the 25 or so tests that use "@requires vm.hasSAandCanAttach" do not, 
>>>>>>>>> and therefore are never run with our CI OSX testing. The changes in 
>>>>>>>>> this webrev fix that. 
>>>>>>>>> 
>>>>>>>>> There are two possible approaches to the fix. One is having the check 
>>>>>>>>> for sudo be done as part of the vm.hasSAandCanAttach evaluation. The 
>>>>>>>>> other approach is to do the check in the test at runtime similar to 
>>>>>>>>> how                             ClhsdbLauncher currently does. This 
>>>>>>>>> would mean just using "@requires vm.hasSA" for all the tests instead 
>>>>>>>>> of "@requires vm.hasSAandCanAttach". I chose the later because there 
>>>>>>>>> is an advantage to throwing SkippedException rather than just 
>>>>>>>>> silently skipping the test using @requires. The advantage is that 
>>>>>>>>> mdash tells you how many tests were skipped, and when you hover over 
>>>>>>>>> the reason you can see the SkippedException message, which will 
>>>>>>>>> differentiate between reasons like the JDK was signed or there are 
>>>>>>>>> insufficient privileges. If all the checking was done by the 
>>>>>>>>> vm.hasSAandCanAttach evaluation, you would not know why the test 
>>>>>>>>> wasn't run. 
>>>>>>>>> 
>>>>>>>>> The "support" related changes made are all in the following 3 files. 
>>>>>>>>> The rest of the changes are in the tests: 
>>>>>>>>> 
>>>>>>>>> test/jtreg-ext/requires/VMProps.java 
>>>>>>>>> test/lib/jdk/test/lib/Platform.java 
>>>>>>>>> test/lib/jdk/test/lib/SA/SATestUtils.java 
>>>>>>>>> 
>>>>>>>>> You'll noticed that one change I made to the sudo support in 
>>>>>>>>> SATestUtils.canAddPrivileges() is to make sudo non-interactive, which 
>>>>>>>>> means no password prompt. So that means either the user does not 
>>>>>>>>> require a password, or the credentials have been cached. Otherwise 
>>>>>>>>> the sudo check will fail. On most platforms if you execute a sudo 
>>>>>>>>> command, the credentials are cached for 5 minutes. So if your user is 
>>>>>>>>> not setup for passwordless sudo, then a sudo command can be issued 
>>>>>>>>> before running the tests, and will likely remain cached until the 
>>>>>>>>> test is run. The reason for using passwordless is because prompting 
>>>>>>>>> in the middle of running tests can be confusing (you usually walk way 
>>>>>>>>> once launching the tests and miss the prompt anyway), and avoids 
>>>>>>>>> unnecessary delays in automated testing due to waiting for the 
>>>>>>>>> password prompt to timeout (it used to wait 1 minute). 
>>>>>>>>> 
>>>>>>>>> There are essentially 3 types of tests that SA Attach to a process, 
>>>>>>>>> each needing a slightly different fix: 
>>>>>>>>> 
>>>>>>>>> 1. Tests that directly launch a jdk.hotspot.agent class, such as 
>>>>>>>>> TestClassDump.java. They need to call SATestUtils.checkAttachOk() to 
>>>>>>>>> verify that attaching will be possible, and then 
>>>>>>>>> SATestUtils.addPrivilegesIfNeeded(pb) to get the sudo command added 
>>>>>>>>> if needed.They also need to switch from using hasSAandCanAttach to 
>>>>>>>>> using hasSA. 
>>>>>>>>> 
>>>>>>>>> 2. Tests that launch command line tools such has jhsdb. They need to 
>>>>>>>>> call SATestUtils.checkAttachOk() to verify that attaching will be 
>>>>>>>>> possible, and then SATestUtils.createProcessBuilder() to create a 
>>>>>>>>> process that will be launched using sudo if necessary.They also need 
>>>>>>>>> to switch from using hasSAandCanAttach to using hasSA. 
>>>>>>>>> 
>>>>>>>>> 3. Tests that use ClhsdbLauncher. They already use hasSA instead of 
>>>>>>>>> hasSAandCanAttach, and rely on ClhsdbLauncher to do check at runtime 
>>>>>>>>> if attaching will work, so for the most part all the these tests are 
>>>>>>>>> unchanged. ClhsdbLauncher was modified to take advantage of the new 
>>>>>>>>> SATestUtils.createProcessBuilder() and SATestUtils.checkAttachOk() 
>>>>>>>>> APIs. 
>>>>>>>>> 
>>>>>>>>> Some tests required special handling: 
>>>>>>>>> 
>>>>>>>>> test/hotspot/jtreg/compiler/ciReplay/TestSAClient.java 
>>>>>>>>> test/hotspot/jtreg/compiler/ciReplay/TestSAServer.java 
>>>>>>>>> 
>>>>>>>>> - These two tests SA Attach to a core file, not to a process, so only 
>>>>>>>>> need hasSA, 
>>>>>>>>>   not hasSAandCanAttach. No other changes were needed. 
>>>>>>>>> 
>>>>>>>>> test/hotspot/jtreg/serviceability/sa/ClhsdbFindPC.java 
>>>>>>>>> 
>>>>>>>>> - The output should never be null. If the test was skipped due to 
>>>>>>>>> lack of privileges, you 
>>>>>>>>>   would never get to this section of the test. 
>>>>>>>>> 
>>>>>>>>> test/hotspot/jtreg/serviceability/sa/TestClhsdbJstackLock.java 
>>>>>>>>> test/hotspot/jtreg/serviceability/sa/TestIntConstant.java 
>>>>>>>>> test/hotspot/jtreg/serviceability/sa/TestPrintMdo.java 
>>>>>>>>> test/hotspot/jtreg/serviceability/sa/TestType.java 
>>>>>>>>> test/hotspot/jtreg/serviceability/sa/TestUniverse.java 
>>>>>>>>> 
>>>>>>>>> - These are ClhsdbLauncher tests, so they should have been using 
>>>>>>>>> hasSA instead of 
>>>>>>>>>   hasSAandCanAttachin the first place. No other changes were needed. 
>>>>>>>>> 
>>>>>>>>> test/hotspot/jtreg/serviceability/sa/TestCpoolForInvokeDynamic.java 
>>>>>>>>> test/hotspot/jtreg/serviceability/sa/TestDefaultMethods.java 
>>>>>>>>> test/hotspot/jtreg/serviceability/sa/TestG1HeapRegion.java 
>>>>>>>>> 
>>>>>>>>> - These tests used to "@require mac" but seem run fine on OSX, so I 
>>>>>>>>> removed this requirement. 
>>>>>>>>> 
>>>>>>>>> test/jdk/sun/tools/jhsdb/BasicLauncherTest.java 
>>>>>>>>> 
>>>>>>>>> - This test had a runtime check to not run on OSX due to not having 
>>>>>>>>> core file stack 
>>>>>>>>>   walking support. However, this tests always attaches to a process, 
>>>>>>>>> not a core file, 
>>>>>>>>>   and seems to run just fine on OSX. 
>>>>>>>>> 
>>>>>>>>> test/jdk/sun/tools/jstack/DeadlockDetectionTest.java 
>>>>>>>>> 
>>>>>>>>> - I changed the test to throw a SkippedException if it gets the 
>>>>>>>>> unexpected error code 
>>>>>>>>>   rather than just println. 
>>>>>>>>> 
>>>>>>>>> And a few other miscellaneous changes not already covered: 
>>>>>>>>> 
>>>>>>>>> test/lib/jdk/test/lib/Platform.java 
>>>>>>>>> - Made canPtraceAttachLinux() public so it can be called from 
>>>>>>>>> SATestUtils. 
>>>>>>>>> - vm.hasSAandCanAttach is now gone. 
>>>>>>>>> 
>>>>>>>>> thanks, 
>>>>>>>>> 
>>>>>>>>> Chris 
>>>>>>>>> 
>>>>>>>> 
>>>>>>> 
>>>>>> 
>>>>> 
>>>> 
>>> 
>> 
> 

Reply via email to