commit d2d67f1fe14830cc9d2bf34edd869797a639fbee
parent dd7c4b3bab7232366bfd6be9e222be7ae3b357ba
Author: Janus <ysangkok@gmail.com>
Date: Tue, 12 Feb 2019 19:34:14 +0100
sqlite in lnrouter: avoid exceptions on shutdown
Diffstat:
1 file changed, 15 insertions(+), 11 deletions(-)
diff --git a/electrum/lnrouter.py b/electrum/lnrouter.py
@@ -36,7 +36,7 @@ import base64
import asyncio
from sqlalchemy import create_engine, Column, ForeignKey, Integer, String, DateTime, Boolean
-from sqlalchemy.engine import Engine
+from sqlalchemy.pool import StaticPool
from sqlalchemy.orm import sessionmaker
from sqlalchemy.orm.query import Query
from sqlalchemy.ext.declarative import declarative_base
@@ -71,7 +71,6 @@ def validate_features(features : int):
Base = declarative_base()
session_factory = sessionmaker()
DBSession = scoped_session(session_factory)
-engine = None
FLAG_DISABLE = 1 << 1
FLAG_DIRECTION = 1 << 0
@@ -262,27 +261,32 @@ class ChannelDB:
NUM_MAX_RECENT_PEERS = 20
def __init__(self, network: 'Network'):
- global engine
self.network = network
self.num_nodes = 0
self.num_channels = 0
self.path = os.path.join(get_headers_dir(network.config), 'channel_db.sqlite3')
- engine = create_engine('sqlite:///' + self.path)#, echo=True)
- DBSession.remove()
- DBSession.configure(bind=engine, autoflush=False)
-
- Base.metadata.drop_all(engine)
- Base.metadata.create_all(engine)
-
- self.lock = threading.RLock()
# (intentionally not persisted)
self._channel_updates_for_private_channels = {} # type: Dict[Tuple[bytes, bytes], dict]
self.ca_verifier = LNChannelVerifier(network, self)
+ self.network.run_from_another_thread(self.sqlinit())
+
+ async def sqlinit(self):
+ """
+ this has to run on the async thread since that is where
+ the lnpeer loop is running from, which will do call in here
+ """
+ engine = create_engine('sqlite:///' + self.path, pool_reset_on_return=None, poolclass=StaticPool)#, echo=True)
+ DBSession.remove()
+ DBSession.configure(bind=engine, autoflush=False)
+
+ Base.metadata.drop_all(engine)
+ Base.metadata.create_all(engine)
+
def update_counts(self):
self.num_channels = DBSession.query(ChannelInfoInDB).count()
self.num_nodes = DBSession.query(NodeInfoInDB).count()