56
56
ConnectionFailure ,
57
57
DuplicateKeyError ,
58
58
InvalidDocument ,
59
- OperationFailure )
59
+ OperationFailure ,
60
+ InvalidOperation )
60
61
61
62
EMPTY = b ("" )
62
63
MAX_BSON_SIZE = 4 * 1024 * 1024
@@ -282,6 +283,10 @@ def shutdown(self, dummy=None):
282
283
def schedule_refresh (self ):
283
284
"""Refresh immediately
284
285
"""
286
+ if not self .isAlive ():
287
+ raise InvalidOperation (
288
+ "Monitor thread is dead: Perhaps started before a fork?" )
289
+
285
290
self .refreshed .clear ()
286
291
self .event .set ()
287
292
@@ -313,8 +318,11 @@ def monitor(self):
313
318
except :
314
319
break
315
320
321
+ def isAlive (self ):
322
+ raise NotImplementedError ()
316
323
317
- class MonitorThread (Monitor , threading .Thread ):
324
+
325
+ class MonitorThread (threading .Thread , Monitor ):
318
326
"""Thread based replica set monitor.
319
327
"""
320
328
def __init__ (self , rsc ):
@@ -325,14 +333,6 @@ def __init__(self, rsc):
325
333
# Track whether the thread has started. (Greenlets track this already.)
326
334
self .started = False
327
335
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
-
336
336
def start (self ):
337
337
self .started = True
338
338
super (MonitorThread , self ).start ()
@@ -367,6 +367,10 @@ def _run(self):
367
367
"""
368
368
self .monitor ()
369
369
370
+ def isAlive (self ):
371
+ # Gevent defines bool(Greenlet) as True if it's alive.
372
+ return bool (self )
373
+
370
374
except ImportError :
371
375
pass
372
376
0 commit comments