Don’t block on write if we’ve been killed #163
+35
−29
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Hi - I've been debugging this issue and fixed it with the changes in this pull request. I'm a bit new to go - so forgive me If I misunderstand, but here's what happened.
Quick context first: I am using hpcloud/tail in my component, called "CsvTail" which tails a file, parses the CSV records in that file, and only stops when it encounters the NUL byte at the beginning of a line. The CSV files are streamed and written by another service, which uses the NUL byte to indicate the end of the file.
The code would sometimes deadlock when calling tail.Stop(). Stop() internally calls tail.Wait(), which waits for the tomb to be declared as dead.
What happens is that another line comes in after my read of the NUL byte, but before my Stop() call, causing the tail library to block on this line.
Tail would never reach the end of tailFileSync() where it checks for tail.Dying(), returns, and sets the tomb as Done().
My fix is to add a select and "cancel" the write if the tomb enters dying state.
Not sure if this is right though let me know if I'm misunderstanding or misusing the library.
Best,
Paul