Skip to content

Commit 5a23fd5

Browse files
committed
clear queue when socket.gaierror occurs
1 parent ace80f4 commit 5a23fd5

File tree

3 files changed

+42
-7
lines changed

3 files changed

+42
-7
lines changed

.gitignore

+2
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,5 @@
1010
/build
1111
/dist
1212
.idea/
13+
venv/
14+
env/

fluent/asyncsender.py

+22-6
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
# -*- coding: utf-8 -*-
22

3+
import socket
34
import threading
45
from queue import Queue, Full, Empty
56

@@ -81,11 +82,7 @@ def close(self, flush=True):
8182
return
8283
self._closed = True
8384
if not flush:
84-
while True:
85-
try:
86-
self._queue.get(block=False)
87-
except Empty:
88-
break
85+
self._clear_queue()
8986
self._queue.put(_TOMBSTONE)
9087
self._send_thread.join()
9188

@@ -101,6 +98,13 @@ def queue_blocking(self):
10198
def queue_circular(self):
10299
return self._queue_circular
103100

101+
def _clear_queue(self):
102+
while True:
103+
try:
104+
self._queue.get(block=False)
105+
except Empty:
106+
break
107+
104108
def _send(self, bytes_):
105109
with self.lock:
106110
if self._closed:
@@ -120,8 +124,20 @@ def _send(self, bytes_):
120124

121125
return True
122126

127+
def _send_internal(self, bytes_):
128+
send_internal_result = super(FluentSender, self)._send_internal(bytes_)
129+
if send_internal_result is False:
130+
# when send_result is False, super() caught socket.error
131+
# and assigned the error to self.last_error
132+
if isinstance(self.last_error, socket.gaierror):
133+
# clear the queue to avoid blocking and print the log
134+
self._clear_queue()
135+
print("%s. Please check address: (%s, %s)" % (str(self.last_error), self.host, self.port))
136+
137+
return send_internal_result
138+
123139
def _send_loop(self):
124-
send_internal = super(FluentSender, self)._send_internal
140+
send_internal = self._send_internal
125141

126142
try:
127143
while True:

tests/test_asyncsender.py

+18-1
Original file line numberDiff line numberDiff line change
@@ -330,7 +330,6 @@ def test_simple(self):
330330

331331

332332
class TestSenderUnlimitedSize(unittest.TestCase):
333-
Q_SIZE = 3
334333

335334
def setUp(self):
336335
super(TestSenderUnlimitedSize, self).setUp()
@@ -374,3 +373,21 @@ def test_simple(self):
374373
eq(3, len(el))
375374
eq("test.foo{}".format(NUM), el[0])
376375
eq({'bar': "baz{}".format(NUM)}, el[2])
376+
377+
378+
class TestSenderSocketGaierror(unittest.TestCase):
379+
def setUp(self):
380+
super(TestSenderSocketGaierror, self).setUp()
381+
self._sender = fluent.asyncsender.FluentSender(host='localhost_error', tag='test')
382+
383+
def tearDown(self):
384+
self._sender.close()
385+
386+
def test_simple(self):
387+
with self._sender as sender:
388+
for _ in range(100):
389+
sender._queue.put(b"1")
390+
391+
sender._queue.put(fluent.asyncsender._TOMBSTONE)
392+
393+
self.assertEqual(self._sender._queue.qsize(), 0)

0 commit comments

Comments
 (0)