Add Wait
to binaryProcessor
Add exported `Wait(ctx context.Context) error` interface that waits on the underlying command (or context cancellation) and returns the error. This fixes a race condition between `.wait()` and `.Err error`: https://github.com/containerd/containerd/issues/6914 Signed-off-by: Hamza El-Saawy <hamzaelsaawy@microsoft.com>
This commit is contained in:
parent
1e749e5f04
commit
ad8b87ba23
@ -89,6 +89,7 @@ func NewBinaryProcessor(ctx context.Context, imt, rmt string, stream StreamProce
|
|||||||
r: r,
|
r: r,
|
||||||
mt: rmt,
|
mt: rmt,
|
||||||
stderr: stderr,
|
stderr: stderr,
|
||||||
|
done: make(chan struct{}),
|
||||||
}
|
}
|
||||||
go p.wait()
|
go p.wait()
|
||||||
|
|
||||||
@ -111,6 +112,11 @@ type binaryProcessor struct {
|
|||||||
|
|
||||||
mu sync.Mutex
|
mu sync.Mutex
|
||||||
err error
|
err error
|
||||||
|
|
||||||
|
// There is a race condition between waiting on c.cmd.Wait() and setting c.err within
|
||||||
|
// c.wait(), and reading that value from c.Err().
|
||||||
|
// Use done to wait for the returned error to be captured and set.
|
||||||
|
done chan struct{}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *binaryProcessor) Err() error {
|
func (c *binaryProcessor) Err() error {
|
||||||
@ -127,6 +133,16 @@ func (c *binaryProcessor) wait() {
|
|||||||
c.mu.Unlock()
|
c.mu.Unlock()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
close(c.done)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *binaryProcessor) Wait(ctx context.Context) error {
|
||||||
|
select {
|
||||||
|
case <-c.done:
|
||||||
|
return c.Err()
|
||||||
|
case <-ctx.Done():
|
||||||
|
return ctx.Err()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *binaryProcessor) File() *os.File {
|
func (c *binaryProcessor) File() *os.File {
|
||||||
|
@ -98,6 +98,7 @@ func NewBinaryProcessor(ctx context.Context, imt, rmt string, stream StreamProce
|
|||||||
r: r,
|
r: r,
|
||||||
mt: rmt,
|
mt: rmt,
|
||||||
stderr: stderr,
|
stderr: stderr,
|
||||||
|
done: make(chan struct{}),
|
||||||
}
|
}
|
||||||
go p.wait()
|
go p.wait()
|
||||||
|
|
||||||
@ -117,6 +118,11 @@ type binaryProcessor struct {
|
|||||||
|
|
||||||
mu sync.Mutex
|
mu sync.Mutex
|
||||||
err error
|
err error
|
||||||
|
|
||||||
|
// There is a race condition between waiting on c.cmd.Wait() and setting c.err within
|
||||||
|
// c.wait(), and reading that value from c.Err().
|
||||||
|
// Use done to wait for the returned error to be captured and set.
|
||||||
|
done chan struct{}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *binaryProcessor) Err() error {
|
func (c *binaryProcessor) Err() error {
|
||||||
@ -133,6 +139,16 @@ func (c *binaryProcessor) wait() {
|
|||||||
c.mu.Unlock()
|
c.mu.Unlock()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
close(c.done)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *binaryProcessor) Wait(ctx context.Context) error {
|
||||||
|
select {
|
||||||
|
case <-c.done:
|
||||||
|
return c.Err()
|
||||||
|
case <-ctx.Done():
|
||||||
|
return ctx.Err()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *binaryProcessor) File() *os.File {
|
func (c *binaryProcessor) File() *os.File {
|
||||||
|
Loading…
Reference in New Issue
Block a user