Skip to content

Commit 9a5ded5

Browse files
author
A. Jesse Jiryu Davis
committed
Raise InvalidOperation if monitor thread is dead.
1 parent 6a88ac7 commit 9a5ded5

File tree

2 files changed

+16
-12
lines changed

2 files changed

+16
-12
lines changed

pymongo/mongo_replica_set_client.py

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,8 @@
5656
ConnectionFailure,
5757
DuplicateKeyError,
5858
InvalidDocument,
59-
OperationFailure)
59+
OperationFailure,
60+
InvalidOperation)
6061

6162
EMPTY = b("")
6263
MAX_BSON_SIZE = 4 * 1024 * 1024
@@ -282,6 +283,10 @@ def shutdown(self, dummy=None):
282283
def schedule_refresh(self):
283284
"""Refresh immediately
284285
"""
286+
if not self.isAlive():
287+
raise InvalidOperation(
288+
"Monitor thread is dead: Perhaps started before a fork?")
289+
285290
self.refreshed.clear()
286291
self.event.set()
287292

@@ -313,8 +318,11 @@ def monitor(self):
313318
except:
314319
break
315320

321+
def isAlive(self):
322+
raise NotImplementedError()
316323

317-
class MonitorThread(Monitor, threading.Thread):
324+
325+
class MonitorThread(threading.Thread, Monitor):
318326
"""Thread based replica set monitor.
319327
"""
320328
def __init__(self, rsc):
@@ -325,14 +333,6 @@ def __init__(self, rsc):
325333
# Track whether the thread has started. (Greenlets track this already.)
326334
self.started = False
327335

328-
def schedule_refresh(self):
329-
"""Override Monitor's schedule_refresh method
330-
raise exception as warning if thread is dead
331-
"""
332-
if not self.isAlive():
333-
raise Exception("Monitor thread died unexpectedly, used with fork?")
334-
super(MonitorThread, self).schedule_refresh()
335-
336336
def start(self):
337337
self.started = True
338338
super(MonitorThread, self).start()
@@ -367,6 +367,10 @@ def _run(self):
367367
"""
368368
self.monitor()
369369

370+
def isAlive(self):
371+
# Gevent defines bool(Greenlet) as True if it's alive.
372+
return bool(self)
373+
370374
except ImportError:
371375
pass
372376

test/test_replica_set_client.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@
4545
ConfigurationError,
4646
ConnectionFailure,
4747
InvalidName,
48-
OperationFailure)
48+
OperationFailure, InvalidOperation)
4949
from test import version, port, pair
5050
from test.utils import (
5151
delay, assertReadFrom, assertReadFromAll, read_from_which_host,
@@ -580,7 +580,7 @@ def test_fork_and_schedule_refresh(self):
580580
def f(pipe):
581581
try:
582582
# Trigger a refresh.
583-
self.assertRaises(Exception, client.disconnect)
583+
self.assertRaises(InvalidOperation, client.disconnect)
584584
except:
585585
traceback.print_exc()
586586
pipe.send(True)

0 commit comments

Comments
 (0)