accumulo-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From mwa...@apache.org
Subject [3/5] accumulo-testing git commit: ACCUMULO-4510 Moved remaining external test code from Accumulo
Date Wed, 25 Jan 2017 18:21:52 GMT
http://git-wip-us.apache.org/repos/asf/accumulo-testing/blob/0d97273c/test/bench/cloudstone3/cloudstone3.py
----------------------------------------------------------------------
diff --git a/test/bench/cloudstone3/cloudstone3.py b/test/bench/cloudstone3/cloudstone3.py
new file mode 100755
index 0000000..e6e1bca
--- /dev/null
+++ b/test/bench/cloudstone3/cloudstone3.py
@@ -0,0 +1,50 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+import unittest
+
+from lib import cloudshell
+from lib.IngestBenchmark import IngestBenchmark
+
+class CloudStone3(IngestBenchmark):
+    "TestIngest one thousand chunky records on each tserver"
+
+    _size = 65535
+    _count = 10000
+
+    def size(self):
+        return self._size
+
+    def count(self):
+        return self._count
+        
+    def setSpeed(self, speed):
+        if speed == "fast":
+            self._size = 2**10
+            self._count = 1000
+        elif speed == "medium":
+            self._size = 2**13
+            self._count = 5000            
+        elif speed == "slow":
+            self._size = 2**16
+            self._count = 10000
+        
+
+def suite():
+    result = unittest.TestSuite([
+        CloudStone3(),
+        ])
+    return result

http://git-wip-us.apache.org/repos/asf/accumulo-testing/blob/0d97273c/test/bench/cloudstone4/__init__.py
----------------------------------------------------------------------
diff --git a/test/bench/cloudstone4/__init__.py b/test/bench/cloudstone4/__init__.py
new file mode 100755
index 0000000..09697dc
--- /dev/null
+++ b/test/bench/cloudstone4/__init__.py
@@ -0,0 +1,15 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+

http://git-wip-us.apache.org/repos/asf/accumulo-testing/blob/0d97273c/test/bench/cloudstone4/cloudstone4.py
----------------------------------------------------------------------
diff --git a/test/bench/cloudstone4/cloudstone4.py b/test/bench/cloudstone4/cloudstone4.py
new file mode 100755
index 0000000..c87bec9
--- /dev/null
+++ b/test/bench/cloudstone4/cloudstone4.py
@@ -0,0 +1,29 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+import unittest
+
+from lib import cloudshell
+from lib.TeraSortBenchmark import TeraSortBenchmark
+
+class CloudStone4(TeraSortBenchmark):
+    "TestCloudIngest one terabyte of data"
+
+def suite():
+    result = unittest.TestSuite([
+        CloudStone4(),
+        ])
+    return result

http://git-wip-us.apache.org/repos/asf/accumulo-testing/blob/0d97273c/test/bench/cloudstone5/__init__.py
----------------------------------------------------------------------
diff --git a/test/bench/cloudstone5/__init__.py b/test/bench/cloudstone5/__init__.py
new file mode 100755
index 0000000..09697dc
--- /dev/null
+++ b/test/bench/cloudstone5/__init__.py
@@ -0,0 +1,15 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+

http://git-wip-us.apache.org/repos/asf/accumulo-testing/blob/0d97273c/test/bench/cloudstone5/cloudstone5.py
----------------------------------------------------------------------
diff --git a/test/bench/cloudstone5/cloudstone5.py b/test/bench/cloudstone5/cloudstone5.py
new file mode 100755
index 0000000..2c4ba78
--- /dev/null
+++ b/test/bench/cloudstone5/cloudstone5.py
@@ -0,0 +1,29 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+import unittest
+
+from lib import cloudshell
+from lib.TableSplitsBenchmark import TableSplitsBenchmark
+
+class CloudStone5(TableSplitsBenchmark):
+    "Creates a table with many splits"
+    
+def suite():
+    result = unittest.TestSuite([
+        CloudStone5(),
+        ])
+    return result

http://git-wip-us.apache.org/repos/asf/accumulo-testing/blob/0d97273c/test/bench/cloudstone6/__init__.py
----------------------------------------------------------------------
diff --git a/test/bench/cloudstone6/__init__.py b/test/bench/cloudstone6/__init__.py
new file mode 100755
index 0000000..09697dc
--- /dev/null
+++ b/test/bench/cloudstone6/__init__.py
@@ -0,0 +1,15 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+

http://git-wip-us.apache.org/repos/asf/accumulo-testing/blob/0d97273c/test/bench/cloudstone6/cloudstone6.py
----------------------------------------------------------------------
diff --git a/test/bench/cloudstone6/cloudstone6.py b/test/bench/cloudstone6/cloudstone6.py
new file mode 100755
index 0000000..6e72633
--- /dev/null
+++ b/test/bench/cloudstone6/cloudstone6.py
@@ -0,0 +1,29 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+import unittest
+
+from lib import cloudshell
+from lib.CreateTablesBenchmark import CreateTablesBenchmark
+
+class CloudStone6(CreateTablesBenchmark):
+    "Creates many tables and then deletes them"
+    
+def suite():
+    result = unittest.TestSuite([
+        CloudStone6(),
+        ])
+    return result

http://git-wip-us.apache.org/repos/asf/accumulo-testing/blob/0d97273c/test/bench/cloudstone7/__init__.py
----------------------------------------------------------------------
diff --git a/test/bench/cloudstone7/__init__.py b/test/bench/cloudstone7/__init__.py
new file mode 100755
index 0000000..09697dc
--- /dev/null
+++ b/test/bench/cloudstone7/__init__.py
@@ -0,0 +1,15 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+

http://git-wip-us.apache.org/repos/asf/accumulo-testing/blob/0d97273c/test/bench/cloudstone7/cloudstone7.py
----------------------------------------------------------------------
diff --git a/test/bench/cloudstone7/cloudstone7.py b/test/bench/cloudstone7/cloudstone7.py
new file mode 100755
index 0000000..1933a4b
--- /dev/null
+++ b/test/bench/cloudstone7/cloudstone7.py
@@ -0,0 +1,29 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+import unittest
+
+from lib import cloudshell
+from lib.RowHashBenchmark import RowHashBenchmark
+
+class CloudStone7(RowHashBenchmark):
+    "Hashes all the rows in an accumulo table and outputs them to another table"
+    
+def suite():
+    result = unittest.TestSuite([
+        CloudStone7(),
+        ])
+    return result

http://git-wip-us.apache.org/repos/asf/accumulo-testing/blob/0d97273c/test/bench/cloudstone8/__init__.py
----------------------------------------------------------------------
diff --git a/test/bench/cloudstone8/__init__.py b/test/bench/cloudstone8/__init__.py
new file mode 100755
index 0000000..09697dc
--- /dev/null
+++ b/test/bench/cloudstone8/__init__.py
@@ -0,0 +1,15 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+

http://git-wip-us.apache.org/repos/asf/accumulo-testing/blob/0d97273c/test/bench/cloudstone8/cloudstone8.py
----------------------------------------------------------------------
diff --git a/test/bench/cloudstone8/cloudstone8.py b/test/bench/cloudstone8/cloudstone8.py
new file mode 100755
index 0000000..a02a0a1
--- /dev/null
+++ b/test/bench/cloudstone8/cloudstone8.py
@@ -0,0 +1,64 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+import unittest
+
+from lib import cloudshell
+from lib.TeraSortBenchmark import TeraSortBenchmark
+
+class CloudStone8(TeraSortBenchmark):
+    "Tests variable length input keys and values"
+    
+    keymin = 10
+    keymax = 50
+    valmin = 100
+    valmax = 500
+    rows = 1000000
+    tablename = 'VariableLengthIngestTable'
+    
+    
+    def shortDescription(self):
+        return 'Ingests %d rows of variable key and value length to be sorted. '\
+               'Lower score is better.' % (self.numrows())
+    
+    def setSpeed(self, speed):
+        if speed == "slow":
+            self.rows = 1000000
+            self.keymin = 60
+            self.keymax = 100
+            self.valmin = 200
+            self.valmax = 300
+            self.numsplits = 400
+        elif speed == "medium":
+            self.rows = 100000
+            self.keymin = 40
+            self.keymax = 70
+            self.valmin = 130
+            self.valmax = 170
+            self.numsplits = 40
+        elif speed == "fast":
+            self.rows = 10000 
+            self.keymin = 30
+            self.keymax = 50
+            self.valmin = 80
+            self.valmax = 100 
+            self.numsplits = 4
+
+def suite():
+    result = unittest.TestSuite([
+        CloudStone8(),
+        ])
+    return result

http://git-wip-us.apache.org/repos/asf/accumulo-testing/blob/0d97273c/test/bench/lib/Benchmark.py
----------------------------------------------------------------------
diff --git a/test/bench/lib/Benchmark.py b/test/bench/lib/Benchmark.py
new file mode 100755
index 0000000..1481ccf
--- /dev/null
+++ b/test/bench/lib/Benchmark.py
@@ -0,0 +1,115 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import time
+
+import unittest
+import os
+import glob
+import sys
+
+from options import log
+
+from path import accumulo
+
+class Benchmark(unittest.TestCase):
+    
+    username = ''
+    password = ''
+    zookeepers = ''
+    instance = ''
+
+    def __init__(self):
+        unittest.TestCase.__init__(self)
+        self.finished = None
+
+    def name(self):
+        return self.__class__.__name__
+
+    def setUp(self):
+        # verify accumulo is running
+        self.start = time.time()
+
+    def tearDown(self):
+        self.stop = time.time()
+        log.debug("Runtime: %.2f", self.stop - self.start)
+        self.finished = True
+
+    def runTime(self):
+        return self.stop - self.start
+
+    def score(self):
+        if self.finished:
+            return self.runTime()
+        return 0.
+
+    # Each class that extends Benchmark should overwrite this
+    def setSpeed(self, speed):
+        print "Classes that extend Benchmark need to override setSpeed."
+        
+
+    def setUsername(self, user):
+        self.username = user
+
+    def getUsername(self):
+        return self.username
+        
+    def setPassword(self, password):
+        self.password = password
+
+    def getPassword(self):
+        return self.password
+        
+    def setZookeepers(self, zookeepers):
+        self.zookeepers = zookeepers
+
+    def getZookeepers(self):
+        return self.zookeepers
+        
+    def setInstance(self, instance):
+        self.instance = instance
+
+    def getInstance(self):
+        return self.instance
+        
+    def sleep(self, tts):
+        time.sleep(tts)
+        
+    def needsAuthentication(self):
+        return 0
+    
+    def findjar(self, path):
+        globjar = [ j for j in glob.glob(path) if j.find('javadoc') == -1 and j.find('sources') == -1 ]
+        return globjar[0]
+        
+    # Returns the location of the local test jar
+    def gettestjar(self):
+        return self.findjar(accumulo() + '/lib/accumulo-test.jar')
+    
+    # Returns a string of core, thrift and zookeeper jars with a specified delim
+    def getjars(self, delim=','):
+        accumulo_core_jar = self.findjar(accumulo('lib', 'accumulo-core.jar'))
+        accumulo_start_jar = self.findjar(accumulo('lib', 'accumulo-start.jar'))
+        accumulo_fate_jar = self.findjar(accumulo('lib', 'accumulo-fate.jar'))
+        accumulo_trace_jar = self.findjar(accumulo('lib', 'accumulo-trace.jar'))
+        accumulo_thrift_jar = self.findjar(accumulo('lib', 'libthrift.jar'))
+        accumulo_zookeeper_jar = self.findjar(os.path.join(os.getenv('ZOOKEEPER_HOME'), 'zookeeper*.jar'))
+        return delim.join([accumulo_core_jar, accumulo_thrift_jar, accumulo_zookeeper_jar, accumulo_start_jar,
+            accumulo_fate_jar, accumulo_trace_jar])
+       
+    # Builds the running command for the map/reduce class specified sans the arguments
+    def buildcommand(self, classname, *args):
+        return [accumulo('bin', 'accumulo'), classname, '-libjars', self.getjars()] + list(map(str, args))
+

http://git-wip-us.apache.org/repos/asf/accumulo-testing/blob/0d97273c/test/bench/lib/CreateTablesBenchmark.py
----------------------------------------------------------------------
diff --git a/test/bench/lib/CreateTablesBenchmark.py b/test/bench/lib/CreateTablesBenchmark.py
new file mode 100755
index 0000000..e5761d6
--- /dev/null
+++ b/test/bench/lib/CreateTablesBenchmark.py
@@ -0,0 +1,78 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import unittest
+
+import subprocess
+
+from lib import cloudshell, runner, path
+from lib.Benchmark import Benchmark
+from lib.tservers import runEach, tserverNames
+from lib.path import accumulo, accumuloJar
+from lib.util import sleep
+from lib.options import log
+
+class CreateTablesBenchmark(Benchmark):
+    "Creating and deleting tables"
+
+    tables = 1000
+
+    def setUp(self): 
+        for x in range(1, self.tables):
+            currentTable = 'test_ingest%d' % (x)      
+            log.debug("Checking for table existence: %s" % currentTable)
+            code, out, err = cloudshell.run(self.username, self.password, 'table %s\n' % currentTable)
+            if out.find('does not exist') == -1:
+                command = 'deletetable -f %s\n' % (currentTable)
+                log.debug("Running Command %r", command)
+                code, out, err = cloudshell.run(self.username, self.password, command)
+                self.assertEqual(code, 0, 'Did not successfully delete table: %s' % currentTable)
+        Benchmark.setUp(self)  
+
+    def runTest(self):
+        for x in range(1, self.tables):
+            currentTable = 'test_ingest%d' % (x)      
+            command = 'createtable %s\n' % (currentTable)
+            log.debug("Running Command %r", command)
+            code, out, err = cloudshell.run(self.username, self.password, command)
+            self.assertEqual(code, 0, 'Did not successfully create table: %s' % currentTable)
+            # print err
+        for x in range(1, self.tables):
+            currentTable = 'test_ingest%d' % (x)      
+            command = 'deletetable -f %s\n' % (currentTable)
+            log.debug("Running Command %r", command)
+            code, out, err = cloudshell.run(self.username, self.password, command)
+            self.assertEqual(code, 0, 'Did not successfully delete table: %s' % currentTable)
+            # print err
+        log.debug("Process finished")
+        return code, out, err
+            
+    def numTables(self):
+        return self.tables
+    
+    def shortDescription(self):
+        return 'Creates %d tables and then deletes them. '\
+               'Lower score is better.' % (self.numTables())
+               
+    def setSpeed(self, speed):
+        if speed == "slow":
+            self.tables = 50
+        elif speed == "medium":
+            self.tables = 10
+        elif speed == "fast":
+            self.tables = 5
+            
+    def needsAuthentication(self):
+        return 1

http://git-wip-us.apache.org/repos/asf/accumulo-testing/blob/0d97273c/test/bench/lib/IngestBenchmark.py
----------------------------------------------------------------------
diff --git a/test/bench/lib/IngestBenchmark.py b/test/bench/lib/IngestBenchmark.py
new file mode 100755
index 0000000..3036c28
--- /dev/null
+++ b/test/bench/lib/IngestBenchmark.py
@@ -0,0 +1,94 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+import unittest
+
+from lib import cloudshell
+from lib.Benchmark import Benchmark
+from lib.tservers import runEach, tserverNames
+from lib.path import accumulo, accumuloJar
+from lib.util import sleep
+from lib.options import log
+
+class IngestBenchmark(Benchmark):
+    "TestIngest records on each tserver"
+    
+    rows = 1000000
+
+    def setUp(self):
+        code, out, err = cloudshell.run(self.username, self.password, 'table test_ingest\n')
+        if out.find('does not exist') == -1:
+            log.debug("Deleting table test_ingest")
+            code, out, err = cloudshell.run(self.username, self.password, 'deletetable test_ingest -f\n')
+            self.assertEquals(code, 0, "Could not delete the table 'test_ingest'")
+        code, out, err = cloudshell.run(self.username, self.password, 'createtable test_ingest\n')
+        self.assertEqual(code, 0, "Could not create the table 'test_ingest'")
+        Benchmark.setUp(self)
+
+    def tearDown(self):
+        command = 'deletetable test_ingest -f\n'
+        log.debug("Running Command %r", command)
+        code, out, err = cloudshell.run(self.username, self.password, command)
+        self.assertEqual(code, 0, "Could not delete the table 'test_ingest'")
+        Benchmark.tearDown(self)
+
+    def size(self):
+        return 50
+
+    def random(self):
+        return 56
+
+    def count(self):
+        return self.rows
+
+    def runTest(self):
+        commands = {}
+        for i, s in enumerate(tserverNames()):
+            commands[s] = '%s %s -u %s -p %s --size %d --random %d --rows %d --start %d --cols %d' % (
+                accumulo('bin', 'accumulo'),
+                'org.apache.accumulo.test.TestIngest',
+                self.username, self.password,
+                self.size(),
+                self.random(),
+                self.count(),
+                i*self.count(),
+                1)
+        results = runEach(commands)
+        codes = {}
+        for tserver, (code, out, err) in results.items():
+            codes.setdefault(code, [])
+            codes[code].append(tserver)
+        for code, tservers in codes.items():
+            if code != 0:
+                self.assertEqual(code, 0, "Bad exit code (%d) from tservers %r" % (code, tservers))
+
+    def score(self):
+        if self.finished:
+            return self.count() * self.size() / 1e6 / self.runTime()
+        return 0.
+    
+    def shortDescription(self):
+        return 'Ingest %d rows of values %d bytes on every tserver.  '\
+               'Higher is better.' % (self.count(), self.size())
+
+    def setSpeed(self, speed):
+        if speed == "fast":
+            self.rows = 10000
+        elif speed == "medium":
+            self.rows = 100000
+        elif speed == "slow":
+            self.rows = 1000000
+        

http://git-wip-us.apache.org/repos/asf/accumulo-testing/blob/0d97273c/test/bench/lib/RowHashBenchmark.py
----------------------------------------------------------------------
diff --git a/test/bench/lib/RowHashBenchmark.py b/test/bench/lib/RowHashBenchmark.py
new file mode 100755
index 0000000..34009d6
--- /dev/null
+++ b/test/bench/lib/RowHashBenchmark.py
@@ -0,0 +1,136 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import unittest
+
+import subprocess
+import os
+import glob
+import random
+import time
+
+from lib import cloudshell, runner, path
+from lib.Benchmark import Benchmark
+from lib.tservers import runEach, tserverNames
+from lib.path import accumulo, accumuloJar
+from lib.util import sleep
+from lib.options import log
+
+class RowHashBenchmark(Benchmark):
+    "RowHashing Benchmark"
+
+    keymin = 10
+    keymax = 10
+    valmin = 80
+    valmax = 80
+    rows = 1000000
+    maxmaps = 60
+    hadoop_version = ''
+    input_table = 'RowHashTestInput'
+    output_table = 'RowHashTestOutput'
+
+    def setUp(self): 
+        dir = os.path.dirname(os.path.realpath(__file__))
+        file = os.path.join( dir, 'splits' )  
+        code, out, err = cloudshell.run(self.username, self.password, 'table %s\n' % self.input_table) 
+        if out.find('does not exist') == -1:
+           code, out, err = cloudshell.run(self.username, self.password, 'deletetable -f %s\n' % self.input_table) 
+           self.sleep(15)
+        code, out, err = cloudshell.run(self.username, self.password, "createtable %s -sf %s\n" % (self.input_table, file))
+        code, out, err = cloudshell.run(self.username, self.password, 'table %s\n' % self.output_table) 
+        if out.find('does not exist') == -1:
+            code, out, err = cloudshell.run(self.username, self.password, 'deletetable -f %s\n' %
+                    self.output_table) 
+            self.sleep(15)
+        code, out, err = cloudshell.run(self.username, self.password, "createtable %s -sf %s\n" % (self.output_table, file))
+        command = self.buildcommand('org.apache.accumulo.test.mapreduce.TeraSortIngest',
+                                    '--count', self.numrows(),
+                                    '-nk', self.keysizemin(),
+                                    '-xk', self.keysizemax(),
+                                    '-nv', self.minvaluesize(),
+                                    '-xv', self.maxvaluesize(),
+                                    '--table', self.input_table, 
+                                    '-i', self.getInstance(),
+                                    '-z', self.getZookeepers(),
+                                    '-u', self.getUsername(),
+                                    '-p', self.getPassword(),
+                                    '--splits', self.maxmaps)
+        handle = runner.start(command, stdin=subprocess.PIPE)
+        log.debug("Running: %r", command)
+        out, err = handle.communicate("")  
+        Benchmark.setUp(self)
+
+    def tearDown(self):
+        code, out, err = cloudshell.run(self.username, self.password, "deletetable -f %s\n" % self.input_table)
+        self.assertEqual(code, 0, 'Could not delete %s, %s' % (self.input_table, out))
+        code, out, err = cloudshell.run(self.username, self.password, "deletetable -f %s\n" % self.output_table)
+        self.assertEqual(code, 0, 'Could not delete %s, %s' % (self.output_table, out))
+        Benchmark.tearDown(self)
+
+    def tearDown(self):
+        code, out, err = cloudshell.run(self.username, self.password, "deletetable %s\n" % self.input_table)
+        self.assertEqual(code, 0, 'Could not delete %s, %s' % (self.input_table, out))
+        code, out, err = cloudshell.run(self.username, self.password, "deletetable %s\n" % self.output_table)
+        self.assertEqual(code, 0, 'Could not delete %s, %s' % (self.output_table, out))
+        Benchmark.tearDown(self)
+
+    def keysizemin(self):
+        return self.keymin
+
+    def keysizemax(self):
+        return self.keymax
+
+    def numrows(self):
+        return self.rows
+
+    def minvaluesize(self):
+        return self.valmin
+
+    def maxvaluesize(self):
+        return self.valmax
+        
+    def runTest(self):   
+        command = self.buildcommand('org.apache.accumulo.test.mapreduce.RowHash',
+                                    self.getInstance(),
+                                    self.getZookeepers(),
+                                    self.getUsername(),
+                                    self.getPassword(),
+                                    self.input_table,
+                                    'column:columnqual',
+                                    self.output_table,
+                                    self.maxmaps)
+        handle = runner.start(command, stdin=subprocess.PIPE)        
+        log.debug("Running: %r", command)
+        out, err = handle.communicate("")
+        log.debug("Process finished: %d (%s)", handle.returncode, ' '.join(handle.command))
+        return handle.returncode, out, err
+    
+    def shortDescription(self):
+        return 'Hashes %d rows from one table and outputs them into another table. '\
+               'Lower score is better.' % (self.numrows())
+               
+    def setSpeed(self, speed):
+        if speed == "slow":
+            self.rows = 1000000
+            self.maxmaps = 400
+        elif speed == "medium":
+            self.rows = 100000
+            self.maxmaps = 40
+        else: # if speed == "fast"
+            self.rows = 10000
+            self.maxmaps = 4
+            
+    def needsAuthentication(self):
+        return 1

http://git-wip-us.apache.org/repos/asf/accumulo-testing/blob/0d97273c/test/bench/lib/TableSplitsBenchmark.py
----------------------------------------------------------------------
diff --git a/test/bench/lib/TableSplitsBenchmark.py b/test/bench/lib/TableSplitsBenchmark.py
new file mode 100755
index 0000000..2a21fe4
--- /dev/null
+++ b/test/bench/lib/TableSplitsBenchmark.py
@@ -0,0 +1,76 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import unittest
+
+import subprocess
+import os
+import glob
+import random
+import time
+
+from lib import cloudshell, runner, path
+from lib.Benchmark import Benchmark
+from lib.tservers import runEach, tserverNames
+from lib.path import accumulo, accumuloJar
+from lib.util import sleep
+from lib.options import log
+
+class TableSplitsBenchmark(Benchmark):
+    "Creating a table with predefined splits and then deletes it"
+
+    splitsfile = 'slowsplits'
+    tablename = 'test_splits'
+
+    def setUp(self): 
+        # Need to generate a splits file for each speed
+        code, out, err = cloudshell.run(self.username, self.password, 'table %s\n' % self.tablename)
+        if out.find('does not exist') == -1:
+            log.debug('Deleting table %s' % self.tablename)
+            code, out, err = cloudshell.run(self.username, self.password, 'deletetable %s -f\n' % self.tablename)
+            self.assertEqual(code, 0, "Could not delete table")
+        Benchmark.setUp(self)
+
+    def runTest(self):             
+        command = 'createtable %s -sf %s\n' % (self.tablename, self.splitsfile)
+        log.debug("Running Command %r", command)
+        code, out, err = cloudshell.run(self.username, self.password, command)
+        self.assertEqual(code, 0, 'Could not create table: %s' % out)
+        return code, out, err
+
+    def shortDescription(self):
+        return 'Creates a table with splits. Lower score is better.'
+        
+    def tearDown(self):
+        command = 'deletetable %s -f\n' % self.tablename
+        log.debug("Running Command %r", command)
+        code, out, err = cloudshell.run(self.username, self.password, command)
+        self.assertEqual(code, 0, "Could not delete table")
+        log.debug("Process finished")        
+        Benchmark.tearDown(self)
+
+    def setSpeed(self, speed):
+        dir = os.path.dirname(os.path.realpath(__file__))
+        if speed == "slow":
+            splitsfile = 'slowsplits'
+        elif speed == "medium":
+            splitsfile = 'mediumsplits'
+        else: # speed == "fast"
+            splitsfile = 'fastsplits'
+        self.splitsfile = os.path.join( dir, splitsfile)
+        
+    def needsAuthentication(self):
+        return 1
+        

http://git-wip-us.apache.org/repos/asf/accumulo-testing/blob/0d97273c/test/bench/lib/TeraSortBenchmark.py
----------------------------------------------------------------------
diff --git a/test/bench/lib/TeraSortBenchmark.py b/test/bench/lib/TeraSortBenchmark.py
new file mode 100755
index 0000000..f9984b2
--- /dev/null
+++ b/test/bench/lib/TeraSortBenchmark.py
@@ -0,0 +1,110 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import unittest
+
+import subprocess
+import os
+import glob
+import random
+import time
+
+from lib import cloudshell, runner, path
+from lib.Benchmark import Benchmark
+from lib.util import sleep
+from lib.options import log
+
+class TeraSortBenchmark(Benchmark):
+    "TeraSort in the cloud"
+
+    keymin = 10
+    keymax = 10
+    valmin = 78
+    valmax = 78
+    rows = 10000000000
+    numsplits = 400
+    # Change this number to modify how the jobs are run on hadoop
+    rows_per_split = 250000
+    hadoop_version = ''
+    tablename = 'CloudIngestTest'
+
+
+    def setUp(self): 
+        code, out, err = cloudshell.run(self.username, self.password, 'table %s\n' % self.tablename)
+        if out.find('does not exist') == -1:
+            log.debug('Deleting table %s' % self.tablename)
+            code, out, err = cloudshell.run(self.username, self.password, 'deletetable -f %s\n' % self.tablename)
+        Benchmark.setUp(self)
+
+    def tearDown(self):
+        code, out, err = cloudshell.run(self.username, self.password, "deletetable -f %s\n" % self.tablename)
+        self.assertEqual(code, 0, 'Could not delete %s, %s' % (self.tablename, out))
+        Benchmark.tearDown(self)
+        
+    def keysizemin(self):
+        return self.keymin
+
+    def keysizemax(self):
+        return self.keymax
+
+    def numrows(self):
+        return self.rows
+
+    def minvaluesize(self):
+        return self.valmin
+
+    def maxvaluesize(self):
+        return self.valmax
+        
+    def runTest(self):        
+        dir = os.path.dirname(os.path.realpath(__file__))
+        file = os.path.join( dir, 'splits' )
+        code, out, err = cloudshell.run(self.username, self.password, "createtable %s -sf %s\n" % (self.tablename, file))
+        command = self.buildcommand('org.apache.accumulo.test.mapreduce.TeraSortIngest',
+                                    '--count', self.numrows(),
+                                    '-nk', self.keysizemin(),
+                                    '-xk', self.keysizemax(),
+                                    '-nv', self.minvaluesize(),
+                                    '-xv', self.maxvaluesize(),
+                                    '-t', self.tablename,
+                                    '-i', self.instance,
+                                    '-z', self.zookeepers,
+                                    '-u', self.username,
+                                    '-p', self.password,
+                                    '--splits', self.numsplits)
+        handle = runner.start(command, stdin=subprocess.PIPE)
+        log.debug("Running: %r", command)
+        out, err = handle.communicate("")
+        log.debug("Process finished: %d (%s)", handle.returncode, ' '.join(handle.command))
+        self.assertEqual(handle.returncode, 0, "Job did not complete successfully")
+        return handle.returncode, out, err
+        
+    def needsAuthentication(self):
+        return 1
+    
+    def shortDescription(self):
+        return 'Ingests %d rows (to be sorted). '\
+               'Lower score is better.' % (self.numrows())
+               
+    def setSpeed(self, speed):
+        if speed == "slow":
+            self.rows = 10000000000            
+            self.numsplits = 400
+        elif speed == "medium":
+            self.rows = 10000000
+            self.numsplits = 40
+        elif speed == "fast":
+            self.rows = 10000 
+            self.numsplits = 4

http://git-wip-us.apache.org/repos/asf/accumulo-testing/blob/0d97273c/test/bench/lib/__init__.py
----------------------------------------------------------------------
diff --git a/test/bench/lib/__init__.py b/test/bench/lib/__init__.py
new file mode 100755
index 0000000..09697dc
--- /dev/null
+++ b/test/bench/lib/__init__.py
@@ -0,0 +1,15 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+

http://git-wip-us.apache.org/repos/asf/accumulo-testing/blob/0d97273c/test/bench/lib/cloudshell.py
----------------------------------------------------------------------
diff --git a/test/bench/lib/cloudshell.py b/test/bench/lib/cloudshell.py
new file mode 100755
index 0000000..8c552fb
--- /dev/null
+++ b/test/bench/lib/cloudshell.py
@@ -0,0 +1,33 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+import subprocess
+
+from lib import path
+from lib import runner
+from lib.options import log
+
+    
+def run(username, password, input):
+    "Run a command in accumulo"
+    handle = runner.start([path.accumulo('bin', 'accumulo'), 'shell', '-u', username, '-p', password],
+                          stdin=subprocess.PIPE)
+    log.debug("Running: %r", input)
+    out, err = handle.communicate(input)
+    log.debug("Process finished: %d (%s)",
+              handle.returncode,
+              ' '.join(handle.command))
+    return handle.returncode, out, err

http://git-wip-us.apache.org/repos/asf/accumulo-testing/blob/0d97273c/test/bench/lib/fastsplits
----------------------------------------------------------------------
diff --git a/test/bench/lib/fastsplits b/test/bench/lib/fastsplits
new file mode 100644
index 0000000..63a3126
--- /dev/null
+++ b/test/bench/lib/fastsplits
@@ -0,0 +1,300 @@
+ 8_[[@]V)g
+! Hm=E#(X}
+!N<~+ Y7LW
+"!#02~UMAc
+"C[`\+0<6_
+#$;~d/|&`)
+#)S(BIkV+8
+#9||w=nFUS
+#<f!5A0/2F
+#PAB|J{K(P
+#\M_9bs,y~
+$GFv0'F=_G
+$VdF;\XyxC
+$`"WiH2o>,
+$l"]2vq>x%
+$oBIw^3Q6g
+%+QoBOq:F[
+%6hnyeW+xu
+%9Ty&[2+AR
+%Bu+%{xQk}
+%IETwl`7@u
+%NH<U0fa^T
+%fJ &xc,uR
+':,7c#E@=c
+'Fh9*<Ffi4
+'H*d.B,one
+'}/tlA^J7d
+(H;1tZhH5!
+(U2mqCC|fy
+)4h-S][gEg
+)S(BIkV+8$
+)X%u=$fKWE
+)g~h'DpOn9
+)m6Qf=5KHM
+)no79`(x]f
+*! Hm=E#(X
+*,j.9UR]}J
+*u^.u0<N,m
++QoBOq:F[7
+,*$>>"34"i
+,4O]Y@h-%.
+,A_;2J/poG
+,j.9UR]}J@
+,xWmj0-)<r
+-$O;nf/dKo
+-){&T;kH|/
+-BFcq5=qK[
+-EypWN*I4D
+-KgIM-K=cK
+-Z6]ka+Omr
+-_9z+e^[Sv
+.(U2mqCC|f
+.Nk"~w?=7f
+.Xq'a@Ve@L
+.YJ|irdw_@
+.ptinhidK?
+.zpEan^lN 
+/.YJ|irdw_
+/UmI2_.}qy
+/y_@;{hWz?
+/|hir_ZKl?
+0Q:S5|;s y
+0t!#F.jycv
+10Q:S5|;s 
+1<Q8ka\IS+
+1NFCWfkIgL
+2=Mo\my;(Y
+2tacz_=}.6
+3Mc<F>'fXk
+4G3;-_4c@z
+4_e1LVoOd{
+4d[Bz~I#*c
+4h-S][gEg@
+4p,Z_@(F(0
+5r8Qtn]%Zp
+6%~Wgz .`r
+6@vYDc%@-k
+6UB2tRz9VG
+6]NN,?mXfF
+6|;OY,eC^m
+71NFCWfkIg
+7T,N*L0|B$
+7X&k)Mnw7A
+7hu(z$ .d2
+7|m#)G;g7'
+8 gNp8#@5R
+8$/O8Z<a$C
+88Imw^rpkO
+8G]KhZ=^vD
+8X~QuCBfmG
+8^OB&SnJ.[
+8_[[@]V)gn
+9ZL)eI5z"S
+:,7c#E@=cF
+:F.DT"MrX=
+:HOBc>hCMu
+;E`6m/n=B(
+;eT#S*'^m@
+;~9@/]L7t4
+<+`jK~}h[K
+<v3lFW:Ih{
+=+sqj~[8<C
+=Mo\my;(Y+
+>32ir!c?v)
+>H@1?E 1Sr
+>IyA_El%$K
+>rL,qr~TqI
+?%IETwl`7@
+?g8{KnWc(2
+?lQTa c1DE
+@+@B*+,%9E
+@BT^o`(~GO
+@`,Y#9tX0V
+A-Xo.RbIa3
+A7hu(z$ .d
+AFV1^w+wyf
+A_;2J/poG#
+Aa|<zVU0YB
+AfZn),"ibh
+B>rL,qr~Tq
+BFcq5=qK[!
+BbY^)[9#jl
+B|~j!/o.AX
+C3!##k\4+L
+C8 gNp8#@5
+C876I<O,T6
+CdWn]fP!g`
+Ce3bHH1*$G
+ChOeh,bJ]y
+D+*d~OplV3
+DJ2j^@_uGQ
+DgCs5Xj,Nw
+E746NYvO}K
+EU,y{4\Q7y
+EwOwA\-ko3
+EypWN*I4D_
+FV1^w+wyfX
+Fh9*<Ffi4S
+F~M<q,taX*
+G!%-3jzL^V
+H&NywA&UO,
+H;1tZhH5!z
+HOBc>hCMu<
+HQ\jNVWxb 
+H]>129!z1Z
+Hm#7?^2*^v
+IBHd-yE=*8
+Id~_^eb*:~
+IyA_El%$KO
+J2j^@_uGQE
+KA!~Bd6{w/
+KgIM-K=cKv
+L(D\MVWT]q
+Lb4`Xe|Ide
+M:F.DT"MrX
+ME746NYvO}
+METKC~VFEZ
+MHX\>VSx"a
+MQ_,z sLfk
+N;m+QQ)MM:
+Nk"~w?=7fW
+O$oBIw^3Q6
+O7h/k3y4Wx
+O9L>=;KJo?
+O<K;.-fKB!
+OCtBJFLcXs
+P<9]<"\Htb
+PAB|J{K(PB
+Pgh4d,q@WL
+Q6@vYDc%@-
+Q;5Zp=+%\}
+Q>32ir!c?v
+QQ;5Zp=+%\
+QbIzMD=/~)
+Qj{.TkiD2f
+RH{]O><_tb
+Rw2v5>R*~X
+S)]6byA mX
+Sf@jpK'i:?
+T7|m#)G;g7
+TlP76bt0.d
+U=n~3gOx(g
+U>7^ux VgB
+UW^?k\EMo|
+UmI2_.}qy}
+VA>Shg;h$Q
+VHFQ0J%G]u
+Vxd,Vz>!t]
+WVxd,Vz>!t
+W^?k\EMo|g
+X%u=$fKWE#
+X_RMVKC8/K
+Xa!\`%>};~
+Xq'a@Ve@LH
+Xy1<XzwYg@
+Y%NH<U0fa^
+Y~[[%5OX@d
+ZL)eI5z"S$
+ZT[-~uLI)[
+[9VQ2>"}W;
+[S)]6byA m
+[Sb.8r[b5Q
+[VD4|Swvl]
+[[Lx&Ubo_&
+\aZ{Kux;oE
+]#<f!5A0/2
+]H&NywA&UO
+]NN,?mXfFn
+]sr@>j.mUz
+_*u^.u0<N,
+_9z+e^[Svg
+_RMVKC8/KV
+_ZT[-~uLI)
+_e1LVoOd{|
+`#9||w=nFU
+`*uX?A^"g2
+`+0W:>F9Dw
+`uBR|..b#]
+a$`"WiH2o>
+b4`Xe|IdeQ
+bIzMD=/~)b
+bpip1V|XZ#
+c1gueA\riS
+d6w&X@GAFQ
+d[9VQ2>"}W
+d[Bz~I#*c?
+dqX7xL$:BS
+f@jpK'i:?H
+fZn),"ibhj
+gCs5Xj,Nw>
+gz|'Kxfm2O
+h$VdF;\Xyx
+i]C)h.:Q*o
+iv@PFpmW9.
+jY~[[%5OX@
+jjYSis[@q0
+jmRxiM\A-a
+j{.TkiD2f9
+kPgh4d,q@W
+k[[Lx&Ubo_
+l"]2vq>x%|
+lP76bt0.dq
+lkj=KxI!)#
+m#7?^2*^vB
+m6Qf=5KHMx
+m@+@B*+,%9
+mRxiM\A-a,
+mzCemV4I]w
+nmb]2LQMD0
+no79`(x]f%
+oJ'&t#@~ty
+p"C[`\+0<6
+p%!]7$<!}<
+p,Z_@(F(0:
+p-Z6]ka+Om
+p[Sb.8r[b5
+p]sr@>j.mU
+pip1V|XZ#*
+ptinhidK?.
+q7X&k)Mnw7
+qB|~j!/o.A
+qDzPRZ5}O*
+qX7xL$:BS&
+rC3!##k\4+
+rXa!\`%>};
+ry[fI-whv9
+t9l&/-RrdC
+t;E`6m/n=B
+tw+$P@p7**
+uBR|..b#]X
+u~]KWLu s%
+vEU,y{4\Q7
+w+$P@p7**t
+wD+*d~OplV
+wIBHd-yE=*
+wOwA\-ko3,
+wq2~T%*`C.
+xL4\6T(T8z
+xWmj0-)<r(
+xnmb]2LQMD
+y%9Ty&[2+A
+y1<XzwYg@5
+yCe3bHH1*$
+y[fI-whv9^
+y\F]9Klfe 
+zCemV4I]wZ
+zP}sUVQjDU
+zpEan^lN :
+{MHX\>VSx"
+{i_V5T0Y~ 
+|;OY,eC^mU
+|[VD4|Swvl
+}/tlA^J7dS
+}1<Q8ka\IS
+}8G]KhZ=^v
+}<+`jK~}h[
+~M<q,taX*E
+~]KWLu s%o
+~w?:@7O%*e
+~y\F]9Klfe

http://git-wip-us.apache.org/repos/asf/accumulo-testing/blob/0d97273c/test/bench/lib/mediumsplits
----------------------------------------------------------------------
diff --git a/test/bench/lib/mediumsplits b/test/bench/lib/mediumsplits
new file mode 100644
index 0000000..77b24cf
--- /dev/null
+++ b/test/bench/lib/mediumsplits
@@ -0,0 +1,650 @@
+ 5`[Tg\<Ro
+ >mj^DS'%i
+ mX(H;1tZh
+ nvsr*n7Nm
+! Hm=E#(X}
+!%-3jzL^Vx
+!3!.b\Q,:5
+!97l@xN m'
+!R?OI;j7fp
+!`2TDk_[m}
+!dZ)Kqr\Z$
+!dpSG}M^[!
+!e;<w )%Ar
+"!#02~UMAc
+".#b>ep_3A
+"C[`\+0<6_
+"S$kPgh4d,
+"h4<#+*5^}
+"iw\o7oX`^
+#$;~d/|&`)
+#+*5^}O5h5
+#9||w=nFUS
+#<f!5A0/2F
+#=R8gSadto
+#L3P9RLf@z
+#\M_9bs,y~
+#d\%.)pDs_
+#x97^QGxAN
+$VdF;\XyxC
+$]d9-34zl0
+$`"WiH2o>,
+$oBIw^3Q6g
+${bV80R>13
+%!]7$<!}<5
+%$Af!rm 5`
+%-`tW-TcJl
+%.~VHFQ0J%
+%9E,A_;2J/
+%9Ty&[2+AR
+%Bu+%{xQk}
+%IETwl`7@u
+%NH<U0fa^T
+%\}rXa!\`%
+&b/=#x97^Q
+&srQw5aK}Y
+&z.@>ASN;z
+&|?\H&?#d\
+'&D%F6V"t)
+':X}rq!g7v
+'pXQ1sTGoA
+'tx\r-?j^@
+'z@KNK@<=,
+($raW"A^%n
+(2]N;m+QQ)
+(O2Z+[\fEb
+(U2mqCC|fy
+(X}_ZT[-~u
+(Y+Hm#7?^2
+(aK`!?\~;o
+(qL0nP1qAM
+)#K;~9@/]L
+)S(BIkV+8$
+)UMqX3#~E1
+)g~h'DpOn9
+)ue+Y%*X|x
+*$>>"34"iw
+*$GrC3!##k
+*7ozJGKA@~
+*DUx9EMa[?
+*WUm48!G[?
+*c?m@+@B*+
+*e>=+sqj~[
+*mZ>~yNm:2
+*qVlW` BEy
+*u^.u0<N,m
+*zQA'"wq%n
++-p''"g:ya
++/'Z6Lt{|6
++0W:>F9Dw`
++8$71NFCWf
++C!GtinpGM
++Mq\;3:Zn~
++QoBOq:F[7
++sqj~[8<C7
+,"7lu'J[!&
+,Cf`o&|LK{
+,j.9UR]}J@
+,}~/+gu=31
+-#JmI@DQd0
+-$O;nf/dKo
+-){&T;kH|/
+-DED&srQw5
+-Xo.RbIa3{
+-Z6]ka+Omr
+-a,t;E`6m/
+-jwCbA9sYF
+.)pDs_!O`K
+.AXX_RMVKC
+.YJ|irdw_@
+.[4/|hir_Z
+.d2~y\F]9K
+.mo[d'qE0,
+/#Udir>>68
+/BB]uzzf.g
+/KVyCe3bHH
+/OB^&Z.\,w
+/^>ku2$G$s
+0$\:M,0GbK
+0&}~-jwCbA
+0'Z[m^>Cxy
+0Q:S5|;s y
+0e'$+/'Z6L
+0w0'7`l]'L
+1<Q8ka\IS+
+1J"oyVzs^r
+1NFCWfkIgL
+1Zv$GFv0'F
+1sTGoAZ8Eh
+1xnSIJcn?u
+1xvhKV*':X
+2D8H[5ELY8
+2WQO@6PDGs
+2`{pN[df,~
+2f9-_9z+e^
+2tacz_=}.6
+3!Z[JF1EV7
+32;i6wp$Br
+3<XYUYu`{Y
+3gL 9-WQ9h
+3n!Me<W0'Z
+3~5KmW<8Wk
+4+L:HOBc>h
+43vu4f@d]]
+48!G[?/>Jv
+4FdT,Cf`o&
+4G3;-_4c@z
+4O]Y@h-%.~
+4[s+a$lgN'
+4h-S][gEg@
+4jqapc^pKf
+4u&:,[%{/M
+5!z{MHX\>V
+5h5_5}Q8 Y
+5qi[8O4c~g
+5z'|f<aqR2
+5}Q8 Yrw|@
+6%~Wgz .`r
+63Q=(;!P4F
+6@vYDc%@-k
+6O o/-@cf.
+6UB2tRz9VG
+6[SJTvb*>A
+6^!Z3(vbR@
+6hnyeW+xuj
+6iS1$M1ybT
+6u`E8_HV#!
+6w&X@GAFQ'
+7@uA7hu(z$
+7F>0Vs>xU3
+7L)S@SUo@x
+7T,N*L0|B$
+7UFT5@Y5qi
+7X&k)Mnw7A
+7dSvEU,y{4
+7hu(z$ .d2
+7p%d_S8+7b
+7w.M`P'VRF
+7|m#)G;g7'
+8 gNp8#@5R
+8$/O8Z<a$C
+876I<O,T6p
+88Imw^rpkO
+8Eh!L@SfIJ
+8G]KhZ=^vD
+8O4c~gyV<2
+8X~QuCBfmG
+8_[[@]V)gn
+8hgssof,OQ
+8z/lkj=KxI
+9M#+/OB^&Z
+:,7c#E@=cF
+:?+9[weO=:
+:F.DT"MrX=
+:~fOCtBJFL
+;'lj>LBq:\
+;2I4v0/X!a
+;E`6m/n=B(
+;m+QQ)MM:z
+<+`jK~}h[K
+<5eKO/BtO+
+<BC#]Hhe_Z
+<C7@BT^o`(
+<r(Qj{.Tki
+<z0kV]]148
+=B('}/tlA^
+=Mo\my;(Y+
+=O8noj[T4U
+>32ir!c?v)
+>E|u|~bdnH
+>H@1?E 1Sr
+>Jv3*mZ>~y
+>jMk(GRv5F
+>rL,qr~TqI
+?6dax-R-c2
+?:)y6{O[UH
+?;a)g)>k|I
+?h]XP;,'&D
+?ky$X1@K|A
+?v)wD+*d~O
+@)f`<b%/^>
+@+@B*+,%9E
+@5RjY~[[%5
+@;3ByWA I:
+@CN]@)f`<b
+@CySoxVge.
+@L97DQ2Ps|
+@SUo@x8 >m
+@WL]H&NywA
+@`,Y#9tX0V
+@xN m's*qV
+A_;2J/poG#
+Ar9oCA'~v 
+A~kBVEU?Jf
+BFcq5=qK[!
+BT^o`(~GO<
+BbY^)[9#jl
+B|~j!/o.AX
+C.K%6hnyeW
+C3!##k\4+L
+CDIlg%Lsuu
+CZu4y= 1]#
+CdWn]fP!g`
+Ce3bHH1*$G
+CtBJFLcXs=
+C{;F7F>0Vs
+D+*d~OplV3
+D9<s%"8CO+
+DEK,*$>>"3
+DGs$+Mq\;3
+DUY`+0W:>F
+Dw`oJ'&t#@
+Dz;CM_w~kw
+DzPRZ5}O*o
+E746NYvO}K
+EE*wmHrS_A
+EU,y{4\Q7y
+EV7'rWEGvb
+E]G~:ATEE*
+Eg@p-Z6]ka
+EhYZ1xvhKV
+EypWN*I4D_
+F*[{e[,IG5
+F6V"t)bOCb
+FJlUHUI0$\
+FQ'xL4\6T(
+FUS9ZL)eI5
+FV1^w+wyfX
+Fh9*<Ffi4S
+GFv0'F=_G!
+GO<H]>129!
+GQE/UmI2_.
+GhZ#W &4Fd
+GudpcexeTj
+GvjI/BB]uz
+G}M^[!3R[k
+H&NywA&UO,
+H*d.B,one*
+H;1tZhH5!z
+H=ihzZ83L$
+HFQ0J%G]u>
+HMx[S)]6by
+HOBc>hCMu<
+HQ\jNVWxb 
+HbF,_LWF}P
+I)[)4h-S][
+I1htFb#Yk@
+I=.pMm$]&|
+I@DQd0AYRu
+IBHd-yE=*8
+IG51qSR$f[
+IMKmf2SH:r
+IS+10Q:S5|
+IZq^R;B`t7
+IgLLb4`Xe|
+IyA_El%$KO
+J'&t#@~tyq
+J-CQw03`he
+J2j^@_uGQE
+J4hkmD /)y
+JGKA@~/py)
+J__e6iS1$M
+K7DM&*6`e8
+KA!~Bd6{w/
+K[!O$oBIw^
+Kdn^X%#<tt
+KgIM-K=cKv
+K|AWnc)#HF
+K}YZ#=R8gS
+L%bR~/q-,]
+L(D\MVWT]q
+L+%AFX6]Hd
+L2t?(RE::l
+L4\6T(T8z/
+L@SfIJQ7p%
+LK{DoW5Fdr
+LMwq:K*2>D
+LWfwq2~T%*
+M*Hpr,LY5.
+M,0GbK=~2X
+M,L?h"$^ <
+M:z0t!#F.j
+METKC~VFEZ
+MHX\>VSx"a
+MQ_,z sLfk
+MR]|XC+9~'
+M_w~kw[7L)
+Mc<F>'fXkv
+Mqaze|RZ='
+Mu<EwOwA\-
+N :-BFcq5=
+N5z b*:Kdn
+N<~+ Y7LWf
+N?glp"fvT$
+NK@<=,NjP^
+Nk"~w?=7fW
+NrRPUS/f[]
+O*od6w&X@G
+O7h/k3y4Wx
+O9L>=;KJo?
+O<K;.-fKB!
+O@kKr2XOxr
+OC'XGhZ#W 
+OCbRO@kKr2
+O^1mcl 5qe
+O`K`F*[{e[
+Omr4_e1LVo
+Op!:AIE@CN
+Oxr?E]G~:A
+O}K-KgIM-K
+P4F'2`{pN[
+P<9]<"\Htb
+PAB|J{K(PB
+PDMJ43vu4f
+Pgh4d,q@WL
+P}sUVQjDUY
+Q6g4d[Bz~I
+Q7y`#9||w=
+Q;5Zp=+%\}
+R&:jtXwWz@
+RG/`J.H3#p
+RH{]O><_tb
+RN{k3uqof\
+RY5k[ndICZ
+R[k >E|u|~
+Rev{v$&"XY
+Rw2v5>R*~X
+S)]6byA mX
+S>k>0?5z%a
+Sq:|?ky$X1
+SvgC8 gNp8
+T6pAa|<zVU
+Tg\<RoTOC'
+TqIQbIzMD=
+Tvb*>A{CZu
+U/50bXa<E&
+U=n~3gOx(g
+U>7^ux VgB
+UO,}1<Q8ka
+UmI2_.}qy}
+V<2Zxq8A7>
+VA>Shg;h$Q
+Vic_v.LIoG
+Vxd,Vz>!t]
+W69cl*|{=r
+WEbs?(S[Es
+WR=\\fgZv_
+W^?k\EMo|g
+W` BEyY{r[
+X%#<ttDr\%
+X%u=$fKWE#
+X@d?%IETwl
+XC+9~'*XT@
+XT@S)UMqX3
+Xa!\`%>};~
+XkvC876I<O
+Xq'a@Ve@LH
+Xs=%fJ &xc
+X|x-?h]XP;
+YB1p%!]7$<
+YRu-mZy=!@
+Yb+Z<Swys!
+Yk@P~]e)*H
+Y~[[%5OX@d
+ZL)eI5z"S$
+ZT[-~uLI)[
+ZXq;}m~]p#
+Zn~2twZ}"9
+Zp|~w?:@7O
+[(5J-<liO=
+[9VQ2>"}W;
+[Sb.8r[b5Q
+[UHHipTB`w
+[VD4|Swvl]
+[[Lx&Ubo_&
+[m}y$]d9-3
+[weO=:KhB!
+[}f=3<XYUY
+\+][D~CY#!
+\,wJ!dZ)Kq
+\Tv*>qPviV
+\Z$_q{7`8Y
+\~7Qq)>`%d
+]&|9voa'5X
+]30hzA}9m:
+]7)'VB#}A#
+]7wVp5%c? 
+]<%w`M9[aD
+]>129!z1Zv
+]@Tw&|?\H&
+]Hhe_Z,:?+
+]NN,?mXfFn
+]_n27'F{sr
+]sr@>j.mUz
+]u>5r8Qtn]
+]y !N<~+ Y
+^ <P($raW"
+^!CrsAG=O8
+^%ngN5z b*
+^DS'%izC{;
+^OB&SnJ.[4
+^PP3Obv_i7
+^Vx?lQTa c
+^nIk!h,f`Z
+^vB.zpEan^
+^vDq7X&k)M
+_9z+e^[Svg
+_G!Id~_^eb
+_RMVKC8/KV
+_S8+7bNEhY
+_e1LVoOd{|
+`*uX?A^"g2
+`e8p*DUx9E
+`he%m^Eh,K
+`r7#i5ux>W
+`{Y{`r7#i5
+a3{ChOeh,b
+aF[|z]5!dp
+aZ{Kux;oE3
+a[?06^!Z3(
+a^T2=Mo\my
+ark:j*[]30
+a|<zVU0YB1
+b+'X,qosnD
+b-R_#;lk?r
+b4`Xe|IdeQ
+bIzMD=/~)b
+bR@hoE0tUg
+bU%3*K$9[U
+bhj)m6Qf=5
+c1gueA\riS
+cKv#)S(BIk
+cexeTj(Gvj
+cf.uJ-CQw0
+cs5|IqCkKE
+cv%/y_@;{h
+cxR[Iawr'F
+d,_Eu4Ag15
+d8B563Q=(;
+d[Bz~I#*c?
+d]]L^!CrsA
+deQ,xWmj0-
+dnH:M,L?h"
+dto8ark:j*
+d{|DJ2j^@_
+d~_^eb*:~f
+e \@cxR[Ia
+eT#S*'^m@8
+e|RZ=']"h4
+f,~>uQ3g!:
+f.g^!`2TDk
+f@jpK'i:?H
+fJ &xc,uRy
+fZn),"ibhj
+f`8re6;Vic
+fe Q>32ir!
+g8{KnWc(2]
+gCs5Xj,Nw>
+gsMz}1ODz;
+gz|'Kxfm2O
+h-AQ~v3A,4
+hB!m3!Z[JF
+hOeh,bJ]y 
+h[KY%NH<U0
+h{Q;eT#S*'
+i+[~8};N?g
+i.MH<0h0C?
+i4SB>rL,qr
+i<!Oka;4TE
+i]C)h.:Q*o
+ipTB`wfRev
+iv@PFpmW9.
+jP^PI=.pMm
+j^@{{%)@6#
+jjYSis[@q0
+j{.TkiD2f9
+kCy74jqapc
+kj=KxI!)#K
+kl#V4u&:,[
+koDl-SMJ0^
+k|ISgsMz}1
+l"]2vq>x%|
+l?h,4O]Y@h
+lP76bt0.dq
+lQTa c1DEK
+lV3}8G]KhZ
+lvOc> 9p7{
+lvh@i+[~8}
+ly'y8uN `l
+m#7?^2*^vB
+m6Qf=5KHMx
+m9uz7UFT5@
+m:26{=K@GZ
+m>:0/\2>cj
+m@8?g8{KnW
+mHrS_AsL%b
+mRxiM\A-a,
+mZy=!@=!e;
+m^>CxyxM*H
+m^Eh,K5]@T
+nc#U4|$K=&
+nc)#HF)kl#
+ne*3Mc<F>'
+nmb]2LQMD0
+no79`(x]f%
+o3,d[9VQ2>
+o7oX`^v6[S
+oE0tUg 'pX
+oE38^OB&Sn
+oG#$l"]2vq
+oW5FdrutGT
+of\{K7DM&*
+oj[T4Uld,_
+p"fvT$Hm9u
+p,Z_@(F(0:
+pGM0trHE&k
+pKfxaF[|z]
+p]i)u]_Zm*
+pip1V|XZ#*
+ptinhidK?.
+py)b]_n27'
+q2~T%*`C.K
+qR2tI1htFb
+qSR$f[7lvh
+qX7xL$:BS&
+qy}ME746NY
+q{7`8Y(MR]
+r'Fa3n!Me<
+r,LY5.ekCy
+r8Qtn]%Zp|
+rWEGvb{J__
+r\%R?;a)g)
+rc>hRN{k3u
+rq!g7v4*WU
+s yAfZn),"
+sYFUS>k>0?
+sof,OQOSq:
+s{WIAn~d8B
+t!#F.jycv%
+t4%\aZ{Kux
+t9l&/-RrdC
+t<)4;e}n.Z
+tGTjAr9oCA
+tGXi"?3!=5
+tO+1Op!:AI
+trHE&kdPDM
+twZ}"9"8hg
+tyq'H*d.B,
+u2$G$s&rc>
+u4Ag15R0e'
+u?@J)ue+Y%
+uBR|..b#]X
+uQ3g!:{9M#
+uRy<v3lFW:
+u].=NvQ>S=
+u]_Zm*X*7o
+v$&"XY[}xC
+v.LIoG'-#J
+v3lFW:Ih{Q
+v7/VXuP= C
+vBxU"pSST4
+voa'5X-&b/
+w )%Ar9u?@
+w+$P@p7**t
+w7AQQ;5Zp=
+w?:@7O%*e>
+wOwA\-ko3,
+w|@-}e+G}}
+x"a'Fh9*<F
+x%|*! Hm=E
+x>W[Yb+Z<S
+xANONZA[HX
+xU3ns{WIAn
+xWmj0-)<r(
+xq8A7>np]i
+xujzP}sUVQ
+y1<XzwYg@5
+y= 1]#mGud
+yClc0Wb.[,
+y[fI-whv9^
+y\F]9Klfe 
+y_@;{hWz?D
+ybTW%$Af!r
+yoJ&}Wem[p
+ys!U'tx\r-
+z%a"{w}$CV
+z?DA-Xo.Rb
+zA}9m:I<BC
+zCemV4I]wZ
+zl005z'|f<
+zpEan^lN :
+{%)@6#<0&}
+{/MN?:)y6{
+{:MSW{z-DE
+{=K@GZO!97
+{_$|Kc([VE
+{dB0K$Rw[.
+{i_V5T0Y~ 
+{r[~{:MSW{
+{srd+C!Gti
+{w}$CV:Mqa
+{|6D<5eKO/
+{|N$0:g^U=
+|'`;&A'N\F
+|;OY,eC^mU
+|hir_ZKl?h
+}/tlA^J7dS
+};~qB|~j!/
+}<5G!%-3jz
+}W;qDzPRZ5
+}e+G}}G'z@
+}xC+6O o/-
+~)b}<+`jK~
+~/q-,]o[}f
+~2Xuf`8re6
+~9@/]L7t4%
+~E102WQO@6
+~M<q,taX*E
+~]KWLu s%o
+~]e)*Hte \
+~v 'FJlUHU

http://git-wip-us.apache.org/repos/asf/accumulo-testing/blob/0d97273c/test/bench/lib/options.py
----------------------------------------------------------------------
diff --git a/test/bench/lib/options.py b/test/bench/lib/options.py
new file mode 100755
index 0000000..cfd6a99
--- /dev/null
+++ b/test/bench/lib/options.py
@@ -0,0 +1,39 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from optparse import OptionParser
+import logging
+
+log = logging.getLogger("test.bench")
+
+usage = "usage: %prog [options] [benchmark]"
+parser = OptionParser(usage)
+parser.add_option('-l', '--list', dest='list', action='store_true',
+                  default=False)
+parser.add_option('-v', '--level', dest='logLevel',
+                  default=logging.INFO, type=int,
+                  help="The logging level (%default)")
+parser.add_option('-s', '--speed', dest='runSpeed', action='store', default='slow')
+parser.add_option('-u', '--user', dest='user', action='store', default='')
+parser.add_option('-p', '--password', dest='password', action='store', default='')
+parser.add_option('-z', '--zookeepers', dest='zookeepers', action='store', default='')
+parser.add_option('-i', '--instance', dest='instance', action='store', default='')
+
+
+
+options, args = parser.parse_args()
+
+__all__ = ['options', 'args']
+

http://git-wip-us.apache.org/repos/asf/accumulo-testing/blob/0d97273c/test/bench/lib/path.py
----------------------------------------------------------------------
diff --git a/test/bench/lib/path.py b/test/bench/lib/path.py
new file mode 100755
index 0000000..22b8309
--- /dev/null
+++ b/test/bench/lib/path.py
@@ -0,0 +1,38 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+import os
+
+HERE = os.path.dirname(__file__)
+ACCUMULO_HOME = os.getenv('ACCUMULO_HOME')
+if not os.getenv('ACCUMULO_CONF_DIR'):
+  ACCUMULO_CONF_DIR = ACCUMULO_HOME+'/conf'
+else:
+  ACCUMULO_CONF_DIR = os.getenv('ACCUMULO_CONF_DIR')
+
+def accumulo(*args):
+    return os.path.join(ACCUMULO_HOME, *args)
+
+def accumuloConf(*args):
+    return os.path.join(ACCUMULO_CONF_DIR, *args)
+
+def accumuloJar():
+    import glob
+    options = (glob.glob(accumulo('lib', 'accumulo*.jar')) +
+               glob.glob(accumulo('accumulo', 'target', 'accumulo*.jar')))
+    options = [jar for jar in options if jar.find('instrumented') < 0]
+    return options[0]
+

http://git-wip-us.apache.org/repos/asf/accumulo-testing/blob/0d97273c/test/bench/lib/runner.py
----------------------------------------------------------------------
diff --git a/test/bench/lib/runner.py b/test/bench/lib/runner.py
new file mode 100755
index 0000000..5a85684
--- /dev/null
+++ b/test/bench/lib/runner.py
@@ -0,0 +1,28 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import subprocess
+
+from lib.options import log
+    
+def start(command, stdin=None):
+    log.debug("Running %s", ' '.join(command))
+    handle = subprocess.Popen(command,
+                              stdin=stdin,
+                              stdout=subprocess.PIPE,
+                              stderr=subprocess.PIPE)
+    # remember the command for debugging
+    handle.command = command
+    return handle

http://git-wip-us.apache.org/repos/asf/accumulo-testing/blob/0d97273c/test/bench/lib/slowsplits
----------------------------------------------------------------------
diff --git a/test/bench/lib/slowsplits b/test/bench/lib/slowsplits
new file mode 100644
index 0000000..363c56a
--- /dev/null
+++ b/test/bench/lib/slowsplits
@@ -0,0 +1,1000 @@
+ (pD{JbKCL
+ CL|'`;&A'
+ Y7LWfwq2~
+ Yrw|@-}e+
+ a6_eW3_U`
+ c1DEK,*$>
+ clA)/1,o0
+ p'NiRfrp3
+! Hm=E#(X}
+!%-3jzL^Vx
+!&P1xnSIJc
+!'>p]D)_fQ
+!/\$4oMrW&
+!/o.AXX_RM
+!0f2rL6@Bu
+!:{9M#+/OB
+!?\~;oli.M
+!@=!e;<w )
+!ADIG.w%Hh
+!`2TDk_[m}
+!aEJ4hkmD 
+!dZ)Kqr\Z$
+!h,f`Z!(qL
+!nwO(JY9p:
+!rm 5`[Tg\
+!tfhP,fKA8
+"!#02~UMAc
+".v]dRo ]R
+"34"iw\o7o
+"5)>QhL~r&
+"9"8hgssof
+"?3!=5lHbF
+"BN/#%-lA1
+"C[`\+0<6_
+"\AhQ4?"WL
+"l#n6<mXSH
+"pSST4J>jM
+#!&]7)'VB#
+#!Fv7/VXuP
+#$;~d/|&`)
+#%-lA18kw'
+#+*5^}O5h5
+#9||w=nFUS
+#;lk?rXU/5
+#<f!5A0/2F
+#=R8gSadto
+#@~tyq'H*d
+#BoZ}ElkS@
+#D;(/-,5R|
+#\M_9bs,y~
+#i?4[wm:>a
+#k\4+L:HOB
+#pCWR=\\fg
+#x97^QGxAN
+$<!}<5G!%-
+$M1ybTW%$A
+$VdF;\XyxC
+$]d9-34zl0
+$`"WiH2o>,
+$j,S@*vqo`
+$nT`dP4-]k
+$oBIw^3Q6g
+$o~Fdu,ljs
+$s&rc>hRN{
+%!]7$<!}<5
+%"8CO+W^PP
+%$Af!rm 5`
+%*`C.K%6hn
+%9Ty&[2+AR
+%Bu+%{xQk}
+%IETwl`7@u
+%NH<U0fa^T
+%Pr;DN6C;4
+%d@@;3ByWA
+%izC{;F7F>
+%n/R&:jtXw
+&*6`e8p*DU
+&A'N\FIZXq
+&CrH4,|c/6
+&L#.Jmp(DR
+&QaBTSZBI`
+&Z.\,wJ!dZ
+&_2O[cq4ep
+&kdPDMJ43v
+&srQw5aK}Y
+&|?\H&?#d\
+'"g:ya_{_$
+'"wq%n/R&:
+'F=_G!Id~_
+'LW6u`E8_H
+'Q b*WP\s,
+'mrppzMh4+
+'tx\r-?j^@
+($raW"A^%n
+('LV=7D#Bo
+(;!P4F'2`{
+(GRv5FyD9<
+(J"50*R;o<
+(RE::l24[s
+(Tb*w93B=q
+(U2mqCC|fy
+(Xb>)$^@D(
+(iJ^e/()`b
+)*D\ !cqon
+)6l-2u}&P}
+)Mnw7AQQ;5
+)S(BIkV+8$
+)UMqX3#~E1
+)g~h'DpOn9
+)ue+Y%*X|x
+)y%1J"oyVz
+*$>>"34"iw
+*'^m@8?g8{
+*DUx9EMa[?
+*H:Z -0O5=
+*Hte \@cxR
+*K$9[UZ32;
+*WP\s,*D.d
+*mZ>~yNm:2
+*p8LEas6=f
+*uI6v0x%sW
+*u^.u0<N,m
++/'Z6Lt{|6
++0W:>F9Dw`
++C!GtinpGM
++Mq\;3:Zn~
++QoBOq:F[7
++[\fEbn{|N
++gu=312H=i
++sqj~[8<C7
+,!rQ8%q&e#
+,4X0w0'7`l
+,Cf`o&|LK{
+,G0Owz~Ki]
+,K5]@Tw&|?
+,[%{/MN?:)
+,]o[}f=3<X
+,bJ]y !N<~
+,j.9UR]}J@
+,mHv!'>p]D
+,o0=3E:4#@
+,qosnDyu].
+-$O;nf/dKo
+-){&T;kH|/
+-34zl005z'
+-<liO=LCDI
+->: VPO@M#
+-FPWS=J@\{
+-SMJ0^zt<)
+-T86yB|B#"
+-Xo.RbIa3{
+-Z6]ka+Omr
+-jwCbA9sYF
+.)pDs_!O`K
+.YJ|irdw_@
+.Zncs5|IqC
+.^g$7rd=Y*
+.jycv%/y_@
+.l5S`7lzv3
+/-,5R|f1$u
+/-@cf.uJ-C
+/BB]uzzf.g
+/NI2R`i"5)
+/OB^&Z.\,w
+/\2>cj,b+'
+0%36h!Wv]5
+0*5[Ue0Tgj
+0*R;o</"BN
+0,gtGXi"?3
+0:g^U=l^nI
+0?5z%a"{w}
+0Q:S5|;s y
+0VG:)v1&Kg
+0Wb.[,l%-`
+0^zt<)4;e}
+0hQ!Grw2+`
+1$uo}p)7h7
+1)g6uj7@l"
+13_IZq^R;B
+15R0e'$+/'
+1<Q8ka\IS+
+1NFCWfkIgL
+1n{kL?47:;
+1sTGoAZ8Eh
+1uUo8!l4CN
+1xvhKV*':X
+231*y>ZDIq
+2>"}W;qDzP
+2F~b"l#n6<
+2Pj89$_1uU
+2WQO@6PDGs
+2`{pN[df,~
+2tacz_=}.6
+3!Z[JF1EV7
+3(vbR@hoE0
+312H=ihzZ8
+3<XYUYu`{Y
+3A0IMKmf2S
+3E:4#@Q'Q 
+3U;1x77p4\
+3fE!$j,S@*
+3n!Me<W0'Z
+3uqof\{K7D
+4,|c/6u4z5
+43vu4f@d]]
+48!G[?/>Jv
+48l7w.M`P'
+4G3;-_4c@z
+4KRGqCQ9W^
+4O]Y@h-%.~
+4Uld,_Eu4A
+4X?69VB!Go
+4epwLxsb=x
+4f@d]]L^!C
+4h-S][gEg@
+4jqapc^pKf
+4u&:,[%{/M
+4z5Tl+,b^M
+4|$K=&7[(5
+5.ekCy74jq
+5@Y5qi[8O4
+5FyD9<s%"8
+5VzVl$g0I*
+5X-&b/=#x9
+5Z=<9e_xB?
+5z'|f<aqR2
+5}Q8 Yrw|@
+6#<0&}~-jw
+6%~Wgz .`r
+63Q=(;!P4F
+686&z.@>AS
+6=Fq,}AUJe
+6@vYDc%@-k
+6Lt{|6D<5e
+6O o/-@cf.
+6Q~=v;8!jo
+6UB2tRz9VG
+6^!Z3(vbR@
+6hnyeW+xuj
+6iS1$M1ybT
+6rUuUNlC#r
+6tvW2+>O#2
+6w&X@GAFQ'
+6wp$Br(.mo
+6{O[UHHipT
+7'F{srd+C!
+74(E0kxTv+
+7961a/r%'f
+7>np]i)u]_
+7F>0Vs>xU3
+7O%*e>=+sq
+7T,N*L0|B$
+7UFT5@Y5qi
+7X&k)Mnw7A
+7^ddJlgwL<
+7`l]'LW6u`
+7bNEhYZ1xv
+7hu(z$ .d2
+7v4*WUm48!
+7{A nvsr*n
+7|m#)G;g7'
+8 gNp8#@5R
+8!l4CN0&L#
+8$/O8Z<a$C
+80R>13_IZq
+876I<O,T6p
+88Imw^rpkO
+8=T!hBZ>$a
+8G]KhZ=^vD
+8LPAPHi$*~
+8Lsl=hpm!/
+8O4c~gyV<2
+8P}k#>EEI=
+8X~QuCBfmG
+8Y(MR]|XC+
+8_HV#!&]7)
+8_[[@]V)gn
+8`<q^.qdvt
+8uN `lI\+]
+8};N?glp"f
+9!z1Zv$GFv
+9-WQ9hn+-p
+9EMa[?06^!
+9HX-4k:]Ed
+9Klfe Q>32
+9RLf@z>!3!
+9Sd-y<;j{3
+9hn+-p''"g
+9zw"sCJ,mH
+:%7/^mI#*^
+:,7c#E@=cF
+:.`u5Z=<9e
+:5eO^1mcl 
+:>a{hK-d-^
+:ATEE*wmHr
+:F.DT"MrX=
+:K*2>D#nc#
+:\e{?Gv=pT
+:l24[s+a$l
+:r\*zQA'"w
+;3:Zn~2twZ
+;E`6m/n=B(
+;e}n.Zncs5
+;m+QQ)MM:z
+;oli.MH<0h
+;omC6rUuUN
+;zqNrRPUS/
+<+`jK~}h[K
+<0h0C?-ly'
+<5eKO/BtO+
+<K|z'[wkC<
+<O,T6pAa|<
+<Swys!U'tx
+<b%/^>ku2$
+<g|@}}YUu^
+=&7[(5J-<l
+=']"h4<#+*
+=,NjP^PI=.
+=5lHbF,_LW
+=:KhB!m3!Z
+=I.54li^&u
+=Mo\my;(Y+
+=pT)Qg"eJk
+=rX4 (pD{J
+=rf<z0kV]]
+=z&$e*p0?j
+> 9p7{A nv
+>'fXkvC876
+>32ir!c?v)
+>ASN;zqNrR
+>A{CZu4y= 
+>D#nc#U4|$
+>E|u|~bdnH
+>F9Dw`oJ'&
+>H@1?E 1Sr
+>LBq:\e{?G
+>ep_3A0IMK
+>hCMu<EwOw
+>l&{f3F;n~
+>qPviV]A~k
+>rL,qr~TqI
+? u".#b>ep
+?(S[Es"yoJ
+?.w~XEWayx
+?:)y6{O[UH
+?;a)g)>k|I
+?bJ*f;>Clb
+?h]XP;,'&D
+?ky$X1@K|A
+?l\9>l<z3Z
+?rXU/50bXa
+?ui\~7Qq)>
+@)f`<b%/^>
+@+@B*+,%9E
+@6PDGs$+Mq
+@GAFQ'xL4\
+@SUo@x8 >m
+@`,Y#9tX0V
+@h-%.~VHFQ
+@qI82}DU;5
+@x8 >mj^DS
+@xN m's*qV
+@z>!3!.b\Q
+@~/py)b]_n
+A#VW69cl*|
+AIE@CN]@)f
+AMD\Tv*>qP
+A_;2J/poG#
+Ah7ZH`^CT]
+An~d8B563Q
+Ar9oCA'~v 
+Ar9u?@J)ue
+B'}L;XR*Fx
+B,one*3Mc<
+BFcq5=qK[!
+BOD nfLqfC
+BT^o`(~GO<
+BbY^)[9#jl
+Br(.mo[d'q
+B|~j!/o.AX
+C#r:VhD45=
+C3!##k\4+L
+C>nWUbKv!)
+C?-ly'y8uN
+CA'~v 'FJl
+CV:Mqaze|R
+CZ]L2t?(RE
+C] @Y8=?.w
+C_+L!/\$4o
+CdWn]fP!g`
+Ce3bHH1*$G
+ClS)g\fcsM
+Clb2QlYLv!
+CtBJFLcXs=
+C~StqP]"\5
+D+*d~OplV3
+D.dwBOD nf
+DQ2Ps|C@Cy
+Dk_[m}y$]d
+DxJYjgIr?l
+DzPRZ5}O*o
+D~CY#!Fv7/
+E&l/#Udir>
+E6/Z_Gf1K5
+E746NYvO}K
+E<IdDujthf
+EU,y{4\Q7y
+E]G~:ATEE*
+Ebn{|N$0:g
+EnLYq'YI;g
+Es"yoJ&}We
+EyY{r[~{:M
+EypWN*I4D_
+F*[{e[,IG5
+F6V"t)bOCb
+FJlUHUI0$\
+FLcXs=%fJ 
+FV1^w+wyfX
+FX6]HdM3gL
+Fb#Yk@P~]e
+Fh9*<Ffi4S
+FpbMt"&/Y#
+GFv0'F=_G!
+GMAVpI4cd 
+GZO!97l@xN
+GhZ#W &4Fd
+Glb4a|5LUw
+Gnm]mk3u"b
+Grw2+`<cW$
+G}M^[!3R[k
+H&?#d\%.)p
+H&NywA&UO,
+H*!0H336oE
+H*d.B,one*
+H;1tZhH5!z
+H?l+xS)Y<3
+HF)kl#V4u&
+HFQ0J%G]u>
+HH1*$GrC3!
+HOBc>hCMu<
+HP%9xjE,+v
+HQ\jNVWxb 
+HR$Bs_f|Fa
+HUI0$\:M,0
+HXnm>:0/\2
+HYhv@qI82}
+HdM3gL 9-W
+H|<ytwI*IB
+I/P|rCQ+y(
+I1htFb#Yk@
+I:qh-AQ~v3
+I;j7fpYRG/
+I=.pMm$]&|
+I@DQd0AYRu
+IBHd-yE=*8
+IJQ7p%d_S8
+IJcn?ui\~7
+IKaUi/}:|}
+Iawr'Fa3n!
+IqCkKEyb-R
+IyA_El%$KO
+J%G]u>5r8Q
+J'&t#@~tyq
+J-CQw03`he
+J.H3#pCWR=
+J2j^@_uGQE
+JD9<H"6LV#
+JF1EV7'rWE
+JFuK?l\9>l
+JGKA@~/py)
+Jfs@L97DQ2
+Jh+9i^,r7i
+JlK,}~/+gu
+Jmp(DR&[N3
+K$Rw[.AWEb
+K7DM&*6`e8
+KA!~Bd6{w/
+KC8/KVyCe3
+KCLqPv-'XH
+KEyb-R_#;l
+KV*':X}rq!
+K[2"A]]ZiC
+Kc([VE!;'l
+KgIM-K=cKv
+Kqr\Z$_q{7
+L a^/4U5Vz
+L$R(O2Z+[\
+L(D\MVWT]q
+L4\6T(T8z/
+L@SfIJQ7p%
+Lgv{|N&Zp'
+Lxsb=x}j<U
+M!JLHYVjjo
+M,0GbK=~2X
+M,L?h"$^ <
+M9vSAL."aF
+METKC~VFEZ
+MHX\>VSx"a
+MQ_,z sLfk
+M_w~kw[7L)
+Mc<F>'fXkv
+Mm$]&|9voa
+N'eL+%AFX6
+N5z b*:Kdn
+N<~+ Y7LWf
+NK@<=,NjP^
+NZA[HXnm>:
+N[df,~>uQ3
+Nk"~w?=7fW
+Nm8LMwq:K*
+Np+U~LT89^
+NvQ>S=li<!
+O+W^PP3Obv
+O/BtO+1Op!
+O5YtN<%e{I
+O7h/k3y4Wx
+O7zg$O0gZj
+O9L>=;KJo?
+O<K;.-fKB!
+O=LCDIlg%L
+O@kKr2XOxr
+OQOSq:|?ky
+O`q"Iq$fsD
+Obv_i7?2D8
+Op!:AIE@CN
+P,fKA8tlFg
+P;,'&D%F6V
+P<9]<"\Htb
+PAB|J{K(PB
+PgBqrPiP-1
+Pgh4d,q@WL
+Pv-'XH6`s*
+Py*Js[n(J"
+P}sUVQjDUY
+Q ort3?aO4
+Q)MM:z0t!#
+Q41mD?*RU`
+Q4?"WLYNp+
+Q4ny'ss*~.
+Q79j$#ZgqL
+Q;5Zp=+%\}
+QL!)`$hE\"
+Qg"eJk]\y,
+QhL~r&ye>t
+QlYLv!c!tf
+R-,u-#4>E`
+R/%vW7Bs:2
+R4PErdDVpt
+R;B`t7\#L3
+RFuRY5k[nd
+RH{]O><_tb
+RN{k3uqof\
+RbIa3{ChOe
+RoTOC'XGhZ
+Rw2v5>R*~X
+S)]6byA mX
+S=li<!Oka;
+S>k>0?5z%a
+SG{|+])j-c
+SHHCluc@Ub
+SR/Ig;CQ5)
+SnJ.[4/|hi
+T$Hm9uz7UF
+T(T8z/lkj=
+T23Y{XPXSB
+T4J>jMk(GR
+TE^]<%w`M9
+TG_tF-dW3)
+Tg\<RoTOC'
+TgjsY'$wWX
+Tj(GvjI/BB
+Tv+3xHe|Z|
+Tvb*>A{CZu
+TyF#+)W:.`
+U#R-DxJYjg
+U,KjPMN%[x
+U;5"`RLL)Y
+U=l^nIk!h,
+U=n~3gOx(g
+U>7^ux VgB
+UCkb('LV=7
+UJe<<g|@}}
+UOI\z${e|u
+US/f[]g3~5
+UYu`{Y{`r7
+Ug 'pXQ1sT
+UmI2_.}qy}
+Uu^k|f!Ln/
+V+vp2|R(yG
+V@d, (alJy
+VA>Shg;h$Q
+VB#}A#VW69
+VE!;'lj>LB
+VEU?Jfs@L9
+VG'R&_2O[c
+VQjDUY`+0W
+VU0YB1p%!]
+V]]148l7w.
+Vci@go:#D;
+VhD45=lR4P
+Vs>xU3ns{W
+Vxd,Vz>!t]
+W &4FdT,Cf
+W"A^%ngN5z
+W%ST^@CJ.I
+W-TcJlK,}~
+W1*+}<b^|e
+W3)1aPtOQM
+W:Ih{Q;eT#
+W^?k\EMo|g
+W` BEyY{r[
+Wkf!R?OI;j
+W{z-DED&sr
+X%#<ttDr\%
+X%u=$fKWE#
+X/ayk;{"sI
+X1@K|AWnc)
+X3#~E102WQ
+XC+9~'*XT@
+XEWayx2>l&
+XSBPHR$Bs_
+XSHVy-D`+Y
+XY[}xC+6O 
+Xa!\`%>};~
+Xq'a@Ve@LH
+XuP= CL|'`
+X|EUa.[@W^
+Y%*X|x-?h]
+Y'$wWX{VG'
+Y8?yClc0Wb
+Yb+Z<Swys!
+Y{"x=TzloE
+Y~[[%5OX@d
+Z5}O*od6w&
+ZL)eI5z"S$
+ZT[-~uLI)[
+[!3R[k >E|
+['>5usQF#C
+[,l%-`tW-T
+[.AWEbs?(S
+[1E;uJ?3dx
+[5ELY8?yCl
+[9VQ2>"}W;
+[?/>Jv3*mZ
+[N3RT23Y{X
+[Sb.8r[b5Q
+[UZ32;i6wp
+[VD4|Swvl]
+[[Lx&Ubo_&
+[]g3~5KmW<
+[c5C,+wIKa
+[ndICZ]L2t
+[pB(aK`!?\
+[t om:4ln8
+[weO=:KhB!
+\-ko3,d[9V
+\FIZXq;}m~
+\asC#)EKE)
+\fgZv_d,"7
+\y,l0*5[Ue
+\{.+'2fXAh
+]#mGudpcex
+].'@;Gk0PF
+]>129!z1Zv
+]Edd6=Fq,}
+]Hhe_Z,:?+
+]L7t4%\aZ{
+]N=ZKmNsPE
+]NN,?mXfFn
+]_n27'F{sr
+]sr@>j.mUz
+]}N6_l>5N"
+]}bI`R46B0
+^!CrsAG=O8
+^3XNx)|`,l
+^DS'%izC{;
+^OB&SnJ.[4
+^QGxANONZA
+^r>]7wVp5%
+^}O5h5_5}Q
+_9z+e^[Svg
+_AsL%bR~/q
+_LWF}P-koD
+_ON,K_yAxi
+_RMVKC8/KV
+_S8+7bNEhY
+_U`F?bJ*f;
+_Z,:?+9[we
+_ZKl?h,4O]
+_e1LVoOd{|
+_fQ"gncbqO
+_hS5WUld}1
+_l>5N"_U#R
+`%>};~qB|~
+`(~GO<H]>1
+`*uX?A^"g2
+`7lzv3/o'|
+`M9[aD]{dB
+`P'VRFuRY5
+`R46B0m;om
+`RLL)Y0"\A
+`Z!(qL0nP1
+`^v6[SJTvb
+`lI\+][D~C
+`r7#i5ux>W
+`s*qqm/=SI
+`wfRev{v$&
+a$lgN'eL+%
+aD]{dB0K$R
+aF[|z]5!dp
+aPtOQM;d U
+aX!eG-$q4.
+aZ{Kux;oE3
+anH=PW_Gwv
+ark:j*[]30
+a|<zVU0YB1
+b*:Kdn^X%#
+b4`Xe|IdeQ
+bA9sYFUS>k
+bB"Ref)Qe7
+bIzMD=/~)b
+bK2XC9Gy7E
+bK=~2Xuf`8
+bXa<E&l/#U
+b\Q,:5eO^1
+bgGIRw8[6}
+bzb2.4.4.5
+c1gueA\riS
+c2xbU%3*K$
+cAPED?Iu4k
+cW$V9zw"sC
+cWXQWj-o;_
+cexeTj(Gvj
+cj,b+'X,qo
+cl 5qe2vBx
+cxR[Iawr'F
+cyaP^+;%}p
+d U>2Pj89$
+d'qE0,gtGX
+d([^tNXdQ/
+d0AYRu-mZy
+dRo ]RT]}b
+dXAG03O".v
+d[Bz~I#*c?
+drutGTjAr9
+d~_^eb*:~f
+e.E;2I4v0/
+e3QY9HX-4k
+e6;Vic_v.L
+e<W0'Z[m^>
+e>t"TG_tF-
+eT#S*'^m@8
+eW+xujzP}s
+e[,IG51qSR
+eb*:~fOCtB
+e|RZ=']"h4
+f MiN3eN,+
+f2SH:r\*zQ
+f3F;n~BlPd
+f9,QGZ%n91
+f<aqR2tI1h
+f@jpK'i:?H
+fFh=UH15pV
+fJ &xc,uRy
+fZn),"ibhj
+f[7lvh@i+[
+f`8re6;Vic
+fnM_)!.@]e
+fpYRG/`J.H
+g%LsuuC${b
+g)>k|ISgsM
+g8{KnWc(2]
+gCs5Xj,Nw>
+gSadto8ark
+gncbqOGUCk
+gsMz}1ODz;
+gz|'Kxfm2O
+h"$^ <P($r
+hK-d-^g(Tb
+hOeh,bJ]y 
+hZ=^vDq7X&
+i)-= WoBbF
+i+[~8};N?g
+i/}:|}>zTt
+i5ux>W[Yb+
+i6N!)lTBG4
+i7?2D8H[5E
+iV]A~kBVEU
+i]C)h.:Q*o
+i^,r7i+&Cr
+ipTB`wfRev
+ir>>686&z.
+iv@PFpmW9.
+j*[]30hzA}
+j-f#:\rsIr
+j2|QJ)&,oq
+j<Uc7^ddJl
+jjYSis[@q0
+jjo[^3XNx)
+jzL^Vx?lQT
+j{.TkiD2f9
+k;8nfm[#"&
+kMF?hv%3fE
+kQwC qa.L1
+ka;4TE^]<%
+kcmajf[`yw
+kj=KxI!)#K
+kw'`kMF?hv
+kw[7L)S@SU
+l"]2vq>x%|
+l$g0I*o,G0
+l*|{=rf<z0
+l+,b^M^ogp
+lFg-[c5C,+
+lP76bt0.dq
+lPdKj-f#:\
+lQTa c1DEK
+m#7?^2*^vB
+m's*qVlW` 
+m*X*7ozJGK
+m,[kUK*L"r
+m6Qf=5KHMx
+m:I<BC#]Hh
+mD /)y%1J"
+mHrS_AsL%b
+mRxiM\A-a,
+mW<8Wkf!R?
+mZy=!@=!e;
+m^>CxyxM*H
+m^Eh,K5]@T
+nDyu].=NvQ
+nP1qAMD\Tv
+nWc(2]N;m+
+n]%Zp|~w?:
+nc)#HF)kl#
+nmb]2LQMD0
+no79`(x]f%
+o&|LK{DoW5
+o'|@TyF#+)
+o7oX`^v6[S
+oAZ8Eh!L@S
+oE0tUg 'pX
+oG'-#JmI@D
+oW5FdrutGT
+odr9:\$Ll#
+ogpy/NI2R`
+oj[T4Uld,_
+opiiZs#Y3[
+ow1Zc.`1)g
+oxVge.E;2I
+p"fvT$Hm9u
+p#8lvOc> 9
+p,Z_@(F(0:
+p5%c? u".#
+p=+%\}rXa!
+pKG#d=WM<a
+pc^pKfxaF[
+pip1V|XZ#*
+ptinhidK?.
+q'YI;g=H|<
+q)>`%d@@;3
+q2~T%*`C.K
+q75Ps`Q4f'
+qM|0@5:}]x
+qSR$f[7lvh
+qX7xL$:BS&
+q]'zEE,'u/
+qe2vBxU"pS
+qfC%L a^/4
+qm/=SIV.l5
+qo`>Vci@go
+q{7`8Y(MR]
+r!c?v)wD+*
+r*n7Nm8LMw
+r,LY5.ekCy
+r-?j^@{{%)
+r2XOxr?E]G
+r8Qtn]%Zp|
+r?lOC] @Y8
+rFl?@t74-O
+rW&!Py*Js[
+rWEGvb{J__
+rd>x8(2vWe
+rdDVpt!]}N
+riWO"%y77}
+rq!g7v4*WU
+r{iF#i?4[w
+sAG=O8noj[
+sIr\ow1Zc.
+s_!O`K`F*[
+sof,OQOSq:
+s{WIAn~d8B
+s|C@CySoxV
+t!#F.jycv%
+t)bOCbRO@k
+t1;{=Oh"ur
+t7\#L3P9RL
+t9l&/-RrdC
+tH'e>x0{??
+tKab`fYpOL
+tXwWz@r?6d
+tinpGM0trH
+trHE&kdPDM
+ttDr\%R?;a
+twI*IBc2F~
+twZ}"9"8hg
+u'J[!&P1xn
+u2$G$s&rc>
+u4Ag15R0e'
+uBR|..b#]X
+uQ3g!:{9M#
+u]_Zm*X*7o
+uj7@l".C_+
+uq|#5{u]#1
+uuC${bV80R
+ux;oE38^OB
+uzzf.g^!`2
+v 0N4ne -\
+v$&"XY[}xC
+v.LIoG'-#J
+v0/X!aEJ4h
+v3lFW:Ih{Q
+v_d,"7lu'J
+va1XuCc+*F
+vb{J__e6iS
+voa'5X-&b/
+w )%Ar9u?@
+w+$P@p7**t
+w03`he%m^E
+w5aK}YZ#=R
+w93B=q'0hQ
+w?:@7O%*e>
+wL<x clA)/
+wOwA\-ko3,
+wz~Ki]qHYh
+x)b7<M%Y&5
+x-R-c2xbU%
+xB?R74(E0k
+xHe|Z|ae3Q
+xI!)#K;~9@
+xWmj0-)<r(
+xc,uRy<v3l
+xq8A7>np]i
+xuHrk~a_Y}
+xyxM*Hpr,L
+y-D`+Y_r{i
+y1<XzwYg@5
+y= 1]#mGud
+yVzs^r>]7w
+yWA I:qh-A
+y[fI-whv9^
+y\F]9Klfe 
+y_@;{hWz?D
+ya_{_$|Kc(
+z3Z2 a6_eW
+z@r?6dax-R
+zA}9m:I<BC
+zCemV4I]wZ
+zTtSdXAG03
+zZ83L$R(O2
+z]5!dpSG}M
+zpEan^lN :
+{%)@6#<0&}
+{9)lj-{_:W
+{:MSW{z-DE
+{=K@GZO!97
+{hWz?DA-Xo
+{i_V5T0Y~ 
+{w}$CV:Mqa
+{zp[C|^"wJ
+|:{vPNOa5e
+|;OY,eC^mU
+|FaJM!JLHY
+|f!Ln/0JFu
+|hir_ZKl?h
+|~bdnH:M,L
+}/tlA^J7dS
+}1ODz;CM_w
+}ElkS@@=rX
+}P-koDl-SM
+}Wem[pB(aK
+}]E`?:A|/%
+}c 'l8JK1(
+}e+G}}G'z@
+}m~]p#8lvO
+}p)7h7vJh+
+}}G'z@KNK@
+~'*XT@S)UM
+~/q-,]o[}f
+~9@/]L7t4%
+~LT89^dEnL
+~M<q,taX*E
+~OplV3}8G]
+~Q0U*;lxlH
+~[8<C7@BT^
+~]KWLu s%o
+~]e)*Hte \
+~gyV<2Zxq8
+~v3A,4X0w0
+~yNm:26{=K

http://git-wip-us.apache.org/repos/asf/accumulo-testing/blob/0d97273c/test/bench/lib/splits
----------------------------------------------------------------------
diff --git a/test/bench/lib/splits b/test/bench/lib/splits
new file mode 100644
index 0000000..a983c87
--- /dev/null
+++ b/test/bench/lib/splits
@@ -0,0 +1,190 @@
+ P
+          
+!P
+!!!!!!!!!!
+"P
+""""""""""
+#P
+##########
+$P
+$$$$$$$$$$
+%P
+%%%%%%%%%%
+&P
+&&&&&&&&&&
+'P
+''''''''''
+(P
+((((((((((
+)P
+))))))))))
+*P
+**********
++P
+++++++++++
+,P
+,,,,,,,,,,
+-P
+----------
+.P
+..........
+/P
+//////////
+0P
+0000000000
+1P
+1111111111
+2P
+2222222222
+3P
+3333333333
+4P
+4444444444
+5P
+5555555555
+6P
+6666666666
+7P
+7777777777
+8P
+8888888888
+9P
+9999999999
+:P
+::::::::::
+;P
+;;;;;;;;;;
+<P
+<<<<<<<<<<
+=P
+==========
+>P
+>>>>>>>>>>
+?P
+??????????
+@P
+@@@@@@@@@@
+AP
+AAAAAAAAAA
+BP
+BBBBBBBBBB
+CP
+CCCCCCCCCC
+DP
+DDDDDDDDDD
+EP
+EEEEEEEEEE
+FP
+FFFFFFFFFF
+GP
+GGGGGGGGGG
+HP
+HHHHHHHHHH
+IP
+IIIIIIIIII
+JP
+JJJJJJJJJJ
+KP
+KKKKKKKKKK
+LP
+LLLLLLLLLL
+MP
+MMMMMMMMMM
+NP
+NNNNNNNNNN
+OP
+OOOOOOOOOO
+PP
+PPPPPPPPPP
+QP
+QQQQQQQQQQ
+RP
+RRRRRRRRRR
+SP
+SSSSSSSSSS
+TP
+TTTTTTTTTT
+UP
+UUUUUUUUUU
+VP
+VVVVVVVVVV
+WP
+WWWWWWWWWW
+XP
+XXXXXXXXXX
+YP
+YYYYYYYYYY
+ZP
+ZZZZZZZZZZ
+[P
+[[[[[[[[[[
+\P
+\\\\\\\\\\
+]P
+]]]]]]]]]]
+^P
+^^^^^^^^^^
+_P
+__________
+`P
+``````````
+aP
+aaaaaaaaaa
+bP
+bbbbbbbbbb
+cP
+cccccccccc
+dP
+dddddddddd
+eP
+eeeeeeeeee
+fP
+ffffffffff
+gP
+gggggggggg
+hP
+hhhhhhhhhh
+iP
+iiiiiiiiii
+jP
+jjjjjjjjjj
+kP
+kkkkkkkkkk
+lP
+llllllllll
+mP
+mmmmmmmmmm
+nP
+nnnnnnnnnn
+oP
+oooooooooo
+pP
+pppppppppp
+qP
+qqqqqqqqqq
+rP
+rrrrrrrrrr
+sP
+ssssssssss
+tP
+tttttttttt
+uP
+uuuuuuuuuu
+vP
+vvvvvvvvvv
+wP
+wwwwwwwwww
+xP
+xxxxxxxxxx
+yP
+yyyyyyyyyy
+zP
+zzzzzzzzzz
+{P
+{{{{{{{{{{
+|P
+||||||||||
+}P
+}}}}}}}}}}
+~P
+~~~~~~~~~~

http://git-wip-us.apache.org/repos/asf/accumulo-testing/blob/0d97273c/test/bench/lib/tservers.py
----------------------------------------------------------------------
diff --git a/test/bench/lib/tservers.py b/test/bench/lib/tservers.py
new file mode 100755
index 0000000..b34397a
--- /dev/null
+++ b/test/bench/lib/tservers.py
@@ -0,0 +1,89 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import fcntl
+
+import os
+import time
+import select
+import subprocess
+
+from lib.path import accumuloConf
+from lib.options import log
+
+def tserverNames():
+    return [s.strip() for s in open(accumuloConf('tservers'))]
+
+def runEach(commandMap):
+    result = {}
+    handles = []
+    for tserver, command in commandMap.items():
+        log.debug("ssh: %s: %s", tserver, command)
+        handle = subprocess.Popen(['ssh',tserver] + [command],
+                                  stdout=subprocess.PIPE,
+                                  stderr=subprocess.PIPE)
+        for h in handle.stdout, handle.stderr:
+            fcntl.fcntl(h, fcntl.F_SETFL, os.O_NDELAY)
+        handle.tserver = tserver
+        handle.command = command
+        handle.start = time.time()
+        handles.append(handle)
+    handlesLeft = set(handles[:])
+    while handlesLeft:
+        fds = {}
+        doomed = set()
+        for h in handlesLeft:
+            more = []
+            if h.stdout != None:
+                more.append(h.stdout)
+            if h.stderr != None:
+                more.append(h.stderr)
+            for m in more:
+                fds[m] = h
+            if not more:
+                doomed.add(h)
+        handlesLeft -= doomed
+        if not handlesLeft: break
+        rd, wr, ex = select.select(fds.keys(), [], [], 10)
+        for r in rd:
+            handle = fds[r]
+            data = r.read(1024)
+            result.setdefault(handle, ['', ''])
+            if not data:
+                if r == handle.stdout:
+                    handle.stdout = None
+                else:
+                    handle.stderr = None
+            if r == handle.stdout:
+                result[handle][0] += data
+            else:
+                result[handle][1] += data
+            if handle.stdout == None and handle.stderr == None:
+                log.debug("Tserver %s finished in %.2f",
+                          handle.tserver,
+                          time.time() - handle.start)
+                handle.wait()
+        if not rd:
+            log.debug("Waiting on %d tservers (%s...)",
+                      len(handlesLeft),
+                      ', '.join([h.tserver for h in handlesLeft])[:50])
+    return dict([(h.tserver, (h.returncode, out, err))
+                 for h, (out, err) in result.items()])
+
+def runAll(command):
+    tservers = tserverNames()
+    log.debug("Running %s on %s..", command, ', '.join(tservers)[:50])
+    return runEach(dict([(s, command) for s in tservers]))
+

http://git-wip-us.apache.org/repos/asf/accumulo-testing/blob/0d97273c/test/bench/lib/util.py
----------------------------------------------------------------------
diff --git a/test/bench/lib/util.py b/test/bench/lib/util.py
new file mode 100755
index 0000000..bfe38db
--- /dev/null
+++ b/test/bench/lib/util.py
@@ -0,0 +1,20 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import time
+
+
+def sleep(n):
+    time.sleep(n)

http://git-wip-us.apache.org/repos/asf/accumulo-testing/blob/0d97273c/test/bench/run.py
----------------------------------------------------------------------
diff --git a/test/bench/run.py b/test/bench/run.py
new file mode 100755
index 0000000..63a21fa
--- /dev/null
+++ b/test/bench/run.py
@@ -0,0 +1,116 @@
+#! /usr/bin/env python
+
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+import getopt
+import os
+import sys
+import logging
+import unittest
+
+from lib.options import options, args, log
+from lib.Benchmark import Benchmark
+
+def getBenchmarks():
+    import glob
+    result = []
+    here = os.path.dirname(__file__)
+    sys.path.insert(0, here)
+    for path in glob.glob('%s/*/*.py' % here):
+        path = path[len(here):]
+        if path.find('__init__') >= 0: continue
+        if path.find('/lib/') >= 0: continue
+        moduleName = path.replace(os.path.sep, '.')
+        moduleName = moduleName.lstrip('.')[:-3]
+        module = __import__(moduleName, globals(), locals(), [moduleName])
+        result.extend(list(module.suite()))
+    return result
+    
+def benchComparator(first, second):
+    if (first.name() < second.name()):
+        return -1
+    elif (second.name() < first.name()):
+        return 1
+    else:  
+        return 0
+
+def main():
+    if not os.getenv('HADOOP_HOME'):
+        print 'Please set the environment variable \'HADOOP_HOME\' before running the benchmarks'
+        sys.exit(0)
+    if not os.getenv('ZOOKEEPER_HOME'):
+        print 'Please set the environment variable \'ZOOKEEPER_HOME\' before running the benchmarks'
+        sys.exit(0)
+    if not os.getenv('ACCUMULO_HOME'):
+        print 'Please set the environment variable \'ACCUMULO_HOME\' before running the benchmarks'
+        sys.exit(0)
+    import textwrap
+    benchmarks = getBenchmarks()
+    benchmarks.sort(benchComparator)
+    auth = 0
+    for b in benchmarks:
+        b.setSpeed(options.runSpeed)
+        if auth == 0 and b.needsAuthentication > 0:
+            auth = 1 
+    if options.list:
+        indent = len(benchmarks[0].name())
+        wrap = 78 - indent
+        prefix = ' ' * indent + '  '
+        for b in benchmarks:
+            desc = b.shortDescription() or "No description"
+            desc = textwrap.wrap(desc, wrap)
+            desc = '\n'.join([(prefix + line) for line in desc])
+            print '%*s: %s' % (indent, b.name(), desc.lstrip())
+        sys.exit(0)                      
+    logging.basicConfig(level=options.logLevel)
+    if auth == 1:
+        if options.user == '':
+            print 'User: ',
+            user = sys.stdin.readline().strip()
+        else:
+            user = options.user
+        if options.password == '':
+            import getpass
+            password = getpass.getpass('Password: ')
+        else:
+            password = options.password
+        if options.zookeepers == '':
+            print 'Zookeepers: ',
+            zookeepers = sys.stdin.readline().strip()    
+        else:
+            zookeepers = options.zookeepers
+        if options.instance == '':
+            print 'Instance: ',
+            instance = sys.stdin.readline().strip()    
+        else:
+            instance = options.instance
+        Benchmark.instance = instance
+        Benchmark.zookeepers = zookeepers
+        Benchmark.instance = instance
+        Benchmark.password = password
+        Benchmark.username = user   
+    if args:
+        benchmarks = [
+            b for b in benchmarks if b.name() in args
+            ]
+    runner = unittest.TextTestRunner(verbosity=2)
+    runner.run(unittest.TestSuite(benchmarks))
+    for b in benchmarks:
+        log.info("%30s: %5.2f", b.name(), b.score())
+
+if __name__ == '__main__':
+    main()


Mime
View raw message