Skip to content

Commit

Permalink
Documentation: add caveats about I/O buffering for check-{attr,ignore}
Browse files Browse the repository at this point in the history
check-attr and check-ignore have the potential to deadlock callers
which do not read back the output in real-time.  For example, if a
caller writes N paths out and then reads N lines back in, it risks
becoming blocked on write() to check-*, and check-* is blocked on
write back to the caller.  Somebody has to buffer; the pipe buffers
provide some leeway, but they are limited.

Thanks to Peff for pointing this out:

    http://article.gmane.org/gmane.comp.version-control.git/220534

Signed-off-by: Adam Spiers <[email protected]>
Signed-off-by: Junio C Hamano <[email protected]>
  • Loading branch information
aspiers authored and gitster committed Apr 11, 2013
1 parent 0c8e8c0 commit f1ed7fe
Show file tree
Hide file tree
Showing 3 changed files with 13 additions and 2 deletions.
5 changes: 5 additions & 0 deletions Documentation/git-check-attr.txt
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,11 @@ being queried and <info> can be either:
'set';; when the attribute is defined as true.
<value>;; when a value has been assigned to the attribute.

Buffering happens as documented under the `GIT_FLUSH` option in
linkgit:git[1]. The caller is responsible for avoiding deadlocks
caused by overfilling an input buffer or reading from an empty output
buffer.

EXAMPLES
--------

Expand Down
5 changes: 5 additions & 0 deletions Documentation/git-check-ignore.txt
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,11 @@ not. (Without this option, it would be impossible to tell whether the
absence of output for a given file meant that it didn't match any
pattern, or that the output hadn't been generated yet.)

Buffering happens as documented under the `GIT_FLUSH` option in
linkgit:git[1]. The caller is responsible for avoiding deadlocks
caused by overfilling an input buffer or reading from an empty output
buffer.

EXIT STATUS
-----------

Expand Down
5 changes: 3 additions & 2 deletions Documentation/git.txt
Original file line number Diff line number Diff line change
Expand Up @@ -771,8 +771,9 @@ for further details.
'GIT_FLUSH'::
If this environment variable is set to "1", then commands such
as 'git blame' (in incremental mode), 'git rev-list', 'git log',
and 'git whatchanged' will force a flush of the output stream
after each commit-oriented record have been flushed. If this
'git check-attr', 'git check-ignore', and 'git whatchanged' will
force a flush of the output stream after each record have been
flushed. If this
variable is set to "0", the output of these commands will be done
using completely buffered I/O. If this environment variable is
not set, git will choose buffered or record-oriented flushing
Expand Down

0 comments on commit f1ed7fe

Please sign in to comment.