mirror of
git://sourceware.org/git/lvm2.git
synced 2025-03-10 16:58:47 +03:00
lvmdbusd: Limit state refreshes for udev events
Udev events can come in like a flood when something changes. It really doesn't do us any good to refresh the state of the service numerous times when 1 would suffice. We had something like this before, but it was removed when we added the refresh thread. However, we have since learned that we need to sequence events in the correct order and block dbus operations if we believe the state has been affected, thus udev events are being processed on the main work queue. This change limits spurious work items from getting to the queue.
This commit is contained in:
parent
7eeb093fdd
commit
3ead4fb7ac
@ -16,9 +16,33 @@ from . import utils
|
||||
observer = None
|
||||
observer_lock = threading.RLock()
|
||||
|
||||
_udev_lock = threading.RLock()
|
||||
_udev_count = 0
|
||||
|
||||
|
||||
def udev_add():
|
||||
global _udev_count
|
||||
with _udev_lock:
|
||||
if _udev_count == 0:
|
||||
_udev_count += 1
|
||||
|
||||
# Place this on the queue so any other operations will sequence
|
||||
# behind it
|
||||
r = RequestEntry(
|
||||
-1, _udev_event, (), None, None, False)
|
||||
cfg.worker_q.put(r)
|
||||
|
||||
|
||||
def udev_complete():
|
||||
global _udev_count
|
||||
with _udev_lock:
|
||||
if _udev_count > 0:
|
||||
_udev_count -= 1
|
||||
|
||||
|
||||
def _udev_event():
|
||||
utils.log_debug("Processing udev event")
|
||||
udev_complete()
|
||||
cfg.load()
|
||||
|
||||
|
||||
@ -44,10 +68,7 @@ def filter_event(action, device):
|
||||
refresh = True
|
||||
|
||||
if refresh:
|
||||
# Place this on the queue so any other operations will sequence behind it
|
||||
r = RequestEntry(
|
||||
-1, _udev_event, (), None, None, False)
|
||||
cfg.worker_q.put(r)
|
||||
udev_add()
|
||||
|
||||
|
||||
def add():
|
||||
|
Loading…
x
Reference in New Issue
Block a user