Skip to content

Commit 96a54cb

Browse files
author
Mahmood Ali
committed
locking and opening streams in goroutine comment
1 parent 316a161 commit 96a54cb

File tree

1 file changed

+15
-2
lines changed

1 file changed

+15
-2
lines changed

drivers/docker/docklog/docker_logger.go

+15-2
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ func (d *dockerLogger) Start(opts *StartOpts) error {
7878
go func() {
7979
defer close(d.doneCh)
8080

81-
stdout, stderr, err := d.openStreams(opts)
81+
stdout, stderr, err := d.openStreams(ctx, opts)
8282
if err != nil {
8383
d.logger.Error("log streaming ended with terminal error", "error", err)
8484
return
@@ -132,7 +132,9 @@ func (d *dockerLogger) Start(opts *StartOpts) error {
132132

133133
}
134134

135-
func (d *dockerLogger) openStreams(opts *StartOpts) (stdout, stderr io.WriteCloser, err error) {
135+
// openStreams open logger stdout/stderr; should be called in a background goroutine to avoid locking up
136+
// process to avoid locking goroutine process
137+
func (d *dockerLogger) openStreams(ctx context.Context, opts *StartOpts) (stdout, stderr io.WriteCloser, err error) {
136138
d.stdLock.Lock()
137139
stdoutF, stderrF := d.stdout, d.stderr
138140
d.stdLock.Unlock()
@@ -141,6 +143,10 @@ func (d *dockerLogger) openStreams(opts *StartOpts) (stdout, stderr io.WriteClos
141143
return stdoutF, stderrF, nil
142144
}
143145

146+
// opening a fifo may block indefinitely until a reader end opens, so
147+
// we preform open() without holding the stdLock, so Stop and interleave.
148+
// This a defensive measure - logmon (the reader end) should be up and
149+
// started before dockerLogger is started
144150
if stdoutF == nil {
145151
stdoutF, err = fifo.OpenWriter(opts.Stdout)
146152
if err != nil {
@@ -155,6 +161,13 @@ func (d *dockerLogger) openStreams(opts *StartOpts) (stdout, stderr io.WriteClos
155161
}
156162
}
157163

164+
if ctx.Err() != nil {
165+
// Stop was called and don't need files anymore
166+
stdoutF.Close()
167+
stderrF.Close()
168+
return nil, nil, ctx.Err()
169+
}
170+
158171
d.stdLock.Lock()
159172
d.stdout, d.stderr = stdoutF, stderrF
160173
d.stdLock.Unlock()

0 commit comments

Comments
 (0)