redisbench-admin 0.11.54__tar.gz → 0.11.55__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 (242) hide show
  1. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/PKG-INFO +1 -1
  2. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/pyproject.toml +1 -1
  3. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/aibench_run_inference_redisai_vision/aibench_run_inference_redisai_vision.py +4 -16
  4. redisbench_admin-0.11.55/redisbench_admin/run/asm.py +426 -0
  5. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/common.py +3 -0
  6. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ftsb/ftsb.py +4 -16
  7. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/tsbs_run_queries_redistimeseries/tsbs_run_queries_redistimeseries.py +4 -16
  8. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/utils/benchmark_config.py +11 -13
  9. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/utils/utils.py +0 -21
  10. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/LICENSE +0 -0
  11. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/README.md +0 -0
  12. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/__init__.py +0 -0
  13. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/cli.py +0 -0
  14. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/commands/__init__.py +0 -0
  15. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/commands/commands.json.py +0 -0
  16. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/compare/__init__.py +0 -0
  17. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/compare/args.py +0 -0
  18. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/compare/compare.py +0 -0
  19. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/deploy/__init__.py +0 -0
  20. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/deploy/args.py +0 -0
  21. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/deploy/deploy.py +0 -0
  22. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/environments/__init__.py +0 -0
  23. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/environments/oss_cluster.py +0 -0
  24. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/environments/oss_standalone.py +0 -0
  25. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/export/__init__.py +0 -0
  26. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/export/args.py +0 -0
  27. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/export/common/__init__.py +0 -0
  28. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/export/common/common.py +0 -0
  29. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/export/export.py +0 -0
  30. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/export/google_benchmark/__init__.py +0 -0
  31. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/export/google_benchmark/google_benchmark_json_format.py +0 -0
  32. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/export/memtier_benchmark/__init__.py +0 -0
  33. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/export/memtier_benchmark/memtier_benchmark_json_format.py +0 -0
  34. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/export/pyperf/__init__.py +0 -0
  35. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/export/pyperf/pyperf_json_format.py +0 -0
  36. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/export/redis_benchmark/__init__.py +0 -0
  37. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/export/redis_benchmark/metrics_definition.py +0 -0
  38. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/export/redis_benchmark/redis_benchmark_csv_format.py +0 -0
  39. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/extract/__init__.py +0 -0
  40. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/extract/args.py +0 -0
  41. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/extract/extract.py +0 -0
  42. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/grafana_api/__init__.py +0 -0
  43. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/grafana_api/app.py +0 -0
  44. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/grafana_api/args.py +0 -0
  45. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/grafana_api/grafana_api.py +0 -0
  46. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/profilers/__init__.py +0 -0
  47. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/profilers/daemon.py +0 -0
  48. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/profilers/flamegraph.pl +0 -0
  49. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/profilers/perf.py +0 -0
  50. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/profilers/perf_daemon_caller.py +0 -0
  51. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/profilers/pprof.py +0 -0
  52. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/profilers/profilers.py +0 -0
  53. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/profilers/profilers_local.py +0 -0
  54. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/profilers/profilers_schema.py +0 -0
  55. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/profilers/stackcollapse-perf.pl +0 -0
  56. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/profilers/vtune.py +0 -0
  57. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/__init__.py +0 -0
  58. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/aibench_run_inference_redisai_vision/__init__.py +0 -0
  59. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/__init__.py +0 -0
  60. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/ann.py +0 -0
  61. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/.dockerignore +0 -0
  62. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/.git +0 -0
  63. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/.github/workflows/benchmarks.yml +0 -0
  64. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/.gitignore +0 -0
  65. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/LICENSE +0 -0
  66. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/README.md +0 -0
  67. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/algos.yaml +0 -0
  68. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/algosP.yaml +0 -0
  69. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/__init__.py +0 -0
  70. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/algorithms/__init__.py +0 -0
  71. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/algorithms/annoy.py +0 -0
  72. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/algorithms/balltree.py +0 -0
  73. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/algorithms/base.py +0 -0
  74. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/algorithms/bruteforce.py +0 -0
  75. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/algorithms/ckdtree.py +0 -0
  76. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/algorithms/datasketch.py +0 -0
  77. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/algorithms/definitions.py +0 -0
  78. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/algorithms/diskann.py +0 -0
  79. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/algorithms/dolphinnpy.py +0 -0
  80. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/algorithms/dummy_algo.py +0 -0
  81. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/algorithms/elasticsearch.py +0 -0
  82. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/algorithms/elastiknn.py +0 -0
  83. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/algorithms/faiss.py +0 -0
  84. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/algorithms/faiss_gpu.py +0 -0
  85. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/algorithms/faiss_hnsw.py +0 -0
  86. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/algorithms/flann.py +0 -0
  87. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/algorithms/hnswlib.py +0 -0
  88. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/algorithms/kdtree.py +0 -0
  89. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/algorithms/kgraph.py +0 -0
  90. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/algorithms/lshf.py +0 -0
  91. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/algorithms/milvus.py +0 -0
  92. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/algorithms/mrpt.py +0 -0
  93. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/algorithms/n2.py +0 -0
  94. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/algorithms/nearpy.py +0 -0
  95. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/algorithms/nmslib.py +0 -0
  96. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/algorithms/onng_ngt.py +0 -0
  97. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/algorithms/opensearchknn.py +0 -0
  98. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/algorithms/panng_ngt.py +0 -0
  99. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/algorithms/pinecone.py +0 -0
  100. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/algorithms/puffinn.py +0 -0
  101. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/algorithms/pynndescent.py +0 -0
  102. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/algorithms/qg_ngt.py +0 -0
  103. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/algorithms/redisearch.py +0 -0
  104. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/algorithms/rpforest.py +0 -0
  105. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/algorithms/scann.py +0 -0
  106. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/algorithms/sptag.py +0 -0
  107. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/algorithms/subprocess.py +0 -0
  108. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/algorithms/vald.py +0 -0
  109. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/algorithms/vecsim-hnsw.py +0 -0
  110. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/algorithms/vespa.py +0 -0
  111. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/constants.py +0 -0
  112. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/data.py +0 -0
  113. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/datasets.py +0 -0
  114. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/distance.py +0 -0
  115. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/main.py +0 -0
  116. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/plotting/__init__.py +0 -0
  117. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/plotting/metrics.py +0 -0
  118. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/plotting/plot_variants.py +0 -0
  119. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/plotting/utils.py +0 -0
  120. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/results.py +0 -0
  121. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/runner.py +0 -0
  122. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/create_dataset.py +0 -0
  123. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/create_hybrid_dataset.py +0 -0
  124. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/create_text_to_image_ds.py +0 -0
  125. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/create_website.py +0 -0
  126. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/install/Dockerfile +0 -0
  127. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/install/Dockerfile.annoy +0 -0
  128. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/install/Dockerfile.datasketch +0 -0
  129. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/install/Dockerfile.diskann +0 -0
  130. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/install/Dockerfile.diskann_pq +0 -0
  131. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/install/Dockerfile.dolphinn +0 -0
  132. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/install/Dockerfile.elasticsearch +0 -0
  133. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/install/Dockerfile.elastiknn +0 -0
  134. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/install/Dockerfile.faiss +0 -0
  135. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/install/Dockerfile.flann +0 -0
  136. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/install/Dockerfile.hnswlib +0 -0
  137. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/install/Dockerfile.kgraph +0 -0
  138. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/install/Dockerfile.mih +0 -0
  139. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/install/Dockerfile.milvus +0 -0
  140. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/install/Dockerfile.mrpt +0 -0
  141. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/install/Dockerfile.n2 +0 -0
  142. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/install/Dockerfile.nearpy +0 -0
  143. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/install/Dockerfile.ngt +0 -0
  144. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/install/Dockerfile.nmslib +0 -0
  145. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/install/Dockerfile.opensearchknn +0 -0
  146. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/install/Dockerfile.puffinn +0 -0
  147. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/install/Dockerfile.pynndescent +0 -0
  148. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/install/Dockerfile.redisearch +0 -0
  149. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/install/Dockerfile.rpforest +0 -0
  150. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/install/Dockerfile.scann +0 -0
  151. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/install/Dockerfile.scipy +0 -0
  152. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/install/Dockerfile.sklearn +0 -0
  153. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/install/Dockerfile.sptag +0 -0
  154. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/install/Dockerfile.vald +0 -0
  155. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/install/Dockerfile.vespa +0 -0
  156. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/install.py +0 -0
  157. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/logging.conf +0 -0
  158. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/multirun.py +0 -0
  159. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/plot.py +0 -0
  160. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/protocol/bf-runner +0 -0
  161. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/protocol/bf-runner.py +0 -0
  162. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/protocol/ext-add-query-metric.md +0 -0
  163. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/protocol/ext-batch-queries.md +0 -0
  164. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/protocol/ext-prepared-queries.md +0 -0
  165. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/protocol/ext-query-parameters.md +0 -0
  166. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/protocol/specification.md +0 -0
  167. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/requirements.txt +0 -0
  168. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/requirements_py38.txt +0 -0
  169. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/results/fashion-mnist-784-euclidean.png +0 -0
  170. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/results/gist-960-euclidean.png +0 -0
  171. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/results/glove-100-angular.png +0 -0
  172. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/results/glove-25-angular.png +0 -0
  173. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/results/lastfm-64-dot.png +0 -0
  174. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/results/mnist-784-euclidean.png +0 -0
  175. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/results/nytimes-256-angular.png +0 -0
  176. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/results/sift-128-euclidean.png +0 -0
  177. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/run.py +0 -0
  178. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/run_algorithm.py +0 -0
  179. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/templates/chartjs.template +0 -0
  180. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/templates/detail_page.html +0 -0
  181. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/templates/general.html +0 -0
  182. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/templates/latex.template +0 -0
  183. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/templates/summary.html +0 -0
  184. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/test/__init__.py +0 -0
  185. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/test/test-jaccard.py +0 -0
  186. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/test/test-metrics.py +0 -0
  187. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/args.py +0 -0
  188. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/cluster.py +0 -0
  189. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ftsb/__init__.py +0 -0
  190. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/git.py +0 -0
  191. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/grafana.py +0 -0
  192. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/memtier_benchmark/__init__.py +0 -0
  193. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/memtier_benchmark/memtier_benchmark.py +0 -0
  194. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/metrics.py +0 -0
  195. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/modules.py +0 -0
  196. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/redis_benchmark/__init__.py +0 -0
  197. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/redis_benchmark/redis_benchmark.py +0 -0
  198. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/redisgraph_benchmark_go/__init__.py +0 -0
  199. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/redisgraph_benchmark_go/redisgraph_benchmark_go.py +0 -0
  200. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/redistimeseries.py +0 -0
  201. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/run.py +0 -0
  202. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/s3.py +0 -0
  203. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ssh.py +0 -0
  204. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/tsbs_run_queries_redistimeseries/__init__.py +0 -0
  205. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ycsb/__init__.py +0 -0
  206. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ycsb/ycsb.py +0 -0
  207. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run_async/__init__.py +0 -0
  208. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run_async/async_env.py +0 -0
  209. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run_async/async_terraform.py +0 -0
  210. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run_async/benchmark.py +0 -0
  211. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run_async/log.py +0 -0
  212. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run_async/render_files.py +0 -0
  213. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run_async/run_async.py +0 -0
  214. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run_local/__init__.py +0 -0
  215. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run_local/args.py +0 -0
  216. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run_local/local_client.py +0 -0
  217. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run_local/local_db.py +0 -0
  218. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run_local/local_helpers.py +0 -0
  219. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run_local/run_local.py +0 -0
  220. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run_remote/__init__.py +0 -0
  221. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run_remote/args.py +0 -0
  222. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run_remote/consts.py +0 -0
  223. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run_remote/log.py +0 -0
  224. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run_remote/notifications.py +0 -0
  225. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run_remote/remote_client.py +0 -0
  226. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run_remote/remote_db.py +0 -0
  227. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run_remote/remote_env.py +0 -0
  228. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run_remote/remote_failures.py +0 -0
  229. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run_remote/remote_helpers.py +0 -0
  230. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run_remote/run_remote.py +0 -0
  231. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run_remote/standalone.py +0 -0
  232. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run_remote/terraform.py +0 -0
  233. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/utils/__init__.py +0 -0
  234. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/utils/local.py +0 -0
  235. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/utils/redisearch.py +0 -0
  236. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/utils/redisgraph_benchmark_go.py +0 -0
  237. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/utils/remote.py +0 -0
  238. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/utils/results.py +0 -0
  239. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/utils/ssh.py +0 -0
  240. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/watchdog/__init__.py +0 -0
  241. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/watchdog/args.py +0 -0
  242. {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/watchdog/watchdog.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: redisbench-admin
3
- Version: 0.11.54
3
+ Version: 0.11.55
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
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "redisbench-admin"
3
- version = "0.11.54"
3
+ version = "0.11.55"
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"
@@ -46,22 +46,10 @@ def extract_aibench_extra_links(benchmark_config, benchmark_tool):
46
46
  + "tools/redisai/aibench/{}_linux_amd64".format(benchmark_tool)
47
47
  )
48
48
  queries_file_link = None
49
-
50
- # Handle both dict and list formats for clientconfig
51
- config_data = benchmark_config["clientconfig"]
52
- if isinstance(config_data, dict):
53
- # Dict format: check if "parameters" key exists directly
54
- if "parameters" in config_data:
55
- for parameter in config_data["parameters"]:
49
+ for entry in benchmark_config["clientconfig"]:
50
+ # Handle both dict and non-dict entries in the list
51
+ if isinstance(entry, dict) and "parameters" in entry:
52
+ for parameter in entry["parameters"]:
56
53
  if "file" in parameter:
57
54
  queries_file_link = parameter["file"]
58
- elif isinstance(config_data, list):
59
- # List format: iterate over entries
60
- for entry in config_data:
61
- # Handle both dict and non-dict entries in the list
62
- if isinstance(entry, dict) and "parameters" in entry:
63
- for parameter in entry["parameters"]:
64
- if "file" in parameter:
65
- queries_file_link = parameter["file"]
66
-
67
55
  return queries_file_link, remote_tool_link, tool_link
@@ -0,0 +1,426 @@
1
+ # BSD 3-Clause License
2
+ #
3
+ # Copyright (c) 2021., Redis Labs Modules
4
+ # All rights reserved.
5
+ #
6
+
7
+ """
8
+ Adds the capacity to add ASM migration commands:
9
+
10
+ - the tool will execute different ASM CLUSTER MIGRATION IMPORT commands to different shards to force the topology of the Cluster into a state.
11
+
12
+ - This will be a first milestone to have some data of the behavior and performance under some ASM migration events.
13
+
14
+ - The CONFIG now accepts a new entry `asm_cluster_state`.
15
+
16
+ - The `asm_cluster_state` is represented as a list of list of slot ranges:
17
+
18
+ [[List of ranges that wants to be ensured in shard0], [List of ranged that wants to be ensured in shard1] , etc ...]]
19
+
20
+ The engine will not touch the shards or slot ranges not mentioned in this state. And will ignore the shards that do not exist in the real cluster (like if a list of 4 is given and the cluster is of 3, the 4th entry will be ignored).
21
+
22
+ """
23
+
24
+ import logging
25
+ import time
26
+ from dataclasses import dataclass
27
+ from typing import List, Dict, Any, Optional
28
+ import redis
29
+
30
+
31
+ class ShardSlotInfo:
32
+ """
33
+ Helper that fetches and stores cluster topology information using
34
+ CLUSTER SHARDS and CLUSTER SLOTS.
35
+
36
+ - Exposes shards as an ordered list (same order as CLUSTER SHARDS).
37
+ - Provides a method to resolve shard index -> "ip:port" of its master.
38
+ - Also loads CLUSTER SLOTS so you can extend this to map slots to shards
39
+ if you want more validation / routing logic.
40
+ """
41
+
42
+ def __init__(self, conn: redis.Redis):
43
+ self.conn = conn
44
+ self.shards: List[Dict[str, Any]] = []
45
+ self._load()
46
+
47
+ def _load(self) -> None:
48
+ # Redis 7+ : CLUSTER SHARDS returns a list of dicts describing each shard.
49
+ # Example (simplified):
50
+ # [
51
+ # {
52
+ # "id": "...",
53
+ # "slots": [[0, 5460]],
54
+ # "nodes": [
55
+ # {"id": "...", "role": "master", "ip": "10.0.0.1", "port": 7000, ...},
56
+ # {"id": "...", "role": "replica", ...},
57
+ # ],
58
+ # },
59
+ # ...
60
+ # ]
61
+ logging.info("Loading cluster topology information")
62
+ shards = self.conn.execute_command("CLUSTER", "SHARDS")
63
+ self.shards = [self._normalize_shard(shard) for shard in shards]
64
+ logging.info("Cluster topology information loaded")
65
+
66
+ @staticmethod
67
+ def _b2s(x):
68
+ return x.decode("utf-8") if isinstance(x, bytes) else x
69
+
70
+ def _normalize_shard(self, shard) -> Dict[str, Any]:
71
+ # shard is usually a dict-like object
72
+ # Normalize keys and string values
73
+ if isinstance(shard, dict):
74
+ norm = {}
75
+ for k, v in shard.items():
76
+ key = self._b2s(k)
77
+ if key == "nodes":
78
+ norm[key] = [
79
+ {
80
+ self._b2s(nk): (
81
+ self._b2s(nv) if isinstance(nv, (bytes, str)) else nv
82
+ )
83
+ for nk, nv in node.items()
84
+ }
85
+ for node in v
86
+ ]
87
+ elif key == "slots":
88
+ # slots is normally a list of [start, end] pairs; leave as-is
89
+ norm[key] = v
90
+ else:
91
+ norm[key] = self._b2s(v) if isinstance(v, (bytes, str)) else v
92
+ return norm
93
+ elif isinstance(shard, list):
94
+ # Handle list-based format from Redis:
95
+ # [b'slots', [5461, 10922], b'nodes', [[b'id', b'...', b'port', 6380, ...]], ...]
96
+ # Convert to dict format
97
+ norm = {}
98
+ i = 0
99
+ while i < len(shard):
100
+ key = self._b2s(shard[i])
101
+ if i + 1 < len(shard):
102
+ value = shard[i + 1]
103
+
104
+ if key == "nodes":
105
+ # nodes is a list of lists: [[b'id', b'...', b'port', 6380, ...], ...]
106
+ norm[key] = []
107
+ for node_list in value:
108
+ # Each node is a flat list: [b'key1', value1, b'key2', value2, ...]
109
+ node_dict = {}
110
+ j = 0
111
+ while j < len(node_list):
112
+ node_key = self._b2s(node_list[j])
113
+ if j + 1 < len(node_list):
114
+ node_value = node_list[j + 1]
115
+ node_dict[node_key] = (
116
+ self._b2s(node_value)
117
+ if isinstance(node_value, (bytes, str))
118
+ else node_value
119
+ )
120
+ j += 2
121
+ norm[key].append(node_dict)
122
+ elif key == "slots":
123
+ # slots is a list like [start, end] or [[start1, end1], [start2, end2]]
124
+ # Normalize to list of [start, end] pairs
125
+ if value and isinstance(value[0], int):
126
+ # Single range: [start, end]
127
+ norm[key] = [value]
128
+ else:
129
+ # Multiple ranges: [[start1, end1], [start2, end2]]
130
+ norm[key] = value
131
+ else:
132
+ # Other keys: just decode if bytes
133
+ norm[key] = (
134
+ self._b2s(value)
135
+ if isinstance(value, (bytes, str))
136
+ else value
137
+ )
138
+ i += 2
139
+ return norm
140
+
141
+ def master_address_by_shard_index(self, shard_index: int) -> str:
142
+ """
143
+ Returns "<ip>:<port>" for the master node of the shard at the given index.
144
+ The index is the position in the CLUSTER SHARDS response.
145
+ """
146
+ if shard_index < 0 or shard_index >= len(self.shards):
147
+ raise IndexError(
148
+ f"Shard index {shard_index} out of range (0..{len(self.shards)-1})"
149
+ )
150
+
151
+ shard = self.shards[shard_index]
152
+ nodes = shard.get("nodes", [])
153
+
154
+ master = None
155
+ for node in nodes:
156
+ if node.get("role") == "master":
157
+ master = node
158
+ break
159
+
160
+ if master is None:
161
+ raise RuntimeError(f"No master node found for shard index {shard_index}")
162
+
163
+ ip = master.get("ip")
164
+ port = master.get("port")
165
+ return f"{ip}:{port}"
166
+
167
+
168
+ @dataclass
169
+ class SlotRange:
170
+ start: int
171
+ end: int
172
+
173
+
174
+ @dataclass
175
+ class ASMCommandExecute:
176
+ ranges: List[SlotRange]
177
+ import_addr: str # "ip:port"
178
+ task_id: Optional[int] = None
179
+ shard_conn: Optional[redis.Redis] = None
180
+
181
+ def execute(self) -> int:
182
+ flat_slots = [
183
+ item
184
+ for slot_range in self.ranges
185
+ for item in [slot_range.start, slot_range.end]
186
+ ]
187
+ cmd = ["CLUSTER", "MIGRATION", "IMPORT", *flat_slots]
188
+ logging.info("Executing ASM Command: {}".format(cmd))
189
+ self.shard_conn = redis.Redis(
190
+ host=self.import_addr.split(":")[0],
191
+ port=int(self.import_addr.split(":")[1]),
192
+ )
193
+ task_id_raw = self.shard_conn.execute_command(*cmd)
194
+ self.task_id = (
195
+ task_id_raw.decode("utf-8")
196
+ if isinstance(task_id_raw, bytes)
197
+ else str(task_id_raw)
198
+ )
199
+ logging.info(f"Task ID: {self.task_id}")
200
+ return self.task_id
201
+
202
+ def wait_for_completion(self) -> None:
203
+ assert self.task_id is not None, "Task ID is not set"
204
+ assert self.shard_conn is not None, "Shard connection is not set"
205
+ logging.info(f"Waiting for task {self.task_id} to complete")
206
+ it = 0
207
+ while True:
208
+ status_response = self.shard_conn.execute_command(
209
+ "CLUSTER", "MIGRATION", "STATUS", "ID", self.task_id
210
+ )
211
+ status_response = status_response[0]
212
+ for i in range(0, len(status_response)):
213
+ if status_response[i].decode("utf-8") == "state":
214
+ if status_response[i + 1].decode("utf-8") in [
215
+ "completed",
216
+ "done",
217
+ "finished",
218
+ ]:
219
+ logging.info(f"Task {self.task_id} completed")
220
+ logging.info(f"Task {self.task_id} completed")
221
+ return
222
+ else:
223
+ break
224
+ time.sleep(0.1)
225
+ it += 1
226
+ if it % 10 == 0:
227
+ logging.info(f"Task {self.task_id} still running")
228
+
229
+
230
+ @dataclass
231
+ class ASMCommand:
232
+ ranges: List[SlotRange]
233
+ import_node: int
234
+ task_id: Optional[int] = None # index into ShardSlotInfo.shards
235
+ asm_command_executes: Optional[ASMCommandExecute] = None
236
+
237
+ def to_execute(self, shard_slot_info: ShardSlotInfo) -> List[ASMCommandExecute]:
238
+ """
239
+ Use shard_slot_info to map the integer shard indices (target_node and
240
+ destination_node) into "ip:port" strings, and return a list of
241
+ ASMCommandExcute objects.
242
+
243
+ You could return multiple commands if you later decide to split ranges,
244
+ but for now this returns a single ASMCommandExcute mirroring `self`.
245
+ """
246
+ import_addr = shard_slot_info.master_address_by_shard_index(self.import_node)
247
+
248
+ return ASMCommandExecute(
249
+ ranges=self.ranges,
250
+ import_addr=import_addr,
251
+ )
252
+
253
+ def wait_for_completion(self) -> None:
254
+ assert self.asm_command_execute is not None, "ASMCommandExecute is not set"
255
+ self.asm_command_execute.wait_for_completion()
256
+
257
+ def execute(
258
+ self, shard_slot_info: ShardSlotInfo, wait_for_completion: bool = True
259
+ ) -> None:
260
+ self.asm_command_execute: ASMCommandExecute = self.to_execute(shard_slot_info)
261
+ self.task_id = self.asm_command_execute.execute()
262
+ if wait_for_completion:
263
+ self.wait_for_completion()
264
+
265
+
266
+ @dataclass
267
+ class ClusterState:
268
+ shards: List[List[SlotRange]]
269
+
270
+ def to_asm_commands(
271
+ self, current_shards_info: ShardSlotInfo
272
+ ) -> Dict[int, Dict[int, ASMCommand]]:
273
+ """
274
+ Compare current cluster state with desired state and generate ASM commands
275
+ to migrate slots to reach the target configuration.
276
+ Returns: Dict[dest_shard, Dict[origin_shard, ASMCommand]]
277
+ """
278
+ asm_commands = {}
279
+ num_shards = len(self.shards)
280
+ current_num_shards = len(current_shards_info.shards)
281
+
282
+ # Get current slot distribution for each shard
283
+ current_shard_slots = [set() for _ in range(current_num_shards)]
284
+
285
+ for shard_idx, shard in enumerate(current_shards_info.shards):
286
+ slot_ranges = shard.get("slots", [])
287
+ if slot_ranges:
288
+ slots_lists = slot_ranges[0] if slot_ranges else []
289
+ for i in range(0, len(slots_lists), 2):
290
+ start = slots_lists[i]
291
+ end = slots_lists[i + 1]
292
+ for slot in range(start, end + 1):
293
+ current_shard_slots[shard_idx].add(slot)
294
+
295
+ # Convert desired state to slot sets (only for shards that exist)
296
+ max_shards = min(num_shards, current_num_shards)
297
+ desired_shard_slots = [set() for _ in range(max_shards)]
298
+ for shard_idx, slot_ranges in enumerate(self.shards):
299
+ # Skip desired shards that don't exist in current cluster
300
+ if shard_idx >= current_num_shards:
301
+ continue
302
+ for slot_range in slot_ranges:
303
+ slot_range = (
304
+ SlotRange(**slot_range)
305
+ if isinstance(slot_range, dict)
306
+ else slot_range
307
+ )
308
+ for slot in range(slot_range.start, slot_range.end + 1):
309
+ desired_shard_slots[shard_idx].add(slot)
310
+
311
+ # Find slots that need to be migrated
312
+ for dest_shard in range(max_shards):
313
+ slots_needed = (
314
+ desired_shard_slots[dest_shard] - current_shard_slots[dest_shard]
315
+ )
316
+
317
+ if slots_needed:
318
+ # Group slots by their current owner
319
+ slots_by_origin = {}
320
+ for origin_shard in range(current_num_shards):
321
+ if origin_shard != dest_shard:
322
+ slots_from_origin = (
323
+ slots_needed & current_shard_slots[origin_shard]
324
+ )
325
+ if slots_from_origin:
326
+ slots_by_origin[origin_shard] = slots_from_origin
327
+
328
+ # Create ASM commands for each origin shard
329
+ if slots_by_origin:
330
+ asm_commands[dest_shard] = {}
331
+ for origin_shard, slots_to_migrate in slots_by_origin.items():
332
+ sorted_slots = sorted(slots_to_migrate)
333
+ ranges = []
334
+ start = sorted_slots[0]
335
+ end = start
336
+
337
+ # Consolidate consecutive slots into ranges
338
+ for slot in sorted_slots[1:]:
339
+ if slot == end + 1:
340
+ end = slot
341
+ else:
342
+ ranges.append(SlotRange(start, end))
343
+ start = end = slot
344
+ ranges.append(SlotRange(start, end))
345
+
346
+ asm_command = ASMCommand(
347
+ ranges=ranges,
348
+ import_node=dest_shard,
349
+ )
350
+ asm_commands[dest_shard][origin_shard] = asm_command
351
+
352
+ return asm_commands
353
+
354
+
355
+ def execute_asm_commands(benchmark_config, r, dbconfig_keyname="dbconfig"):
356
+ cluster_state = None
357
+ res = 0
358
+ if dbconfig_keyname in benchmark_config:
359
+ dbconfig = benchmark_config[dbconfig_keyname]
360
+ # Handle both dict and list formats
361
+ if isinstance(dbconfig, dict):
362
+ # New format: dbconfig is a dict
363
+ if "asm_cluster_state" in dbconfig:
364
+ cluster_state = dbconfig["asm_cluster_state"]
365
+ elif isinstance(dbconfig, list):
366
+ # Old format: dbconfig is a list of dicts
367
+ for k in dbconfig:
368
+ if isinstance(k, dict) and "asm_cluster_state" in k:
369
+ cluster_state = k["asm_cluster_state"]
370
+
371
+ asm_commands = {}
372
+ if cluster_state is not None:
373
+ logging.info("ASM Cluster State detected. Preparing ASM commands")
374
+ shards_info = ShardSlotInfo(r)
375
+ if isinstance(cluster_state, str) and cluster_state == "SPARSE":
376
+ c_state = ClusterState(
377
+ shards=[
378
+ [
379
+ SlotRange(start=i, end=i) for i in range(0, 16384, 2)
380
+ ], # Shard 0: all even slots
381
+ [
382
+ SlotRange(start=i, end=i) for i in range(1, 16384, 2) if i != 1
383
+ ], # Shard 1: all odd slots except 1
384
+ ]
385
+ )
386
+ logging.info("Cluster State: {}".format(c_state))
387
+ asm_commands = c_state.to_asm_commands(shards_info)
388
+ elif isinstance(cluster_state, dict):
389
+ c_state = ClusterState(**cluster_state)
390
+ logging.info("Cluster State: {}".format(c_state))
391
+ asm_commands = c_state.to_asm_commands(shards_info)
392
+
393
+ num_commands = sum(
394
+ len(origin_command_map) for origin_command_map in asm_commands.values()
395
+ )
396
+ logging.info(f"Executing {num_commands} ASM commands")
397
+ for dest_shard, origin_command_map in asm_commands.items():
398
+ for origin_shard, asm_command in origin_command_map.items():
399
+ logging.info(
400
+ f"Executing ASM Command to migrate from shard {origin_shard} to shard {dest_shard}"
401
+ )
402
+ asm_command.execute(shards_info, wait_for_completion=True)
403
+ logging.info("ASM commands completed. The Cluster should be in the desired state.")
404
+ return res
405
+
406
+
407
+ if __name__ == "__main__":
408
+ r = redis.Redis(host="localhost", port=6379, db=0)
409
+ benchmark_config = {
410
+ "dbconfig": {
411
+ "asm_cluster_state": {
412
+ "shards": [
413
+ [
414
+ {"start": 0, "end": 100},
415
+ ],
416
+ [{"start": 14000, "end": 15000}, {"start": 5461, "end": 10922}],
417
+ ]
418
+ }
419
+ }
420
+ }
421
+ benchmark_config = {
422
+ "dbconfig": {
423
+ "asm_cluster_state": "SPARSE",
424
+ }
425
+ }
426
+ execute_asm_commands(benchmark_config, r)
@@ -10,6 +10,7 @@ import logging
10
10
  import os
11
11
  import time
12
12
  import redis
13
+
13
14
  from pytablewriter import MarkdownTableWriter
14
15
 
15
16
  from redisbench_admin.run.aibench_run_inference_redisai_vision.aibench_run_inference_redisai_vision import (
@@ -54,6 +55,7 @@ from redisbench_admin.utils.remote import (
54
55
  extract_perversion_timeseries_from_results,
55
56
  extract_perbranch_timeseries_from_results,
56
57
  )
58
+ from redisbench_admin.run.asm import execute_asm_commands
57
59
 
58
60
  BENCHMARK_REPETITIONS = int(os.getenv("BENCHMARK_REPETITIONS", 1))
59
61
  # circleci related info
@@ -630,6 +632,7 @@ def run_redis_pre_steps(benchmark_config, r, required_modules):
630
632
  logging.info("Running initialization commands before benchmark starts.")
631
633
  execute_init_commands_start_time = datetime.datetime.now()
632
634
  execute_init_commands(benchmark_config, r)
635
+ execute_asm_commands(benchmark_config, r)
633
636
  execute_init_commands_duration_seconds = (
634
637
  datetime.datetime.now() - execute_init_commands_start_time
635
638
  ).seconds
@@ -67,22 +67,10 @@ def extract_ftsb_extra_links(
67
67
  + f"redisearch/tools/ftsb/{benchmark_tool}_linux_{arch_txt}"
68
68
  )
69
69
  queries_file_link = None
70
-
71
- # Handle both dict and list formats for config_key
72
- config_data = benchmark_config[config_key]
73
- if isinstance(config_data, dict):
74
- # Dict format: check if "parameters" key exists directly
75
- if "parameters" in config_data:
76
- for parameter in config_data["parameters"]:
70
+ for entry in benchmark_config[config_key]:
71
+ # Handle both dict and non-dict entries in the list
72
+ if isinstance(entry, dict) and "parameters" in entry:
73
+ for parameter in entry["parameters"]:
77
74
  if "input" in parameter:
78
75
  queries_file_link = parameter["input"]
79
- elif isinstance(config_data, list):
80
- # List format: iterate over entries
81
- for entry in config_data:
82
- # Handle both dict and non-dict entries in the list
83
- if isinstance(entry, dict) and "parameters" in entry:
84
- for parameter in entry["parameters"]:
85
- if "input" in parameter:
86
- queries_file_link = parameter["input"]
87
-
88
76
  return queries_file_link, remote_tool_link, tool_link
@@ -69,22 +69,10 @@ def extract_remote_tool_extra_links(
69
69
  )
70
70
  )
71
71
  queries_file_link = None
72
-
73
- # Handle both dict and list formats for config_key
74
- config_data = benchmark_config[config_key]
75
- if isinstance(config_data, dict):
76
- # Dict format: check if "parameters" key exists directly
77
- if "parameters" in config_data:
78
- for parameter in config_data["parameters"]:
72
+ for entry in benchmark_config[config_key]:
73
+ # Handle both dict and non-dict entries in the list
74
+ if isinstance(entry, dict) and "parameters" in entry:
75
+ for parameter in entry["parameters"]:
79
76
  if "file" in parameter:
80
77
  queries_file_link = parameter["file"]
81
- elif isinstance(config_data, list):
82
- # List format: iterate over entries
83
- for entry in config_data:
84
- # Handle both dict and non-dict entries in the list
85
- if isinstance(entry, dict) and "parameters" in entry:
86
- for parameter in entry["parameters"]:
87
- if "file" in parameter:
88
- queries_file_link = parameter["file"]
89
-
90
78
  return queries_file_link, remote_tool_link, tool_link
@@ -238,19 +238,17 @@ def extract_redis_dbconfig_parameters(benchmark_config, dbconfig_keyname):
238
238
  dbconfig_present = True
239
239
  if type(benchmark_config[dbconfig_keyname]) == list:
240
240
  for k in benchmark_config[dbconfig_keyname]:
241
- # Handle both dict and non-dict entries in the list
242
- if isinstance(k, dict):
243
- if CONFIG_PARAMS_KEY in k:
244
- modules_configuration_parameters_map = k[CONFIG_PARAMS_KEY]
245
- if "configuration-parameters" in k:
246
- cp = k["configuration-parameters"]
247
- for item in cp:
248
- for k, v in item.items():
249
- redis_configuration_parameters[k] = v
250
- if "dataset_load_timeout_secs" in k:
251
- dataset_load_timeout_secs = k["dataset_load_timeout_secs"]
252
- if "dataset_name" in k:
253
- dataset_name = k["dataset_name"]
241
+ if CONFIG_PARAMS_KEY in k:
242
+ modules_configuration_parameters_map = k[CONFIG_PARAMS_KEY]
243
+ if "configuration-parameters" in k:
244
+ cp = k["configuration-parameters"]
245
+ for item in cp:
246
+ for k, v in item.items():
247
+ redis_configuration_parameters[k] = v
248
+ if "dataset_load_timeout_secs" in k:
249
+ dataset_load_timeout_secs = k["dataset_load_timeout_secs"]
250
+ if "dataset_name" in k:
251
+ dataset_name = k["dataset_name"]
254
252
  if type(benchmark_config[dbconfig_keyname]) == dict:
255
253
  if CONFIG_PARAMS_KEY in benchmark_config[dbconfig_keyname]:
256
254
  modules_configuration_parameters_map = benchmark_config[
@@ -46,26 +46,11 @@ def redis_server_config_module_part(
46
46
 
47
47
  command.append("--loadmodule")
48
48
  command.extend(abs_splitted_module_and_plugins)
49
- logging.info(
50
- "Processing module config parameters. Module file: {}, Config map: {}".format(
51
- local_module_file, modules_configuration_parameters_map
52
- )
53
- )
54
49
  for (
55
50
  module_config_modulename,
56
51
  module_config_dict,
57
52
  ) in modules_configuration_parameters_map.items():
58
- logging.info(
59
- "Checking if module config name '{}' is in module file '{}'".format(
60
- module_config_modulename, local_module_file
61
- )
62
- )
63
53
  if module_config_modulename in local_module_file:
64
- logging.info(
65
- "Match found! Adding module config parameters: {}".format(
66
- module_config_dict
67
- )
68
- )
69
54
  for (
70
55
  module_config_parameter_name,
71
56
  module_config_parameter_value,
@@ -80,12 +65,6 @@ def redis_server_config_module_part(
80
65
  module_config_parameter_value,
81
66
  ]
82
67
  )
83
- else:
84
- logging.info(
85
- "No match - '{}' not found in '{}'".format(
86
- module_config_modulename, local_module_file
87
- )
88
- )
89
68
 
90
69
 
91
70
  def generate_common_server_args(