[jdk17u-dev] RFR: 8312065: Socket.connect does not timeout when profiling [v4]
Paul Hohensee
phh at openjdk.org
Thu Sep 7 18:37:51 UTC 2023
On Wed, 6 Sep 2023 02:52:13 GMT, Long Yang <duke at openjdk.org> wrote:
>> Hi all,
>>
>> This pull request contains a fix for [JDK-8312065](https://bugs.openjdk.org/browse/JDK-8312065).
>>
>> The old SocketImpl is still present in JDK 17, can be enabled with -Djdk.net.usePlainSocketImpl.
>>
>> I have verified that this problem exists on Linux and macOS, and I feel that it also exists on AIX,
>> so I repaired these 3 platforms. Windows implementations are different, so don't have this problem.
>>
>> All callers of NET_Poll() already check for EINTR, so the fix is to remove do-while loop in the implementation of NET_Poll().
>>
>> Other methods, such as NET_Read, NET_NonBlockingRead, NET_Accept, NET_Connect, are not affected.
>> Because if Socket has timeout, it will call NET_Timeout first, and then call them. NET_Timeout has a correct timeout implementation and is not affected by profiling signals.
>> If the Socket does not have a timeout, and if the system call is interrupted by a signal, the [Linux Kernel will automatically retry](https://man7.org/linux/man-pages/man7/signal.7.html), and the application code will not be aware of it.
>>
>> Thanks!
>
> Long Yang has updated the pull request incrementally with one additional commit since the last revision:
>
> push to trigger github workflows
Code duplication is the source of many bugs, so instead of duplicating the macro code inline, add a RETRY macro argument, vis,
#define BLOCKING_IO_RETURN_INT(FD, FUNC, RETRY) { \
int ret; \
threadEntry_t self; \
fdEntry_t *fdEntry = getFdEntry(FD); \
if (fdEntry == NULL) { \
errno = EBADF; \
return -1; \
} \
do { \
startOp(fdEntry, &self); \
ret = FUNC; \
endOp(fdEntry, &self); \
} while ((RETRY) && ret == -1 && errno == EINTR); \
return ret; \
}
Then, add "true" as the last argument to all invocations of the macro, except the one in NET_Poll, which becomes
int NET_Poll(struct pollfd *ufds, unsigned int nfds, int timeout) {
BLOCKING_IO_RETURN_INT( ufds[0].fd, poll(ufds, nfds, timeout), false );
}
-------------
Changes requested by phh (Reviewer).
PR Review: https://git.openjdk.org/jdk17u-dev/pull/1639#pullrequestreview-1616030523
More information about the jdk-updates-dev
mailing list