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.
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/PKG-INFO +1 -1
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/pyproject.toml +1 -1
- {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
- redisbench_admin-0.11.55/redisbench_admin/run/asm.py +426 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/common.py +3 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ftsb/ftsb.py +4 -16
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/tsbs_run_queries_redistimeseries/tsbs_run_queries_redistimeseries.py +4 -16
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/utils/benchmark_config.py +11 -13
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/utils/utils.py +0 -21
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/LICENSE +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/README.md +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/__init__.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/cli.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/commands/__init__.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/commands/commands.json.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/compare/__init__.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/compare/args.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/compare/compare.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/deploy/__init__.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/deploy/args.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/deploy/deploy.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/environments/__init__.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/environments/oss_cluster.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/environments/oss_standalone.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/export/__init__.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/export/args.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/export/common/__init__.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/export/common/common.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/export/export.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/export/google_benchmark/__init__.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/export/google_benchmark/google_benchmark_json_format.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/export/memtier_benchmark/__init__.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/export/memtier_benchmark/memtier_benchmark_json_format.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/export/pyperf/__init__.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/export/pyperf/pyperf_json_format.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/export/redis_benchmark/__init__.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/export/redis_benchmark/metrics_definition.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/export/redis_benchmark/redis_benchmark_csv_format.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/extract/__init__.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/extract/args.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/extract/extract.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/grafana_api/__init__.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/grafana_api/app.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/grafana_api/args.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/grafana_api/grafana_api.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/profilers/__init__.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/profilers/daemon.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/profilers/flamegraph.pl +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/profilers/perf.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/profilers/perf_daemon_caller.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/profilers/pprof.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/profilers/profilers.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/profilers/profilers_local.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/profilers/profilers_schema.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/profilers/stackcollapse-perf.pl +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/profilers/vtune.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/__init__.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/aibench_run_inference_redisai_vision/__init__.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/__init__.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/ann.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/.dockerignore +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/.git +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/.github/workflows/benchmarks.yml +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/.gitignore +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/LICENSE +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/README.md +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/algos.yaml +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/algosP.yaml +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/__init__.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/algorithms/__init__.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/algorithms/annoy.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/algorithms/balltree.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/algorithms/base.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/algorithms/bruteforce.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/algorithms/ckdtree.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/algorithms/datasketch.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/algorithms/definitions.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/algorithms/diskann.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/algorithms/dolphinnpy.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/algorithms/dummy_algo.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/algorithms/elasticsearch.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/algorithms/elastiknn.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/algorithms/faiss.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/algorithms/faiss_gpu.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/algorithms/faiss_hnsw.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/algorithms/flann.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/algorithms/hnswlib.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/algorithms/kdtree.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/algorithms/kgraph.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/algorithms/lshf.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/algorithms/milvus.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/algorithms/mrpt.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/algorithms/n2.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/algorithms/nearpy.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/algorithms/nmslib.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/algorithms/onng_ngt.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/algorithms/opensearchknn.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/algorithms/panng_ngt.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/algorithms/pinecone.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/algorithms/puffinn.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/algorithms/pynndescent.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/algorithms/qg_ngt.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/algorithms/redisearch.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/algorithms/rpforest.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/algorithms/scann.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/algorithms/sptag.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/algorithms/subprocess.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/algorithms/vald.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/algorithms/vecsim-hnsw.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/algorithms/vespa.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/constants.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/data.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/datasets.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/distance.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/main.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/plotting/__init__.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/plotting/metrics.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/plotting/plot_variants.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/plotting/utils.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/results.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/ann_benchmarks/runner.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/create_dataset.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/create_hybrid_dataset.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/create_text_to_image_ds.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/create_website.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/install/Dockerfile +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/install/Dockerfile.annoy +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/install/Dockerfile.datasketch +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/install/Dockerfile.diskann +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/install/Dockerfile.diskann_pq +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/install/Dockerfile.dolphinn +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/install/Dockerfile.elasticsearch +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/install/Dockerfile.elastiknn +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/install/Dockerfile.faiss +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/install/Dockerfile.flann +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/install/Dockerfile.hnswlib +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/install/Dockerfile.kgraph +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/install/Dockerfile.mih +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/install/Dockerfile.milvus +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/install/Dockerfile.mrpt +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/install/Dockerfile.n2 +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/install/Dockerfile.nearpy +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/install/Dockerfile.ngt +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/install/Dockerfile.nmslib +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/install/Dockerfile.opensearchknn +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/install/Dockerfile.puffinn +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/install/Dockerfile.pynndescent +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/install/Dockerfile.redisearch +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/install/Dockerfile.rpforest +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/install/Dockerfile.scann +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/install/Dockerfile.scipy +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/install/Dockerfile.sklearn +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/install/Dockerfile.sptag +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/install/Dockerfile.vald +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/install/Dockerfile.vespa +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/install.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/logging.conf +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/multirun.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/plot.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/protocol/bf-runner +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/protocol/bf-runner.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/protocol/ext-add-query-metric.md +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/protocol/ext-batch-queries.md +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/protocol/ext-prepared-queries.md +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/protocol/ext-query-parameters.md +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/protocol/specification.md +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/requirements.txt +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/requirements_py38.txt +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/results/fashion-mnist-784-euclidean.png +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/results/gist-960-euclidean.png +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/results/glove-100-angular.png +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/results/glove-25-angular.png +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/results/lastfm-64-dot.png +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/results/mnist-784-euclidean.png +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/results/nytimes-256-angular.png +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/results/sift-128-euclidean.png +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/run.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/run_algorithm.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/templates/chartjs.template +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/templates/detail_page.html +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/templates/general.html +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/templates/latex.template +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/templates/summary.html +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/test/__init__.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/test/test-jaccard.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ann/pkg/test/test-metrics.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/args.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/cluster.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ftsb/__init__.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/git.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/grafana.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/memtier_benchmark/__init__.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/memtier_benchmark/memtier_benchmark.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/metrics.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/modules.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/redis_benchmark/__init__.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/redis_benchmark/redis_benchmark.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/redisgraph_benchmark_go/__init__.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/redisgraph_benchmark_go/redisgraph_benchmark_go.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/redistimeseries.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/run.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/s3.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ssh.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/tsbs_run_queries_redistimeseries/__init__.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ycsb/__init__.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run/ycsb/ycsb.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run_async/__init__.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run_async/async_env.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run_async/async_terraform.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run_async/benchmark.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run_async/log.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run_async/render_files.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run_async/run_async.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run_local/__init__.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run_local/args.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run_local/local_client.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run_local/local_db.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run_local/local_helpers.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run_local/run_local.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run_remote/__init__.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run_remote/args.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run_remote/consts.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run_remote/log.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run_remote/notifications.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run_remote/remote_client.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run_remote/remote_db.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run_remote/remote_env.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run_remote/remote_failures.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run_remote/remote_helpers.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run_remote/run_remote.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run_remote/standalone.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/run_remote/terraform.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/utils/__init__.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/utils/local.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/utils/redisearch.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/utils/redisgraph_benchmark_go.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/utils/remote.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/utils/results.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/utils/ssh.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/watchdog/__init__.py +0 -0
- {redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/watchdog/args.py +0 -0
- {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.
|
|
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.
|
|
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
|
-
|
|
51
|
-
|
|
52
|
-
|
|
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
|
-
|
|
72
|
-
|
|
73
|
-
|
|
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
|
-
|
|
74
|
-
|
|
75
|
-
|
|
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
|
{redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/utils/benchmark_config.py
RENAMED
|
@@ -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
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
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(
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/commands/commands.json.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/environments/__init__.py
RENAMED
|
File without changes
|
{redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/environments/oss_cluster.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{redisbench_admin-0.11.54 → redisbench_admin-0.11.55}/redisbench_admin/export/common/__init__.py
RENAMED
|
File without changes
|