From 962298eeb006566c11ce685b354b0082fc44067f Mon Sep 17 00:00:00 2001 From: Brendan Harris Date: Tue, 10 Jul 2012 19:41:03 -0700 Subject: [PATCH 1/5] Added default behavior, handling of long and short options for modifying defaults, zone support, random seed generation, removed text width formatting as it is not necessary, cleaned up format, refactored code, sys module no longer necessary (now that argparse is used) so removed it, added default interpreter path --- bin/generate_cluster_xml.py | 126 +++++++++++++++++++++++++----------- 1 file changed, 87 insertions(+), 39 deletions(-) diff --git a/bin/generate_cluster_xml.py b/bin/generate_cluster_xml.py index 3cd56644d7..57e766583f 100644 --- a/bin/generate_cluster_xml.py +++ b/bin/generate_cluster_xml.py @@ -1,42 +1,90 @@ +#!/usr/bin/python + import sys import random +import argparse + +# Get a random seed +seed = int(random.randint(00000000001,99999999999)) + +# Setup and argument parser +parser = argparse.ArgumentParser(description='Build a voldemort cluster.xml.') +# Add supported arguments +parser.add_argument('-N', '--name', type=str, default='voldemort', dest='name', + help='the name you want to give the clusteer') +parser.add_argument('-n', '--nodes', type=int, default=2, dest='nodes', + help='the number of nodes in the cluster') +parser.add_argument('-p', '--partitions', type=int, default=300, + dest='partitions', help='number of partitions per node') +parser.add_argument('-s', '--socket-port', type=int, default=6666, + dest='sock_port', help='socket port number') +parser.add_argument('-a', '--admin-port', type=int, default=6667, + dest='admin_port', help='admin port number') +parser.add_argument('-H', '--http-port', type=int, default=6665, + dest='http_port', help='http port number') +genType = parser.add_mutually_exclusive_group() +genType.add_argument('-S', '--seed', type=int, default=seed, dest='seed', + help='seed for randomizing partition distribution') +genType.add_argument('-l', '--loops', type=int, default=1000, dest='loops', + help='loop n times, using a different random seed every \ + time (Note: not currently supported)') +parser.add_argument('-z', '--zones', type=int, dest='zones', + help='if using zones, the number of zones you will have\ + (Note: you must add your own field \ + manually)') + +# Parse arguments +args = parser.parse_args() + +# Check args +if args.zones: + zones = args.zones + if (args.nodes % zones) != 0: + print "Number of nodes must be evenly divisible by number of zones" + sys.exit(1) + +# Store arguments +nodes = args.nodes +partitions = args.partitions +name = args.name +http_port = args.http_port +sock_port = args.sock_port +admin_port = args.admin_port + +# Generate the full list of partition IDs +part_ids = range(nodes * partitions) +# Generate full list of zone IDs +if args.zones: + zone_ids = range(zones) + zone_id = 0 +## Use known seed so this is repeatable +#random.seed(3119578866) +random.seed(seed) +random.shuffle(part_ids) + +# Assining partitions to nodes and printing cluster.xml +part_map = dict() +print "" % seed +print "" +print " %s" % name + +for i in xrange(nodes): + part_map[i] = ", ".join(str(p) for p in sorted(part_ids[i*partitions:(i+1)*partitions])) + + print " " + print " %d" % i + print " host%d" % i + print " %d" % http_port + print " %d" % sock_port + print " %d" % admin_port + print " %s" % part_map[i] + # If zones are being used, assign a zone-id + if args.zones: + print " %d" % zone_id + if zone_id == (zones - 1): + zone_id = 0 + else: + zone_id += 1 + print " " -if len(sys.argv) != 3: - print >> sys.stderr, "USAGE: python generate_cluster_xml.py " - sys.exit() - -FORMAT_WIDTH = 10 - -nodes = 0 -for line in open(sys.argv[1],'r'): - nodes+=1 - -partitions = int(sys.argv[2]) - -ids = range(nodes * partitions) - -# use known seed so this is repeatable -random.seed(92873498274) -random.shuffle(ids) - -print '' -print 'prodcluster' -id = 0 -for host in open(sys.argv[1],'r'): - print '' - print " %d" % id - print " %s" % host.strip() - print ' 8081' - print ' 6666' - print ' ', - node_ids = sorted(ids[id*partitions:(id+1)*partitions]) - for j in xrange(len(node_ids)): - print str(node_ids[j]) + ',', - if j % FORMAT_WIDTH == FORMAT_WIDTH - 1: - print ' ', - print ' ' - print '' - id += 1 -print '' - - +print "" From a5606293772bd599f4941d1fbf04f612e2186686 Mon Sep 17 00:00:00 2001 From: Brendan Harris Date: Tue, 10 Jul 2012 19:44:59 -0700 Subject: [PATCH 2/5] Fixing typo --- bin/generate_cluster_xml.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/generate_cluster_xml.py b/bin/generate_cluster_xml.py index 57e766583f..5d7c6065b2 100644 --- a/bin/generate_cluster_xml.py +++ b/bin/generate_cluster_xml.py @@ -30,7 +30,7 @@ time (Note: not currently supported)') parser.add_argument('-z', '--zones', type=int, dest='zones', help='if using zones, the number of zones you will have\ - (Note: you must add your own field \ + (Note: you must add your own fields \ manually)') # Parse arguments From 3aa9d12206242181988e3739805ebfad45c37f88 Mon Sep 17 00:00:00 2001 From: Brendan Harris Date: Thu, 12 Jul 2012 13:14:16 -0700 Subject: [PATCH 3/5] Fixed --seed argument handling so that it actually works, now --- bin/generate_cluster_xml.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/bin/generate_cluster_xml.py b/bin/generate_cluster_xml.py index 5d7c6065b2..08ef4c0f9a 100644 --- a/bin/generate_cluster_xml.py +++ b/bin/generate_cluster_xml.py @@ -5,7 +5,7 @@ import argparse # Get a random seed -seed = int(random.randint(00000000001,99999999999)) +rseed = int(random.randint(00000000001,99999999999)) # Setup and argument parser parser = argparse.ArgumentParser(description='Build a voldemort cluster.xml.') @@ -23,7 +23,7 @@ parser.add_argument('-H', '--http-port', type=int, default=6665, dest='http_port', help='http port number') genType = parser.add_mutually_exclusive_group() -genType.add_argument('-S', '--seed', type=int, default=seed, dest='seed', +genType.add_argument('-S', '--seed', type=int, default=rseed, dest='seed', help='seed for randomizing partition distribution') genType.add_argument('-l', '--loops', type=int, default=1000, dest='loops', help='loop n times, using a different random seed every \ @@ -50,6 +50,7 @@ http_port = args.http_port sock_port = args.sock_port admin_port = args.admin_port +seed = args.seed # Generate the full list of partition IDs part_ids = range(nodes * partitions) From 415d982c6da4f1c5c717b9281570469681c6a464 Mon Sep 17 00:00:00 2001 From: Brendan Harris Date: Fri, 20 Jul 2012 14:53:52 -0700 Subject: [PATCH 4/5] Getting rid of some unused and deprecated code, added in a comment to help explain and separate the partition shuffling --- bin/generate_cluster_xml.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/generate_cluster_xml.py b/bin/generate_cluster_xml.py index 08ef4c0f9a..dd1187d595 100644 --- a/bin/generate_cluster_xml.py +++ b/bin/generate_cluster_xml.py @@ -58,8 +58,8 @@ if args.zones: zone_ids = range(zones) zone_id = 0 -## Use known seed so this is repeatable -#random.seed(3119578866) + +# Shuffle up the partitions random.seed(seed) random.shuffle(part_ids) From ab97905843bd360ac0928320a20bb39b42f6a083 Mon Sep 17 00:00:00 2001 From: Brendan Harris Date: Thu, 26 Jul 2012 16:40:38 -0700 Subject: [PATCH 5/5] Per Jay Wylie's review, no longer using a dict to store the partition sets and fixed two typos --- bin/generate_cluster_xml.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/bin/generate_cluster_xml.py b/bin/generate_cluster_xml.py index dd1187d595..1811fdd2fc 100644 --- a/bin/generate_cluster_xml.py +++ b/bin/generate_cluster_xml.py @@ -11,7 +11,7 @@ parser = argparse.ArgumentParser(description='Build a voldemort cluster.xml.') # Add supported arguments parser.add_argument('-N', '--name', type=str, default='voldemort', dest='name', - help='the name you want to give the clusteer') + help='the name you want to give the cluster') parser.add_argument('-n', '--nodes', type=int, default=2, dest='nodes', help='the number of nodes in the cluster') parser.add_argument('-p', '--partitions', type=int, default=300, @@ -63,14 +63,13 @@ random.seed(seed) random.shuffle(part_ids) -# Assining partitions to nodes and printing cluster.xml -part_map = dict() +# Printing cluster.xml print "" % seed print "" print " %s" % name for i in xrange(nodes): - part_map[i] = ", ".join(str(p) for p in sorted(part_ids[i*partitions:(i+1)*partitions])) + node_partitions = ", ".join(str(p) for p in sorted(part_ids[i*partitions:(i+1)*partitions])) print " " print " %d" % i @@ -78,7 +77,7 @@ print " %d" % http_port print " %d" % sock_port print " %d" % admin_port - print " %s" % part_map[i] + print " %s" % node_partitions # If zones are being used, assign a zone-id if args.zones: print " %d" % zone_id