summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarko Kreen2011-12-09 07:08:14 +0000
committerMarko Kreen2011-12-09 07:08:14 +0000
commit7a8c702d865196477e4bf42db62d468452f824cc (patch)
tree9192374cc00922c5a55e39f0f3bb1a4f581c97a7
parent17c92fba298477e619c57a971708edbea76ddf06 (diff)
londiste repair: some cleanups
- get_pkeys, get_columns: use functions from skytools - replace os.system with subprocess
-rw-r--r--python/londiste/repair.py70
1 files changed, 27 insertions, 43 deletions
diff --git a/python/londiste/repair.py b/python/londiste/repair.py
index 984920b8..101fe6e0 100644
--- a/python/londiste/repair.py
+++ b/python/londiste/repair.py
@@ -5,7 +5,7 @@ Walks tables by primary key and searcher
missing inserts/updates/deletes.
"""
-import sys, os, skytools
+import sys, os, skytools, subprocess
from londiste.syncer import Syncer
@@ -15,34 +15,6 @@ def unescape(s):
"""Remove copy escapes."""
return skytools.unescape_copy(s)
-def get_pkey_list(curs, tbl):
- """Get list of pkey fields in right order."""
-
- oid = skytools.get_table_oid(curs, tbl)
- q = """SELECT k.attname FROM pg_index i, pg_attribute k
- WHERE i.indrelid = %s AND k.attrelid = i.indexrelid
- AND i.indisprimary AND k.attnum > 0 AND NOT k.attisdropped
- ORDER BY k.attnum"""
- curs.execute(q, [oid])
- list = []
- for row in curs.fetchall():
- list.append(row[0])
- return list
-
-def get_column_list(curs, tbl):
- """Get list of columns in right order."""
-
- oid = skytools.get_table_oid(curs, tbl)
- q = """SELECT a.attname FROM pg_attribute a
- WHERE a.attrelid = %s
- AND a.attnum > 0 AND NOT a.attisdropped
- ORDER BY a.attnum"""
- curs.execute(q, [oid])
- list = []
- for row in curs.fetchall():
- list.append(row[0])
- return list
-
class Repairer(Syncer):
"""Walks tables in primary key order and checks if data matches."""
@@ -78,17 +50,9 @@ class Repairer(Syncer):
dst_db.commit()
self.log.info("Sorting src table: %s" % dump_src)
-
- s_in, s_out = os.popen4("sort --version")
- s_ver = s_out.read()
- del s_in, s_out
- if s_ver.find("coreutils") > 0:
- args = "-S 30%"
- else:
- args = ""
- os.system("sort %s -T . -o %s.sorted %s" % (args, dump_src, dump_src))
+ self.do_sort(dump_src, dump_src + '.sorted')
self.log.info("Sorting dst table: %s" % dump_dst)
- os.system("sort %s -T . -o %s.sorted %s" % (args, dump_dst, dump_dst))
+ self.do_sort(dump_dst, dump_dst + '.sorted')
self.dump_compare(dst_tbl, dump_src + ".sorted", dump_dst + ".sorted")
@@ -97,17 +61,37 @@ class Repairer(Syncer):
os.unlink(dump_src + ".sorted")
os.unlink(dump_dst + ".sorted")
+ def do_sort(self, src, dst):
+ p = subprocess.Popen(["sort", "--version"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+ s_ver = p.communicate()[0]
+ del p
+
+ xenv = os.environ.copy()
+ xenv['LANG'] = 'C'
+ xenv['LC_ALL'] = 'C'
+
+ cmdline = ['sort', '-T', '.']
+ if s_ver.find("coreutils") > 0:
+ cmdline.append('-S')
+ cmdline.append('30%')
+ cmdline.append('-o')
+ cmdline.append(dst)
+ cmdline.append(src)
+ p = subprocess.Popen(cmdline, env = xenv)
+ if p.wait() != 0:
+ raise Exception('sort failed')
+
def load_common_columns(self, src_tbl, dst_tbl, src_curs, dst_curs):
"""Get common fields, put pkeys in start."""
- self.pkey_list = get_pkey_list(src_curs, src_tbl)
- dst_pkey = get_pkey_list(dst_curs, dst_tbl)
+ self.pkey_list = skytools.get_table_pkeys(src_curs, src_tbl)
+ dst_pkey = skytools.get_table_pkeys(dst_curs, dst_tbl)
if dst_pkey != self.pkey_list:
self.log.error('pkeys do not match')
sys.exit(1)
- src_cols = get_column_list(src_curs, src_tbl)
- dst_cols = get_column_list(dst_curs, dst_tbl)
+ src_cols = skytools.get_table_columns(src_curs, src_tbl)
+ dst_cols = skytools.get_table_columns(dst_curs, dst_tbl)
field_list = []
for f in self.pkey_list:
field_list.append(f)