Hello,
I have worked on a patch for the things I outlined above, I cant see
anywhere to attach a patch file so I will copy it in below this
message but if you need the actual patch file then I'll be happy to
email this to you. The following commands will patch the file:
cd <directory containing multi-mechanize.py>
patch -p0 -d <directory containing multi-mechanize.py> < /tmp/
patchfile.diff
mv multi-mechanize.py multimechanize.py
I hope you find my changes acceptable.
Thanks,
James Simpson
patchfile.diff:
STARTFILE
diff -ur ./lib/results.py ./lib/results.py
--- ./lib/results.py 2011-06-07 15:33:02.000000000 +0000
+++ ./lib/results.py 2011-09-26 15:28:37.011161876 +0000
@@ -287,6 +287,9 @@
custom_timers[timer] = val
r = ResponseStats(request_num, elapsed_time, epoch_secs,
user_group_name, trans_time, error, custom_timers)
+
+ if self.run_time<0: ## If runtime is negative we will run
until interrupted
+ elapsed_time= self.run_time-1
if elapsed_time < self.run_time: # drop all times that
appear after the last request was sent (incomplete interval)
resp_stats_list.append(r)
diff -ur ./multi-mechanize.py ./multi-mechanize.py
--- ./multi-mechanize.py 2011-06-07 15:33:02.000000000 +0000
+++ ./multi-mechanize.py 2011-09-26 15:28:37.011161876 +0000
@@ -28,6 +28,8 @@
parser = optparse.OptionParser(usage=usage)
parser.add_option('-p', '--port', dest='port', type='int', help='rpc
listener port')
parser.add_option('-r', '--results', dest='results_dir',
help='results directory to reprocess')
+parser.add_option('-o', '--outputdirectory', dest='output_dir',
type='string', help='output directory for results')
+parser.add_option('-d', '--daemon', dest='daemon_process',
help='output directory for results', default=False,
action="store_true")
cmd_opts, args = parser.parse_args()
try:
@@ -68,94 +70,102 @@
run_time, rampup, results_ts_interval, console_logging,
progress_bar, results_database, post_run_script, xml_report,
user_group_configs = configure(project_name)
- run_localtime = time.localtime()
- output_dir = time.strftime('projects/' + project_name + '/results/
results_%Y.%m.%d_%H.%M.%S/', run_localtime)
-
- # this queue is shared between all processes/threads
- queue = multiprocessing.Queue()
- rw = ResultsWriter(queue, output_dir, console_logging)
- rw.daemon = True
- rw.start()
-
- user_groups = []
- for i, ug_config in enumerate(user_group_configs):
- ug = UserGroup(queue, i,
ug_config.name,
ug_config.num_threads, ug_config.script_file, run_time, rampup)
- user_groups.append(ug)
- for user_group in user_groups:
- user_group.start()
-
- start_time = time.time()
+ run_localtime = time.localtime()
- if console_logging:
- for user_group in user_groups:
- user_group.join()
+ if cmd_opts.output_dir:
+ base_output_dir=cmd_opts.output_dir+"/"
else:
- print '\n user_groups: %i' % len(user_groups)
- print ' threads: %i\n' % (ug_config.num_threads *
len(user_groups))
+ base_output_dir='projects/'
+ output_dir = time.strftime(base_output_dir + project_name + '/
results/results_%Y.%m.%d_%H.%M.%S/', run_localtime)
+ try:
+ # this queue is shared between all processes/threads
+ queue = multiprocessing.Queue()
+ rw = ResultsWriter(queue, output_dir, console_logging)
+ rw.daemon = True
+ rw.start()
+
+ user_groups = []
+ for i, ug_config in enumerate(user_group_configs):
+ ug = UserGroup(queue, i,
ug_config.name,
ug_config.num_threads, ug_config.script_file, run_time, rampup)
+ user_groups.append(ug)
+ for user_group in user_groups:
+ user_group.start()
+
+ start_time = time.time()
+
+ if console_logging:
+ for user_group in user_groups:
+ user_group.join()
+ else:
+ print '\n user_groups: %i' % len(user_groups)
+ print ' threads: %i\n' % (ug_config.num_threads *
len(user_groups))
- if progress_bar:
- p = progressbar.ProgressBar(run_time)
- elapsed = 0
- while elapsed < (run_time + 1):
- p.update_time(elapsed)
- if sys.platform.startswith('win'):
- print '%s transactions: %i timers: %i errors:
%i\r' % (p, rw.trans_count, rw.timer_count, rw.error_count),
- else:
- print '%s transactions: %i timers: %i errors:
%i' % (p, rw.trans_count, rw.timer_count, rw.error_count)
- sys.stdout.write(chr(27) + '[A' )
- time.sleep(1)
- elapsed = time.time() - start_time
+ if progress_bar:
+ p = progressbar.ProgressBar(run_time)
+ elapsed = 0
+ while elapsed < (run_time + 1):
+ p.update_time(elapsed)
+ if sys.platform.startswith('win'):
+ print '%s transactions: %i timers: %i
errors: %i\r' % (p, rw.trans_count, rw.timer_count, rw.error_count),
+ else:
+ print '%s transactions: %i timers: %i
errors: %i' % (p, rw.trans_count, rw.timer_count, rw.error_count)
+ sys.stdout.write(chr(27) + '[A' )
+ time.sleep(1)
+ elapsed = time.time() - start_time
- print p
+ print p
- while [user_group for user_group in user_groups if
user_group.is_alive()] != []:
- if progress_bar:
- if sys.platform.startswith('win'):
- print 'waiting for all requests to finish...\r',
- else:
- print 'waiting for all requests to finish...\r'
- sys.stdout.write(chr(27) + '[A' )
- time.sleep(.5)
+ while [user_group for user_group in user_groups if
user_group.is_alive()] != []:
+ if progress_bar:
+ if sys.platform.startswith('win'):
+ print 'waiting for all requests to finish...
\r',
+ else:
+ print 'waiting for all requests to finish...
\r'
+ sys.stdout.write(chr(27) + '[A' )
+ time.sleep(.5)
- if not sys.platform.startswith('win'):
- print
-
- # all agents are done running at this point
- time.sleep(.2) # make sure the writer queue is flushed
- print '\n\nanalyzing results...\n'
- results.output_results(output_dir, 'results.csv', run_time,
rampup, results_ts_interval, user_group_configs, xml_report)
- print 'created: %sresults.html\n' % output_dir
- if xml_report:
- print 'created: %sresults.jtl' % output_dir
- print 'created: last_results.jtl\n'
-
- # copy config file to results directory
- project_config = os.sep.join(['projects', project_name,
'config.cfg'])
- saved_config = os.sep.join([output_dir, 'config.cfg'])
- shutil.copy(project_config, saved_config)
-
- if results_database is not None:
- print 'loading results into database: %s\n' %
results_database
- import lib.resultsloader
- lib.resultsloader.load_results_database(project_name,
run_localtime, output_dir, results_database,
- run_time, rampup, results_ts_interval,
user_group_configs)
-
- if post_run_script is not None:
- print 'running post_run_script: %s\n' % post_run_script
- subprocess.call(post_run_script)
-
- print 'done.\n'
-
- if remote_starter is not None:
- remote_starter.test_running = False
- remote_starter.output_dir = output_dir
-
- return
+ if not sys.platform.startswith('win'):
+ print
+ finally:
+ # all agents are done running at this point
+ time.sleep(.2) # make sure the writer queue is flushed
+ print '\n\nanalyzing results...\n'
+ results.output_results(output_dir, 'results.csv', run_time,
rampup, results_ts_interval, user_group_configs, xml_report)
+ print 'created: %sresults.html\n' % output_dir
+ if xml_report:
+ print 'created: %sresults.jtl' % output_dir
+ print 'created: last_results.jtl\n'
+
+ # copy config file to results directory
+ project_config = os.sep.join(['projects', project_name,
'config.cfg'])
+ saved_config = os.sep.join([output_dir, 'config.cfg'])
+ shutil.copy(project_config, saved_config)
+
+ if results_database is not None:
+ print 'loading results into database: %s\n' %
results_database
+ import lib.resultsloader
+ lib.resultsloader.load_results_database(project_name,
run_localtime, output_dir, results_database,
+ run_time, rampup,
results_ts_interval, user_group_configs)
+
+ if post_run_script is not None:
+ print 'running post_run_script: %s\n' % post_run_script
+ subprocess.call(post_run_script)
+
+ print 'done.\n'
+
+ if remote_starter is not None:
+ remote_starter.test_running = False
+ remote_starter.output_dir = output_dir
+ return
def rerun_results(results_dir):
- output_dir = 'projects/%s/results/%s/' % (project_name,
results_dir)
+ if cmd_opts.output_dir:
+ base_output_dir=cmd_opts.output_dir+"/"
+ else:
+ base_output_dir='projects/'
+ output_dir = '%s/%s/results/%s/' % (base_output_dir,project_name,
results_dir)
saved_config = '%s/config.cfg' % output_dir
run_time, rampup, results_ts_interval, console_logging,
progress_bar, results_database, post_run_script, xml_report,
user_group_configs = configure(project_name, config_file=saved_config)
print '\n\nanalyzing results...\n'
@@ -226,6 +236,8 @@
self.process_num = process_num
self.user_group_name = user_group_name
self.num_threads = num_threads
+ if cmd_opts.daemon_process:
+ self.daemon = True
self.script_file = script_file
self.run_time = run_time
self.rampup = rampup
@@ -286,6 +298,9 @@
# scripts have access to these vars, which can be useful for
loading unique data
trans.thread_num = self.thread_num
trans.process_num = self.process_num
+
+ if self.run_time<0: ## If runtime is negative we will run
until interrupted
+ elapsed= self.run_time-1
while elapsed < self.run_time:
error = ''
@@ -305,7 +320,9 @@
fields = (elapsed, epoch, self.user_group_name,
scriptrun_time, error, trans.custom_timers)
self.queue.put(fields)
-
+
+ if self.run_time<0: ## If runtime is negative we will run
until interrupted
+ elapsed= self.run_time-1
class ResultsWriter(threading.Thread):
ENDFILE