(Round 2) RFR(s): 8150460: (linux|bsd|aix)_close.c: file descriptor table may become large or may not work at all

Dmitry Samersoff dmitry.samersoff at oracle.com
Wed Apr 13 10:00:04 UTC 2016


Thomas,

Looks good for me!

-Dmitry


On 2016-04-13 12:12, Thomas Stüfe wrote:
> Hi Roger, Dmitry,
> 
> May I ask you both to have a last look at this change before I commit?
> It took a while for this to go through our internal tests, hence the delay.
> 
> New
> version: http://cr.openjdk.java.net/~stuefe/webrevs/8150460-linux_close-fdTable/webrev.03/webrev/
> Delta to last
> version: http://cr.openjdk.java.net/~stuefe/webrevs/8150460-linux_close-fdTable/webrev.02-webrev.03/webrev/
> 
> The changes are mostly cosmetic:
> 
> - I tweaked a number of comments to make them clearer
> - If getrlimit(RLIMIT_NOFILE) returns an error, I now handle this correctly.
> - Just for readability, I explicitly initialize global variables instead
> of relying on static zero-initialization.
> - As Roger requested, I changed accesses to the entry table elements
> from using implicit pointer arithmetic to explicit array accesses with "&".
> 
> Thank you for your time!
> 
> Kind Regards, Thomas
> 
> On Sat, Mar 12, 2016 at 8:38 AM, Thomas Stüfe <thomas.stuefe at gmail.com
> <mailto:thomas.stuefe at gmail.com>> wrote:
> 
>     Thank you Roger!
> 
>     On Fri, Mar 11, 2016 at 4:26 PM, Roger Riggs <Roger.Riggs at oracle.com
>     <mailto:Roger.Riggs at oracle.com>> wrote:
> 
>         Hi Thomas,
> 
>         When returning the address of the fdentry, the style using
>         &fdTable[fd] is preferred over
>         the implicit pointer arithmetic (as it was in the previous version).
> 
>         Occurs in all 3 deltas:
> 
>         src/java.base/*/native/libnet/*_close.c:
>         +        result = fdTable + fd;
> 
>         and
>         +        result = fdOverflowTable[rootindex] + slabindex;
> 
>         The rest looks fine.
> 
>         Thanks, Roger
> 
> 
> 
> 
>         On 3/10/2016 7:59 AM, Thomas Stüfe wrote:
> 
>             Thank you Dmitry!
> 
>             I will fix the typo before comitting.
> 
>             Kind Regards, Thomas
> 
>             On Thu, Mar 10, 2016 at 9:19 AM, Dmitry Samersoff <
>             dmitry.samersoff at oracle.com
>             <mailto:dmitry.samersoff at oracle.com>> wrote:
> 
>                 Thomas,
> 
>                 Looks good for me. But please wait for someone from
>                 core-libs team.
> 
>                 PS: Could you also fix a typeo at 79, 51, 53?
> 
>                      s/initialized/initialization/
> 
>                   51  * Heap allocated during initialization - one entry
>                 per fd
> 
>                 -Dmitry
> 
>                 On 2016-03-10 10:59, Thomas Stüfe wrote:
> 
>                     Hi,
> 
>                     may I have a review of this new iteration for this fix?
> 
>                     Thank you!
> 
>                     Thomas
> 
>                     On Thu, Mar 3, 2016 at 5:26 PM, Thomas Stüfe
>                     <thomas.stuefe at gmail.com
>                     <mailto:thomas.stuefe at gmail.com>>
>                     wrote:
> 
>                         Hi all,
> 
>                         https://bugs.openjdk.java.net/browse/JDK-8150460
> 
>                         thanks to all who took the time to review the
>                         first version of this fix!
> 
>                         This is the new version:
> 
> 
> 
>                 http://cr.openjdk.java.net/~stuefe/webrevs/8150460-linux_close-fdTable/webrev.02/webrev/
> 
>                         I reworked the fix, trying to add in all the
>                         input I got: This fix uses
> 
>                 a
> 
>                         simple one-dimensional array, preallocated at
>                         startup, for low-value
> 
>                 file
> 
>                         descriptors. Like the code did before. Only for
>                         large values of file
>                         descriptors it switches to an overflow table,
>                         organized as two
> 
>                 dimensional
> 
>                         sparse array of fixed sized slabs, which are
>                         allocated on demand. Only
> 
>                 the
> 
>                         overflow table is protected by a lock.
> 
>                         For 99% of all cases we will be using the plain
>                         simple fdTable structure
>                         as before. Only for unusually large file
>                         descriptor values we will be
> 
>                 using
> 
>                         this overflow table.
> 
>                         Memory footprint is kept low: for small values
>                         of RLIMIT_NOFILE, we will
>                         only allocate as much space as we need. Only if
>                         file descriptor values
> 
>                 get
> 
>                         large, memory is allocated in the overflow table.
> 
>                         Note that I avoided the proposed double-checked
>                         locking solution: I find
>                         it too risky in this place and also unnecessary.
>                         When calling
> 
>                 getFdEntry(),
> 
>                         we will be executing a blocking IO operation
>                         afterwards, flanked by two
>                         mutex locks (in startOp and endOp). So, I do not
>                         think the third mutex
> 
>                 lock
> 
>                         in getFdEntry will add much, especially since it
>                         is only used in case of
>                         larger file descriptor values.
> 
>                         I also added the fix to bsd_close.c and
>                         aix_close.c. I do not like this
>                         code triplication. I briefly played around with
>                         unifying this code, but
>                         this is more difficult than it seems:
>                         implementations subtly differ
> 
>                 between
> 
>                         the three platforms, and solaris implementation
>                         is completely
> 
>                 different. It
> 
>                         may be a worthwhile cleanup, but that would be a
>                         separate issue.
> 
>                         I did some artificial tests to check how the
>                         code does with many and
> 
>                 large
> 
>                         file descriptor values, all seemed to work well.
>                         I also ran java/net
> 
>                 jtreg
> 
>                         tests on Linux and AIX.
> 
>                         Kind Regards, Thomas
> 
> 
> 
>                 --
>                 Dmitry Samersoff
>                 Oracle Java development team, Saint Petersburg, Russia
>                 * I would love to change the world, but they won't give
>                 me the sources.
> 
> 
> 
> 


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



More information about the core-libs-dev mailing list