redisbench-admin 0.11.72__tar.gz → 0.11.74__tar.gz

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.
Files changed (116) hide show
  1. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/PKG-INFO +1 -1
  2. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/pyproject.toml +1 -1
  3. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/run/common.py +45 -3
  4. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/run_local/local_db.py +13 -3
  5. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/run_remote/remote_db.py +16 -4
  6. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/run_remote/remote_helpers.py +5 -4
  7. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/run_remote/standalone.py +11 -0
  8. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/utils/utils.py +126 -1
  9. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/LICENSE +0 -0
  10. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/README.md +0 -0
  11. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/__init__.py +0 -0
  12. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/cli.py +0 -0
  13. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/commands/__init__.py +0 -0
  14. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/commands/commands.json.py +0 -0
  15. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/compare/__init__.py +0 -0
  16. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/compare/args.py +0 -0
  17. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/compare/compare.py +0 -0
  18. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/deploy/__init__.py +0 -0
  19. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/deploy/args.py +0 -0
  20. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/deploy/deploy.py +0 -0
  21. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/environments/__init__.py +0 -0
  22. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/environments/oss_cluster.py +0 -0
  23. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/environments/oss_standalone.py +0 -0
  24. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/export/__init__.py +0 -0
  25. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/export/args.py +0 -0
  26. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/export/common/__init__.py +0 -0
  27. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/export/common/common.py +0 -0
  28. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/export/export.py +0 -0
  29. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/export/google_benchmark/__init__.py +0 -0
  30. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/export/google_benchmark/google_benchmark_json_format.py +0 -0
  31. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/export/memtier_benchmark/__init__.py +0 -0
  32. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/export/memtier_benchmark/memtier_benchmark_json_format.py +0 -0
  33. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/export/pyperf/__init__.py +0 -0
  34. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/export/pyperf/pyperf_json_format.py +0 -0
  35. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/export/redis_benchmark/__init__.py +0 -0
  36. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/export/redis_benchmark/metrics_definition.py +0 -0
  37. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/export/redis_benchmark/redis_benchmark_csv_format.py +0 -0
  38. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/extract/__init__.py +0 -0
  39. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/extract/args.py +0 -0
  40. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/extract/extract.py +0 -0
  41. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/grafana_api/__init__.py +0 -0
  42. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/grafana_api/app.py +0 -0
  43. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/grafana_api/args.py +0 -0
  44. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/grafana_api/grafana_api.py +0 -0
  45. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/profilers/__init__.py +0 -0
  46. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/profilers/daemon.py +0 -0
  47. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/profilers/flamegraph.pl +0 -0
  48. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/profilers/perf.py +0 -0
  49. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/profilers/perf_daemon_caller.py +0 -0
  50. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/profilers/pprof.py +0 -0
  51. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/profilers/profilers.py +0 -0
  52. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/profilers/profilers_local.py +0 -0
  53. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/profilers/profilers_schema.py +0 -0
  54. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/profilers/stackcollapse-perf.pl +0 -0
  55. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/profilers/vtune.py +0 -0
  56. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/run/__init__.py +0 -0
  57. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/run/aibench_run_inference_redisai_vision/__init__.py +0 -0
  58. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/run/aibench_run_inference_redisai_vision/aibench_run_inference_redisai_vision.py +0 -0
  59. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/run/ann/__init__.py +0 -0
  60. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/run/ann/ann.py +0 -0
  61. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/run/args.py +0 -0
  62. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/run/asm.py +0 -0
  63. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/run/cluster.py +0 -0
  64. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/run/ftsb/__init__.py +0 -0
  65. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/run/ftsb/ftsb.py +0 -0
  66. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/run/git.py +0 -0
  67. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/run/grafana.py +0 -0
  68. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/run/memtier_benchmark/__init__.py +0 -0
  69. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/run/memtier_benchmark/memtier_benchmark.py +0 -0
  70. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/run/metrics.py +0 -0
  71. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/run/modules.py +0 -0
  72. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/run/redis_benchmark/__init__.py +0 -0
  73. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/run/redis_benchmark/redis_benchmark.py +0 -0
  74. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/run/redisgraph_benchmark_go/__init__.py +0 -0
  75. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/run/redisgraph_benchmark_go/redisgraph_benchmark_go.py +0 -0
  76. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/run/redistimeseries.py +0 -0
  77. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/run/run.py +0 -0
  78. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/run/s3.py +0 -0
  79. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/run/ssh.py +0 -0
  80. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/run/tsbs_run_queries_redistimeseries/__init__.py +0 -0
  81. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/run/tsbs_run_queries_redistimeseries/tsbs_run_queries_redistimeseries.py +0 -0
  82. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/run/ycsb/__init__.py +0 -0
  83. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/run/ycsb/ycsb.py +0 -0
  84. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/run_async/__init__.py +0 -0
  85. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/run_async/async_env.py +0 -0
  86. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/run_async/async_terraform.py +0 -0
  87. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/run_async/benchmark.py +0 -0
  88. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/run_async/log.py +0 -0
  89. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/run_async/render_files.py +0 -0
  90. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/run_async/run_async.py +0 -0
  91. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/run_local/__init__.py +0 -0
  92. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/run_local/args.py +0 -0
  93. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/run_local/local_client.py +0 -0
  94. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/run_local/local_helpers.py +0 -0
  95. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/run_local/run_local.py +0 -0
  96. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/run_remote/__init__.py +0 -0
  97. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/run_remote/args.py +0 -0
  98. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/run_remote/consts.py +0 -0
  99. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/run_remote/log.py +0 -0
  100. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/run_remote/notifications.py +0 -0
  101. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/run_remote/remote_client.py +0 -0
  102. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/run_remote/remote_env.py +0 -0
  103. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/run_remote/remote_failures.py +0 -0
  104. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/run_remote/run_remote.py +0 -0
  105. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/run_remote/terraform.py +0 -0
  106. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/utils/__init__.py +0 -0
  107. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/utils/benchmark_config.py +0 -0
  108. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/utils/local.py +0 -0
  109. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/utils/redisearch.py +0 -0
  110. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/utils/redisgraph_benchmark_go.py +0 -0
  111. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/utils/remote.py +0 -0
  112. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/utils/results.py +0 -0
  113. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/utils/ssh.py +0 -0
  114. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/watchdog/__init__.py +0 -0
  115. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/watchdog/args.py +0 -0
  116. {redisbench_admin-0.11.72 → redisbench_admin-0.11.74}/redisbench_admin/watchdog/watchdog.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: redisbench-admin
3
- Version: 0.11.72
3
+ Version: 0.11.74
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
  License-File: LICENSE
6
6
  Author: filipecosta90
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "redisbench-admin"
3
- version = "0.11.72"
3
+ version = "0.11.74"
4
4
  description = "Redis benchmark run helper. A wrapper around Redis and Redis Modules benchmark tools ( ftsb_redisearch, memtier_benchmark, redis-benchmark, aibench, etc... )."
5
5
  authors = ["filipecosta90 <filipecosta.90@gmail.com>","Redis Performance Group <performance@redis.com>"]
6
6
  readme = "README.md"
@@ -38,6 +38,7 @@ from redisbench_admin.run.ycsb.ycsb import (
38
38
  prepare_ycsb_benchmark_command,
39
39
  prepare_go_ycsb_benchmark_command,
40
40
  )
41
+ from redisbench_admin.utils.utils import get_remote_input_file_from_url
41
42
  from redisbench_admin.run_remote.args import OVERRIDE_MODULES
42
43
  from redisbench_admin.run_remote.remote_helpers import (
43
44
  extract_module_semver_from_info_modules_cmd,
@@ -66,6 +67,38 @@ PERFORMANCE_GH_TOKEN = os.getenv("PERFORMANCE_GH_TOKEN", None)
66
67
  REDIS_BINARY = os.getenv("REDIS_BINARY", "redis-server")
67
68
 
68
69
 
70
+ def extract_input_file_url_from_parameters(entry, benchmark_tool):
71
+ """
72
+ Extract the input file URL from the parameters entry.
73
+ Different tools use different parameter names:
74
+ - ftsb_*: uses "input" parameter
75
+ - tsbs_*, aibench_*: uses "file" parameter
76
+
77
+ Args:
78
+ entry: The benchmark config entry containing "parameters"
79
+ benchmark_tool: The benchmark tool name
80
+
81
+ Returns:
82
+ The file URL if found, None otherwise
83
+ """
84
+ if "parameters" not in entry:
85
+ return None
86
+
87
+ # Determine which parameter name to look for based on the tool
88
+ if "ftsb_" in benchmark_tool:
89
+ param_name = "input"
90
+ elif "tsbs_" in benchmark_tool or "aibench_" in benchmark_tool:
91
+ param_name = "file"
92
+ else:
93
+ return None
94
+
95
+ for param in entry["parameters"]:
96
+ if param_name in param:
97
+ return param[param_name]
98
+
99
+ return None
100
+
101
+
69
102
  def prepare_benchmark_parameters(
70
103
  benchmark_config,
71
104
  benchmark_tool,
@@ -88,6 +121,10 @@ def prepare_benchmark_parameters(
88
121
  if type(benchmark_config[config_key]) == list:
89
122
  for entry in benchmark_config[config_key]:
90
123
  if "parameters" in entry:
124
+ # Extract input file URL from parameters
125
+ input_file_url = extract_input_file_url_from_parameters(
126
+ entry, benchmark_tool
127
+ )
91
128
  command_arr, command_str = prepare_benchmark_parameters_specif_tooling(
92
129
  benchmark_tool,
93
130
  cluster_api_enabled,
@@ -104,10 +141,13 @@ def prepare_benchmark_parameters(
104
141
  private_key,
105
142
  client_ssh_port,
106
143
  redis_password,
144
+ input_file_url,
107
145
  )
108
146
  # v0.4 spec
109
147
  elif type(benchmark_config[config_key]) == dict:
110
148
  entry = benchmark_config[config_key]
149
+ # Extract input file URL from parameters
150
+ input_file_url = extract_input_file_url_from_parameters(entry, benchmark_tool)
111
151
  command_arr, command_str = prepare_benchmark_parameters_specif_tooling(
112
152
  benchmark_tool,
113
153
  cluster_api_enabled,
@@ -124,6 +164,7 @@ def prepare_benchmark_parameters(
124
164
  private_key,
125
165
  client_ssh_port,
126
166
  redis_password,
167
+ input_file_url,
127
168
  )
128
169
  printed_command_str = command_str
129
170
  printed_command_arr = command_arr
@@ -154,6 +195,7 @@ def prepare_benchmark_parameters_specif_tooling(
154
195
  private_key,
155
196
  client_ssh_port,
156
197
  redis_password=None,
198
+ input_file_url=None,
157
199
  ):
158
200
  if "redis-benchmark" in benchmark_tool:
159
201
  command_arr, command_str = prepare_redis_benchmark_command(
@@ -207,7 +249,7 @@ def prepare_benchmark_parameters_specif_tooling(
207
249
  input_data_file = None
208
250
  if isremote is True:
209
251
  benchmark_tool = "/tmp/{}".format(benchmark_tool)
210
- input_data_file = "/tmp/input.data"
252
+ input_data_file = get_remote_input_file_from_url(input_file_url)
211
253
  (
212
254
  command_arr,
213
255
  command_str,
@@ -260,7 +302,7 @@ def prepare_benchmark_parameters_specif_tooling(
260
302
  input_data_file = None
261
303
  if isremote is True:
262
304
  benchmark_tool = "/tmp/{}".format(benchmark_tool)
263
- input_data_file = "/tmp/input.data"
305
+ input_data_file = get_remote_input_file_from_url(input_file_url)
264
306
  (
265
307
  command_arr,
266
308
  command_str,
@@ -280,7 +322,7 @@ def prepare_benchmark_parameters_specif_tooling(
280
322
  input_data_file = None
281
323
  if isremote is True:
282
324
  benchmark_tool = "/tmp/{}".format(benchmark_tool)
283
- input_data_file = "/tmp/input.data"
325
+ input_data_file = get_remote_input_file_from_url(input_file_url)
284
326
  (
285
327
  command_arr,
286
328
  command_str,
@@ -4,6 +4,7 @@
4
4
  # All rights reserved.
5
5
  #
6
6
  import logging
7
+ import os
7
8
  import tempfile
8
9
  import datetime
9
10
 
@@ -32,6 +33,7 @@ from redisbench_admin.utils.local import (
32
33
  check_dataset_local_requirements,
33
34
  is_process_alive,
34
35
  )
36
+ from redisbench_admin.utils.utils import setup_search_clusterset
35
37
 
36
38
 
37
39
  def local_db_spin(
@@ -163,6 +165,9 @@ def local_db_spin(
163
165
  r.client_setname("redisbench-admin-standalone")
164
166
  redis_conns.append(r)
165
167
 
168
+ # Setup search CLUSTERSET if enabled (after all servers are started and cluster is set up)
169
+ setup_search_clusterset(redis_conns, args.host, args.port, args.password)
170
+
166
171
  if dataset is None:
167
172
  if flushall_on_every_test_start:
168
173
  logging.info("Will flush all data at test start...")
@@ -213,8 +218,13 @@ def local_db_spin(
213
218
  )
214
219
  dbconfig_keyspacelen_check(benchmark_config, redis_conns, ignore_keyspace_errors)
215
220
 
216
- artifact_version = run_redis_pre_steps(
217
- benchmark_config, redis_conns[0], required_modules
218
- )
221
+ if 'SEARCH_CLUSTERSET' in os.environ:
222
+ logging.info("SEARCH_CLUSTERSET is set. Running run_redis_pre_steps for each shard")
223
+ for conn in redis_conns:
224
+ artifact_version = run_redis_pre_steps(benchmark_config, conn, required_modules)
225
+ else:
226
+ artifact_version = run_redis_pre_steps(
227
+ benchmark_config, redis_conns[0], required_modules
228
+ )
219
229
 
220
230
  return result, artifact_version, cluster_api_enabled, redis_conns, redis_processes
@@ -5,7 +5,7 @@
5
5
  #
6
6
  import datetime
7
7
  import logging
8
-
8
+ import os
9
9
  import redis
10
10
 
11
11
  from redisbench_admin.environments.oss_cluster import setup_redis_cluster_from_conns
@@ -37,6 +37,7 @@ from redisbench_admin.utils.remote import (
37
37
  check_dataset_remote_requirements,
38
38
  get_run_full_filename,
39
39
  )
40
+ from redisbench_admin.utils.utils import setup_search_clusterset
40
41
 
41
42
 
42
43
  def remote_tmpdir_prune(
@@ -277,6 +278,14 @@ def remote_db_spin(
277
278
  )
278
279
  server_plaintext_port = cluster_start_port
279
280
 
281
+ # Setup BigRedis CLUSTERSET if enabled (after all servers are started and cluster is set up)
282
+ setup_search_clusterset(
283
+ redis_conns,
284
+ server_private_ip,
285
+ cluster_start_port if cluster_enabled else server_plaintext_port,
286
+ redis_password,
287
+ )
288
+
280
289
  topology_setup_end_time = datetime.datetime.now()
281
290
  topology_setup_duration_seconds = (
282
291
  topology_setup_end_time - topology_setup_start_time
@@ -406,9 +415,12 @@ def remote_db_spin(
406
415
  ignore_keyspace_errors,
407
416
  keyspace_check_timeout,
408
417
  )
409
- artifact_version = run_redis_pre_steps(
410
- benchmark_config, redis_conns[0], required_modules
411
- )
418
+ if 'SEARCH_CLUSTERSET' in os.environ:
419
+ logging.info("SEARCH_CLUSTERSET is set. Running run_redis_pre_steps for each shard")
420
+ for conn in redis_conns:
421
+ artifact_version = run_redis_pre_steps(benchmark_config, conn, required_modules)
422
+ else:
423
+ artifact_version = run_redis_pre_steps(benchmark_config, redis_conns[0], required_modules)
412
424
  return (
413
425
  artifact_version,
414
426
  cluster_enabled,
@@ -28,6 +28,7 @@ from redisbench_admin.utils.remote import (
28
28
  extract_redisgraph_version_from_resultdict,
29
29
  )
30
30
  from redisbench_admin.utils.results import post_process_benchmark_results
31
+ from redisbench_admin.utils.utils import get_remote_input_file_from_url
31
32
 
32
33
 
33
34
  def absoluteFilePaths(directory):
@@ -166,7 +167,7 @@ def remote_tool_pre_bench_step(
166
167
  queries_file_link, remote_tool_link, tool_link
167
168
  )
168
169
  )
169
- remote_input_file = "/tmp/input.data"
170
+ remote_input_file = get_remote_input_file_from_url(queries_file_link)
170
171
  setup_remote_benchmark_tool_requirements_ftsb(
171
172
  client_public_ip,
172
173
  username,
@@ -191,7 +192,7 @@ def remote_tool_pre_bench_step(
191
192
  "redisearch",
192
193
  "go-ycsb",
193
194
  )
194
- remote_input_file = "/tmp/input.data"
195
+ remote_input_file = get_remote_input_file_from_url(queries_file_link)
195
196
  setup_remote_benchmark_tool_requirements_tsbs(
196
197
  client_public_ip,
197
198
  username,
@@ -211,7 +212,7 @@ def remote_tool_pre_bench_step(
211
212
  ) = extract_remote_tool_extra_links(
212
213
  benchmark_config, benchmark_tool, config_key, os_str, arch_str
213
214
  )
214
- remote_input_file = "/tmp/input.data"
215
+ remote_input_file = get_remote_input_file_from_url(queries_file_link)
215
216
  setup_remote_benchmark_tool_requirements_tsbs(
216
217
  client_public_ip,
217
218
  username,
@@ -228,7 +229,7 @@ def remote_tool_pre_bench_step(
228
229
  remote_tool_link,
229
230
  tool_link,
230
231
  ) = extract_aibench_extra_links(benchmark_config, benchmark_tool)
231
- remote_input_file = "/tmp/input.data"
232
+ remote_input_file = get_remote_input_file_from_url(queries_file_link)
232
233
  setup_remote_benchmark_tool_requirements_tsbs(
233
234
  client_public_ip,
234
235
  username,
@@ -583,6 +583,17 @@ def generate_remote_standalone_redis_cmd(
583
583
  )
584
584
  if remote_module_files is not None:
585
585
  initial_redis_cmd += " " + " ".join(command)
586
+
587
+ # Add BigRedis configuration if enabled via environment variable
588
+ if os.getenv("BIGREDIS_ENABLED") is not None:
589
+ bigredis_path = os.getenv("BIGREDIS_PATH", f"{temporary_dir}/redis.big")
590
+ bigredis_use_async = os.getenv("BIGREDIS_USE_ASYNC", "no")
591
+ logging.info(f"BigRedis enabled. Using bigredis-path: {bigredis_path}")
592
+ initial_redis_cmd += " --bigredis-enabled yes"
593
+ initial_redis_cmd += " --bigredis-driver speedb"
594
+ initial_redis_cmd += f" --bigredis-use-async {bigredis_use_async}"
595
+ initial_redis_cmd += f" --bigredis-path {bigredis_path}"
596
+
586
597
  return full_logfile, initial_redis_cmd
587
598
 
588
599
 
@@ -11,10 +11,12 @@ import logging
11
11
  import operator
12
12
  import os
13
13
  import os.path
14
+ import re
14
15
  import tarfile
15
16
  import time
16
17
  from functools import reduce
17
- from urllib.parse import quote_plus
18
+ from pathlib import PurePosixPath
19
+ from urllib.parse import quote_plus, urlparse, unquote
18
20
  from zipfile import ZipFile
19
21
 
20
22
  import boto3
@@ -135,6 +137,75 @@ def generate_common_server_args(
135
137
  return command
136
138
 
137
139
 
140
+ def setup_search_clusterset(redis_conns, host="127.0.0.1", start_port=6379, password=None):
141
+ """
142
+ Configure SEARCH.CLUSTERSET for Redis instances.
143
+ This is required when SEARCH_CLUSTERSET is set to configure the search module
144
+ to work with BigRedis. Supports both standalone (single conn) and cluster (multiple conns).
145
+
146
+ Args:
147
+ redis_conns: List of Redis connection objects (or single connection)
148
+ host: Redis host address (default: 127.0.0.1)
149
+ start_port: Starting port number (default: 6379)
150
+ password: Redis password (optional)
151
+ """
152
+ if os.getenv("SEARCH_CLUSTERSET") is None:
153
+ return
154
+
155
+ # Handle single connection case
156
+ if not isinstance(redis_conns, list):
157
+ redis_conns = [redis_conns]
158
+
159
+ shard_count = len(redis_conns)
160
+ logging.info(f"Search Clusterset enabled - configuring SEARCH.CLUSTERSET for {shard_count} shard(s)")
161
+
162
+ # Calculate slots per shard
163
+ total_slots = 16384
164
+ slots_per_shard = total_slots // shard_count
165
+
166
+ for shard_id, conn in enumerate(redis_conns, start=1):
167
+ port = start_port + shard_id - 1
168
+
169
+ # Calculate slot range for this shard
170
+ slot_start = (shard_id - 1) * slots_per_shard
171
+ if shard_id == shard_count:
172
+ # Last shard gets remaining slots
173
+ slot_end = total_slots - 1
174
+ else:
175
+ slot_end = shard_id * slots_per_shard - 1
176
+
177
+ # Build the address string with optional password
178
+ if password:
179
+ addr = f"{password}@{host}:{port}"
180
+ else:
181
+ addr = f"{host}:{port}"
182
+
183
+ logging.info(
184
+ f"Sending SEARCH.CLUSTERSET to shard {shard_id}: "
185
+ f"slots {slot_start}-{slot_end}, addr {host}:{port}"
186
+ )
187
+
188
+ try:
189
+ conn.execute_command(
190
+ "SEARCH.CLUSTERSET",
191
+ "MYID",
192
+ str(shard_id),
193
+ "RANGES",
194
+ "1",
195
+ "SHARD",
196
+ str(shard_id),
197
+ "SLOTRANGE",
198
+ str(slot_start),
199
+ str(slot_end),
200
+ "ADDR",
201
+ addr,
202
+ "MASTER",
203
+ )
204
+ logging.info(f"SEARCH.CLUSTERSET command executed successfully for shard {shard_id}")
205
+ except Exception as e:
206
+ logging.warning(f"Failed to execute SEARCH.CLUSTERSET for shard {shard_id}: {e}")
207
+
208
+
138
209
  def upload_artifacts_to_s3(
139
210
  artifacts,
140
211
  s3_bucket_name,
@@ -484,6 +555,60 @@ def make_dashboard_callback(
484
555
  )
485
556
 
486
557
 
558
+ def get_remote_input_file_from_url(url):
559
+ """
560
+ Generate a unique remote input file path based on the file name from the URL.
561
+ This ensures each input file has its own path and avoids reuse issues between benchmark runs.
562
+
563
+ Example:
564
+ url = "https://s3.amazonaws.com/.../AND_QUERY.CSV"
565
+ returns "/tmp/input-AND_QUERY.data"
566
+
567
+ Args:
568
+ url: The URL or path to the input file
569
+
570
+ Returns:
571
+ A unique remote file path like /tmp/input-{file_name}.data,
572
+ or "/tmp/input.data" as fallback if url is None or empty
573
+ """
574
+ default_path = PurePosixPath("/tmp/input.data")
575
+
576
+ if url is None or url == "":
577
+ return str(default_path)
578
+
579
+ # Parse the URL to extract the path component
580
+ # This handles both http(s):// URLs and s3:// URIs
581
+ parsed = urlparse(url)
582
+ url_path = parsed.path if parsed.path else url
583
+
584
+ # Use PurePosixPath to extract the file name (works for both URLs and paths)
585
+ path = PurePosixPath(url_path)
586
+ file_name = path.name
587
+
588
+ # If no file name could be extracted, return default
589
+ if not file_name:
590
+ return str(default_path)
591
+
592
+ # Decode URL-encoded characters (e.g., %3A -> :)
593
+ file_name = unquote(file_name)
594
+
595
+ # Remove extension using pathlib's stem property
596
+ base_name = PurePosixPath(file_name).stem
597
+
598
+ # If stem is empty (e.g., hidden file like ".data"), use the full name
599
+ if not base_name:
600
+ base_name = file_name
601
+
602
+ # Sanitize the base name: replace characters that might cause issues in file paths
603
+ # Keep only alphanumeric, underscore, hyphen, and dot
604
+ base_name = re.sub(r"[^a-zA-Z0-9_\-.]", "_", base_name)
605
+
606
+ # Construct the final path using PurePosixPath for proper path joining
607
+ result_path = PurePosixPath("/tmp") / f"input-{base_name}.data"
608
+
609
+ return str(result_path)
610
+
611
+
487
612
  EC2_REGION = os.getenv("AWS_DEFAULT_REGION", None)
488
613
  EC2_SECRET_KEY = os.getenv("AWS_SECRET_ACCESS_KEY", None)
489
614
  EC2_PRIVATE_PEM = os.getenv("EC2_PRIVATE_PEM", None)