Андреас,

481: It's better to declare n as ssize_t and remove cast at 488

Looks good for me!

-Dmitry


On 2016-01-18 14:42, Andreas Eriksson wrote:
> Hi,
> 
> New webrev: http://cr.openjdk.java.net/~aeriksso/8129419/webrev.02/hotspot/
> 
> Write_internal handles writes less than len, and EINTR.
> 
> EINTR is taken care of by os::write, but to use it I had to remove an
> assert from the solaris os::write, which checked that a JavaThread was
> in_native. Since heap dumping is done from the vm_thread (not a
> JavaThread) the assert crashed the VM.
> 
> Regards,
> Andreas
> 
> On 2016-01-13 13:39, Andreas Eriksson wrote:
>> Hi,
>>
>> On 2015-12-29 21:27, Dmitry Samersoff wrote:
>>> Andreas,
>>>
>>> Great work. All but write_internal looks good for me (see below).
>>>
>>>
>>> HprofReader.java:
>>>
>>> Nit -  length -= skipped; should be after if skipped == 0
>>>
>>> heapDumper.cpp:480
>>>
>>> 1. For windows you can do :
>>>      assert(len < (size_t)UINT_MAX, ... );
>>>      ::write( ..., (uint) (len & UINT_MAX));
>>>
>>> 2. You should check for n < len and if it is true,
>>> deal with errno. n = 0 is legitimate case,
>>> so assert is not necessary.
>>
>> I only think n = 0 is valid if write is called with length 0, which
>> write_internal will never do.
>> Otherwise, according to posix, n will be -1 if an error occurred, or
>> greater than zero if some bytes were written. [1]
>> If some bytes but not all were written then the while(len > 0) loop
>> will make sure we try to write the rest of the bytes.
>> It looks like windows write should never return 0 when len != 0
>> either. [2]
>>
>> I should however handle the -1 result with errno EINTR, working on a
>> new webrev.
>>
>> Thanks,
>> Andreas
>>
>> [1] http://pubs.opengroup.org/onlinepubs/9699919799/functions/write.html
>> If write() is interrupted by a signal before it writes any data, it
>> shall return -1 with errno set to [EINTR].
>> If write() is interrupted by a signal after it successfully writes
>> some data, it shall return the number of bytes written.
>>
>> [2] https://msdn.microsoft.com/en-us/library/1570wh78(v=vs.80).aspx
>>
>>> -Dmitry
>>>
>>> On 2015-12-28 17:02, Andreas Eriksson wrote:
>>>> Hi,
>>>>
>>>> Here is the webrev for type changes.
>>>> Top-repo:
>>>> http://cr.openjdk.java.net/~aeriksso/8129419/webrev.01/jdk9-hs-rt/
>>>> Hotspot:
>>>> http://cr.openjdk.java.net/~aeriksso/8129419/webrev.01/hotspot/
>>>>
>>>> The windows_x64 native write function uses a length of type uint, not
>>>> size_t. I added an ifdef for that case and handled it, but better
>>>> suggestions are welcome.
>>>>
>>>> Also found and fixed another problem in the hprof parser when skipping
>>>> over bytes.
>>>>
>>>> I've not included the tests, they have OOM issues on several JPRT
>>>> hosts,
>>>> and until I've figured out a way to fix that I wont be pushing them.
>>>>
>>>> Thanks,
>>>> Andreas
>>>>
>>>> On 2015-12-14 19:34, Andreas Eriksson wrote:
>>>>> Hi Dmitry, thanks for looking at this.
>>>>>
>>>>>
>>>>> On 2015-12-14 18:30, Dmitry Samersoff wrote:
>>>>>> Andreas,
>>>>>>
>>>>>> Nice cleanup.
>>>>>>
>>>>>> Some generic comments below.
>>>>>>
>>>>>> 1. It would be excellent if you can split webrev into two parts, one
>>>>>> part with types cleanup and other part with array truncation related
>>>>>> changes or ever push these changes separately as it address different
>>>>>> problems.
>>>>>>
>>>>>> Type cleanup could be reviewed quickly, but review of array
>>>>>> truncation
>>>>>> requires some time.
>>>>>>
>>>>>> (We already have two different CRs: JDK-8129419 for type cleanup and
>>>>>> JDK-8144732 for array truncation)
>>>>> Yes, that's a good point.
>>>>>
>>>>>>
>>>>>> 2.
>>>>>> it might be better to use size_t and jlong (or julong) across all
>>>>>> file
>>>>>> and get rid of all other types with a few exclusion.
>>>>> I'll see what I can do, and we can look at it closer once I've split
>>>>> the type changes into a separate webrev.
>>>>>
>>>>>> 3.
>>>>>> Each assert costs some time in nightly testing, so we probably don't
>>>>>> need as much asserts.
>>>>> Alright.
>>>>>
>>>>>> 4. write_internal:
>>>>>>
>>>>>>     There are couple of cases where ::write writes less bytes than
>>>>>> requested and doesn't return -1.
>>>>>>     So we should check if ::write returns a value less that len
>>>>>> and if it
>>>>>> happens deal with errno - either repeat entire write
>>>>>> attempt(EINTR/EAGAIN) or abort writing.
>>>>> Actually, I meant to ask about that, but forgot:
>>>>> I tried using os::write, which handles EINTR/EAGAIN if necessary
>>>>> (depending on platform), but Solaris has an assert that fails:
>>>>> http://hg.openjdk.java.net/jdk9/hs-rt/hotspot/file/5a42c1dde332/src/os/solaris/vm/os_solaris.cpp#l5692
>>>>>
>>>>>
>>>>> It checks that os::write is called by a JavaThread that is in_native,
>>>>> which we are not, since we are in the VM_thread doing a safepoint_op.
>>>>> Does anyone know if that assert is really needed? It's only done for
>>>>> Solaris.
>>>>>
>>>>>> 5. we should handle zero-length array in calculate_array_max_length -
>>>>>> it's a legitimate case
>>>>> Not sure what you mean here, I believe it does handle zero-length
>>>>> arrays.
>>>>> It should just fall through without taking any of the if-clauses.
>>>>> (Or do you mean that I should add a return immediately at the top if
>>>>> length is zero?)
>>>>>
>>>>>> 6. max_juint is less than SegmentedHeapDumpThreshold so non-segmented
>>>>>> heapdump can't contain huge array and it's better to check for
>>>>>> segmented
>>>>>> dump before any other checks.
>>>>> Correct me if I'm wrong here, but SegmentedHeapDumpThreshold could in
>>>>> theory be set so that we have a non-segmented heap dump while still
>>>>> having huge arrays.
>>>>> Not sure if this is worth taking into account, since it most likely
>>>>> would lead to other problems as well, and the flag is develop only, so
>>>>> it can't happen in product builds.
>>>>> What do you think would be best to do here?
>>>>>
>>>>> - Andreas
>>>>>
>>>>>> -Dmitry
>>>>>>
>>>>>>
>>>>>> On 2015-12-14 18:38, Andreas Eriksson wrote:
>>>>>>> Hi,
>>>>>>>
>>>>>>> Please review this fix for dumping of long arrays, and general
>>>>>>> cleanup
>>>>>>> of types in heapDumper.cpp.
>>>>>>>
>>>>>>> Problem:
>>>>>>> At several places in heapDumper.cpp overflows could happen when
>>>>>>> dumping
>>>>>>> long arrays.
>>>>>>> Also the hprof format uses an u4 as a record length field, but
>>>>>>> arrays
>>>>>>> can be longer than that (counted in bytes).
>>>>>>>
>>>>>>> Fix:
>>>>>>> Many types that were previously signed are changed to equivalent
>>>>>>> unsigned types and/or to a larger type to prevent overflow.
>>>>>>> The bulk of the change though is the addition of
>>>>>>> calculate_array_max_length, which for a given array returns the
>>>>>>> number
>>>>>>> of elements we can dump. That length is then used to truncate arrays
>>>>>>> that are too long.
>>>>>>> Whenever an array is truncated a warning is printed:
>>>>>>> Java HotSpot(TM) 64-Bit Server VM warning: cannot dump array of type
>>>>>>> object[] with length 1,073,741,823; truncating to length 536,870,908
>>>>>>>
>>>>>>> Much of the rest of the change is moving functions needed by
>>>>>>> calculate_array_max_length to the DumpWriter or DumperSupport
>>>>>>> class so
>>>>>>> that they can be accessed.
>>>>>>>
>>>>>>> Added a test that relies on the hprof parser, which also had a
>>>>>>> couple of
>>>>>>> overflow problems (top repo changes).
>>>>>>> I've also run this change against a couple of other tests, but
>>>>>>> they are
>>>>>>> problematic in JPRT because they are using large heaps and lots of
>>>>>>> disk.
>>>>>>>
>>>>>>> Bug:
>>>>>>> 8129419: heapDumper.cpp: assert(length_in_bytes > 0) failed:
>>>>>>> nothing to
>>>>>>> copy
>>>>>>> https://bugs.openjdk.java.net/browse/JDK-8129419
>>>>>>>
>>>>>>> Also fixed in this change is the problems seen in these two bugs:
>>>>>>> 8133317: Integer overflow in heapDumper.cpp leads to corrupt HPROF
>>>>>>> dumps
>>>>>>> https://bugs.openjdk.java.net/browse/JDK-8133317
>>>>>>>
>>>>>>> 8144732: VM_HeapDumper hits assert with bad dump_len
>>>>>>> https://bugs.openjdk.java.net/browse/JDK-8144732
>>>>>>>
>>>>>>> Webrev:
>>>>>>> Top repo:
>>>>>>> http://cr.openjdk.java.net/~aeriksso/8129419/webrev.00/jdk9-hs-rt/
>>>>>>> Hotspot:
>>>>>>> http://cr.openjdk.java.net/~aeriksso/8129419/webrev.00/hotspot/
>>>>>>>
>>>>>>> Regards,
>>>>>>> Andreas
>>>
>>
> 


-- 
Dmitry Samersoff
Oracle Java development team, Saint Petersburg, Russia
* I would love to change the world, but they won't give me the sources.

Reply via email to