Fixed I2P controller startup when event loop is not immediately ready

This commit is contained in:
Mark Qvist 2022-05-26 09:54:56 +02:00
parent 1e77f85cd4
commit 49616a36cf

View File

@ -76,6 +76,7 @@ class I2PController:
self.i2plib = i2plib self.i2plib = i2plib
self.utils = i2plib.utils self.utils = i2plib.utils
self.sam_address = i2plib.get_sam_address() self.sam_address = i2plib.get_sam_address()
self.ready = False
self.storagepath = rns_storagepath+"/i2p" self.storagepath = rns_storagepath+"/i2p"
if not os.path.isdir(self.storagepath): if not os.path.isdir(self.storagepath):
@ -86,14 +87,19 @@ class I2PController:
asyncio.set_event_loop(asyncio.new_event_loop()) asyncio.set_event_loop(asyncio.new_event_loop())
self.loop = asyncio.get_event_loop() self.loop = asyncio.get_event_loop()
RNS.log("Could not get event loop for "+str(self)+", waiting for event loop to appear", RNS.LOG_WARNING) time.sleep(0.10)
if self.loop == None:
RNS.log("Could not get event loop for "+str(self)+", waiting for event loop to appear", RNS.LOG_VERBOSE)
while self.loop == None: while self.loop == None:
self.loop = asyncio.get_event_loop() self.loop = asyncio.get_event_loop()
sleep(0.25) sleep(0.25)
try: try:
self.ready = True
self.loop.run_forever() self.loop.run_forever()
except Exception as e: except Exception as e:
self.ready = False
RNS.log("Exception on event loop for "+str(self)+": "+str(e), RNS.LOG_ERROR) RNS.log("Exception on event loop for "+str(self)+": "+str(e), RNS.LOG_ERROR)
finally: finally:
self.loop.close() self.loop.close()
@ -613,6 +619,19 @@ class I2PInterface(Interface):
i2p_thread.setDaemon(True) i2p_thread.setDaemon(True)
i2p_thread.start() i2p_thread.start()
i2p_notready_warning = False
time.sleep(0.25)
if not self.i2p.ready:
RNS.log("I2P controller did not become available in time, waiting for controller", RNS.LOG_VERBOSE)
i2p_notready_warning = True
while not self.i2p.ready:
time.sleep(0.25)
if i2p_notready_warning == True:
RNS.log("I2P controller ready, continuing setup", RNS.LOG_VERBOSE)
def handlerFactory(callback): def handlerFactory(callback):
def createHandler(*args, **keys): def createHandler(*args, **keys):
return I2PInterfaceHandler(callback, *args, **keys) return I2PInterfaceHandler(callback, *args, **keys)