def loadSplitPointsFromMeta(metaUri): if not metaUri.startswith('meta+'): raise ValueError('not a meta table: %r' % metaUri) metaUri = metaUri[5:] import urllib,cgi p,q = urllib.splitquery(metaUri) q = cgi.parse_qs(q or '') tableName = q.get('name',[''])[0] if not tableName: raise ValueError('meta uri needs table name') from util.zero import zeroEncode,zeroDecode pred = '%r <= row < %r and column = "location"' % \ (zeroEncode(tableName, '\x01', ''), zeroEncode(tableName, '\x02', '')) rows = [] import pykdi for r,c,t,v in pykdi.Table(metaUri).scan(pred): n,x,r = zeroDecode(r) rows.append(r) f = 1.0 / (len(rows) + 1) return [((i+1)*f, r) for i,r in enumerate(rows)]
def loadSplitPointsFromMeta(metaUri): if not metaUri.startswith('meta+'): raise ValueError('not a meta table: %r' % metaUri) metaUri = metaUri[5:] import urllib, cgi p, q = urllib.splitquery(metaUri) q = cgi.parse_qs(q or '') tableName = q.get('name', [''])[0] if not tableName: raise ValueError('meta uri needs table name') from util.zero import zeroEncode, zeroDecode pred = '%r <= row < %r and column = "location"' % \ (zeroEncode(tableName, '\x01', ''), zeroEncode(tableName, '\x02', '')) rows = [] import pykdi for r, c, t, v in pykdi.Table(metaUri).scan(pred): n, x, r = zeroDecode(r) rows.append(r) f = 1.0 / (len(rows) + 1) return [((i + 1) * f, r) for i, r in enumerate(rows)]
def iterMetaCells(table, nPartitions, splitPoints, servers, format, alphabet): d = {} d['table'] = table pi = 0 for split in iterSplits(nPartitions, splitPoints, alphabet): d['partition'] = pi d['server'] = servers[pi % len(servers)] row = zeroEncode(table, '\x01', split) value = format % d yield (row, 'location', 0, value) pi += 1 d['partition'] = pi d['server'] = servers[pi % len(servers)] row = zeroEncode(table, '\x02', '') value = format % d yield (row, 'location', 0, value)
def createTable(meta, table, server, force): import pykdi # Open META table metaTable = pykdi.Table(meta) # Create the row key from util.zero import zeroEncode row = zeroEncode(table, '\x02', '') # Make sure the table hasn't already been created (note this is a # race if there are other processes trying to create the table). for r,c,t,v in metaTable.scan('row = %r' % row): if force: metaTable.erase(r,c,t) else: raise RuntimeError('table %r already exists' % table) metaTable.set(row, 'config', 0, 'server = %s\n' % server) metaTable.sync()