#! /usr/bin/env python3 # # Perforce benchmarks using Locust.io framework # # Copyright (C) 2016, Robert Cowham, Perforce # from __future__ import print_function import os import sys import logging from locust import Locust, events, task, TaskSet from locust.exception import StopLocust import P4 from p4benchutils import popen, fmtsize, readConfig, Timer, P4Benchmark from locust.stats import RequestStats def noop(*arg, **kwargs): logger.info("Stats reset prevented by monkey patch!") RequestStats.reset_all = noop python3 = sys.version_info[0] >= 3 logger = logging.getLogger("p4_basic") startdir = os.getcwd() CONFIG_FILE = "config_p4_basic.yml" # Configuration parameters class P4BasicBenchmark(P4Benchmark): """Performs basic benchmark test - Perforce specific subclass""" def __init__(self, startdir, config): super(P4BasicBenchmark, self).__init__(logger, startdir, config, "basicActions") def basicActions(bench, request_type): "Basic actions does sync/resolve/revert and then add/edit/delete" t = Timer(request_type) name = "actions" try: count = bench.basicFileActions() t.report_success(name, count) except Exception as e: logger.exception(e) t.report_failure(name, e) def reportingActions(bench, request_type): "Does describe/fstat/filelog" t = Timer(request_type) name = "reporting" try: count = bench.reportingActions() t.report_success(name, count) except Exception as e: logger.exception(e) t.report_failure(name, e) class AllTasks(TaskSet): """Entry point for locust""" min_wait = 1000 max_wait = 3000 request_type = "p4" def __init__(self, *args, **kwargs): super(AllTasks, self).__init__(*args, **kwargs) self.config = readConfig(startdir, CONFIG_FILE) self.min_wait = self.config["general"]["min_wait"] self.max_wait = self.config["general"]["max_wait"] self.repeat_count = 0 if "repeat" in self.config["perforce"]: self.repeat_count = self.config["perforce"]["repeat"] self.count = 0 self.task_name = "p4basic" self.bench = P4BasicBenchmark(startdir, self.config) def on_start(self): count = 0 t = Timer(self.request_type) name = "create" try: self.bench.createWorkspace() count = 1 t.report_success(name, count) except Exception as e: logger.exception(e) t.report_failure(name, e) t = Timer(self.request_type) name = "sync" try: count = self.bench.syncWorkspace(t) t.report_success(name, count) except Exception as e: logger.exception(e) t.report_failure(name, e) @task(10) def basicActions(self): basicActions(self.bench, self.task_name) logger.info("Finished %s" % self.task_name) self.count += 1 if self.repeat_count and self.count >= self.repeat_count: raise StopLocust(self.task_name) # Die if done @task(10) def reportingActions(self): "Run describe, filelog and fstat" reportingActions(self.bench, self.task_name) logger.info("Finished %s" % self.task_name) self.count += 1 if self.repeat_count and self.count >= self.repeat_count: raise StopLocust(self.task_name) # Die if done class P4RepoTestLocust(Locust): """Will be imported and then run by locust""" task_set = AllTasks