Merge pull request #189 from 9seconds/relay-close-racecondition

Fix race condition in closing a relay
This commit is contained in:
Sergey Arkhipov
2021-05-07 11:40:06 +03:00
committed by GitHub
+5 -4
View File
@@ -68,11 +68,12 @@ func (r *Relay) Process(eastConn, westConn io.ReadWriteCloser) error {
func (r *Relay) transmit(src io.ReadCloser, dst io.WriteCloser, func (r *Relay) transmit(src io.ReadCloser, dst io.WriteCloser,
buffer []byte, direction string, wg *sync.WaitGroup) { buffer []byte, direction string, wg *sync.WaitGroup) {
defer wg.Done()
defer func() { defer func() {
r.ctxCancel()
src.Close() src.Close()
dst.Close() dst.Close()
wg.Done()
r.ctxCancel()
}() }()
if _, err := io.CopyBuffer(dst, src, buffer); err != nil { if _, err := io.CopyBuffer(dst, src, buffer); err != nil {
@@ -92,6 +93,8 @@ func (r *Relay) transmit(src io.ReadCloser, dst io.WriteCloser,
} }
func (r *Relay) runObserver(one, another io.Closer, wg *sync.WaitGroup) { func (r *Relay) runObserver(one, another io.Closer, wg *sync.WaitGroup) {
defer wg.Done()
ticker := time.NewTicker(time.Second) ticker := time.NewTicker(time.Second)
defer func() { defer func() {
@@ -104,8 +107,6 @@ func (r *Relay) runObserver(one, another io.Closer, wg *sync.WaitGroup) {
case <-ticker.C: case <-ticker.C:
default: default:
} }
wg.Done()
}() }()
lastTickAt := time.Now() lastTickAt := time.Now()