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.

2. in SATestUtils::canAddPrivileges, could you please add some meaningful 
message to the RuntimeException at L#102?

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().

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.
> +     */


5. it also might make sense to catch IOException within 
SATestUtils::checkAttachOk and throw it as Error or RuntimeException.

I've briefly looked at all the changed tests and they look good.

Thanks,
-- Igor 


> On Mar 12, 2020, at 11:06 PM, Chris Plummer <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