1
0
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:
Tony Asleson 2018-12-18 09:49:36 -06:00
parent 3320ab8334
commit ab1f1a306b
2 changed files with 28 additions and 1 deletions

View File

@ -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()

View File

@ -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()