mirror of
git://sourceware.org/git/lvm2.git
synced 2024-12-21 13:34:40 +03:00
lvmdbusd: Exit daemon when unable to retrieve state
In some cases we get stuck where we are unable to retrieve the current state of lvm as we are encountering an error. When the error is persistent we will log and exit the daemon instead of consuming vast amounts of resources. Signed-off-by: Tony Asleson <tasleson@redhat.com>
This commit is contained in:
parent
3320ab8334
commit
ab1f1a306b
@ -87,3 +87,13 @@ blackbox = None
|
|||||||
|
|
||||||
# RequestEntry ctor
|
# RequestEntry ctor
|
||||||
create_request_entry = None
|
create_request_entry = None
|
||||||
|
|
||||||
|
|
||||||
|
def exit_daemon():
|
||||||
|
"""
|
||||||
|
Exit the daemon cleanly
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
|
if run and loop:
|
||||||
|
run.value = 0
|
||||||
|
loop.quit()
|
||||||
|
@ -14,6 +14,7 @@ from . import cfg
|
|||||||
from .utils import MThreadRunner, log_debug, log_error
|
from .utils import MThreadRunner, log_debug, log_error
|
||||||
import threading
|
import threading
|
||||||
import queue
|
import queue
|
||||||
|
import time
|
||||||
import traceback
|
import traceback
|
||||||
|
|
||||||
|
|
||||||
@ -82,6 +83,8 @@ class StateUpdate(object):
|
|||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def update_thread(obj):
|
def update_thread(obj):
|
||||||
|
exception_count = 0
|
||||||
|
|
||||||
queued_requests = []
|
queued_requests = []
|
||||||
while cfg.run.value != 0:
|
while cfg.run.value != 0:
|
||||||
# noinspection PyBroadException
|
# noinspection PyBroadException
|
||||||
@ -136,12 +139,26 @@ class StateUpdate(object):
|
|||||||
# wake up if we get an exception
|
# wake up if we get an exception
|
||||||
queued_requests = []
|
queued_requests = []
|
||||||
|
|
||||||
|
# We retrieved OK, clear exception count
|
||||||
|
exception_count = 0
|
||||||
|
|
||||||
except queue.Empty:
|
except queue.Empty:
|
||||||
pass
|
pass
|
||||||
except Exception:
|
except Exception as e:
|
||||||
st = traceback.format_exc()
|
st = traceback.format_exc()
|
||||||
log_error("update_thread exception: \n%s" % st)
|
log_error("update_thread exception: \n%s" % st)
|
||||||
cfg.blackbox.dump()
|
cfg.blackbox.dump()
|
||||||
|
exception_count += 1
|
||||||
|
if exception_count >= 5:
|
||||||
|
for i in queued_requests:
|
||||||
|
i.set_result(e)
|
||||||
|
|
||||||
|
log_error("Too many errors in update_thread, exiting daemon")
|
||||||
|
cfg.exit_daemon()
|
||||||
|
|
||||||
|
else:
|
||||||
|
# Slow things down when encountering errors
|
||||||
|
time.sleep(1)
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.lock = threading.RLock()
|
self.lock = threading.RLock()
|
||||||
|
Loading…
Reference in New Issue
Block a user