Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit e45069a

Browse files
author
saville
committed
Fix 66568: Prevent unclosed TCP channels and avoid additional errors
1 parent 7e5c150 commit e45069a

File tree

3 files changed

+18
-3
lines changed

3 files changed

+18
-3
lines changed

changelog/66568.fixed.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fix closing of TCP transport channels and avoid additional errors

salt/channel/client.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -559,7 +559,8 @@ def connect_callback(self, result):
559559
# may have been restarted
560560
yield self.send_id(self.token, self._reconnected)
561561
self.connected = True
562-
self.event.fire_event({"master": self.opts["master"]}, "__master_connected")
562+
if self.event:
563+
self.event.fire_event({"master": self.opts["master"]}, "__master_connected")
563564
if self._reconnected:
564565
# On reconnects, fire a master event to notify that the minion is
565566
# available.

salt/transport/tcp.py

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,6 @@ def __init__(self, opts, io_loop, **kwargs): # pylint: disable=W0231
224224
self.connected = False
225225
self._closing = False
226226
self._stream = None
227-
self._closing = False
228227
self._closed = False
229228
self.backoff = opts.get("tcp_reconnect_backoff", 1)
230229
self.resolver = kwargs.get("resolver")
@@ -1723,6 +1722,7 @@ def __init__(self, opts, io_loop, **kwargs): # pylint: disable=W0231
17231722
self._closed = False
17241723
self._stream_return_running = False
17251724
self._stream = None
1725+
self.task = None
17261726
self.disconnect_callback = _null_callback
17271727
self.connect_callback = _null_callback
17281728
self.backoff = opts.get("tcp_reconnect_backoff", 1)
@@ -1791,7 +1791,7 @@ async def _stream_return(self):
17911791
message_id,
17921792
)
17931793
except tornado.iostream.StreamClosedError as e:
1794-
log.error(
1794+
log.debug(
17951795
"tcp stream to %s:%s closed, unable to recv",
17961796
self.host,
17971797
self.port,
@@ -1833,6 +1833,8 @@ async def _stream_return(self):
18331833
stream.close()
18341834
unpacker = salt.utils.msgpack.Unpacker()
18351835
await self.connect()
1836+
except asyncio.CancelledError:
1837+
log.debug("Stream return cancelled")
18361838
self._stream_return_running = False
18371839

18381840
def _message_id(self):
@@ -1881,9 +1883,20 @@ async def _do_send():
18811883
def close(self):
18821884
if self._closing:
18831885
return
1886+
self._closing = True
18841887
if self._stream is not None:
18851888
self._stream.close()
18861889
self._stream = None
1890+
if self.task:
1891+
self.task.cancel()
1892+
# Wait for the task to finish via asyncio
1893+
group = asyncio.gather(self.task)
1894+
try:
1895+
self.task.get_loop().run_until_complete(group)
1896+
except RuntimeError:
1897+
# Ignore event loop was already running message
1898+
pass
1899+
self.task = None
18871900

18881901

18891902
class TCPReqClient(RequestClient):

0 commit comments

Comments
 (0)