Skip to content

Commit e390400

Browse files
Stephen HawkinsStephen Hawkins
authored andcommitted
fix: Don't overwrite base logging Handler class lock var
1 parent b2af948 commit e390400

File tree

2 files changed

+20
-7
lines changed

2 files changed

+20
-7
lines changed

logdna/logdna.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ def __init__(self, key, options={}):
7474
max_workers=self.max_concurrent_requests)
7575

7676
self.setLevel(logging.DEBUG)
77-
self.lock = threading.RLock()
77+
self._lock = threading.RLock()
7878

7979
self.flusher = None
8080

@@ -100,7 +100,7 @@ def buffer_log(self, message):
100100

101101
def buffer_log_sync(self, message):
102102
# Attempt to acquire lock to write to buffer
103-
if self.lock.acquire(blocking=True):
103+
if self._lock.acquire(blocking=True):
104104
try:
105105
msglen = len(message['line'])
106106
if self.buf_size + msglen < self.buf_retention_limit:
@@ -119,7 +119,7 @@ def buffer_log_sync(self, message):
119119
except Exception as e:
120120
self.internalLogger.exception(f'Error in buffer_log_sync: {e}')
121121
finally:
122-
self.lock.release()
122+
self._lock.release()
123123

124124
def flush(self):
125125
self.schedule_flush_sync()
@@ -137,18 +137,18 @@ def schedule_flush_sync(self, should_block=False):
137137

138138
def try_lock_and_do_flush_request(self, should_block=False):
139139
local_buf = []
140-
if self.lock.acquire(blocking=should_block):
140+
if self._lock.acquire(blocking=should_block):
141141
if not self.buf:
142142
self.close_flusher()
143-
self.lock.release()
143+
self._lock.release()
144144
return
145145

146146
local_buf = self.buf.copy()
147147
self.buf.clear()
148148
self.buf_size = 0
149149
if local_buf:
150150
self.close_flusher()
151-
self.lock.release()
151+
self._lock.release()
152152

153153
if local_buf:
154154
self.try_request(local_buf)
@@ -351,4 +351,5 @@ def close(self):
351351
if self.request_thread_pool:
352352
self.request_thread_pool.shutdown(wait=True)
353353
self.request_thread_pool = None
354+
354355
logging.Handler.close(self)

tests/test_logger.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -255,15 +255,27 @@ def test_close(self):
255255
handler = LogDNAHandler(LOGDNA_API_KEY, sample_options)
256256
close_flusher_mock = unittest.mock.Mock()
257257
close_flusher_mock.side_effect = handler.close_flusher
258-
handler.close_flusher = close_flusher_mock
259258
handler.schedule_flush_sync = unittest.mock.Mock()
259+
handler.close_flusher = close_flusher_mock
260260
handler.close()
261261
handler.close_flusher.assert_called_once_with()
262262
handler.schedule_flush_sync.assert_called_once_with(
263263
should_block=True)
264264
self.assertIsNone(handler.worker_thread_pool)
265265
self.assertIsNone(handler.request_thread_pool)
266266

267+
# These should be separate objects, since there is already
268+
# a variable in the base class named self.lock. We want
269+
# to make sure that a separate lock is created for the
270+
# locking semantics of the LogDNA Handler
271+
def test_lock_var_separate_from_local_lock_var(self):
272+
handler = LogDNAHandler(LOGDNA_API_KEY, sample_options)
273+
self.assertIsNotNone(handler)
274+
275+
# Test that we did not replace the base class' instance var.
276+
self.assertIsNotNone(handler._lock)
277+
self.assertIsNotNone(handler.lock)
278+
267279
def test_flush(self):
268280
handler = LogDNAHandler(LOGDNA_API_KEY, sample_options)
269281
handler.worker_thread_pool = MockThreadPoolExecutor()

0 commit comments

Comments
 (0)