sync controller database to disk and load it on start
This commit is contained in:
@ -265,9 +265,6 @@ class ControllerConn:
|
||||
|
||||
|
||||
class HubApplication:
|
||||
def is_controller(self) -> bool:
|
||||
return False
|
||||
|
||||
async def new_peer(self, *, peer_id: uuid.UUID) -> None:
|
||||
_logger.info(f"New peer {peer_id}")
|
||||
|
||||
@ -287,13 +284,18 @@ class HubApplication:
|
||||
|
||||
|
||||
class Hub:
|
||||
def __init__(self, config: Config, app: HubApplication) -> None:
|
||||
def __init__(self, config: Config, app: HubApplication, *, is_controller: bool) -> None:
|
||||
self._config = config
|
||||
self._instance_id = uuid.uuid4()
|
||||
self._hostname = socket.getfqdn()
|
||||
self.database = capport.database.Database()
|
||||
self._app = app
|
||||
self._is_controller = bool(app.is_controller())
|
||||
self._is_controller = is_controller
|
||||
state_filename: typing.Optional[str]
|
||||
if is_controller:
|
||||
state_filename = 'capport.state'
|
||||
else:
|
||||
state_filename = None
|
||||
self.database = capport.database.Database(state_filename=state_filename)
|
||||
self._anon_context = ssl.SSLContext()
|
||||
# python ssl doesn't support setting tls1.3 ciphers yet, so make sure we stay on 1.2 for now to enable anon
|
||||
self._anon_context.minimum_version = ssl.TLSVersion.TLSv1_2
|
||||
@ -324,6 +326,7 @@ class Hub:
|
||||
|
||||
async def run(self, *, task_status=trio.TASK_STATUS_IGNORED):
|
||||
async with trio.open_nursery() as nursery:
|
||||
await nursery.start(self.database.run)
|
||||
if self._is_controller:
|
||||
await nursery.start(self._listen)
|
||||
|
||||
@ -412,12 +415,12 @@ class Hub:
|
||||
pass
|
||||
elif isinstance(variant, capport.comm.message.MacStates):
|
||||
await self._app.received_mac_state(from_peer_id=peer_id, states=variant)
|
||||
pu = capport.database.PendingUpdates()
|
||||
for state in variant.states:
|
||||
self.database.received_mac_state(state, pending_updates=pu)
|
||||
if pu.macs:
|
||||
async with self.database.make_changes() as pu:
|
||||
for state in variant.states:
|
||||
pu.received_mac_state(state)
|
||||
if pu:
|
||||
# re-broadcast all received updates to all peers
|
||||
await self.broadcast(*pu.serialize(), exclude=peer_id)
|
||||
await self.broadcast(*pu.serialized, exclude=peer_id)
|
||||
await self._app.mac_states_changed(from_peer_id=peer_id, pending_updates=pu)
|
||||
else:
|
||||
await self._app.received_unknown_message(from_peer_id=peer_id, msg=msg)
|
||||
|
Reference in New Issue
Block a user