[ https://issues.apache.org/jira/browse/KUDU-3645?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Alexey Serbin resolved KUDU-3645. --------------------------------- Fix Version/s: 1.18.0 Resolution: Fixed > Do not retry close() syscall on EINTR > ------------------------------------- > > Key: KUDU-3645 > URL: https://issues.apache.org/jira/browse/KUDU-3645 > Project: Kudu > Issue Type: Improvement > Components: client, master, subprocess, test, tserver > Reporter: Alexey Serbin > Assignee: Alexey Serbin > Priority: Major > Fix For: 1.18.0 > > > It's not a good idea to retry calling close() on EINTR, at least on Linux and > other Unices except for HP-UX. In case of a multiple running threads and a > lot of concurrency with opening/closing files, sockets, etc. it might lead to > unexpected closure of descriptors that aren't supposed to be closed yet. > > Similar issue has been addressed in the Boost library > \[[1|https://github.com/boostorg/beast/issues/1445]\] > \[[2|https://github.com/boostorg/beast/commit/0ce8ebbef]\]. It's a well known > issue and it's been discussed a long time ago > \[[3|https://lwn.net/Articles/576478/]\]. Also, it's well documented in the > manual page \[[4|https://man7.org/linux/man-pages/man2/close.2.html]\]: > {noformat} > Dealing with error returns from close() > ... > The EINTR error is a somewhat special case. Regarding the EINTR > error, POSIX.1-2008 says: > If close() is interrupted by a signal that is to be caught, > it shall return -1 with errno set to EINTR and the state of > fildes is unspecified. > This permits the behavior that occurs on Linux and many other > implementations, where, as with other errors that may be reported > by close(), the file descriptor is guaranteed to be closed. > However, it also permits another possibility: that the > implementation returns an EINTR error and keeps the file > descriptor open. (According to its documentation, HP-UX's close() > does this.) The caller must then once more use close() to close > the file descriptor, to avoid file descriptor leaks. This > divergence in implementation behaviors provides a difficult hurdle > for portable applications, since on many implementations, close() > must not be called again after an EINTR error, and on at least > one, close() must be called again. There are plans to address > this conundrum for the next major release of the POSIX.1 standard. > {noformat} > # https://github.com/boostorg/beast/issues/1445 > # https://github.com/boostorg/beast/commit/0ce8ebbef > # https://lwn.net/Articles/576478/ > # https://man7.org/linux/man-pages/man2/close.2.html -- This message was sent by Atlassian Jira (v8.20.10#820010)