redisbench-admin 0.11.19__py3-none-any.whl → 0.11.21__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -53,8 +53,6 @@ def create_compare_arguments(parser):
53
53
  parser.add_argument("--deployment_type", type=str, default="oss-standalone")
54
54
  parser.add_argument("--baseline_deployment_name", type=str, default="")
55
55
  parser.add_argument("--comparison_deployment_name", type=str, default="")
56
- parser.add_argument("--baseline_github_org", type=str, default=GITHUB_ORG)
57
- parser.add_argument("--comparison_github_org", type=str, default=GITHUB_ORG)
58
56
  parser.add_argument("--metric_name", type=str, default=None)
59
57
  parser.add_argument("--running_platform", type=str, default=None)
60
58
  parser.add_argument("--extra-filter", type=str, default=None)
@@ -166,8 +166,6 @@ def compare_command_logic(args, project_name, project_version):
166
166
  auto_approve = args.auto_approve
167
167
  running_platform = args.running_platform
168
168
  grafana_base_dashboard = args.grafana_base_dashboard
169
- baseline_github_org = args.baseline_github_org
170
- comparison_github_org = args.comparison_github_org
171
169
  # using an access token
172
170
  is_actionable_pr = False
173
171
  contains_regression_comment = False
@@ -193,38 +191,32 @@ def compare_command_logic(args, project_name, project_version):
193
191
  logging.info("Detected github token")
194
192
  g = Github(github_token)
195
193
  if pull_request is not None and pull_request != "":
196
- try:
197
- pull_request_n = int(pull_request)
198
- github_pr = (
199
- g.get_user(tf_github_org)
200
- .get_repo(tf_github_repo)
201
- .get_issue(pull_request_n)
202
- )
203
- comments = github_pr.get_comments()
204
- pr_link = github_pr.html_url
205
- logging.info("Working on github PR already: {}".format(pr_link))
206
- is_actionable_pr = True
207
- contains_regression_comment, pos = check_regression_comment(comments)
208
- if contains_regression_comment:
209
- regression_comment = comments[pos]
210
- old_regression_comment_body = regression_comment.body
211
- logging.info(
212
- "Already contains regression comment. Link: {}".format(
213
- regression_comment.html_url
214
- )
194
+ pull_request_n = int(pull_request)
195
+ github_pr = (
196
+ g.get_user(tf_github_org)
197
+ .get_repo(tf_github_repo)
198
+ .get_issue(pull_request_n)
199
+ )
200
+ comments = github_pr.get_comments()
201
+ pr_link = github_pr.html_url
202
+ logging.info("Working on github PR already: {}".format(pr_link))
203
+ is_actionable_pr = True
204
+ contains_regression_comment, pos = check_regression_comment(comments)
205
+ if contains_regression_comment:
206
+ regression_comment = comments[pos]
207
+ old_regression_comment_body = regression_comment.body
208
+ logging.info(
209
+ "Already contains regression comment. Link: {}".format(
210
+ regression_comment.html_url
215
211
  )
216
- if verbose:
217
- logging.info("Printing old regression comment:")
218
- print("".join(["-" for x in range(1, 80)]))
219
- print(regression_comment.body)
220
- print("".join(["-" for x in range(1, 80)]))
221
- else:
222
- logging.info("Does not contain regression comment")
223
-
224
- except Exception as e:
225
- logging.error(
226
- f"Error while working with github. exception {e.__str__()}"
227
212
  )
213
+ if verbose:
214
+ logging.info("Printing old regression comment:")
215
+ print("".join(["-" for x in range(1, 80)]))
216
+ print(regression_comment.body)
217
+ print("".join(["-" for x in range(1, 80)]))
218
+ else:
219
+ logging.info("Does not contain regression comment")
228
220
 
229
221
  grafana_dashboards_uids = {
230
222
  "redisgraph": "SH9_rQYGz",
@@ -282,8 +274,6 @@ def compare_command_logic(args, project_name, project_version):
282
274
  to_ts_ms,
283
275
  use_metric_context_path,
284
276
  running_platform,
285
- baseline_github_org,
286
- comparison_github_org,
287
277
  )
288
278
  comment_body = ""
289
279
  if total_comparison_points > 0:
@@ -508,8 +498,6 @@ def compute_regression_table(
508
498
  to_ts_ms=None,
509
499
  use_metric_context_path=None,
510
500
  running_platform=None,
511
- baseline_github_org="",
512
- comparison_github_org="",
513
501
  ):
514
502
  START_TIME_NOW_UTC, _, _ = get_start_time_vars()
515
503
  START_TIME_LAST_MONTH_UTC = START_TIME_NOW_UTC - datetime.timedelta(days=31)
@@ -595,8 +583,6 @@ def compute_regression_table(
595
583
  test_names,
596
584
  tf_triggering_env,
597
585
  verbose,
598
- baseline_github_org,
599
- comparison_github_org,
600
586
  running_platform,
601
587
  )
602
588
  logging.info(
@@ -667,7 +653,7 @@ def get_by_strings(
667
653
  comparison_str = comparison_branch
668
654
 
669
655
  if baseline_tag is not None:
670
- if baseline_covered:
656
+ if comparison_covered:
671
657
  logging.error(
672
658
  "--baseline-branch and --baseline-tag are mutually exclusive. Pick one..."
673
659
  )
@@ -724,8 +710,6 @@ def from_rts_to_regression_table(
724
710
  test_names,
725
711
  tf_triggering_env,
726
712
  verbose,
727
- baseline_github_org="",
728
- comparison_github_org="",
729
713
  running_platform=None,
730
714
  ):
731
715
  print_all = print_regressions_only is False and print_improvements_only is False
@@ -748,7 +732,6 @@ def from_rts_to_regression_table(
748
732
  "{}={}".format(test_filter, test_name),
749
733
  "deployment_name={}".format(baseline_deployment_name),
750
734
  "triggering_env={}".format(tf_triggering_env),
751
- "github_org={}".format(baseline_github_org),
752
735
  ]
753
736
  if running_platform is not None:
754
737
  filters_baseline.append("running_platform={}".format(running_platform))
@@ -758,7 +741,6 @@ def from_rts_to_regression_table(
758
741
  "{}={}".format(test_filter, test_name),
759
742
  "deployment_name={}".format(comparison_deployment_name),
760
743
  "triggering_env={}".format(tf_triggering_env),
761
- "github_org={}".format(comparison_github_org),
762
744
  ]
763
745
  if running_platform is not None:
764
746
  filters_comparison.append("running_platform={}".format(running_platform))
@@ -1061,9 +1043,9 @@ def get_v_pct_change_and_largest_var(
1061
1043
  if last_n < 0 or (last_n > 0 and len(comparison_values) < last_n):
1062
1044
  comparison_values.append(tuple[1])
1063
1045
  comparison_df = pd.DataFrame(comparison_values)
1064
- comparison_median = float(comparison_df.median().iloc[0])
1046
+ comparison_median = float(comparison_df.median())
1065
1047
  comparison_v = comparison_median
1066
- comparison_std = float(comparison_df.std().iloc[0])
1048
+ comparison_std = float(comparison_df.std())
1067
1049
  if verbose:
1068
1050
  logging.info(
1069
1051
  "comparison_datapoints: {} value: {}; std-dev: {}; median: {}".format(
@@ -69,13 +69,19 @@ def deploy_command_logic(args, project_name, project_version):
69
69
  )
70
70
  tf_setup_name_sufix = "{}-{}".format(args.setup_name_sufix, tf_github_sha)
71
71
  tf_setup_name = "{}{}".format(remote_setup, tf_setup_name_sufix)
72
- terraform_backend_key = "benchmarks/infrastructure/{}.tfstate".format(
73
- tf_setup_name
74
- ).replace("/", "-")
72
+ terraform_backend_key = "benchmarks/infrastructure/{}.tfstate".format(tf_setup_name)
75
73
  tf_triggering_env = "redisbench-admin-deploy"
76
74
  logging.info("Setting an infra timeout of {} secs".format(infra_timeout_secs))
77
75
  if args.destroy is False:
78
- (tf_return_code, _, _, _, _, _, _,) = setup_remote_environment(
76
+ (
77
+ tf_return_code,
78
+ _,
79
+ _,
80
+ _,
81
+ _,
82
+ _,
83
+ _,
84
+ ) = setup_remote_environment(
79
85
  tf,
80
86
  tf_github_sha,
81
87
  tf_github_actor,
@@ -103,7 +109,6 @@ def deploy_command_logic(args, project_name, project_version):
103
109
  _, _, _ = tf.init(
104
110
  capture_output=True,
105
111
  backend_config={"key": terraform_backend_key},
106
- reconfigure=True,
107
112
  )
108
113
  logging.info("Refreshing remote state")
109
114
  _, _, _ = tf.refresh()
@@ -42,7 +42,13 @@ def export_command_logic(args, project_name, project_version):
42
42
  deployment_name = args.deployment_name
43
43
  deployment_type = args.deployment_type
44
44
  results_format = args.results_format
45
- (_, github_branch, github_org, github_repo, _,) = git_vars_crosscheck(
45
+ (
46
+ _,
47
+ github_branch,
48
+ github_org,
49
+ github_repo,
50
+ _,
51
+ ) = git_vars_crosscheck(
46
52
  None, args.github_branch, args.github_org, args.github_repo, None
47
53
  )
48
54
  exporter_timemetric_path = None
@@ -400,9 +400,9 @@ class Perf:
400
400
  "Main THREAD Flame Graph: " + use_case, details
401
401
  )
402
402
  if artifact_result is True:
403
- outputs[
404
- "Main THREAD Flame Graph {}".format(identifier)
405
- ] = flame_graph_output
403
+ outputs["Main THREAD Flame Graph {}".format(identifier)] = (
404
+ flame_graph_output
405
+ )
406
406
  result &= artifact_result
407
407
 
408
408
  tid = self.pid
@@ -440,9 +440,9 @@ class Perf:
440
440
  )
441
441
 
442
442
  if artifact_result is True:
443
- outputs[
444
- "perf report per dso,sym {}".format(identifier)
445
- ] = perf_report_artifact
443
+ outputs["perf report per dso,sym {}".format(identifier)] = (
444
+ perf_report_artifact
445
+ )
446
446
  result &= artifact_result
447
447
 
448
448
  # generate perf report per dso,sym
@@ -460,9 +460,9 @@ class Perf:
460
460
  )
461
461
 
462
462
  if artifact_result is True:
463
- outputs[
464
- "perf report per dso,sym with callgraph {}".format(identifier)
465
- ] = perf_report_artifact
463
+ outputs["perf report per dso,sym with callgraph {}".format(identifier)] = (
464
+ perf_report_artifact
465
+ )
466
466
  result &= artifact_result
467
467
 
468
468
  # generate perf report per dso,sym,srcline
@@ -487,9 +487,9 @@ class Perf:
487
487
  )
488
488
 
489
489
  if artifact_result is True:
490
- outputs[
491
- "perf report per dso,sym,srcline {}".format(identifier)
492
- ] = perf_report_artifact
490
+ outputs["perf report per dso,sym,srcline {}".format(identifier)] = (
491
+ perf_report_artifact
492
+ )
493
493
  result &= artifact_result
494
494
 
495
495
  self.logger.info(
@@ -527,9 +527,9 @@ class Perf:
527
527
  )
528
528
 
529
529
  if artifact_result is True:
530
- outputs[
531
- "perf report top self-cpu {}".format(identifier)
532
- ] = perf_report_artifact
530
+ outputs["perf report top self-cpu {}".format(identifier)] = (
531
+ perf_report_artifact
532
+ )
533
533
  result &= artifact_result
534
534
 
535
535
  # generate perf report --stdio report
@@ -546,9 +546,9 @@ class Perf:
546
546
  )
547
547
 
548
548
  if artifact_result is True:
549
- outputs[
550
- "perf report top self-cpu (dso={})".format(binary)
551
- ] = perf_report_artifact
549
+ outputs["perf report top self-cpu (dso={})".format(binary)] = (
550
+ perf_report_artifact
551
+ )
552
552
  result &= artifact_result
553
553
 
554
554
  if self.callgraph_mode == "dwarf":
@@ -590,9 +590,9 @@ class Perf:
590
590
  )
591
591
  result &= artifact_result
592
592
  if artifact_result is True:
593
- outputs[
594
- "Top entries in text form by LOC"
595
- ] = pprof_artifact_text_output
593
+ outputs["Top entries in text form by LOC"] = (
594
+ pprof_artifact_text_output
595
+ )
596
596
  tabular_data_map["text-lines"] = tabular_data
597
597
  self.logger.info("Generating pprof png output")
598
598
  pprof_png_output = self.output + ".pprof.png"
@@ -604,9 +604,9 @@ class Perf:
604
604
  self.output,
605
605
  )
606
606
  if artifact_result is True:
607
- outputs[
608
- "Output graph image in PNG format"
609
- ] = pprof_artifact_png_output
607
+ outputs["Output graph image in PNG format"] = (
608
+ pprof_artifact_png_output
609
+ )
610
610
  result &= artifact_result
611
611
 
612
612
  # save stack collapsed
@@ -44,9 +44,20 @@ KEEP_ENV = bool(int(os.getenv("KEEP_ENV", "0")))
44
44
  ALLOWED_TOOLS_DEFAULT = "memtier_benchmark,redis-benchmark,redisgraph-benchmark-go,ycsb,go-ycsb,tsbs_run_queries_redistimeseries,tsbs_load_redistimeseries,ftsb_redisearch,aibench_run_inference_redisai_vision,ann-benchmarks"
45
45
  ALLOWED_BENCH_TOOLS = os.getenv("ALLOWED_BENCH_TOOLS", ALLOWED_TOOLS_DEFAULT)
46
46
  SKIP_DB_SETUP = bool(int(os.getenv("SKIP_DB_SETUP", "0")))
47
+ ARCH_X86 = "x86_64"
48
+ ARCH_ARM = "aarch64"
49
+ VALID_ARCHS = [ARCH_X86, ARCH_ARM]
50
+ ARCH = os.getenv("ARCH", ARCH_X86)
47
51
 
48
52
 
49
53
  def common_run_args(parser):
54
+ parser.add_argument(
55
+ "--architecture",
56
+ type=str,
57
+ required=False,
58
+ default=ARCH,
59
+ help=f"Architecture to run the benchmark on. One of {VALID_ARCHS}.",
60
+ )
50
61
  parser.add_argument(
51
62
  "--keep_env_and_topo",
52
63
  required=False,
@@ -206,7 +206,10 @@ def prepare_benchmark_parameters_specif_tooling(
206
206
  if isremote is True:
207
207
  benchmark_tool = "/tmp/{}".format(benchmark_tool)
208
208
  input_data_file = "/tmp/input.data"
209
- (command_arr, command_str,) = prepare_tsbs_benchmark_command(
209
+ (
210
+ command_arr,
211
+ command_str,
212
+ ) = prepare_tsbs_benchmark_command(
210
213
  benchmark_tool,
211
214
  server_private_ip,
212
215
  server_plaintext_port,
@@ -218,7 +221,10 @@ def prepare_benchmark_parameters_specif_tooling(
218
221
  cluster_api_enabled,
219
222
  )
220
223
  if "memtier_benchmark" in benchmark_tool:
221
- (command_arr, command_str,) = prepare_memtier_benchmark_command(
224
+ (
225
+ command_arr,
226
+ command_str,
227
+ ) = prepare_memtier_benchmark_command(
222
228
  benchmark_tool,
223
229
  server_private_ip,
224
230
  server_plaintext_port,
@@ -236,7 +242,10 @@ def prepare_benchmark_parameters_specif_tooling(
236
242
  ann_path = stdout[0].strip() + "/run/ann/pkg/multirun.py"
237
243
  logging.info("Remote ann-benchmark path: {}".format(ann_path))
238
244
 
239
- (command_arr, command_str,) = prepare_ann_benchmark_command(
245
+ (
246
+ command_arr,
247
+ command_str,
248
+ ) = prepare_ann_benchmark_command(
240
249
  server_private_ip,
241
250
  server_plaintext_port,
242
251
  cluster_api_enabled,
@@ -250,7 +259,10 @@ def prepare_benchmark_parameters_specif_tooling(
250
259
  if isremote is True:
251
260
  benchmark_tool = "/tmp/{}".format(benchmark_tool)
252
261
  input_data_file = "/tmp/input.data"
253
- (command_arr, command_str,) = prepare_ftsb_benchmark_command(
262
+ (
263
+ command_arr,
264
+ command_str,
265
+ ) = prepare_ftsb_benchmark_command(
254
266
  benchmark_tool,
255
267
  server_private_ip,
256
268
  server_plaintext_port,
@@ -267,7 +279,10 @@ def prepare_benchmark_parameters_specif_tooling(
267
279
  if isremote is True:
268
280
  benchmark_tool = "/tmp/{}".format(benchmark_tool)
269
281
  input_data_file = "/tmp/input.data"
270
- (command_arr, command_str,) = prepare_aibench_benchmark_command(
282
+ (
283
+ command_arr,
284
+ command_str,
285
+ ) = prepare_aibench_benchmark_command(
271
286
  benchmark_tool,
272
287
  server_private_ip,
273
288
  server_plaintext_port,
@@ -619,11 +634,9 @@ def run_redis_pre_steps(benchmark_config, r, required_modules):
619
634
  )
620
635
  search_specific_init(r, module_names)
621
636
  if required_modules is not None and len(required_modules) > 0:
622
- artifact_pos = check_required_modules(module_names, required_modules)
623
- version = artifact_versions[artifact_pos]
624
- logging.info(
625
- f"Using version {version} in by version timeseries coming from {module_names[artifact_pos]}"
626
- )
637
+ check_required_modules(module_names, required_modules)
638
+
639
+ version = artifact_versions[0]
627
640
  else:
628
641
  version = r.info("server")["redis_version"]
629
642
 
@@ -689,45 +702,54 @@ def dso_check(dso, local_module_file):
689
702
 
690
703
 
691
704
  def dbconfig_keyspacelen_check(
692
- benchmark_config, redis_conns, ignore_keyspace_errors=False
705
+ benchmark_config, redis_conns, ignore_keyspace_errors=False, timeout=60
693
706
  ):
694
- result = True
707
+ start_time = time.time()
695
708
  (
696
709
  requires_keyspacelen_check,
697
710
  keyspacelen,
698
711
  ) = check_dbconfig_keyspacelen_requirement(benchmark_config)
699
- if requires_keyspacelen_check:
700
- result = False
712
+
713
+ if not requires_keyspacelen_check:
714
+ return True
715
+
716
+ attempt = 0
717
+ while time.time() - start_time < timeout:
701
718
  logging.info(
702
- "Ensuring keyspace length requirement = {} is met.".format(keyspacelen)
719
+ f"Ensuring keyspace length requirement = {keyspacelen} is met. attempt #{attempt+1}"
703
720
  )
704
721
  total_keys = 0
705
722
  for shard_conn in redis_conns:
706
723
  keyspace_dict = shard_conn.info("keyspace")
707
724
  for _, dbdict in keyspace_dict.items():
708
- shard_keys = dbdict["keys"]
709
- total_keys += shard_keys
725
+ total_keys += dbdict.get("keys", 0)
710
726
 
711
727
  if total_keys == keyspacelen:
712
728
  logging.info(
713
- "The total numbers of keys in setup matches the expected spec: {}=={}".format(
729
+ "The total number of keys in setup matches the expected spec: {} == {}".format(
714
730
  keyspacelen, total_keys
715
731
  )
716
732
  )
717
- result = True
718
- else:
719
- logging.error(
720
- "The total numbers of keys in setup does not match the expected spec: {}!={}. Aborting...".format(
721
- keyspacelen, total_keys
722
- )
733
+ return True
734
+
735
+ logging.warning(
736
+ "Keyspace length mismatch ({} != {}). Retrying in {} seconds...".format(
737
+ total_keys, keyspacelen, 2**attempt
723
738
  )
724
- if ignore_keyspace_errors is False:
725
- raise Exception(
726
- "The total numbers of keys in setup does not match the expected spec: {}!={}. Aborting...".format(
727
- keyspacelen, total_keys
728
- )
729
- )
730
- return result
739
+ )
740
+ time.sleep(2**attempt) # Exponential backoff
741
+ attempt += 1
742
+
743
+ logging.error(
744
+ f"The total number of keys in setup does not match the expected spec: {keyspacelen} != {total_keys}. Aborting after {attempt+1} tries..."
745
+ )
746
+
747
+ if not ignore_keyspace_errors:
748
+ raise Exception(
749
+ f"The total number of keys in setup does not match the expected spec: {keyspacelen} != {total_keys}. Aborting after {attempt+1} tries..."
750
+ )
751
+
752
+ return False
731
753
 
732
754
 
733
755
  def common_properties_log(
@@ -765,7 +787,10 @@ def print_results_table_stdout(
765
787
  metric_names=[],
766
788
  ):
767
789
  # check which metrics to extract
768
- (_, metrics,) = merge_default_and_config_metrics(
790
+ (
791
+ _,
792
+ metrics,
793
+ ) = merge_default_and_config_metrics(
769
794
  benchmark_config,
770
795
  default_metrics,
771
796
  None,
@@ -29,7 +29,6 @@ def prepare_ftsb_benchmark_command(
29
29
  :return: [string] containing the required command to run the benchmark given the configurations
30
30
  """
31
31
  command_arr = [executable_path]
32
-
33
32
  command_arr.extend(
34
33
  ["--host", "{}:{}".format(server_private_ip, server_plaintext_port)]
35
34
  )
@@ -42,7 +42,6 @@ def ssh_tunnel_redisconn(
42
42
  ), # remote redis server
43
43
  # Bind the socket to port 0. A random free port from 1024 to 65535 will be selected.
44
44
  local_bind_address=("0.0.0.0", 0), # enable local forwarding port
45
- set_keepalive=60,
46
45
  )
47
46
  ssh_tunel.start() # start tunnel
48
47
  redis_conn = redis.Redis(
@@ -70,19 +69,6 @@ def check_connection(ssh_conn):
70
69
  return False
71
70
 
72
71
 
73
- def ensure_400_permissions(file_path):
74
- import stat
75
-
76
- file_stat = os.stat(file_path)
77
- current_permissions = stat.S_IMODE(file_stat.st_mode)
78
-
79
- if current_permissions != 0o400:
80
- logging.info(f"Changing permissions of {file_path} to 400")
81
- os.chmod(file_path, 0o400)
82
- else:
83
- logging.info(f"{file_path} already has 400 permissions.")
84
-
85
-
86
72
  def ssh_pem_check(EC2_PRIVATE_PEM, private_key):
87
73
  if os.path.exists(private_key) is False:
88
74
  if EC2_PRIVATE_PEM is not None and EC2_PRIVATE_PEM != "":
@@ -103,4 +89,3 @@ def ssh_pem_check(EC2_PRIVATE_PEM, private_key):
103
89
  logging.info(
104
90
  "Confirmed that private key path artifact: '{}' exists!".format(private_key)
105
91
  )
106
- ensure_400_permissions(private_key)
@@ -114,7 +114,11 @@ class TerraformClass:
114
114
  def async_runner_setup(
115
115
  self,
116
116
  ):
117
- (remote_setup, deployment_type, remote_id,) = fetch_remote_setup_from_config(
117
+ (
118
+ remote_setup,
119
+ deployment_type,
120
+ remote_id,
121
+ ) = fetch_remote_setup_from_config(
118
122
  [{"type": "async", "setup": "runner"}],
119
123
  "https://github.com/RedisLabsModules/testing-infrastructure.git",
120
124
  "master",
@@ -229,7 +233,11 @@ def terraform_spin_or_reuse_env(
229
233
  tf_override_name=None,
230
234
  tf_folder_path=None,
231
235
  ):
232
- (remote_setup, deployment_type, remote_id,) = fetch_remote_setup_from_config(
236
+ (
237
+ remote_setup,
238
+ deployment_type,
239
+ remote_id,
240
+ ) = fetch_remote_setup_from_config(
233
241
  benchmark_config["remote"],
234
242
  "https://github.com/RedisLabsModules/testing-infrastructure.git",
235
243
  "master",
@@ -28,9 +28,9 @@ WantedBy=multi-user.target
28
28
  argv.append("--private_key")
29
29
  argv.append("/home/ubuntu/work_dir/tests/benchmarks/benchmarks.redislabs.pem")
30
30
  else:
31
- argv[
32
- argv.index(args.private_key)
33
- ] = "/home/ubuntu/work_dir/tests/benchmarks/benchmarks.redislabs.pem"
31
+ argv[argv.index(args.private_key)] = (
32
+ "/home/ubuntu/work_dir/tests/benchmarks/benchmarks.redislabs.pem"
33
+ )
34
34
  if len(args.module_path) != 0:
35
35
  argv[argv.index(args.module_path[0])] = (
36
36
  "/home/ubuntu/work_dir/tests/benchmarks/"
@@ -12,6 +12,7 @@ FLUSHALL_AT_START = bool(int(os.getenv("FLUSHALL_AT_START", "1")))
12
12
  IGNORE_KEYSPACE_ERRORS = bool(int(os.getenv("IGNORE_KEYSPACE_ERRORS", "0")))
13
13
  SKIP_REDIS_SPIN = bool(int(os.getenv("SKIP_REDIS_SPIN", "0")))
14
14
  REDIS_PORT = int(os.getenv("REDIS_PORT", "6379"))
15
+ REDIS_AUTH = os.getenv("REDIS_AUTH", None)
15
16
  REDIS_HOST = os.getenv("REDIS_HOST", "127.0.0.1")
16
17
 
17
18
 
@@ -19,6 +20,7 @@ def create_run_local_arguments(parser):
19
20
  parser = common_run_args(parser)
20
21
  parser.add_argument("--port", type=int, default=REDIS_PORT)
21
22
  parser.add_argument("--host", type=str, default=REDIS_HOST)
23
+ parser.add_argument("--password", type=str, default=REDIS_AUTH)
22
24
  parser.add_argument("--redis-binary", type=str, default=REDIS_BINARY)
23
25
  parser.add_argument(
24
26
  "--flushall_on_every_test_start",
@@ -158,7 +158,7 @@ def local_db_spin(
158
158
  logging.info("Skipping DB spin step...")
159
159
 
160
160
  if setup_type == "oss-standalone":
161
- r = redis.Redis(port=args.port, host=args.host)
161
+ r = redis.Redis(port=args.port, host=args.host, password=args.password)
162
162
  r.ping()
163
163
  r.client_setname("redisbench-admin-standalone")
164
164
  redis_conns.append(r)
@@ -192,6 +192,11 @@ def local_db_spin(
192
192
  benchmark_tool_workdir,
193
193
  cluster_api_enabled,
194
194
  "dbconfig",
195
+ None,
196
+ None,
197
+ None,
198
+ None,
199
+ args.password,
195
200
  )
196
201
 
197
202
  # run the benchmark
@@ -206,7 +211,6 @@ def local_db_spin(
206
211
  load_via_benchmark_duration_seconds
207
212
  )
208
213
  )
209
-
210
214
  dbconfig_keyspacelen_check(benchmark_config, redis_conns, ignore_keyspace_errors)
211
215
 
212
216
  artifact_version = run_redis_pre_steps(
@@ -298,6 +298,12 @@ def run_local_command_logic(args, project_name, project_version):
298
298
  False,
299
299
  benchmark_tool_workdir,
300
300
  cluster_api_enabled,
301
+ "clientconfig",
302
+ None,
303
+ None,
304
+ None,
305
+ None,
306
+ args.password,
301
307
  )
302
308
  redis_pids = [
303
309
  redis_process.pid
@@ -680,17 +686,17 @@ def commandstats_latencystats_process_name(
680
686
  branch = variant_labels_dict["branch"]
681
687
 
682
688
  if version is not None:
683
- variant_labels_dict[
684
- "command_and_metric_and_version"
685
- ] = "{} - {} - {}".format(command, metric, version)
686
- variant_labels_dict[
687
- "command_and_metric_and_setup_and_version"
688
- ] = "{} - {} - {} - {}".format(command, metric, setup_name, version)
689
+ variant_labels_dict["command_and_metric_and_version"] = (
690
+ "{} - {} - {}".format(command, metric, version)
691
+ )
692
+ variant_labels_dict["command_and_metric_and_setup_and_version"] = (
693
+ "{} - {} - {} - {}".format(command, metric, setup_name, version)
694
+ )
689
695
 
690
696
  if branch is not None:
691
- variant_labels_dict[
692
- "command_and_metric_and_branch"
693
- ] = "{} - {} - {}".format(command, metric, branch)
694
- variant_labels_dict[
695
- "command_and_metric_and_setup_and_branch"
696
- ] = "{} - {} - {} - {}".format(command, metric, setup_name, branch)
697
+ variant_labels_dict["command_and_metric_and_branch"] = (
698
+ "{} - {} - {}".format(command, metric, branch)
699
+ )
700
+ variant_labels_dict["command_and_metric_and_setup_and_branch"] = (
701
+ "{} - {} - {} - {}".format(command, metric, setup_name, branch)
702
+ )
@@ -7,6 +7,7 @@ import logging
7
7
 
8
8
  from python_terraform import TerraformCommandError
9
9
 
10
+ from redisbench_admin.run.args import ARCH_X86, ARCH_ARM
10
11
  from redisbench_admin.run_remote.terraform import (
11
12
  retrieve_inventory_info,
12
13
  terraform_spin_or_reuse_env,
@@ -33,11 +34,22 @@ def remote_env_setup(
33
34
  spot_instance_error=False,
34
35
  spot_price_counter=0,
35
36
  full_price_counter=0,
37
+ architecture=ARCH_X86,
36
38
  ):
37
39
  server_plaintext_port = args.db_port
38
40
  db_ssh_port = args.db_ssh_port
39
41
  client_ssh_port = args.client_ssh_port
40
42
  username = args.user
43
+ if architecture != ARCH_X86 and tf_folder_path is not None:
44
+ logging.info(
45
+ f"Checking if the architecture info is specified on the terraform path {tf_folder_path}"
46
+ )
47
+ if architecture is ARCH_ARM and ARCH_ARM not in tf_folder_path:
48
+ logging.info(f"adding suffix '-{ARCH_ARM}' to {tf_folder_path}")
49
+ tf_folder_path = "{tf_folder_path}-{ARCH_ARM}"
50
+ else:
51
+ logging.info(f"'-{ARCH_ARM}' suffix already in {tf_folder_path}")
52
+
41
53
  if args.inventory is not None:
42
54
  (
43
55
  status,
@@ -274,7 +274,6 @@ def post_process_remote_run(
274
274
  tmp,
275
275
  result_csv_filename="result.csv",
276
276
  ):
277
- results_dict = {}
278
277
  if benchmark_tool == "redis-benchmark":
279
278
  local_benchmark_output_filename = tmp
280
279
  with open(result_csv_filename, "r", encoding="utf-8") as txt_file:
@@ -21,7 +21,7 @@ from redisbench_admin.profilers.perf_daemon_caller import (
21
21
  PerfDaemonRemoteCaller,
22
22
  PERF_DAEMON_LOGNAME,
23
23
  )
24
- from redisbench_admin.run.args import PROFILE_FREQ
24
+ from redisbench_admin.run.args import PROFILE_FREQ, VALID_ARCHS
25
25
  from redisbench_admin.run.common import (
26
26
  get_start_time_vars,
27
27
  BENCHMARK_REPETITIONS,
@@ -300,6 +300,14 @@ def run_remote_command_logic(args, project_name, project_version):
300
300
  benchmark_artifacts_table_name = "Benchmark client artifacts"
301
301
  benchmark_artifacts_table_headers = ["Setup", "Test-case", "Artifact", "link"]
302
302
  benchmark_artifacts_links = []
303
+ architecture = args.architecture
304
+ if architecture not in VALID_ARCHS:
305
+ logging.critical(
306
+ f"The specified architecture {architecture} is not valid. Specify one of {VALID_ARCHS}"
307
+ )
308
+ exit(1)
309
+ else:
310
+ logging.info("Running benchmark for architecture {architecture}")
303
311
 
304
312
  # contains the overall target-tables ( if any target is defined )
305
313
  overall_tables = {}
@@ -346,10 +354,7 @@ def run_remote_command_logic(args, project_name, project_version):
346
354
 
347
355
  # map from setup name to overall target-tables ( if any target is defined )
348
356
  overall_tables[setup_name] = {}
349
- total_benchmarks = len(benchmarks_map.keys())
350
- import tqdm
351
357
 
352
- pbar = tqdm.tqdm(total=total_benchmarks, unit="benchmarks")
353
358
  for test_name, benchmark_config in benchmarks_map.items():
354
359
  if return_code != 0 and args.fail_fast:
355
360
  logging.warning(
@@ -374,7 +379,9 @@ def run_remote_command_logic(args, project_name, project_version):
374
379
  continue
375
380
  remote_perf = None
376
381
  logging.info(
377
- f"Repetition {repetition} of {BENCHMARK_REPETITIONS}. Running test {test_name}. Total benchmarks {total_benchmarks}"
382
+ "Repetition {} of {}. Running test {}".format(
383
+ repetition, BENCHMARK_REPETITIONS, test_name
384
+ )
378
385
  )
379
386
  (
380
387
  setup_name,
@@ -442,6 +449,7 @@ def run_remote_command_logic(args, project_name, project_version):
442
449
  spot_instance_error,
443
450
  0,
444
451
  0,
452
+ architecture,
445
453
  )
446
454
 
447
455
  # after we've created the env, even on error we should always teardown
@@ -1093,7 +1101,6 @@ def run_remote_command_logic(args, project_name, project_version):
1093
1101
  f"Test {test_name} does not have remote config. Skipping test."
1094
1102
  )
1095
1103
 
1096
- pbar.update()
1097
1104
  if len(benchmark_artifacts_links) > 0:
1098
1105
  writer = MarkdownTableWriter(
1099
1106
  table_name=benchmark_artifacts_table_name,
@@ -1376,20 +1383,20 @@ def commandstats_latencystats_process_name(
1376
1383
  branch = variant_labels_dict["branch"]
1377
1384
 
1378
1385
  if version is not None:
1379
- variant_labels_dict[
1380
- "command_and_metric_and_version"
1381
- ] = "{} - {} - {}".format(command, metric, version)
1382
- variant_labels_dict[
1383
- "command_and_metric_and_setup_and_version"
1384
- ] = "{} - {} - {} - {}".format(command, metric, setup_name, version)
1386
+ variant_labels_dict["command_and_metric_and_version"] = (
1387
+ "{} - {} - {}".format(command, metric, version)
1388
+ )
1389
+ variant_labels_dict["command_and_metric_and_setup_and_version"] = (
1390
+ "{} - {} - {} - {}".format(command, metric, setup_name, version)
1391
+ )
1385
1392
 
1386
1393
  if branch is not None:
1387
- variant_labels_dict[
1388
- "command_and_metric_and_branch"
1389
- ] = "{} - {} - {}".format(command, metric, branch)
1390
- variant_labels_dict[
1391
- "command_and_metric_and_setup_and_branch"
1392
- ] = "{} - {} - {} - {}".format(command, metric, setup_name, branch)
1394
+ variant_labels_dict["command_and_metric_and_branch"] = (
1395
+ "{} - {} - {}".format(command, metric, branch)
1396
+ )
1397
+ variant_labels_dict["command_and_metric_and_setup_and_branch"] = (
1398
+ "{} - {} - {} - {}".format(command, metric, setup_name, branch)
1399
+ )
1393
1400
 
1394
1401
 
1395
1402
  def shutdown_remote_redis(redis_conns, ssh_tunnel):
@@ -76,7 +76,6 @@ def remote_module_files_cp(
76
76
  ):
77
77
  remote_module_files = []
78
78
  if local_module_files is not None:
79
- logging.info(f"local_module_files: {local_module_files}")
80
79
  for local_module_file in local_module_files:
81
80
  splitted_module_and_plugins = []
82
81
  if type(local_module_file) is str:
@@ -136,10 +135,7 @@ def remote_module_files_cp(
136
135
  if pos > 1:
137
136
  remote_module_files_in = remote_module_files_in + " "
138
137
  remote_module_files_in = remote_module_files_in + remote_module_file
139
- logging.info(
140
- f"appending to {remote_module_files} remote file {remote_module_files_in}"
141
- )
142
- remote_module_files.append(remote_module_files_in)
138
+ remote_module_files.append(remote_module_files_in)
143
139
  logging.info(
144
140
  "There are a total of {} remote files {}".format(
145
141
  len(remote_module_files), remote_module_files
@@ -157,9 +153,12 @@ def generate_remote_standalone_redis_cmd(
157
153
  enable_redis_7_config_directives=True,
158
154
  enable_debug_command="yes",
159
155
  ):
160
- initial_redis_cmd = "redis-server --save '' --logfile {} --dir {} --daemonize yes --protected-mode no --enable-debug-command yes ".format(
156
+ initial_redis_cmd = "redis-server --save '' --logfile {} --dir {} --daemonize yes --protected-mode no ".format(
161
157
  logfile, temporary_dir
162
158
  )
159
+ if enable_redis_7_config_directives:
160
+ extra_str = " --enable-debug-command {} ".format(enable_debug_command)
161
+ initial_redis_cmd = initial_redis_cmd + extra_str
163
162
  full_logfile = "{}/{}".format(temporary_dir, logfile)
164
163
  if redis_configuration_parameters is not None:
165
164
  for (
@@ -31,7 +31,11 @@ def terraform_spin_or_reuse_env(
31
31
  tf_override_name=None,
32
32
  tf_folder_path=None,
33
33
  ):
34
- (remote_setup, deployment_type, remote_id,) = fetch_remote_setup_from_config(
34
+ (
35
+ remote_setup,
36
+ deployment_type,
37
+ remote_id,
38
+ ) = fetch_remote_setup_from_config(
35
39
  benchmark_config["remote"],
36
40
  "https://github.com/redis-performance/testing-infrastructure.git",
37
41
  "master",
@@ -565,7 +565,6 @@ def get_testfiles_to_process(
565
565
 
566
566
 
567
567
  def check_required_modules(module_names, required_modules):
568
- position = -1
569
568
  if required_modules is not None:
570
569
  if len(required_modules) > 0:
571
570
  logging.info(
@@ -573,12 +572,6 @@ def check_required_modules(module_names, required_modules):
573
572
  required_modules
574
573
  )
575
574
  )
576
- first_module = required_modules[0]
577
- if first_module in module_names:
578
- position = module_names.index(first_module)
579
- logging.info(
580
- f"POSITION of 1st required module :{first_module} in the module names list {module_names}: pos={position} "
581
- )
582
575
  for required_module in required_modules:
583
576
  if required_module not in module_names:
584
577
  raise Exception(
@@ -587,7 +580,6 @@ def check_required_modules(module_names, required_modules):
587
580
  module_names,
588
581
  )
589
582
  )
590
- return position
591
583
 
592
584
 
593
585
  def results_dict_kpi_check(benchmark_config, results_dict, return_code):
@@ -142,7 +142,7 @@ def execute_remote_commands(
142
142
  c = connect_remote_ssh(port, private_key, server_public_ip, username)
143
143
  for command in commands:
144
144
  logging.info('Executing remote command "{}"'.format(command))
145
- stdin, stdout, stderr = c.exec_command(command, get_pty=get_pty, timeout=180)
145
+ stdin, stdout, stderr = c.exec_command(command, get_pty=get_pty)
146
146
  recv_exit_status = stdout.channel.recv_exit_status() # status is 0
147
147
  stdout = stdout.readlines()
148
148
  stderr = stderr.readlines()
@@ -158,46 +158,13 @@ def execute_remote_commands(
158
158
 
159
159
 
160
160
  def connect_remote_ssh(port, private_key, server_public_ip, username):
161
- import time
162
- import socket
163
-
164
161
  k = paramiko.RSAKey.from_private_key_file(private_key)
165
162
  c = paramiko.SSHClient()
166
163
  c.set_missing_host_key_policy(paramiko.AutoAddPolicy())
167
-
168
- max_retries = 20
169
- base_delay = 8 # Initial backoff time in seconds
170
- max_delay = 900 # Maximum delay in seconds
171
-
172
- for attempt in range(max_retries):
173
- try:
174
- logging.info(
175
- f"Connecting to remote server {server_public_ip}, attempt {attempt + 1}"
176
- )
177
- c.connect(
178
- hostname=server_public_ip,
179
- port=port,
180
- username=username,
181
- pkey=k,
182
- timeout=300,
183
- )
184
- logging.info(f"Connected to remote server {server_public_ip}")
185
- return c
186
- except (
187
- paramiko.ssh_exception.NoValidConnectionsError,
188
- socket.timeout,
189
- paramiko.ssh_exception.SSHException,
190
- ) as e:
191
- wait_time = min(base_delay * (2**attempt), max_delay)
192
- logging.warning(
193
- f"Connection attempt {attempt + 1} failed: {e}. Retrying in {wait_time} seconds..."
194
- )
195
- time.sleep(wait_time)
196
-
197
- logging.error("Failed to connect after multiple attempts.")
198
- raise Exception(
199
- f"Could not connect to {server_public_ip} after {max_retries} attempts."
200
- )
164
+ logging.info("Connecting to remote server {}".format(server_public_ip))
165
+ c.connect(hostname=server_public_ip, port=port, username=username, pkey=k)
166
+ logging.info("Connected to remote server {}".format(server_public_ip))
167
+ return c
201
168
 
202
169
 
203
170
  def check_dataset_remote_requirements(
@@ -303,9 +270,7 @@ def setup_remote_environment(
303
270
  _, _, _ = tf.init(
304
271
  capture_output=True,
305
272
  backend_config={
306
- "key": "benchmarks/infrastructure/{}.tfstate".format(tf_setup_name).replace(
307
- "/", "-"
308
- )
273
+ "key": "benchmarks/infrastructure/{}.tfstate".format(tf_setup_name)
309
274
  },
310
275
  )
311
276
  _, _, _ = tf.refresh()
@@ -579,21 +544,12 @@ def common_tf(branch, path, repo, temporary_dir=None, destroy=False):
579
544
  temporary_dir = tempfile.mkdtemp()
580
545
  if destroy is False:
581
546
  logging.info(
582
- "Fetching infrastructure definition from git repo {}{} (branch={}). Using local dir {} to store state".format(
547
+ "Fetching infrastructure definition from git repo {}/{} (branch={}). Using local dir {} to store state".format(
583
548
  repo, path, branch, temporary_dir
584
549
  )
585
550
  )
586
551
  git.Repo.clone_from(repo, temporary_dir, branch=branch, depth=1)
587
- logging.info(f"ensuring folder exists: {temporary_dir}")
588
- assert os.path.exists(temporary_dir) and os.path.isdir(
589
- temporary_dir
590
- ), f"Folder '{temporary_dir}' does not exist"
591
- if path[0] != "/":
592
- temporary_dir = temporary_dir + "/"
593
552
  terraform_working_dir = temporary_dir + path
594
- logging.info(
595
- f"terraform_working_dir={terraform_working_dir}. temporary_dir={temporary_dir}. path={path}"
596
- )
597
553
  return terraform_working_dir
598
554
 
599
555
 
@@ -605,7 +561,7 @@ def check_remote_setup_spot_instance(
605
561
  contains_spot_instance = False
606
562
  for remote_setup_property in remote_setup_config:
607
563
  if "spot_instance" in remote_setup_property:
608
- spot_path = "terraform/" + remote_setup_property["spot_instance"]
564
+ spot_path = "/terraform/" + remote_setup_property["spot_instance"]
609
565
  contains_spot_instance = True
610
566
  logging.info(f"Detected spot instance config. Setup path: {spot_path}")
611
567
 
@@ -775,7 +731,10 @@ def extract_perversion_timeseries_from_results(
775
731
  ):
776
732
  break_by_key = "version"
777
733
  break_by_str = "by.{}".format(break_by_key)
778
- (branch_time_series_dict, target_tables,) = common_timeseries_extraction(
734
+ (
735
+ branch_time_series_dict,
736
+ target_tables,
737
+ ) = common_timeseries_extraction(
779
738
  break_by_key,
780
739
  break_by_str,
781
740
  datapoints_timestamp,
@@ -946,9 +905,9 @@ def from_metric_kv_to_timeserie(
946
905
 
947
906
  target_table_dict[target_name] = target_value
948
907
 
949
- target_table_dict[
950
- "{}:percent {}".format(target_name, comparison_type)
951
- ] = target_value_pct_str
908
+ target_table_dict["{}:percent {}".format(target_name, comparison_type)] = (
909
+ target_value_pct_str
910
+ )
952
911
  return target_table_keyname, target_table_dict
953
912
 
954
913
 
@@ -100,12 +100,17 @@ def generate_common_server_args(
100
100
  "''",
101
101
  "--port",
102
102
  "{}".format(port),
103
- "--enable-debug-command",
104
- "yes",
105
103
  "--dir",
106
104
  dbdir,
107
105
  ]
108
106
  )
107
+ if enable_redis_7_config_directives:
108
+ command.extend(
109
+ [
110
+ "--enable-debug-command",
111
+ enable_debug_command,
112
+ ]
113
+ )
109
114
 
110
115
  return command
111
116
 
@@ -31,15 +31,14 @@ def get_ci_ec2_instances_by_state(ec2_client, ci_machines_prefix, requested_stat
31
31
  instances = group["Instances"]
32
32
  for instance in instances:
33
33
  state = instance["State"]["Name"]
34
- if "Tags" in instance:
35
- for tag_dict in instance["Tags"]:
36
- key = tag_dict["Key"]
37
- key_v = tag_dict["Value"]
38
- if key == "Name":
39
- if ci_machines_prefix in key_v:
40
- if state == requested_state:
41
- count = count + 1
42
- state_instances.append(instance)
34
+ for tag_dict in instance["Tags"]:
35
+ key = tag_dict["Key"]
36
+ key_v = tag_dict["Value"]
37
+ if key == "Name":
38
+ if ci_machines_prefix in key_v:
39
+ if state == requested_state:
40
+ count = count + 1
41
+ state_instances.append(instance)
43
42
  return count, state_instances
44
43
 
45
44
 
@@ -1,12 +1,11 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: redisbench-admin
3
- Version: 0.11.19
3
+ Version: 0.11.21
4
4
  Summary: Redis benchmark run helper. A wrapper around Redis and Redis Modules benchmark tools ( ftsb_redisearch, memtier_benchmark, redis-benchmark, aibench, etc... ).
5
5
  Author: filipecosta90
6
6
  Author-email: filipecosta.90@gmail.com
7
- Requires-Python: >=3.9.0,<4.0.0
7
+ Requires-Python: >=3.10.0,<4.0.0
8
8
  Classifier: Programming Language :: Python :: 3
9
- Classifier: Programming Language :: Python :: 3.9
10
9
  Classifier: Programming Language :: Python :: 3.10
11
10
  Classifier: Programming Language :: Python :: 3.11
12
11
  Classifier: Programming Language :: Python :: 3.12
@@ -3,11 +3,11 @@ redisbench_admin/cli.py,sha256=LAS5qnqScXKhxHYfXWB0mvAYaUYrSurIwadhexEa9g4,7740
3
3
  redisbench_admin/commands/__init__.py,sha256=mzVrEtqefFdopyzR-W6xx3How95dyZfToGKm1-_YzeY,95
4
4
  redisbench_admin/commands/commands.json.py,sha256=mzVrEtqefFdopyzR-W6xx3How95dyZfToGKm1-_YzeY,95
5
5
  redisbench_admin/compare/__init__.py,sha256=DtBXRp0Q01XgCFmY-1OIePMyyYihVNAjZ1Y8zwqSDN0,101
6
- redisbench_admin/compare/args.py,sha256=S6QFNQEY68Fm_2eQZzfpKetuJlSOnhzFm9koReq423c,5386
7
- redisbench_admin/compare/compare.py,sha256=zxZzMfLJqYaVogQnHm2cOsROg7VlE5g2majRfFO_hss,38483
6
+ redisbench_admin/compare/args.py,sha256=10zbiT8roeTGnAubvoVFZTbJNbVxuRaRPtCKjxV8iNE,5226
7
+ redisbench_admin/compare/compare.py,sha256=ANCm4kKCR8IBBoeBRgsPOOYW2s5qJV1QVIIPcY-WNUk,37725
8
8
  redisbench_admin/deploy/__init__.py,sha256=DtBXRp0Q01XgCFmY-1OIePMyyYihVNAjZ1Y8zwqSDN0,101
9
9
  redisbench_admin/deploy/args.py,sha256=neLUcQqI__HkJItkQg2C293hl5g3yHG40t171r7-E5Y,1732
10
- redisbench_admin/deploy/deploy.py,sha256=l0yfWMYSGtcjcQes8t3i8-buO-jpEbzNJEU4Ik6FXC0,3853
10
+ redisbench_admin/deploy/deploy.py,sha256=MtfJbsL97DLrbBYut6zRCzyEMebX4xWoZE-m4-JDRB8,3885
11
11
  redisbench_admin/environments/__init__.py,sha256=cD7zfXt0VEmy0b7452HvcAxX_9kVj6Vm213yNdUHP20,95
12
12
  redisbench_admin/environments/oss_cluster.py,sha256=lUOG6oN8VXAnDXFK7Xns-ag-hSOSxxxL8jZ4Mh03hQY,6681
13
13
  redisbench_admin/environments/oss_standalone.py,sha256=Sl38rUpwJ3wNOl9zn38iK8q2iJi2pRFmaJAZJbuT_SQ,2474
@@ -15,7 +15,7 @@ redisbench_admin/export/__init__.py,sha256=DtBXRp0Q01XgCFmY-1OIePMyyYihVNAjZ1Y8z
15
15
  redisbench_admin/export/args.py,sha256=kzBfU21mXYWLZ8YPhKA8MCfxJo-OU4m8-OBZFY7VKnA,3189
16
16
  redisbench_admin/export/common/__init__.py,sha256=DtBXRp0Q01XgCFmY-1OIePMyyYihVNAjZ1Y8zwqSDN0,101
17
17
  redisbench_admin/export/common/common.py,sha256=LnvXjMLlJRzMTxiFIjrfRFfDx9JJm88OZHu7lnTOpFA,4331
18
- redisbench_admin/export/export.py,sha256=Es4pPzNXvEtU_vxdasrc2BI9-D5_l6Tm5WRNzJVu9LU,10547
18
+ redisbench_admin/export/export.py,sha256=JkdoMpbFnMEooNVSEmXQdyEfcU0SlFkO4jV6jGwYWRA,10593
19
19
  redisbench_admin/export/google_benchmark/__init__.py,sha256=DtBXRp0Q01XgCFmY-1OIePMyyYihVNAjZ1Y8zwqSDN0,101
20
20
  redisbench_admin/export/google_benchmark/google_benchmark_json_format.py,sha256=OuMaMmmma5VvXA0rcLIQSMxIq81oa5I3xYDFhbWj-IA,1804
21
21
  redisbench_admin/export/memtier_benchmark/__init__.py,sha256=DtBXRp0Q01XgCFmY-1OIePMyyYihVNAjZ1Y8zwqSDN0,101
@@ -35,7 +35,7 @@ redisbench_admin/grafana_api/grafana_api.py,sha256=dG17GCYmWRILmy7h3-OiBeGzuNGnR
35
35
  redisbench_admin/profilers/__init__.py,sha256=DtBXRp0Q01XgCFmY-1OIePMyyYihVNAjZ1Y8zwqSDN0,101
36
36
  redisbench_admin/profilers/daemon.py,sha256=Y4ZbbH-cRHJk9cvpsb60UZFq_HVHWXtatb7T2vtlRKo,12973
37
37
  redisbench_admin/profilers/flamegraph.pl,sha256=Za5XE-1gb_U-nzqwoyRwfe1TB182c64gITa-2klWTTA,35898
38
- redisbench_admin/profilers/perf.py,sha256=OjHI9iKqCx9vZDqRqz0xOGoeKLTRps-ikBKVxSJqwC4,27756
38
+ redisbench_admin/profilers/perf.py,sha256=HtzzMVsXEJa1H7tOAfKlbFYDn2KnxAG_IU9yKPKZB7w,27772
39
39
  redisbench_admin/profilers/perf_daemon_caller.py,sha256=nD97cXmX3JytyafvNMmhUBq40uYrf6vtjdJ1TXZbvVY,4948
40
40
  redisbench_admin/profilers/pprof.py,sha256=g7oNC3AtNDTUOBIh_mIi5bFl_b0mL8tqBu6qKvAOrKw,3949
41
41
  redisbench_admin/profilers/profilers.py,sha256=4C1xaPyLoPydJ3eBAxW7IlSHG-3qj3A3BAKejiZXEK0,510
@@ -174,11 +174,11 @@ redisbench_admin/run/ann/pkg/templates/summary.html,sha256=Y-jePm8EGM41ensKay18R
174
174
  redisbench_admin/run/ann/pkg/test/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
175
175
  redisbench_admin/run/ann/pkg/test/test-jaccard.py,sha256=oIhaQCQKrQokwv3fvgLSwPlRwkY0MNppG9Fc08oS3ZI,462
176
176
  redisbench_admin/run/ann/pkg/test/test-metrics.py,sha256=vJdS8Kuk8bAnpB65Uqb-9rUUI35XrHwaO3cNwKX5gxc,3057
177
- redisbench_admin/run/args.py,sha256=Sspv4eusQs9HMVMIyv_hB9vQ3S_s0lHYGAL1gPb2WGM,7864
177
+ redisbench_admin/run/args.py,sha256=tevHZrezJ4RreHp6K-MGHko3e1Gi_IdsS2Q0jD2ZSoU,8173
178
178
  redisbench_admin/run/cluster.py,sha256=QuptSW-IhdyFIoQ3hzY613jtQWxBrVIlgc8OarcEK20,6072
179
- redisbench_admin/run/common.py,sha256=_nnvrSE1y7cOwha2BsaTM-j-PkFH2gf4LYu0FrbqKeQ,28172
179
+ redisbench_admin/run/common.py,sha256=zRh2AxYks1-O_50qmk1WoD95C6xBaa5Hvs_-o7Q4ZFQ,28404
180
180
  redisbench_admin/run/ftsb/__init__.py,sha256=DtBXRp0Q01XgCFmY-1OIePMyyYihVNAjZ1Y8zwqSDN0,101
181
- redisbench_admin/run/ftsb/ftsb.py,sha256=plP-yxjMvvy-gITlXpuXJcyrPHfDoYYI8JRwTe5kK4M,2388
181
+ redisbench_admin/run/ftsb/ftsb.py,sha256=aupMl27UZU6byUFsApBz5GLcdGd7lxtY6vCjJ3jnqJE,2387
182
182
  redisbench_admin/run/git.py,sha256=6UYGcTN0MPzf4QDVoJnFkou0yZasLF6jLG7f0zoySq8,3064
183
183
  redisbench_admin/run/grafana.py,sha256=iMDgMyJKinpZMTD43rZ1IcRGkadjFjCxaB48mYWkvG4,9421
184
184
  redisbench_admin/run/memtier_benchmark/__init__.py,sha256=DtBXRp0Q01XgCFmY-1OIePMyyYihVNAjZ1Y8zwqSDN0,101
@@ -192,24 +192,24 @@ redisbench_admin/run/redisgraph_benchmark_go/redisgraph_benchmark_go.py,sha256=D
192
192
  redisbench_admin/run/redistimeseries.py,sha256=x3PA7QoHXu53zs5v0ekK2sVmUnA9_ZF2JxgCDf1Mui4,21331
193
193
  redisbench_admin/run/run.py,sha256=WIBc1q5198Ln3Elfgk6D1_ezuAKx5kM_xsxnxGe66-I,5586
194
194
  redisbench_admin/run/s3.py,sha256=pXQXZ1rrwDCWeBegGR4aKzbKqWWwMrmqvIjFxEB3bh4,442
195
- redisbench_admin/run/ssh.py,sha256=vLesv-a1Ze7Prb8rCnquBbLS1Svj-EZtrSs36RbVHro,3269
195
+ redisbench_admin/run/ssh.py,sha256=gRW6ROoTKlaxLKhS5tM-Ejjd6zk2iO1KN9dzBzw7GOk,2835
196
196
  redisbench_admin/run/tsbs_run_queries_redistimeseries/__init__.py,sha256=DtBXRp0Q01XgCFmY-1OIePMyyYihVNAjZ1Y8zwqSDN0,101
197
197
  redisbench_admin/run/tsbs_run_queries_redistimeseries/tsbs_run_queries_redistimeseries.py,sha256=9JWh23vG_4pNZuv6-kVk7_5C6qJ2ZOBWv53LxGMKXgs,2426
198
198
  redisbench_admin/run/ycsb/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
199
199
  redisbench_admin/run/ycsb/ycsb.py,sha256=cs5saVH7C4YpDvzhoa15PwEho59qTVR1E90v_FYjMVw,6873
200
200
  redisbench_admin/run_async/__init__.py,sha256=DtBXRp0Q01XgCFmY-1OIePMyyYihVNAjZ1Y8zwqSDN0,101
201
201
  redisbench_admin/run_async/async_env.py,sha256=tE1turaaZNHfOaSpGxh62EJWp88zoQFUf3sMbaS7JRA,2408
202
- redisbench_admin/run_async/async_terraform.py,sha256=fRzhUq9kIPs0EjQxrpctkoNiI2Q4fKTdNlVbBDpG1Ys,11223
202
+ redisbench_admin/run_async/async_terraform.py,sha256=ngOQnECUuC20pZwiJItaiBnzlwT2DiKciPTHtqLURe4,11299
203
203
  redisbench_admin/run_async/benchmark.py,sha256=S-dsaWGjgsPQxj8sXAACnbtNw5zlJnRFoo53ULbrMEY,1630
204
204
  redisbench_admin/run_async/log.py,sha256=cD7zfXt0VEmy0b7452HvcAxX_9kVj6Vm213yNdUHP20,95
205
- redisbench_admin/run_async/render_files.py,sha256=OMPy3-GnU14tQ4HNlF5utOnmzpRAXURwG_h8UDkTmYs,2674
205
+ redisbench_admin/run_async/render_files.py,sha256=NMagmx-2hsMET_XN8tkmQz55g-azqW7SjAqaq4GL8F0,2676
206
206
  redisbench_admin/run_async/run_async.py,sha256=g2ZOQqj9vXZYaRyNpJZtgfYyY9tMuRmEv3Hh3qWOUs8,14525
207
207
  redisbench_admin/run_local/__init__.py,sha256=DtBXRp0Q01XgCFmY-1OIePMyyYihVNAjZ1Y8zwqSDN0,101
208
- redisbench_admin/run_local/args.py,sha256=VkIDvdTW-cRl-ncOkcK8-8MdCbq-qyipGQFugh9Fio0,1393
208
+ redisbench_admin/run_local/args.py,sha256=9Qr-IVQJ3TMqFkn9Jp597KjU2AGq3u0X5Eb82CWD7wk,1504
209
209
  redisbench_admin/run_local/local_client.py,sha256=gwawMDOBrf7m--uyxu8kMZC5LBiLjbUBSKvzVOdOAas,124
210
- redisbench_admin/run_local/local_db.py,sha256=Xh7xyZaSyhmRXKyMsbKqO9aLUikf-EXGha3K1h9yL2M,7396
210
+ redisbench_admin/run_local/local_db.py,sha256=9vINqKOs-wDMFEuEHT0I8KO9YnEo_h4NWNk5da3LwSY,7518
211
211
  redisbench_admin/run_local/local_helpers.py,sha256=JyqLW2-Sbm35BXjxxfOB1yK7ADdLfcVrq08NLNdIwac,7026
212
- redisbench_admin/run_local/run_local.py,sha256=tueVqiqApQx2b0Dq6GJ84jr7WYRVKvJ7r2QCzlfY3aw,30870
212
+ redisbench_admin/run_local/run_local.py,sha256=u2smgDsml6-nnjf4ptb4JeEetmtLyVhLGtzho-GGeNU,31149
213
213
  redisbench_admin/run_remote/__init__.py,sha256=DtBXRp0Q01XgCFmY-1OIePMyyYihVNAjZ1Y8zwqSDN0,101
214
214
  redisbench_admin/run_remote/args.py,sha256=vhV87avBwXL8c2QLqrAkIyWD53MYhN06F-3wRv3l5xE,3829
215
215
  redisbench_admin/run_remote/consts.py,sha256=bCMkwyeBD-EmOpoHKni7LjWy5WuaxGJhGhqpi4AL0RQ,386
@@ -217,26 +217,26 @@ redisbench_admin/run_remote/log.py,sha256=cD7zfXt0VEmy0b7452HvcAxX_9kVj6Vm213yNd
217
217
  redisbench_admin/run_remote/notifications.py,sha256=-W9fLaftEFNfplBl2clHk37jbYxliDbHftQ62khN31k,2157
218
218
  redisbench_admin/run_remote/remote_client.py,sha256=JqxsUjyxRtsChIkOWrVTGF_mQH0_8h7v5j-5rud448Y,14079
219
219
  redisbench_admin/run_remote/remote_db.py,sha256=a1_fnLhsCGv_0HMBB91zscHTFcHwmab_u1W7u-u1r3E,12929
220
- redisbench_admin/run_remote/remote_env.py,sha256=fTZliXW7Cz0ztew7IR2BNlqLd_l4_p-5Oc6rX7T5EdI,4605
220
+ redisbench_admin/run_remote/remote_env.py,sha256=jUbqijwivVmbC4VKEnUkKVFogy1TRTswxUt4ObqYMeU,5187
221
221
  redisbench_admin/run_remote/remote_failures.py,sha256=IOo6DyxarcwwMPCeN4gWB2JrhuC9iBLwq0nCROqr5ak,1567
222
- redisbench_admin/run_remote/remote_helpers.py,sha256=md58cuh11htP-_7mMQywNDy2zMcCCtrJaeUg7MH6owE,9840
223
- redisbench_admin/run_remote/run_remote.py,sha256=Y2EIiNzkktp_yu0CB3C8yjUXkbLBZSQ6RKGPJju7v0A,67599
224
- redisbench_admin/run_remote/standalone.py,sha256=na_T1V1PrqzhB68ixBXlcWyRv6rJDcQ3INRESstmVDk,6710
225
- redisbench_admin/run_remote/terraform.py,sha256=zD2gGuOmnTex6Dt2lhdAtNn21iL6sykPPXI10jJaim4,3945
222
+ redisbench_admin/run_remote/remote_helpers.py,sha256=gy10SuKheBiL568ldiOdJaHRPJ_J7DxH_uZpqgOuylo,9818
223
+ redisbench_admin/run_remote/run_remote.py,sha256=uI-c_7FpVjNeVBXcD1uBMLECJZ62Rpfg2Kidmoucle8,67820
224
+ redisbench_admin/run_remote/standalone.py,sha256=vWmm0CdFtrasy-_1BDKO7I_gVPBjjiypv94_Fq2Sm7o,6660
225
+ redisbench_admin/run_remote/terraform.py,sha256=ZOBrSjHrWRMHa9_ER_cS3UxbWK7IdzMkO0ZD-Hq8BAo,3975
226
226
  redisbench_admin/utils/__init__.py,sha256=DtBXRp0Q01XgCFmY-1OIePMyyYihVNAjZ1Y8zwqSDN0,101
227
- redisbench_admin/utils/benchmark_config.py,sha256=sVhS2c3p4lBMga0g3U-S9rF8pntcI4qSKeX138emWm0,21753
227
+ redisbench_admin/utils/benchmark_config.py,sha256=bC2C6rnj89wkkSlOXyyfe0N15unn_M1t1zfskfVkb98,21387
228
228
  redisbench_admin/utils/local.py,sha256=zUvyVI9LZMT3qyxs1pO3mXL6Bt_1z9EZUGppaRcWNRA,3890
229
229
  redisbench_admin/utils/redisearch.py,sha256=lchUEzpt0zB1rHwlDlw9LLifAnxFWcLP-PePw7TjL-0,1602
230
230
  redisbench_admin/utils/redisgraph_benchmark_go.py,sha256=os7EJt6kBxsFJLKkSoANbjMT7-cEq4-Ns-49alk2Tf8,2048
231
- redisbench_admin/utils/remote.py,sha256=4jA3qDnc_U36hP-sqiX_XB38UwVshMLcGvZ74aKMDWY,40363
231
+ redisbench_admin/utils/remote.py,sha256=nNKKNmzZ4a44U7I3Wzc4fwaiKYNDDIGy-i-seovDkqU,38952
232
232
  redisbench_admin/utils/results.py,sha256=uKk3uNJ--bSXlUj_HGQ2OaV6MVqmXJVM8xTzFV6EOw4,3267
233
233
  redisbench_admin/utils/ssh.py,sha256=QW4AwlocMHJt05QMdN_4f8WeDmxiEwR80ny8VBThq6k,6533
234
- redisbench_admin/utils/utils.py,sha256=nQkN3N2iVhoe2GlRxU3BBaicrtw5vZXFaqnstc4i2Fc,14034
234
+ redisbench_admin/utils/utils.py,sha256=FLDjhGkW0PWwcu_nlTnIW6aZtHzJGz4LIwvu1CpCajw,14160
235
235
  redisbench_admin/watchdog/__init__.py,sha256=cD7zfXt0VEmy0b7452HvcAxX_9kVj6Vm213yNdUHP20,95
236
236
  redisbench_admin/watchdog/args.py,sha256=nKsG1G6ATOZlAMHMtT9u3kXxduKCbejSZ5x8oB_ynZ8,1312
237
- redisbench_admin/watchdog/watchdog.py,sha256=NiveQyTq22ZCrZoPJYskP9s5MMLRXq9xCGdBwEMNMxg,6225
238
- redisbench_admin-0.11.19.dist-info/LICENSE,sha256=AAMtfs82zOOvmG68vILivm6lxi2rcOlGObmA8jzxQvw,10768
239
- redisbench_admin-0.11.19.dist-info/METADATA,sha256=ZC6onJul_jgW1PYydjCWYwLV5Jgp19RNqX_MQxd7eys,5438
240
- redisbench_admin-0.11.19.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
241
- redisbench_admin-0.11.19.dist-info/entry_points.txt,sha256=UUawXk_AS-PlieKJ1QxPQXGsRLb6OW_F0MtmA1W0KE8,113
242
- redisbench_admin-0.11.19.dist-info/RECORD,,
237
+ redisbench_admin/watchdog/watchdog.py,sha256=jFGtm5ktjKuXKWvH7lnmf3pp-ch1WBJUOomXILJMDAg,6158
238
+ redisbench_admin-0.11.21.dist-info/LICENSE,sha256=AAMtfs82zOOvmG68vILivm6lxi2rcOlGObmA8jzxQvw,10768
239
+ redisbench_admin-0.11.21.dist-info/METADATA,sha256=RrK5OW8EH3XQEaaQmFvtHOtMCCJJutOkGYvvHBpTKJo,5389
240
+ redisbench_admin-0.11.21.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
241
+ redisbench_admin-0.11.21.dist-info/entry_points.txt,sha256=UUawXk_AS-PlieKJ1QxPQXGsRLb6OW_F0MtmA1W0KE8,113
242
+ redisbench_admin-0.11.21.dist-info/RECORD,,