summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLV-426 <lv-426@taproot.org.il>2015-05-05 01:33:35 +0300
committerLV-426 <lv-426@taproot.org.il>2015-05-05 19:28:09 +0300
commit0e1d15d0d464b6b6dbaeb2744bfa2008f83d91a8 (patch)
treeaa188dba82b9e989ff640205e129bb61ffd1486a /src
parent17290bc6d011ec3bd3dfb4cdbefa3bb7843ee660 (diff)
init_DB(): more refactoring, assist kernel via op_factory__DBO_rzdb__init_DB
Diffstat (limited to 'src')
-rw-r--r--src/server/rz_kernel.py55
-rw-r--r--src/server/rz_server.py8
2 files changed, 32 insertions, 31 deletions
diff --git a/src/server/rz_kernel.py b/src/server/rz_kernel.py
index 0b0581ca..e2a2043b 100644
--- a/src/server/rz_kernel.py
+++ b/src/server/rz_kernel.py
@@ -89,36 +89,18 @@ class RZ_Kernel(object):
- all public methods decorated with deco__exception_log
"""
- def __init__(self, cfg):
- self.cfg = cfg
+ def __init__(self):
self.cache__rzdoc_name_to_rzdoc = {}
self.heartbeat_period_sec = 0.5
- self.db_ctl = DB_Controller(cfg.db_base_url)
self.period__db_conn_check = 60
self.rzdoc_reader_assoc_map = defaultdict(list)
- self.should_stop = False
- self.db_initialized = False
-
- def _init_DB(self):
- op_probe = DBO_rzdb__fetch_DB_metablock()
-
- try:
- dbmb = self.db_ctl.exec_op(op_probe)
- if dbmb is None:
- log.warning('detected uninitialized DB, initializing')
- op_init = DBO_rzdb__init_DB(self.cfg.rzdoc__mainpage_name)
- self.db_ctl.exec_op(op_init)
- op_probe = DBO_rzdb__fetch_DB_metablock() # reprobe for metablock
- dbmb = self.db_ctl.exec_op(op_probe)
- log.info('DB initialized, schema-version: %s' % (dbmb['schema_version']))
- else:
- log.info('DB connection established, schema-version: %s' % (dbmb['schema_version']))
- except Exception as e:
- log.exception('failed to init DB')
- raise e
+ self.db_ctl = None # set by caller
+ self.op_factory__DBO_rzdb__init_DB = None # required for DB initialization, set by caller
- return self.db_ctl
+ self.should_stop = False
+ self.db_conn_avail = False
+ self.db_metablock_obtained = False
def start(self):
@@ -137,15 +119,30 @@ class RZ_Kernel(object):
try:
op = DBO_nop()
self.db_ctl.exec_op(op)
-
- if not self.db_initialized:
- self._init_DB()
-
- except Exception:
+ self.db_conn_avail = True
+ except Exception as e:
log.info('rz_kernel: unable to establish DB connection')
+ self.db_conn_avail = False
finally:
t__last_db_conn_check = t_0
+ if self.db_conn_avail and not self.db_metablock_obtained:
+ try:
+ op_probe = DBO_rzdb__fetch_DB_metablock()
+ db_mb = self.db_ctl.exec_op(op_probe)
+ if db_mb is None:
+ log.warning('uninitialized DB detected, attempting initialization')
+ op_init = self.op_factory__DBO_rzdb__init_DB.gen_op__rzdb__init_DB()
+ self.db_ctl.exec_op(op_init)
+ op_probe = DBO_rzdb__fetch_DB_metablock() # reattempt mb fetch
+ db_mb = self.db_ctl.exec_op(op_probe)
+ log.info('DB initialized, schema-version: %s' % (db_mb['schema_version']))
+ else:
+ log.info('DB metablock read, schema-version: %s' % (db_mb['schema_version']))
+ self.db_metablock_obtained = True
+ except Exception as e:
+ log.info('rz_kernel: failed DB metablock fetch / DB init')
+
for rzdoc, r_assoc_set in self.rzdoc_reader_assoc_map.items():
for r_assoc in r_assoc_set:
diff --git a/src/server/rz_server.py b/src/server/rz_server.py
index 7442a16b..21f29160 100644
--- a/src/server/rz_server.py
+++ b/src/server/rz_server.py
@@ -261,6 +261,9 @@ class FlaskExt(Flask):
request.peer_sock_addr = self.req_probe__sock_addr.probe_client_socket_addr__http_req(request)
request.host_sock_addr = self.req_probe__sock_addr.probe_requested_host__http_req(request)
+ def gen_op__rzdb__init_DB(self): # provided to assist kernel with DB initialization
+ return DBO_rzdb__init_DB(self.rz_config.rzdoc__mainpage_name)
+
def make_default_options_response(self):
ret = Flask.make_default_options_response(self)
@@ -508,14 +511,15 @@ if __name__ == "__main__":
# init kernel
#
kernel = RZ_Kernel()
+ kernel.db_ctl = DB_Controller(cfg.db_base_url)
#
# init webapp
#
webapp = init_webapp(cfg, kernel)
- ws_srv = init_ws_interface(cfg, kernel, webapp)
-
webapp.user_db = user_db
+ kernel.op_factory__DBO_rzdb__init_DB = webapp # assist kernel with DB initialization
+ ws_srv = init_ws_interface(cfg, kernel, webapp)
try:
kernel.start()