Of course…This is getting embarrassing. :)

http://cr.openjdk.java.net/~sla/8039173/webrev.03/

/Staffan

On 11 apr 2014, at 09:32, Ivan Gerasimov <ivan.gerasi...@oracle.com> wrote:

> Hi Staffan!
> 
> Isn't the second read in line# 268 erroneous?
> 
>  267         while ((n = sis.read(b)) != -1)  {
>  268             n = sis.read(b);
> 
> Sincerely yours,
> Ivan
> 
> On 11.04.2014 11:16, Staffan Larsen wrote:
>> Here is a new version where the 200 char cap is removed:
>> 
>> http://cr.openjdk.java.net/~sla/8039173/webrev.02/
>> 
>> Thanks,
>> /Staffan
>> 
>> On 4 apr 2014, at 16:27, Staffan Larsen <staffan.lar...@oracle.com> wrote:
>> 
>>> Thanks Ivan.
>>> 
>>> I’ve been thinking a bit more about this and discussing with people here. 
>>> I’m not sure anymore that it is a good idea to cap the error message. My 
>>> original thought was that it made sense to not overflow the client with 
>>> tons of output if something went wrong in the target. On the other hand, 
>>> there is nothing that says that the error message will be in the first 200 
>>> characters. It is perfectly possible for an operation to successfully run 
>>> for a while and only at the end run into a problem. In that case the output 
>>> will have the exception at the end, following any amount of output. Capping 
>>> the message in that case would hide the error. 
>>> 
>>> (My second thought was: let’s only take the last 200 chars, but there is no 
>>> guarantee that that will contain the complete error message either).
>>> 
>>> So the "keep it simple” principle here would be to remove the cap (which 
>>> also makes the code in getErrorMessage() simpler). 
>>> 
>>> If someone has a better solution for propagating error messages from the 
>>> operations, I’m all ears.
>>> 
>>> Thanks,
>>> /Staffan
>>> 
>>> 
>>> 
>>> On 4 apr 2014, at 14:41, Ivan Gerasimov <ivan.gerasi...@oracle.com> wrote:
>>> 
>>>> An alternative, more compact variant might be
>>>> 
>>>> ------------------------
>>>>   String getErrorMessage(InputStream sis, int maxlen) throws IOException {
>>>>       int n, off = 0, len = maxlen + 1;
>>>>       byte b[] = new byte[len];
>>>>       while ((n = sis.read(b, off, len - off)) > 0)
>>>>           off += n;
>>>>       return (off == 0) ? null
>>>>               : (off < len)
>>>>               ? new String(b, 0, off, "UTF-8")
>>>>               : new String(b, 0, maxlen, "UTF-8") + " ...";
>>>>   }
>>>> ------------------------
>>>> 
>>>> Not a big deal, of course.
>>>> 
>>>> Sincerely yours,
>>>> Ivan
>>>> 
>>>> 
>>>> 
>>>> On 04.04.2014 16:24, Ivan Gerasimov wrote:
>>>>> Now you reintroduced the smallish issue, when the message is exactly 200 
>>>>> characters (or whatever maxlen is).
>>>>> The dots will be appended to the message, even though it's not necessary.
>>>>> 
>>>>> I think the only reliable way to deal with it is to try to read one extra 
>>>>> character from sis.
>>>>> 
>>>>> Something like this should do:
>>>>> ------------------------
>>>>>   String getErrorMessage(InputStream sis, int maxlen) throws IOException {
>>>>>       byte b[] = new byte[maxlen + 1];
>>>>>       int n, off = 0, len = b.length;
>>>>>       do {
>>>>>           n = sis.read(b, off, len);
>>>>>           if (n == -1) {
>>>>>               break;
>>>>>           }
>>>>>           off += n;
>>>>>           len -= n;
>>>>>       } while (off < maxlen);
>>>>> 
>>>>>       String message = null;
>>>>>       if (off > 0) {
>>>>>           message = (off > maxlen)
>>>>>                   ? new String(b, 0, maxlen, "UTF-8") + " ..."
>>>>>                   : new String(b, 0, off, "UTF-8");
>>>>>       }
>>>>>       return message;
>>>>>   }
>>>>> ------------------------
>>>>> 
>>>>> Sincerely yours,
>>>>> Ivan
>>>>> 
>>>>> On 04.04.2014 16:08, Staffan Larsen wrote:
>>>>>> I’m afraid you are right! Doh. Need to add more testing...
>>>>>> 
>>>>>> How about this change:
>>>>>> 
>>>>>> --- a/src/share/classes/sun/tools/attach/HotSpotVirtualMachine.java
>>>>>> +++ b/src/share/classes/sun/tools/attach/HotSpotVirtualMachine.java
>>>>>> @@ -267,9 +267,11 @@
>>>>>>     String getErrorMessage(InputStream sis, int maxlen) throws 
>>>>>> IOException {
>>>>>>         byte b[] = new byte[maxlen];
>>>>>>         int n, off = 0, len = maxlen;
>>>>>> +        boolean complete = false;
>>>>>>         do {
>>>>>>             n = sis.read(b, off, len);
>>>>>>             if (n == -1) {
>>>>>> +                complete = true;
>>>>>>                 break;
>>>>>>             }
>>>>>>             off += n;
>>>>>> @@ -280,7 +282,7 @@
>>>>>>         if (off > 0) {
>>>>>>             message = new String(b, 0, off, "UTF-8");
>>>>>>         }
>>>>>> -        if (off > b.length && message != null) {
>>>>>> +        if (!complete && message != null) {
>>>>>>             message += " ...";
>>>>>>         }
>>>>>>         return message;
>>>>>> 
>>>>>> 
>>>>>> On 4 apr 2014, at 13:55, Ivan Gerasimov <ivan.gerasi...@oracle.com> 
>>>>>> wrote:
>>>>>> 
>>>>>>> Thank you Staffan for fixing them!
>>>>>>> 
>>>>>>> But I'm afraid that now the function will never add ellipsis to the 
>>>>>>> message, even if it gets truncated.
>>>>>>> 
>>>>>>> Sincerely yours,
>>>>>>> Ivan
>>>>>>> 
>>>>>>> On 04.04.2014 15:47, Staffan Larsen wrote:
>>>>>>>> Thanks for finding these bugs, Ivan!
>>>>>>>> 
>>>>>>>> I have updated the webrev at: 
>>>>>>>> http://cr.openjdk.java.net/~sla/8039173/webrev.01/, and I have also 
>>>>>>>> included the diff below.
>>>>>>>> 
>>>>>>>> The updated webrev also has some changes in the javadoc for 
>>>>>>>> VirtualMachine to clarify that some methods can now throw 
>>>>>>>> AttachOperationFailedException.
>>>>>>>> 
>>>>>>>> Thanks,
>>>>>>>> /Staffan
>>>>>>>> 
>>>>>>>> 
>>>>>>>> diff --git 
>>>>>>>> a/src/share/classes/sun/tools/attach/HotSpotVirtualMachine.java 
>>>>>>>> b/src/share/classes/sun/tools/attach/HotSpotVirtualMachine.java
>>>>>>>> --- a/src/share/classes/sun/tools/attach/HotSpotVirtualMachine.java
>>>>>>>> +++ b/src/share/classes/sun/tools/attach/HotSpotVirtualMachine.java
>>>>>>>> @@ -266,18 +266,21 @@
>>>>>>>>      */
>>>>>>>>     String getErrorMessage(InputStream sis, int maxlen) throws 
>>>>>>>> IOException {
>>>>>>>>         byte b[] = new byte[maxlen];
>>>>>>>> -        int n, off = 0, len = b.length;
>>>>>>>> +        int n, off = 0, len = maxlen;
>>>>>>>>         do {
>>>>>>>>             n = sis.read(b, off, len);
>>>>>>>> +            if (n == -1) {
>>>>>>>> +                break;
>>>>>>>> +            }
>>>>>>>>             off += n;
>>>>>>>>             len -= n;
>>>>>>>> -        } while (n >= 0 && off < b.length);
>>>>>>>> +        } while (off < maxlen);
>>>>>>>> 
>>>>>>>>         String message = null;
>>>>>>>>         if (off > 0) {
>>>>>>>>             message = new String(b, 0, off, "UTF-8");
>>>>>>>>         }
>>>>>>>> -        if (off == b.length && message != null) {
>>>>>>>> +        if (off > b.length && message != null) {
>>>>>>>>             message += " ...";
>>>>>>>>         }
>>>>>>>>         return message;
>>>>>>>> 
>>>>>>>> 
>>>>>>>> On 4 apr 2014, at 11:18, Ivan Gerasimov <ivan.gerasi...@oracle.com> 
>>>>>>>> wrote:
>>>>>>>> 
>>>>>>>>> Hi Staffan!
>>>>>>>>> 
>>>>>>>>> I think there is a couple of minor bugs in 
>>>>>>>>> getErrorMessage(InputStream sis, int maxlen).
>>>>>>>>> 
>>>>>>>>> 1) If maxlen is exactly the size of the message to read, the function 
>>>>>>>>> will add an ellipsis, even though the message isn't truncated,
>>>>>>>>> 2) If maxlen is greater than needed, then sis.read(b, off, len) at 
>>>>>>>>> the line #271 will eventually return -1, and it will cause the 
>>>>>>>>> message to lose its last character.
>>>>>>>>> 
>>>>>>>>> Sincerely yours,
>>>>>>>>> Ivan
>>>>>>>>> 
>>>>>> 
>>>>> 
>>>>> 
>> 
>> 
> 

Reply via email to