summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarko Kreen2008-04-23 15:07:04 +0000
committerMarko Kreen2008-04-23 15:07:04 +0000
commit43b07b728ad3c73a1ba093caec3b36707350eae7 (patch)
tree0db460f699b9fb283bf6474e3007c2590df5d9b5
parentfbe997fbdae1fe568042255a32c373e1ff9528b0 (diff)
python/pgq: more set work
- use worker_name == node_name - make status command show lag - pass root tick_time downstream
-rw-r--r--python/pgq/rawconsumer.py3
-rw-r--r--python/pgq/setadmin.py43
-rw-r--r--python/pgq/setconsumer.py8
-rw-r--r--python/pgq/setinfo.py42
4 files changed, 72 insertions, 24 deletions
diff --git a/python/pgq/rawconsumer.py b/python/pgq/rawconsumer.py
index 1ab452fc..a43b86b7 100644
--- a/python/pgq/rawconsumer.py
+++ b/python/pgq/rawconsumer.py
@@ -23,11 +23,12 @@ class RawQueue:
if not self.batch_id:
return self.batch_id
- q = "select tick_id, prev_tick_id from pgq.get_batch_info(%s)"
+ q = "select tick_id, prev_tick_id, batch_end from pgq.get_batch_info(%s)"
curs.execute(q, [self.batch_id])
inf = curs.dictfetchone()
self.cur_tick = inf['tick_id']
self.prev_tick = inf['prev_tick_id']
+ self.tick_time = inf['batch_end']
return self.batch_id
diff --git a/python/pgq/setadmin.py b/python/pgq/setadmin.py
index 77c07a3e..7dba1959 100644
--- a/python/pgq/setadmin.py
+++ b/python/pgq/setadmin.py
@@ -69,9 +69,6 @@ class SetAdmin(skytools.AdminScript):
self.log.info("Initializing node")
- # fixme
- worker_name = "%s_%s_worker" % (self.set_name, node_name)
-
# register member
if node_type in ('root', 'combined-root'):
global_watermark = None
@@ -79,12 +76,12 @@ class SetAdmin(skytools.AdminScript):
provider_name = None
self.exec_sql(db, "select pgq_set.add_member(%s, %s, %s, false)",
[self.set_name, node_name, node_location])
- self.exec_sql(db, "select pgq_set.create_node(%s, %s, %s, %s, %s, %s, %s)",
- [self.set_name, node_type, node_name, worker_name, provider_name, global_watermark, combined_set])
+ self.exec_sql(db, "select pgq_set.create_node(%s, %s, %s, %s, %s, %s)",
+ [self.set_name, node_type, node_name, provider_name, global_watermark, combined_set])
provider_db = None
else:
root_db = self.find_root_db(provider_loc)
- set = self.load_root_info(root_db)
+ set = self.load_set_info(root_db)
# check if member already exists
if set.get_member(node_name) is not None:
@@ -117,8 +114,8 @@ class SetAdmin(skytools.AdminScript):
# register on provider
self.exec_sql(provider_db, "select pgq_set.add_member(%s, %s, %s, false)",
[self.set_name, node_name, node_location])
- self.exec_sql(provider_db, "select pgq_set.subscribe_node(%s, %s, %s)",
- [self.set_name, node_name, worker_name])
+ self.exec_sql(provider_db, "select pgq_set.subscribe_node(%s, %s)",
+ [self.set_name, node_name])
provider_db.commit()
# initialize node itself
@@ -126,8 +123,8 @@ class SetAdmin(skytools.AdminScript):
[self.set_name, node_name, node_location])
self.exec_sql(db, "select pgq_set.add_member(%s, %s, %s, false)",
[self.set_name, provider_name, provider.location])
- self.exec_sql(db, "select pgq_set.create_node(%s, %s, %s, %s, %s, %s, %s)",
- [self.set_name, node_type, node_name, worker_name, provider_name,
+ self.exec_sql(db, "select pgq_set.create_node(%s, %s, %s, %s, %s, %s)",
+ [self.set_name, node_type, node_name, provider_name,
global_watermark, combined_set])
db.commit()
@@ -175,16 +172,16 @@ class SetAdmin(skytools.AdminScript):
self.log.info("Sub node provider not initialized?")
sys.exit(1)
- def load_root_info(self, db):
+ def load_set_info(self, db):
res = self.exec_query(db, "select * from pgq_set.get_node_info(%s)", [self.set_name])
info = res[0]
q = "select * from pgq_set.get_member_info(%s)"
- node_list = self.exec_query(db, q, [self.set_name])
+ member_list = self.exec_query(db, q, [self.set_name])
db.commit()
- return SetInfo(self.set_name, info, node_list)
+ return SetInfo(self.set_name, info, member_list)
def install_code(self, db):
objs = [
@@ -200,19 +197,29 @@ class SetAdmin(skytools.AdminScript):
def cmd_status(self, args):
root_db = self.find_root_db()
- sinf = self.load_root_info(root_db)
+ sinf = self.load_set_info(root_db)
for mname, minf in sinf.member_map.iteritems():
db = self.get_database('look_db', connstr = minf.location, autocommit = 1)
curs = db.cursor()
curs.execute("select * from pgq_set.get_node_info(%s)", [self.set_name])
- node = NodeInfo(curs.fetchone())
+ node = NodeInfo(self.set_name, curs.fetchone())
+ node.load_status(curs)
+ self.load_extra_status(curs, node)
sinf.add_node(node)
self.close_database('look_db')
sinf.print_tree()
- def cmd_switch(self):
+ def load_extra_status(self, curs, node):
+ pass
+
+ def cmd_switch(self, node_name, new_provider):
+ node_db = self.get_node_database(node_name)
+ new_provider_db = self.get_node_database(new_provider)
+ node_info = self.load_set_info(node_db)
+
+ #
[['node', 'PAUSE']]
[['new_parent', 'select * from pgq_set.subscribe_node(%(set_name)s, %(node_name)s, %(node_pos)s)']]
[['node', 'select * from pgq_set.change_provider(%(set_name)s, %(new_provider)s)']]
@@ -220,6 +227,10 @@ class SetAdmin(skytools.AdminScript):
[['node', 'RESUME']]
def cmd_promote(self):
+ old_root = 'foo'
+ new_root = ''
+ self.pause_node(old_root)
+ ctx = self.load_node_info(old_root)
[['old-root', 'PAUSE']]
[['old-root', 'demote, set-provider?']]
[['new-root', 'wait-for-catch-up']]
diff --git a/python/pgq/setconsumer.py b/python/pgq/setconsumer.py
index 268cd7a8..baa18b28 100644
--- a/python/pgq/setconsumer.py
+++ b/python/pgq/setconsumer.py
@@ -27,7 +27,7 @@ class SetConsumer(skytools.DBScript):
dst_node = self.load_node_info(dst_db)
if self.main_worker:
- self.consumer_name = dst_node.worker_name
+ self.consumer_name = dst_node.name
if not dst_node.up_to_date:
self.tag_node_uptodate(dst_db)
@@ -188,7 +188,7 @@ class SetConsumer(skytools.DBScript):
mbr_list = curs.dictfetchall()
db.commit()
- return NodeInfo(node_row, self.main_worker)
+ return NodeInfo(self.set_name, node_row, self.main_worker)
def tag_node_uptodate(self, dst_db):
dst_curs = dst_db.cursor()
@@ -197,8 +197,8 @@ class SetConsumer(skytools.DBScript):
dst_db.commit()
def copy_tick(self, dst_curs, src_queue, dst_queue):
- q = "select * from pgq.ticker(%s, %s)"
- dst_curs.execute(q, [dst_queue.queue_name, src_queue.cur_tick])
+ q = "select * from pgq.ticker(%s, %s, %s)"
+ dst_curs.execute(q, [dst_queue.queue_name, src_queue.cur_tick, src_queue.tick_time])
def set_tick_complete(self, dst_curs, tick_id):
q = "select * from pgq_set.set_completed_tick(%s, %s, %s)"
diff --git a/python/pgq/setinfo.py b/python/pgq/setinfo.py
index 8013e114..da2e1ba9 100644
--- a/python/pgq/setinfo.py
+++ b/python/pgq/setinfo.py
@@ -31,7 +31,8 @@ class MemberInfo:
self.dead = row['dead']
class NodeInfo:
- def __init__(self, row, main_worker = True):
+ def __init__(self, set_name, row, main_worker = True):
+ self.set_name = set_name
self.member_map = {}
self.main_worker = main_worker
@@ -49,10 +50,11 @@ class NodeInfo:
self.combined_set = row['combined_set']
self.combined_type = row['combined_type']
self.combined_queue = row['combined_queue']
- self.worker_name = row['worker_name']
self._row = row
+ self._info_lines = []
+
def need_action(self, action_name):
if not self.main_worker:
return action_name in ('process-batch', 'process-events')
@@ -82,7 +84,38 @@ class NodeInfo:
return qname
def get_infolines(self):
- return ['somestuff = 100.2', '']
+ lst = self._info_lines
+ if self.parent:
+ root = self.parent
+ while root.parent:
+ root = root.parent
+ tick_time = self.parent.consumer_map[self.name]['tick_time']
+ root_time = root.queue_info['now']
+ lag = root_time - tick_time
+ else:
+ lag = self.queue_info['ticker_lag']
+ lst.append("lag: %s" % lag)
+ return lst
+
+ def add_info_line(self, ln):
+ self._info_lines.append(ln)
+
+ def load_status(self, curs):
+ self.consumer_map = {}
+ self.queue_info = {}
+ if self.queue_name:
+ q = "select consumer_name, current_timestamp - lag as tick_time,"\
+ " lag, last_seen, last_tick "\
+ "from pgq.get_consumer_info(%s)"
+ curs.execute(q, [self.set_name])
+ for row in curs.fetchall():
+ cname = row['consumer_name']
+ self.consumer_map[cname] = row
+ q = "select current_timestamp - ticker_lag as tick_time,"\
+ " ticker_lag, current_timestamp as now "\
+ "from pgq.get_queue_info(%s)"
+ curs.execute(q, [self.set_name])
+ self.queue_info = curs.fetchone()
class SetInfo:
def __init__(self, set_name, info_row, member_rows):
@@ -141,6 +174,9 @@ class SetInfo:
if node.provider_node:
p = self.node_map[node.provider_node]
p.child_list.append(node)
+ node.parent = p
+ else:
+ node.parent = None
def _tree_calc(self, node):
total = len(node.child_list)