daemon: updates to remove the delay for processing wlan changes along with code to support it
This commit is contained in:
parent
43737a42e4
commit
efb97d1a5d
2 changed files with 24 additions and 51 deletions
|
@ -343,14 +343,12 @@ class BasicRangeModel(WirelessModel):
|
|||
:return: nothing
|
||||
"""
|
||||
x, y, z = iface.node.position.get()
|
||||
self.iface_lock.acquire()
|
||||
self.iface_to_pos[iface] = (x, y, z)
|
||||
if x is None or y is None:
|
||||
self.iface_lock.release()
|
||||
return
|
||||
for iface2 in self.iface_to_pos:
|
||||
self.calclink(iface, iface2)
|
||||
self.iface_lock.release()
|
||||
with self.iface_lock:
|
||||
self.iface_to_pos[iface] = (x, y, z)
|
||||
if x is None or y is None:
|
||||
return
|
||||
for iface2 in self.iface_to_pos:
|
||||
self.calclink(iface, iface2)
|
||||
|
||||
position_callback = set_position
|
||||
|
||||
|
@ -388,20 +386,15 @@ class BasicRangeModel(WirelessModel):
|
|||
"""
|
||||
if iface == iface2:
|
||||
return
|
||||
|
||||
try:
|
||||
x, y, z = self.iface_to_pos[iface]
|
||||
x2, y2, z2 = self.iface_to_pos[iface2]
|
||||
|
||||
if x2 is None or y2 is None:
|
||||
return
|
||||
|
||||
d = self.calcdistance((x, y, z), (x2, y2, z2))
|
||||
|
||||
# ordering is important, to keep the wlan._linked dict organized
|
||||
a = min(iface, iface2)
|
||||
b = max(iface, iface2)
|
||||
|
||||
with self.wlan.linked_lock:
|
||||
linked = self.wlan.is_linked(a, b)
|
||||
if d > self.range:
|
||||
|
|
|
@ -4,7 +4,6 @@ Defines network nodes used within core.
|
|||
|
||||
import logging
|
||||
import threading
|
||||
import time
|
||||
from collections import OrderedDict
|
||||
from pathlib import Path
|
||||
from queue import Queue
|
||||
|
@ -80,50 +79,32 @@ class NftablesQueue:
|
|||
self.cmds: List[str] = []
|
||||
# list of WLANs requiring update
|
||||
self.updates: SetQueue = SetQueue()
|
||||
# timestamps of last WLAN update; this keeps track of WLANs that are
|
||||
# using this queue
|
||||
self.last_update_time: Dict["CoreNetwork", float] = {}
|
||||
|
||||
def start(self, net: "CoreNetwork") -> None:
|
||||
def start(self) -> None:
|
||||
"""
|
||||
Start thread to listen for updates for the provided network.
|
||||
:param net: network to start checking updates
|
||||
|
||||
:return: nothing
|
||||
"""
|
||||
with self.lock:
|
||||
self.last_update_time[net] = time.monotonic()
|
||||
if self.running:
|
||||
return
|
||||
self.running = True
|
||||
self.run_thread = threading.Thread(target=self.run, daemon=True)
|
||||
self.run_thread.start()
|
||||
if not self.running:
|
||||
self.running = True
|
||||
self.run_thread = threading.Thread(target=self.run, daemon=True)
|
||||
self.run_thread.start()
|
||||
|
||||
def stop(self, net: "CoreNetwork") -> None:
|
||||
def stop(self) -> None:
|
||||
"""
|
||||
Stop updates for network, when no networks remain, stop update thread.
|
||||
:param net: network to stop watching updates
|
||||
|
||||
:return: nothing
|
||||
"""
|
||||
with self.lock:
|
||||
self.last_update_time.pop(net, None)
|
||||
if self.last_update_time:
|
||||
return
|
||||
self.running = False
|
||||
if self.run_thread:
|
||||
if self.running:
|
||||
self.running = False
|
||||
self.updates.put(None)
|
||||
self.run_thread.join()
|
||||
self.run_thread = None
|
||||
|
||||
def last_update(self, net: "CoreNetwork") -> float:
|
||||
"""
|
||||
Return the time elapsed since this network was last updated.
|
||||
:param net: network node
|
||||
:return: elapsed time
|
||||
"""
|
||||
now = time.monotonic()
|
||||
last_update = self.last_update_time.setdefault(net, now)
|
||||
return now - last_update
|
||||
|
||||
def run(self) -> None:
|
||||
"""
|
||||
Thread target that looks for networks needing update, and
|
||||
|
@ -136,17 +117,14 @@ class NftablesQueue:
|
|||
net = self.updates.get()
|
||||
if net is None:
|
||||
break
|
||||
if not net.up:
|
||||
self.last_update_time[net] = time.monotonic()
|
||||
elif self.last_update(net) > self.rate:
|
||||
with self.lock:
|
||||
self.build_cmds(net)
|
||||
self.commit(net)
|
||||
self.last_update_time[net] = time.monotonic()
|
||||
with self.lock:
|
||||
self.build_cmds(net)
|
||||
self.commit(net)
|
||||
|
||||
def commit(self, net: "CoreNetwork") -> None:
|
||||
"""
|
||||
Commit changes to nftables for the provided network.
|
||||
|
||||
:param net: network to commit nftables changes
|
||||
:return: nothing
|
||||
"""
|
||||
|
@ -164,6 +142,7 @@ class NftablesQueue:
|
|||
def update(self, net: "CoreNetwork") -> None:
|
||||
"""
|
||||
Flag this network has an update, so the nftables chain will be rebuilt.
|
||||
|
||||
:param net: wlan network
|
||||
:return: nothing
|
||||
"""
|
||||
|
@ -182,6 +161,7 @@ class NftablesQueue:
|
|||
def build_cmds(self, net: "CoreNetwork") -> None:
|
||||
"""
|
||||
Inspect linked nodes for a network, and rebuild the nftables chain commands.
|
||||
|
||||
:param net: network to build commands for
|
||||
:return: nothing
|
||||
"""
|
||||
|
@ -299,7 +279,7 @@ class CoreNetwork(CoreNetworkBase):
|
|||
self.net_client.set_mtu(self.brname, self.mtu)
|
||||
self.has_nftables_chain = False
|
||||
self.up = True
|
||||
nft_queue.start(self)
|
||||
nft_queue.start()
|
||||
|
||||
def shutdown(self) -> None:
|
||||
"""
|
||||
|
@ -309,7 +289,7 @@ class CoreNetwork(CoreNetworkBase):
|
|||
"""
|
||||
if not self.up:
|
||||
return
|
||||
nft_queue.stop(self)
|
||||
nft_queue.stop()
|
||||
try:
|
||||
self.net_client.delete_bridge(self.brname)
|
||||
if self.has_nftables_chain:
|
||||
|
|
Loading…
Reference in a new issue