lmcache-cli 0.4.5.dev0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (399) hide show
  1. lmcache/__init__.py +84 -0
  2. lmcache/_version.py +24 -0
  3. lmcache/cli/__init__.py +1 -0
  4. lmcache/cli/commands/__init__.py +34 -0
  5. lmcache/cli/commands/base.py +157 -0
  6. lmcache/cli/commands/bench/__init__.py +557 -0
  7. lmcache/cli/commands/bench/engine_bench/__init__.py +1 -0
  8. lmcache/cli/commands/bench/engine_bench/config.py +245 -0
  9. lmcache/cli/commands/bench/engine_bench/interactive/__init__.py +274 -0
  10. lmcache/cli/commands/bench/engine_bench/interactive/config.json +10 -0
  11. lmcache/cli/commands/bench/engine_bench/interactive/schema.py +352 -0
  12. lmcache/cli/commands/bench/engine_bench/interactive/state.py +327 -0
  13. lmcache/cli/commands/bench/engine_bench/interactive/terminal.py +291 -0
  14. lmcache/cli/commands/bench/engine_bench/progress.py +145 -0
  15. lmcache/cli/commands/bench/engine_bench/request_sender.py +232 -0
  16. lmcache/cli/commands/bench/engine_bench/stats.py +275 -0
  17. lmcache/cli/commands/bench/engine_bench/workloads/__init__.py +153 -0
  18. lmcache/cli/commands/bench/engine_bench/workloads/base.py +122 -0
  19. lmcache/cli/commands/bench/engine_bench/workloads/long_doc_permutator.py +435 -0
  20. lmcache/cli/commands/bench/engine_bench/workloads/long_doc_qa.py +281 -0
  21. lmcache/cli/commands/bench/engine_bench/workloads/multi_round_chat.py +337 -0
  22. lmcache/cli/commands/bench/engine_bench/workloads/random_prefill.py +178 -0
  23. lmcache/cli/commands/describe.py +310 -0
  24. lmcache/cli/commands/kvcache.py +133 -0
  25. lmcache/cli/commands/mock.py +75 -0
  26. lmcache/cli/commands/ping.py +113 -0
  27. lmcache/cli/commands/query/__init__.py +155 -0
  28. lmcache/cli/commands/query/prompt.py +134 -0
  29. lmcache/cli/commands/query/request.py +357 -0
  30. lmcache/cli/commands/server.py +99 -0
  31. lmcache/cli/commands/tool/__init__.py +63 -0
  32. lmcache/cli/commands/tool/cache_simulator.py +113 -0
  33. lmcache/cli/commands/trace/__init__.py +505 -0
  34. lmcache/cli/commands/trace/dispatch.py +249 -0
  35. lmcache/cli/commands/trace/driver.py +372 -0
  36. lmcache/cli/commands/trace/stats.py +289 -0
  37. lmcache/cli/documents/lmcache.txt +11 -0
  38. lmcache/cli/main.py +42 -0
  39. lmcache/cli/metrics/__init__.py +29 -0
  40. lmcache/cli/metrics/formatter.py +171 -0
  41. lmcache/cli/metrics/handler.py +94 -0
  42. lmcache/cli/metrics/metrics.py +161 -0
  43. lmcache/cli/metrics/section.py +77 -0
  44. lmcache/connections.py +173 -0
  45. lmcache/integration/__init__.py +2 -0
  46. lmcache/integration/base_service_factory.py +165 -0
  47. lmcache/integration/request_telemetry/__init__.py +1 -0
  48. lmcache/integration/request_telemetry/base.py +51 -0
  49. lmcache/integration/request_telemetry/factory.py +113 -0
  50. lmcache/integration/request_telemetry/fastapi.py +109 -0
  51. lmcache/integration/request_telemetry/noop.py +35 -0
  52. lmcache/integration/sglang/__init__.py +2 -0
  53. lmcache/integration/sglang/sglang_adapter.py +326 -0
  54. lmcache/integration/sglang/utils.py +39 -0
  55. lmcache/integration/vllm/__init__.py +1 -0
  56. lmcache/integration/vllm/lmcache_connector_v1.py +213 -0
  57. lmcache/integration/vllm/lmcache_connector_v1_085.py +150 -0
  58. lmcache/integration/vllm/lmcache_mp_connector_0180.py +1072 -0
  59. lmcache/integration/vllm/tests/test_mm_hash_utils.py +112 -0
  60. lmcache/integration/vllm/utils.py +433 -0
  61. lmcache/integration/vllm/vllm_multi_process_adapter.py +1090 -0
  62. lmcache/integration/vllm/vllm_service_factory.py +339 -0
  63. lmcache/integration/vllm/vllm_v1_adapter.py +1713 -0
  64. lmcache/logging.py +107 -0
  65. lmcache/native_storage_ops.pyi +230 -0
  66. lmcache/non_cuda_equivalents.py +1424 -0
  67. lmcache/observability.py +1958 -0
  68. lmcache/storage_backend/serde/__init__.py +1 -0
  69. lmcache/storage_backend/serde/cachegen_basics.py +210 -0
  70. lmcache/storage_backend/serde/cachegen_decoder.py +207 -0
  71. lmcache/storage_backend/serde/cachegen_encoder.py +394 -0
  72. lmcache/storage_backend/serde/serde.py +75 -0
  73. lmcache/tools/__init__.py +1 -0
  74. lmcache/tools/cache_simulator/README.md +392 -0
  75. lmcache/tools/cache_simulator/__init__.py +1 -0
  76. lmcache/tools/cache_simulator/docs/simulate_example.png +0 -0
  77. lmcache/tools/cache_simulator/docs/sweep_example.png +0 -0
  78. lmcache/tools/cache_simulator/gen_bench_dataset.py +360 -0
  79. lmcache/tools/cache_simulator/lru_cache.py +124 -0
  80. lmcache/tools/cache_simulator/plot_hit_rate.py +231 -0
  81. lmcache/tools/cache_simulator/simulator.py +795 -0
  82. lmcache/tools/controller_benchmark/README.md +161 -0
  83. lmcache/tools/controller_benchmark/__init__.py +1 -0
  84. lmcache/tools/controller_benchmark/__main__.py +331 -0
  85. lmcache/tools/controller_benchmark/benchmark.py +660 -0
  86. lmcache/tools/controller_benchmark/config.py +44 -0
  87. lmcache/tools/controller_benchmark/constants.py +10 -0
  88. lmcache/tools/controller_benchmark/handlers/__init__.py +46 -0
  89. lmcache/tools/controller_benchmark/handlers/admit.py +52 -0
  90. lmcache/tools/controller_benchmark/handlers/base.py +47 -0
  91. lmcache/tools/controller_benchmark/handlers/deregister.py +49 -0
  92. lmcache/tools/controller_benchmark/handlers/evict.py +52 -0
  93. lmcache/tools/controller_benchmark/handlers/heartbeat.py +56 -0
  94. lmcache/tools/controller_benchmark/handlers/p2p_lookup.py +47 -0
  95. lmcache/tools/controller_benchmark/handlers/register.py +56 -0
  96. lmcache/tools/mp_status_viewer/__init__.py +1 -0
  97. lmcache/tools/mp_status_viewer/__main__.py +95 -0
  98. lmcache/usage_context.py +417 -0
  99. lmcache/utils.py +665 -0
  100. lmcache/v1/__init__.py +2 -0
  101. lmcache/v1/api_server/__init__.py +2 -0
  102. lmcache/v1/api_server/__main__.py +537 -0
  103. lmcache/v1/basic_check.py +112 -0
  104. lmcache/v1/cache_controller/__init__.py +9 -0
  105. lmcache/v1/cache_controller/commands/__init__.py +15 -0
  106. lmcache/v1/cache_controller/commands/base.py +35 -0
  107. lmcache/v1/cache_controller/commands/full_sync.py +49 -0
  108. lmcache/v1/cache_controller/config.py +176 -0
  109. lmcache/v1/cache_controller/controller_manager.py +535 -0
  110. lmcache/v1/cache_controller/controllers/__init__.py +11 -0
  111. lmcache/v1/cache_controller/controllers/full_sync_tracker.py +473 -0
  112. lmcache/v1/cache_controller/controllers/kv_controller.py +439 -0
  113. lmcache/v1/cache_controller/controllers/registration_controller.py +282 -0
  114. lmcache/v1/cache_controller/executor.py +463 -0
  115. lmcache/v1/cache_controller/frontend/static/css/style.css +201 -0
  116. lmcache/v1/cache_controller/frontend/static/img/logo.png +0 -0
  117. lmcache/v1/cache_controller/frontend/static/index.html +234 -0
  118. lmcache/v1/cache_controller/frontend/static/js/controller_app.js +660 -0
  119. lmcache/v1/cache_controller/full_sync_sender.py +475 -0
  120. lmcache/v1/cache_controller/locks.py +149 -0
  121. lmcache/v1/cache_controller/message.py +828 -0
  122. lmcache/v1/cache_controller/observability.py +208 -0
  123. lmcache/v1/cache_controller/utils.py +679 -0
  124. lmcache/v1/cache_controller/worker.py +665 -0
  125. lmcache/v1/cache_engine.py +2058 -0
  126. lmcache/v1/cache_interface.py +19 -0
  127. lmcache/v1/check/__init__.py +74 -0
  128. lmcache/v1/check/check_mode_gen.py +86 -0
  129. lmcache/v1/check/check_mode_test_l2_adapter.py +284 -0
  130. lmcache/v1/check/check_mode_test_remote.py +155 -0
  131. lmcache/v1/check/check_mode_test_storage_manager.py +142 -0
  132. lmcache/v1/check/utils.py +571 -0
  133. lmcache/v1/compute/__init__.py +2 -0
  134. lmcache/v1/compute/attention/__init__.py +0 -0
  135. lmcache/v1/compute/attention/abstract.py +39 -0
  136. lmcache/v1/compute/attention/flash_attn.py +129 -0
  137. lmcache/v1/compute/attention/flash_infer_sparse.py +284 -0
  138. lmcache/v1/compute/attention/metadata.py +85 -0
  139. lmcache/v1/compute/attention/utils.py +14 -0
  140. lmcache/v1/compute/blend/__init__.py +7 -0
  141. lmcache/v1/compute/blend/blender.py +168 -0
  142. lmcache/v1/compute/blend/metadata.py +34 -0
  143. lmcache/v1/compute/blend/utils.py +63 -0
  144. lmcache/v1/compute/models/__init__.py +0 -0
  145. lmcache/v1/compute/models/base.py +141 -0
  146. lmcache/v1/compute/models/llama.py +9 -0
  147. lmcache/v1/compute/models/qwen3.py +24 -0
  148. lmcache/v1/compute/models/utils.py +68 -0
  149. lmcache/v1/compute/positional_encoding.py +199 -0
  150. lmcache/v1/config.py +848 -0
  151. lmcache/v1/config_base.py +848 -0
  152. lmcache/v1/distributed/api.py +248 -0
  153. lmcache/v1/distributed/config.py +321 -0
  154. lmcache/v1/distributed/error.py +64 -0
  155. lmcache/v1/distributed/eviction.py +192 -0
  156. lmcache/v1/distributed/eviction_policy/__init__.py +21 -0
  157. lmcache/v1/distributed/eviction_policy/factory.py +27 -0
  158. lmcache/v1/distributed/eviction_policy/lru.py +244 -0
  159. lmcache/v1/distributed/eviction_policy/noop.py +50 -0
  160. lmcache/v1/distributed/internal_api.py +170 -0
  161. lmcache/v1/distributed/l1_manager.py +835 -0
  162. lmcache/v1/distributed/l2_adapters/__init__.py +67 -0
  163. lmcache/v1/distributed/l2_adapters/base.py +360 -0
  164. lmcache/v1/distributed/l2_adapters/config.py +385 -0
  165. lmcache/v1/distributed/l2_adapters/factory.py +205 -0
  166. lmcache/v1/distributed/l2_adapters/fs_l2_adapter.py +747 -0
  167. lmcache/v1/distributed/l2_adapters/fs_native_l2_adapter.py +167 -0
  168. lmcache/v1/distributed/l2_adapters/mock_l2_adapter.py +516 -0
  169. lmcache/v1/distributed/l2_adapters/mooncake_store_l2_adapter.py +135 -0
  170. lmcache/v1/distributed/l2_adapters/native_connector_l2_adapter.py +468 -0
  171. lmcache/v1/distributed/l2_adapters/native_plugin_l2_adapter.py +199 -0
  172. lmcache/v1/distributed/l2_adapters/nixl_store_dynamic_l2_adapter.py +831 -0
  173. lmcache/v1/distributed/l2_adapters/nixl_store_l2_adapter.py +983 -0
  174. lmcache/v1/distributed/l2_adapters/plugin_l2_adapter.py +210 -0
  175. lmcache/v1/distributed/l2_adapters/resp_l2_adapter.py +176 -0
  176. lmcache/v1/distributed/memory_manager.py +179 -0
  177. lmcache/v1/distributed/storage_controller.py +39 -0
  178. lmcache/v1/distributed/storage_controllers/__init__.py +43 -0
  179. lmcache/v1/distributed/storage_controllers/eviction_controller.py +242 -0
  180. lmcache/v1/distributed/storage_controllers/prefetch_controller.py +830 -0
  181. lmcache/v1/distributed/storage_controllers/prefetch_policy.py +193 -0
  182. lmcache/v1/distributed/storage_controllers/store_controller.py +452 -0
  183. lmcache/v1/distributed/storage_controllers/store_policy.py +213 -0
  184. lmcache/v1/distributed/storage_manager.py +532 -0
  185. lmcache/v1/event_manager.py +145 -0
  186. lmcache/v1/exceptions/__init__.py +16 -0
  187. lmcache/v1/gpu_connector/__init__.py +126 -0
  188. lmcache/v1/gpu_connector/gpu_connectors.py +1906 -0
  189. lmcache/v1/gpu_connector/gpu_ops.py +85 -0
  190. lmcache/v1/gpu_connector/hpu_connector.py +326 -0
  191. lmcache/v1/gpu_connector/mock_gpu_connector.py +67 -0
  192. lmcache/v1/gpu_connector/utils.py +890 -0
  193. lmcache/v1/gpu_connector/xpu_connectors.py +916 -0
  194. lmcache/v1/health_monitor/__init__.py +1 -0
  195. lmcache/v1/health_monitor/base.py +587 -0
  196. lmcache/v1/health_monitor/checks/__init__.py +1 -0
  197. lmcache/v1/health_monitor/checks/remote_backend_check.py +304 -0
  198. lmcache/v1/health_monitor/constants.py +36 -0
  199. lmcache/v1/internal_api_server/__init__.py +0 -0
  200. lmcache/v1/internal_api_server/api_registry.py +59 -0
  201. lmcache/v1/internal_api_server/api_server.py +120 -0
  202. lmcache/v1/internal_api_server/common/__init__.py +1 -0
  203. lmcache/v1/internal_api_server/common/env_api.py +22 -0
  204. lmcache/v1/internal_api_server/common/loglevel_api.py +57 -0
  205. lmcache/v1/internal_api_server/common/metrics_api.py +29 -0
  206. lmcache/v1/internal_api_server/common/periodic_thread_api.py +138 -0
  207. lmcache/v1/internal_api_server/common/run_script_api.py +73 -0
  208. lmcache/v1/internal_api_server/common/thread_api.py +63 -0
  209. lmcache/v1/internal_api_server/controller/__init__.py +1 -0
  210. lmcache/v1/internal_api_server/controller/key_stats_api.py +81 -0
  211. lmcache/v1/internal_api_server/controller/worker_info_api.py +136 -0
  212. lmcache/v1/internal_api_server/utils.py +43 -0
  213. lmcache/v1/internal_api_server/vllm/__init__.py +1 -0
  214. lmcache/v1/internal_api_server/vllm/backend_api.py +221 -0
  215. lmcache/v1/internal_api_server/vllm/bypass_api.py +204 -0
  216. lmcache/v1/internal_api_server/vllm/cache_api.py +895 -0
  217. lmcache/v1/internal_api_server/vllm/chunk_statistics_api.py +141 -0
  218. lmcache/v1/internal_api_server/vllm/conf_api.py +147 -0
  219. lmcache/v1/internal_api_server/vllm/freeze_api.py +172 -0
  220. lmcache/v1/internal_api_server/vllm/hot_cache_api.py +184 -0
  221. lmcache/v1/internal_api_server/vllm/inference_api.py +65 -0
  222. lmcache/v1/internal_api_server/vllm/load_fs_chunks_api.py +320 -0
  223. lmcache/v1/internal_api_server/vllm/lookup_api.py +145 -0
  224. lmcache/v1/internal_api_server/vllm/version_api.py +25 -0
  225. lmcache/v1/kv_layer_groups.py +267 -0
  226. lmcache/v1/lazy_memory_allocator.py +284 -0
  227. lmcache/v1/lookup_client/__init__.py +25 -0
  228. lmcache/v1/lookup_client/abstract_client.py +77 -0
  229. lmcache/v1/lookup_client/async_lookup_message.py +50 -0
  230. lmcache/v1/lookup_client/chunk_statistics_lookup_client.py +200 -0
  231. lmcache/v1/lookup_client/factory.py +251 -0
  232. lmcache/v1/lookup_client/hit_limit_lookup_client.py +86 -0
  233. lmcache/v1/lookup_client/lmcache_async_lookup_client.py +407 -0
  234. lmcache/v1/lookup_client/lmcache_lookup_client.py +285 -0
  235. lmcache/v1/lookup_client/lmcache_lookup_client_bypass.py +99 -0
  236. lmcache/v1/lookup_client/mooncake_lookup_client.py +87 -0
  237. lmcache/v1/lookup_client/record_strategies/__init__.py +77 -0
  238. lmcache/v1/lookup_client/record_strategies/base.py +327 -0
  239. lmcache/v1/lookup_client/record_strategies/file_hash.py +130 -0
  240. lmcache/v1/lookup_client/record_strategies/memory_bloom_filter.py +81 -0
  241. lmcache/v1/manager.py +539 -0
  242. lmcache/v1/memory_management.py +2619 -0
  243. lmcache/v1/metadata.py +114 -0
  244. lmcache/v1/mp_observability/AGENTS.override.md +21 -0
  245. lmcache/v1/mp_observability/README.md +204 -0
  246. lmcache/v1/mp_observability/config.py +340 -0
  247. lmcache/v1/mp_observability/event.py +100 -0
  248. lmcache/v1/mp_observability/event_bus.py +313 -0
  249. lmcache/v1/mp_observability/otel_init.py +145 -0
  250. lmcache/v1/mp_observability/subscribers/__init__.py +28 -0
  251. lmcache/v1/mp_observability/subscribers/logging/__init__.py +19 -0
  252. lmcache/v1/mp_observability/subscribers/logging/l1.py +56 -0
  253. lmcache/v1/mp_observability/subscribers/logging/l2.py +73 -0
  254. lmcache/v1/mp_observability/subscribers/logging/lookup_hash.py +209 -0
  255. lmcache/v1/mp_observability/subscribers/logging/mp_server.py +90 -0
  256. lmcache/v1/mp_observability/subscribers/logging/sm.py +59 -0
  257. lmcache/v1/mp_observability/subscribers/metrics/__init__.py +20 -0
  258. lmcache/v1/mp_observability/subscribers/metrics/l0_lifecycle.py +290 -0
  259. lmcache/v1/mp_observability/subscribers/metrics/l1.py +55 -0
  260. lmcache/v1/mp_observability/subscribers/metrics/l1_lifecycle.py +166 -0
  261. lmcache/v1/mp_observability/subscribers/metrics/l2.py +121 -0
  262. lmcache/v1/mp_observability/subscribers/metrics/sm.py +69 -0
  263. lmcache/v1/mp_observability/subscribers/tracing/__init__.py +12 -0
  264. lmcache/v1/mp_observability/subscribers/tracing/mp_server.py +333 -0
  265. lmcache/v1/mp_observability/subscribers/tracing/span_registry.py +148 -0
  266. lmcache/v1/mp_observability/trace/__init__.py +50 -0
  267. lmcache/v1/mp_observability/trace/codecs.py +255 -0
  268. lmcache/v1/mp_observability/trace/decorator.py +147 -0
  269. lmcache/v1/mp_observability/trace/format.py +132 -0
  270. lmcache/v1/mp_observability/trace/lifecycle.py +83 -0
  271. lmcache/v1/mp_observability/trace/reader.py +167 -0
  272. lmcache/v1/mp_observability/trace/recorder.py +300 -0
  273. lmcache/v1/multiprocess/__init__.py +0 -0
  274. lmcache/v1/multiprocess/affinity_pool.py +102 -0
  275. lmcache/v1/multiprocess/blend_server_v2.py +891 -0
  276. lmcache/v1/multiprocess/config.py +253 -0
  277. lmcache/v1/multiprocess/custom_types.py +281 -0
  278. lmcache/v1/multiprocess/futures.py +194 -0
  279. lmcache/v1/multiprocess/gpu_context.py +511 -0
  280. lmcache/v1/multiprocess/http_server.py +235 -0
  281. lmcache/v1/multiprocess/mp_runtime_plugin_launcher.py +130 -0
  282. lmcache/v1/multiprocess/mq.py +732 -0
  283. lmcache/v1/multiprocess/protocol.py +86 -0
  284. lmcache/v1/multiprocess/protocols/README.md +213 -0
  285. lmcache/v1/multiprocess/protocols/__init__.py +127 -0
  286. lmcache/v1/multiprocess/protocols/base.py +89 -0
  287. lmcache/v1/multiprocess/protocols/blend.py +109 -0
  288. lmcache/v1/multiprocess/protocols/blend_v2.py +57 -0
  289. lmcache/v1/multiprocess/protocols/controller.py +53 -0
  290. lmcache/v1/multiprocess/protocols/debug.py +34 -0
  291. lmcache/v1/multiprocess/protocols/engine.py +146 -0
  292. lmcache/v1/multiprocess/protocols/observability.py +39 -0
  293. lmcache/v1/multiprocess/server.py +1134 -0
  294. lmcache/v1/multiprocess/session.py +190 -0
  295. lmcache/v1/multiprocess/token_hasher.py +441 -0
  296. lmcache/v1/offload_server/__init__.py +17 -0
  297. lmcache/v1/offload_server/abstract_server.py +37 -0
  298. lmcache/v1/offload_server/message.py +30 -0
  299. lmcache/v1/offload_server/zmq_server.py +122 -0
  300. lmcache/v1/periodic_thread.py +579 -0
  301. lmcache/v1/pin_monitor.py +246 -0
  302. lmcache/v1/plugin/__init__.py +0 -0
  303. lmcache/v1/plugin/runtime_plugin_launcher.py +211 -0
  304. lmcache/v1/protocol.py +317 -0
  305. lmcache/v1/rpc/__init__.py +17 -0
  306. lmcache/v1/rpc/transport.py +105 -0
  307. lmcache/v1/rpc/zmq_transport.py +213 -0
  308. lmcache/v1/rpc_utils.py +165 -0
  309. lmcache/v1/server/__init__.py +2 -0
  310. lmcache/v1/server/__main__.py +170 -0
  311. lmcache/v1/server/storage_backend/__init__.py +21 -0
  312. lmcache/v1/server/storage_backend/abstract_backend.py +80 -0
  313. lmcache/v1/server/storage_backend/local_backend.py +75 -0
  314. lmcache/v1/server/utils.py +21 -0
  315. lmcache/v1/standalone/__init__.py +1 -0
  316. lmcache/v1/standalone/__main__.py +583 -0
  317. lmcache/v1/standalone/manager.py +80 -0
  318. lmcache/v1/standalone/standalone_service_factory.py +86 -0
  319. lmcache/v1/storage_backend/__init__.py +313 -0
  320. lmcache/v1/storage_backend/abstract_backend.py +445 -0
  321. lmcache/v1/storage_backend/audit_backend.py +233 -0
  322. lmcache/v1/storage_backend/batched_message_sender.py +222 -0
  323. lmcache/v1/storage_backend/cache_policy/__init__.py +45 -0
  324. lmcache/v1/storage_backend/cache_policy/base_policy.py +87 -0
  325. lmcache/v1/storage_backend/cache_policy/fifo.py +58 -0
  326. lmcache/v1/storage_backend/cache_policy/lfu.py +105 -0
  327. lmcache/v1/storage_backend/cache_policy/lru.py +81 -0
  328. lmcache/v1/storage_backend/cache_policy/mru.py +61 -0
  329. lmcache/v1/storage_backend/connector/__init__.py +443 -0
  330. lmcache/v1/storage_backend/connector/audit_adapter.py +77 -0
  331. lmcache/v1/storage_backend/connector/audit_connector.py +320 -0
  332. lmcache/v1/storage_backend/connector/base_connector.py +379 -0
  333. lmcache/v1/storage_backend/connector/blackhole_adapter.py +21 -0
  334. lmcache/v1/storage_backend/connector/blackhole_connector.py +37 -0
  335. lmcache/v1/storage_backend/connector/eic_adapter.py +31 -0
  336. lmcache/v1/storage_backend/connector/eic_connector.py +757 -0
  337. lmcache/v1/storage_backend/connector/external_adapter.py +79 -0
  338. lmcache/v1/storage_backend/connector/fs_adapter.py +51 -0
  339. lmcache/v1/storage_backend/connector/fs_connector.py +403 -0
  340. lmcache/v1/storage_backend/connector/infinistore_adapter.py +56 -0
  341. lmcache/v1/storage_backend/connector/infinistore_connector.py +177 -0
  342. lmcache/v1/storage_backend/connector/instrumented_connector.py +219 -0
  343. lmcache/v1/storage_backend/connector/lm_adapter.py +31 -0
  344. lmcache/v1/storage_backend/connector/lm_connector.py +176 -0
  345. lmcache/v1/storage_backend/connector/mock_adapter.py +57 -0
  346. lmcache/v1/storage_backend/connector/mock_connector.py +349 -0
  347. lmcache/v1/storage_backend/connector/mooncakestore_adapter.py +43 -0
  348. lmcache/v1/storage_backend/connector/mooncakestore_connector.py +614 -0
  349. lmcache/v1/storage_backend/connector/redis_adapter.py +181 -0
  350. lmcache/v1/storage_backend/connector/redis_connector.py +828 -0
  351. lmcache/v1/storage_backend/connector/s3_adapter.py +59 -0
  352. lmcache/v1/storage_backend/connector/s3_connector.py +699 -0
  353. lmcache/v1/storage_backend/connector/sagemaker_hyperpod_adapter.py +233 -0
  354. lmcache/v1/storage_backend/connector/sagemaker_hyperpod_connector.py +987 -0
  355. lmcache/v1/storage_backend/connector/valkey_adapter.py +114 -0
  356. lmcache/v1/storage_backend/connector/valkey_connector.py +627 -0
  357. lmcache/v1/storage_backend/gds_backend.py +1199 -0
  358. lmcache/v1/storage_backend/job_executor/__init__.py +0 -0
  359. lmcache/v1/storage_backend/job_executor/base_executor.py +34 -0
  360. lmcache/v1/storage_backend/job_executor/pq_executor.py +235 -0
  361. lmcache/v1/storage_backend/local_cpu_backend.py +810 -0
  362. lmcache/v1/storage_backend/local_disk_backend.py +656 -0
  363. lmcache/v1/storage_backend/maru_backend.py +734 -0
  364. lmcache/v1/storage_backend/naive_serde/__init__.py +50 -0
  365. lmcache/v1/storage_backend/naive_serde/cachegen_basics.py +133 -0
  366. lmcache/v1/storage_backend/naive_serde/cachegen_decoder.py +135 -0
  367. lmcache/v1/storage_backend/naive_serde/cachegen_encoder.py +83 -0
  368. lmcache/v1/storage_backend/naive_serde/kivi_serde.py +22 -0
  369. lmcache/v1/storage_backend/naive_serde/naive_serde.py +18 -0
  370. lmcache/v1/storage_backend/naive_serde/serde.py +37 -0
  371. lmcache/v1/storage_backend/native_clients/connector_client_base.py +165 -0
  372. lmcache/v1/storage_backend/native_clients/resp_client.py +35 -0
  373. lmcache/v1/storage_backend/nixl_storage_backend.py +1400 -0
  374. lmcache/v1/storage_backend/p2p_backend.py +788 -0
  375. lmcache/v1/storage_backend/path_sharder.py +117 -0
  376. lmcache/v1/storage_backend/pd_backend.py +646 -0
  377. lmcache/v1/storage_backend/plugins/dax_backend.py +1443 -0
  378. lmcache/v1/storage_backend/plugins/rust_raw_block_backend.py +1361 -0
  379. lmcache/v1/storage_backend/remote_backend.py +624 -0
  380. lmcache/v1/storage_backend/resp_client.py +227 -0
  381. lmcache/v1/storage_backend/storage_backend_listener.py +19 -0
  382. lmcache/v1/storage_backend/storage_manager.py +1352 -0
  383. lmcache/v1/system_detection.py +110 -0
  384. lmcache/v1/token_database.py +551 -0
  385. lmcache/v1/transfer_channel/__init__.py +83 -0
  386. lmcache/v1/transfer_channel/abstract.py +285 -0
  387. lmcache/v1/transfer_channel/mock_memory_channel.py +156 -0
  388. lmcache/v1/transfer_channel/nixl_channel.py +639 -0
  389. lmcache/v1/transfer_channel/py_socket_channel.py +260 -0
  390. lmcache/v1/transfer_channel/transfer_utils.py +63 -0
  391. lmcache/v1/utils/__init__.py +1 -0
  392. lmcache/v1/utils/bloom_filter.py +109 -0
  393. lmcache/v1/utils/cache_utils.py +125 -0
  394. lmcache_cli-0.4.5.dev0.dist-info/METADATA +185 -0
  395. lmcache_cli-0.4.5.dev0.dist-info/RECORD +399 -0
  396. lmcache_cli-0.4.5.dev0.dist-info/WHEEL +5 -0
  397. lmcache_cli-0.4.5.dev0.dist-info/entry_points.txt +2 -0
  398. lmcache_cli-0.4.5.dev0.dist-info/licenses/LICENSE +201 -0
  399. lmcache_cli-0.4.5.dev0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,828 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+ # Standard
3
+ from dataclasses import dataclass
4
+ from enum import Enum
5
+ from typing import Dict, List, Optional, Tuple, Union
6
+
7
+ # Third Party
8
+ import msgspec
9
+
10
+ # First Party
11
+ from lmcache.v1.cache_controller.commands.base import HeartbeatCommand
12
+ from lmcache.v1.cache_controller.commands.full_sync import FullSyncCommand
13
+
14
+ # Type alias for all command types - msgspec needs Union for tagged unions
15
+ AnyCommand = Union[FullSyncCommand, HeartbeatCommand]
16
+
17
+
18
+ class MsgBase(msgspec.Struct, tag=True): # type: ignore
19
+ """Base class for all messages"""
20
+
21
+ def describe(self) -> str:
22
+ return ""
23
+
24
+
25
+ # NOTE: The additional layer of abstraction is to
26
+ # differentiate among
27
+ # (1) WorkerMsg: push-pull (lmcache->controller)
28
+ # (2) WorkerReqMsg: req-reply (lmcache->controller)
29
+ # (3) ControlMessage: req-reply (controller->lmcache)
30
+ # (4) OrchMsg: req-reply (ochestrator->controller)
31
+
32
+
33
+ """Message from LMCache to Controller"""
34
+
35
+
36
+ class WorkerMsg(MsgBase):
37
+ """Message between LMCache and Controller"""
38
+
39
+ def describe(self) -> str:
40
+ return ""
41
+
42
+
43
+ """Worker Request (requiring a reply) Message from LMCache to Controller"""
44
+
45
+
46
+ class WorkerReqMsg(MsgBase):
47
+ def describe(self) -> str:
48
+ return ""
49
+
50
+
51
+ class RegisterMsg(WorkerReqMsg):
52
+ """Message for Registration (REQ-REP mode)"""
53
+
54
+ instance_id: str
55
+ worker_id: int
56
+ ip: str
57
+ port: int
58
+ # URL for actual KV cache transfer, only useful when p2p is enabled
59
+ peer_init_url: Optional[str]
60
+
61
+ def describe(self) -> str:
62
+ return (
63
+ f"Registering instance {self.instance_id}, "
64
+ f"worker {self.worker_id} "
65
+ f"at {self.ip}:{self.port}"
66
+ f" with peer init URL {self.peer_init_url}"
67
+ )
68
+
69
+
70
+ class DeRegisterMsg(WorkerMsg):
71
+ """Message for Deregistration"""
72
+
73
+ instance_id: str
74
+ worker_id: int
75
+ ip: str
76
+ port: int
77
+
78
+ def describe(self) -> str:
79
+ return (
80
+ f"Deregistering instance {self.instance_id}, "
81
+ f"worker {self.worker_id} "
82
+ f"at {self.ip}:{self.port}"
83
+ )
84
+
85
+
86
+ class KVOperationMsg(WorkerMsg):
87
+ """Base class for KV operation messages (admit/evict) with full context"""
88
+
89
+ instance_id: str
90
+ worker_id: int
91
+ key: int
92
+ location: str
93
+ seq_num: int = 0
94
+
95
+
96
+ class KVAdmitMsg(KVOperationMsg):
97
+ """Message for KV chunk admission"""
98
+
99
+ def describe(self) -> str:
100
+ return f"kv_admit {self.key} to {self.instance_id}"
101
+
102
+
103
+ class KVEvictMsg(KVOperationMsg):
104
+ """Message for KV chunk eviction"""
105
+
106
+ def describe(self) -> str:
107
+ return f"kv_evict {self.key} from {self.instance_id}"
108
+
109
+
110
+ @dataclass
111
+ class WorkerInfo:
112
+ """Information about a worker for external API consumption."""
113
+
114
+ instance_id: str
115
+ worker_id: int
116
+ ip: str
117
+ port: int
118
+ peer_init_url: Optional[str]
119
+ registration_time: float
120
+ last_heartbeat_time: float
121
+
122
+
123
+ class OpType(Enum):
124
+ """Enum for KV operation types"""
125
+
126
+ ADMIT = "admit"
127
+ EVICT = "evict"
128
+
129
+
130
+ class KVOpEvent(msgspec.Struct):
131
+ """Lightweight KV operation event for queue storage (without common fields)"""
132
+
133
+ op_type: OpType
134
+ key: int
135
+ seq_num: int
136
+
137
+
138
+ class BatchedKVOperationMsg(WorkerMsg):
139
+ """Batched KV operation message with common fields and lightweight operations
140
+
141
+ Design: Common fields (instance_id, worker_id, location) are stored once
142
+ at the batch level, while individual operations only contain the varying
143
+ fields (op_type, key, seq_num). This reduces memory and network overhead.
144
+ """
145
+
146
+ instance_id: str
147
+ worker_id: int
148
+ location: str
149
+ operations: list[KVOpEvent]
150
+
151
+ def describe(self) -> str:
152
+ return (
153
+ f"Batched KV operations with {len(self.operations)} messages "
154
+ f"from {self.instance_id}:{self.worker_id}"
155
+ )
156
+
157
+
158
+ # ============= Full Sync Messages (PUSH mode) =============
159
+
160
+
161
+ class FullSyncBatchMsg(WorkerMsg):
162
+ """Full sync batch message (PUSH mode, no confirmation needed)
163
+
164
+ Used to send a batch of chunk hashes during full sync.
165
+ """
166
+
167
+ instance_id: str
168
+ worker_id: int
169
+ location: str
170
+ sync_id: str
171
+ batch_id: int # Current batch number (0-indexed)
172
+ keys: list[int] # List of chunk_hash in this batch
173
+
174
+ def describe(self) -> str:
175
+ return (
176
+ f"FullSyncBatch sync_id={self.sync_id} batch_id={self.batch_id} "
177
+ f"keys_count={len(self.keys)} from {self.instance_id}:{self.worker_id}"
178
+ )
179
+
180
+
181
+ class FullSyncEndMsg(WorkerMsg):
182
+ """Full sync end message (PUSH mode)
183
+
184
+ Sent after all batches are sent to signal completion.
185
+ """
186
+
187
+ instance_id: str
188
+ worker_id: int
189
+ location: str
190
+ sync_id: str
191
+ actual_total_keys: int # Actual total keys sent (for verification)
192
+
193
+ def describe(self) -> str:
194
+ return (
195
+ f"FullSyncEnd sync_id={self.sync_id} "
196
+ f"total_keys={self.actual_total_keys} from "
197
+ f"{self.instance_id}:{self.worker_id}"
198
+ )
199
+
200
+
201
+ class HeartbeatMsg(WorkerReqMsg):
202
+ """Message for heartbeat (REQ-REP mode), include register info for re-register"""
203
+
204
+ instance_id: str
205
+ worker_id: int
206
+ ip: str
207
+ port: int
208
+ peer_init_url: Optional[str]
209
+
210
+ def describe(self) -> str:
211
+ return f"Heartbeat from instance {self.instance_id}, worker {self.worker_id}"
212
+
213
+
214
+ class BatchedP2PLookupMsg(WorkerReqMsg):
215
+ """Batched P2P lookup message"""
216
+
217
+ hashes: list[int]
218
+ instance_id: str
219
+ worker_id: int # TP rank
220
+
221
+ def describe(self) -> str:
222
+ return (
223
+ f"Batched P2P lookup for {len(self.hashes)} keys from "
224
+ f"instance id {self.instance_id} and "
225
+ f"worker id {self.worker_id}"
226
+ )
227
+
228
+
229
+ class FullSyncStartMsg(WorkerReqMsg):
230
+ """Full sync start message (REQ-REP mode, needs confirmation)
231
+
232
+ Sent before starting full sync to notify controller and get confirmation.
233
+ """
234
+
235
+ instance_id: str
236
+ worker_id: int
237
+ location: str
238
+ sync_id: str # Sync session ID
239
+ total_keys: int # Expected total key count
240
+ batch_count: int # Expected batch count
241
+
242
+ def describe(self) -> str:
243
+ return (
244
+ f"FullSyncStart sync_id={self.sync_id} "
245
+ f"total_keys={self.total_keys} batches={self.batch_count} "
246
+ f"from {self.instance_id}:{self.worker_id}"
247
+ )
248
+
249
+
250
+ class FullSyncStatusMsg(WorkerReqMsg):
251
+ """Full sync status query message (REQ-REP mode)
252
+
253
+ Used to query sync progress and check if freeze mode can be exited.
254
+ """
255
+
256
+ instance_id: str
257
+ worker_id: int
258
+ sync_id: str
259
+
260
+ def describe(self) -> str:
261
+ return (
262
+ f"FullSyncStatus query sync_id={self.sync_id} "
263
+ f"from {self.instance_id}:{self.worker_id}"
264
+ )
265
+
266
+
267
+ """Worker Request Return Message from Controller back to LMCache"""
268
+
269
+
270
+ class WorkerReqRetMsg(MsgBase):
271
+ def describe(self) -> str:
272
+ return ""
273
+
274
+
275
+ class RegisterRetMsg(WorkerReqRetMsg):
276
+ """Register response message with controller configuration
277
+
278
+ Returns configuration information that the worker needs for initialization,
279
+ such as dedicated heartbeat URL.
280
+ """
281
+
282
+ # Extra configuration from controller to worker
283
+ # e.g., {"heartbeat_url": "tcp://...:8082"}
284
+ extra_config: dict[str, str] = msgspec.field(default_factory=dict)
285
+
286
+ def describe(self) -> str:
287
+ return f"RegisterRet extra_config={self.extra_config}"
288
+
289
+
290
+ class HeartbeatRetMsg(WorkerReqRetMsg):
291
+ """Heartbeat response message with optional commands
292
+
293
+ The controller can use this to send commands to workers through
294
+ the heartbeat mechanism. This provides a general-purpose way to
295
+ trigger actions on workers without adding new message types.
296
+
297
+ The commands field uses msgspec's tagged union for polymorphic
298
+ serialization - each command subclass is identified by its tag.
299
+ Commands are executed sequentially by the worker.
300
+ """
301
+
302
+ commands: List[AnyCommand] = []
303
+
304
+ def describe(self) -> str:
305
+ if not self.commands:
306
+ return "HeartbeatRet (no commands)"
307
+ cmd_descs = [cmd.describe() for cmd in self.commands]
308
+ return f"HeartbeatRet commands=[{', '.join(cmd_descs)}]"
309
+
310
+ def has_commands(self) -> bool:
311
+ """Check if there are commands to execute"""
312
+ return len(self.commands) > 0
313
+
314
+
315
+ class BatchedP2PLookupRetMsg(WorkerReqRetMsg):
316
+ """Batched P2P lookup return message"""
317
+
318
+ # (instance_id, location, num_hit_chunks, peer_init_url)
319
+ layout_info: list[tuple[str, str, int, str]]
320
+
321
+ def describe(self) -> str:
322
+ return f"The layout info is {self.layout_info}"
323
+
324
+
325
+ class FullSyncStartRetMsg(WorkerReqRetMsg):
326
+ """Full sync start response message"""
327
+
328
+ sync_id: str
329
+ accepted: bool # Whether sync request is accepted
330
+ error_msg: Optional[str] = None
331
+
332
+ def describe(self) -> str:
333
+ return f"FullSyncStartRet sync_id={self.sync_id} accepted={self.accepted}"
334
+
335
+
336
+ class FullSyncStatusRetMsg(WorkerReqRetMsg):
337
+ """Full sync status response message"""
338
+
339
+ sync_id: str
340
+ is_complete: bool # Whether current worker sync is complete
341
+ global_progress: float # Global progress (0.0 - 1.0)
342
+ can_exit_freeze: bool # Whether freeze mode can be exited
343
+ missing_batches: list[int] = [] # List of missing batch IDs that need to be resent
344
+
345
+ def describe(self) -> str:
346
+ missing_info = (
347
+ f" missing={self.missing_batches}" if self.missing_batches else ""
348
+ )
349
+ return (
350
+ f"FullSyncStatusRet sync_id={self.sync_id} "
351
+ f"complete={self.is_complete} progress={self.global_progress:.2%} "
352
+ f"can_exit_freeze={self.can_exit_freeze}{missing_info}"
353
+ )
354
+
355
+
356
+ """Control Message from Controller to LMCache"""
357
+
358
+
359
+ class ControlMsg(MsgBase):
360
+ def describe(self) -> str:
361
+ return ""
362
+
363
+
364
+ class ClearWorkerMsg(ControlMsg):
365
+ """Clear message for a single lmcache worker"""
366
+
367
+ worker_event_id: str
368
+ location: str
369
+
370
+ def describe(self) -> str:
371
+ return f"Clear tokens in location {self.location}"
372
+
373
+
374
+ class PinWorkerMsg(ControlMsg):
375
+ """Pin message for a single lmcache worker"""
376
+
377
+ worker_event_id: str
378
+ location: str
379
+ tokens: list[int]
380
+
381
+ def describe(self) -> str:
382
+ return f"Pin tokens {self.tokens} in location {self.location}"
383
+
384
+
385
+ class CompressWorkerMsg(ControlMsg):
386
+ """Compress message for a single lmcache worker"""
387
+
388
+ worker_event_id: str
389
+ method: str
390
+ location: str
391
+ tokens: Optional[list[int]] = None
392
+
393
+ def describe(self) -> str:
394
+ return (
395
+ f"Compress tokens {self.tokens} in "
396
+ f"locations {self.location} with "
397
+ f"method {self.method}"
398
+ )
399
+
400
+
401
+ class DecompressWorkerMsg(ControlMsg):
402
+ """Decompress message for a single lmcache worker"""
403
+
404
+ worker_event_id: str
405
+ method: str
406
+ location: str
407
+ tokens: Optional[list[int]] = None
408
+
409
+ def describe(self) -> str:
410
+ return (
411
+ f"Decompress tokens {self.tokens} in "
412
+ f"locations {self.location} with "
413
+ f"method {self.method}"
414
+ )
415
+
416
+
417
+ class MoveWorkerMsg(ControlMsg):
418
+ """Move message for a single lmcache worker"""
419
+
420
+ worker_event_id: str
421
+ old_position: str # location (storage backend name)
422
+ new_position: Tuple[str, str] # (target_url, location (storage backend name) )
423
+ tokens: Optional[list[int]] = None
424
+ copy: Optional[bool] = True
425
+
426
+ def describe(self) -> str:
427
+ return (
428
+ f"Move tokens {self.tokens} from {self.old_position} to {self.new_position}"
429
+ )
430
+
431
+
432
+ class HealthWorkerMsg(ControlMsg):
433
+ """Health message for a single lmcache worker"""
434
+
435
+ worker_event_id: str
436
+
437
+ def describe(self) -> str:
438
+ return "Health check"
439
+
440
+
441
+ class CheckFinishWorkerMsg(ControlMsg):
442
+ """Check finish message for a single lmcache worker"""
443
+
444
+ worker_event_id: str
445
+
446
+ def describe(self) -> str:
447
+ return f"Checking finish for worker event {self.worker_event_id}"
448
+
449
+
450
+ class ControlRetMsg(MsgBase):
451
+ """Return message from LMCache to Controller"""
452
+
453
+ def describe(self) -> str:
454
+ return ""
455
+
456
+
457
+ class ClearWorkerRetMsg(ControlRetMsg):
458
+ """Return message for a ClearWorkerMsg"""
459
+
460
+ num_tokens: int
461
+
462
+ def describe(self) -> str:
463
+ return f"Number of cleared tokens: {self.num_tokens}"
464
+
465
+
466
+ class PinWorkerRetMsg(ControlRetMsg):
467
+ """Pin return message for a single lmcache worker"""
468
+
469
+ num_tokens: int
470
+
471
+ def describe(self) -> str:
472
+ return f"Number of pinned tokens: {self.num_tokens}"
473
+
474
+
475
+ class CompressWorkerRetMsg(ControlRetMsg):
476
+ """Compress return message for a single lmcache worker"""
477
+
478
+ num_tokens: int
479
+
480
+ def describe(self) -> str:
481
+ return f"Compress success: {self.num_tokens}"
482
+
483
+
484
+ class DecompressWorkerRetMsg(ControlRetMsg):
485
+ """Decompress return message for a single lmcache worker"""
486
+
487
+ num_tokens: int
488
+
489
+ def describe(self) -> str:
490
+ return f"Decompress success: {self.num_tokens}"
491
+
492
+
493
+ class MoveWorkerRetMsg(ControlRetMsg):
494
+ """Move return message for a single lmcache worker"""
495
+
496
+ num_tokens: int
497
+
498
+ def describe(self) -> str:
499
+ return f"Moving {self.num_tokens} tokens"
500
+
501
+
502
+ class HealthWorkerRetMsg(ControlRetMsg):
503
+ """Health return message for a single lmcache worker"""
504
+
505
+ error_code: int
506
+
507
+ def describe(self) -> str:
508
+ return f"Health check error code: {self.error_code}"
509
+
510
+
511
+ class CheckFinishWorkerRetMsg(ControlRetMsg):
512
+ """Check finish return message for a single lmcache worker"""
513
+
514
+ status: str
515
+
516
+ def describe(self) -> str:
517
+ return f"Check finish status: {self.status}"
518
+
519
+
520
+ """Orchestration Message from Ochestrator to LMCache"""
521
+
522
+
523
+ class OrchMsg(MsgBase):
524
+ """Message from Ochestrator to Controller"""
525
+
526
+ def describe(self) -> str:
527
+ return ""
528
+
529
+
530
+ class QueryInstMsg(OrchMsg):
531
+ """Query instance message"""
532
+
533
+ event_id: str
534
+ ip: str
535
+
536
+ def describe(self) -> str:
537
+ return f"Query instance id of ip {self.ip}"
538
+
539
+
540
+ class LookupMsg(OrchMsg):
541
+ """Lookup message"""
542
+
543
+ event_id: str
544
+ tokens: list[int]
545
+
546
+ def describe(self) -> str:
547
+ return f"Lookup tokens {self.tokens}"
548
+
549
+
550
+ class ClearMsg(OrchMsg):
551
+ """Clear message"""
552
+
553
+ event_id: str
554
+ instance_id: str
555
+ location: str
556
+
557
+ def describe(self) -> str:
558
+ return (
559
+ f"Clear tokens in instance {self.instance_id} and locations {self.location}"
560
+ )
561
+
562
+
563
+ class PinMsg(OrchMsg):
564
+ """Pin message"""
565
+
566
+ event_id: str
567
+ instance_id: str
568
+ location: str
569
+ tokens: list[int]
570
+
571
+ def describe(self) -> str:
572
+ return (
573
+ f"Pin tokens {self.tokens} in instance "
574
+ f"{self.instance_id} and "
575
+ f"location {self.location}"
576
+ )
577
+
578
+
579
+ class CompressMsg(OrchMsg):
580
+ """Compress message"""
581
+
582
+ event_id: str
583
+ instance_id: str
584
+ method: str
585
+ location: str
586
+ tokens: Optional[list[int]] = None # `None` means compress all tokens
587
+
588
+ def describe(self) -> str:
589
+ return (
590
+ f"Compress tokens {self.tokens} in instance "
591
+ f"{self.instance_id} and "
592
+ f"locations {self.location} with "
593
+ f"method {self.method}"
594
+ )
595
+
596
+
597
+ class DecompressMsg(OrchMsg):
598
+ """Decompress message"""
599
+
600
+ event_id: str
601
+ instance_id: str
602
+ method: str
603
+ location: str
604
+ tokens: Optional[list[int]] = None # `None` means compress all tokens
605
+
606
+ def describe(self) -> str:
607
+ return (
608
+ f"Decompress tokens {self.tokens} in instance "
609
+ f"{self.instance_id} and "
610
+ f"locations {self.location} with "
611
+ f"method {self.method}"
612
+ )
613
+
614
+
615
+ class MoveMsg(OrchMsg):
616
+ """Move message"""
617
+
618
+ event_id: str
619
+ old_position: Tuple[str, str]
620
+ new_position: Tuple[str, str]
621
+ tokens: Optional[list[int]] = None
622
+ copy: Optional[bool] = False
623
+
624
+ def describe(self) -> str:
625
+ return (
626
+ f"Move tokens {self.tokens} from {self.old_position} to {self.new_position}"
627
+ )
628
+
629
+
630
+ class HealthMsg(OrchMsg):
631
+ """Health message"""
632
+
633
+ event_id: str
634
+ instance_id: str
635
+
636
+ def describe(self) -> str:
637
+ return f"Health check for instance {self.instance_id}"
638
+
639
+
640
+ class CheckFinishMsg(OrchMsg):
641
+ """Check finish message"""
642
+
643
+ event_id: str
644
+
645
+ def describe(self) -> str:
646
+ return f"Checking finish for event {self.event_id}"
647
+
648
+
649
+ class QueryWorkerInfoMsg(OrchMsg):
650
+ """Query worker info message"""
651
+
652
+ event_id: str
653
+ instance_id: str
654
+ worker_ids: Optional[list[int]]
655
+
656
+ def describe(self) -> str:
657
+ return f"Query worker info of {self.instance_id} : {self.worker_ids}"
658
+
659
+
660
+ class OrchRetMsg(MsgBase):
661
+ """Return message from Controller to Ochestrator"""
662
+
663
+ def describe(self) -> str:
664
+ return ""
665
+
666
+
667
+ class QueryInstRetMsg(OrchRetMsg):
668
+ """Query instance return message"""
669
+
670
+ event_id: str
671
+ instance_id: Optional[str]
672
+
673
+ def describe(self) -> str:
674
+ return f"The instance id is {self.instance_id}"
675
+
676
+
677
+ class LookupRetMsg(OrchRetMsg):
678
+ """Lookup return message"""
679
+
680
+ event_id: str
681
+ layout_info: Dict[str, Tuple[str, int]]
682
+
683
+ def describe(self) -> str:
684
+ return f"The layout info is {self.layout_info}"
685
+
686
+
687
+ class ClearRetMsg(OrchRetMsg):
688
+ """Clear return message"""
689
+
690
+ event_id: str
691
+ num_tokens: int
692
+
693
+ def describe(self) -> str:
694
+ return f"Number of cleared tokens: {self.num_tokens}"
695
+
696
+
697
+ class PinRetMsg(OrchRetMsg):
698
+ """Pin return message"""
699
+
700
+ event_id: str
701
+ num_tokens: int
702
+
703
+ def describe(self) -> str:
704
+ return f"Number of pinned tokens: {self.num_tokens}"
705
+
706
+
707
+ class CompressRetMsg(OrchRetMsg):
708
+ """Compress return message"""
709
+
710
+ event_id: str
711
+ num_tokens: int
712
+
713
+ def describe(self) -> str:
714
+ return f"Compressed {self.num_tokens} tokens"
715
+
716
+
717
+ class DecompressRetMsg(OrchRetMsg):
718
+ """Decompress return message"""
719
+
720
+ event_id: str
721
+ num_tokens: int
722
+
723
+ def describe(self) -> str:
724
+ return f"Decompressed {self.num_tokens} tokens"
725
+
726
+
727
+ class MoveRetMsg(OrchRetMsg):
728
+ """Move return message"""
729
+
730
+ event_id: str
731
+ num_tokens: int
732
+
733
+ def describe(self) -> str:
734
+ return f"Moving {self.num_tokens} tokens"
735
+
736
+
737
+ class HealthRetMsg(OrchRetMsg):
738
+ """Health return message"""
739
+
740
+ event_id: str
741
+ # worker_id -> error_code
742
+ error_codes: Dict[int, int]
743
+
744
+ def describe(self) -> str:
745
+ return f"error_codes: {self.error_codes}"
746
+
747
+
748
+ class CheckFinishRetMsg(OrchRetMsg):
749
+ """Check finish return message"""
750
+
751
+ status: str
752
+
753
+ def describe(self) -> str:
754
+ return f"Event status: {self.status}"
755
+
756
+
757
+ class QueryWorkerInfoRetMsg(OrchRetMsg):
758
+ """Query worker info return message"""
759
+
760
+ event_id: str
761
+ worker_infos: list[WorkerInfo]
762
+
763
+ def describe(self) -> str:
764
+ return f"worker infos: {self.worker_infos}"
765
+
766
+
767
+ class ErrorMsg(WorkerReqRetMsg):
768
+ """Control Error Message"""
769
+
770
+ error: str
771
+
772
+ def describe(self) -> str:
773
+ return f"Error: {self.error}"
774
+
775
+
776
+ Msg = Union[
777
+ RegisterMsg,
778
+ RegisterRetMsg,
779
+ DeRegisterMsg,
780
+ KVAdmitMsg,
781
+ KVEvictMsg,
782
+ BatchedKVOperationMsg,
783
+ ClearWorkerMsg,
784
+ ClearWorkerRetMsg,
785
+ PinWorkerMsg,
786
+ PinWorkerRetMsg,
787
+ CompressWorkerMsg,
788
+ CompressWorkerRetMsg,
789
+ DecompressWorkerMsg,
790
+ DecompressWorkerRetMsg,
791
+ MoveWorkerMsg,
792
+ MoveWorkerRetMsg,
793
+ HealthWorkerMsg,
794
+ HealthWorkerRetMsg,
795
+ CheckFinishWorkerMsg,
796
+ CheckFinishWorkerRetMsg,
797
+ LookupMsg,
798
+ LookupRetMsg,
799
+ ClearMsg,
800
+ ClearRetMsg,
801
+ PinMsg,
802
+ PinRetMsg,
803
+ CompressMsg,
804
+ CompressRetMsg,
805
+ DecompressMsg,
806
+ DecompressRetMsg,
807
+ MoveMsg,
808
+ MoveRetMsg,
809
+ HealthMsg,
810
+ HealthRetMsg,
811
+ CheckFinishMsg,
812
+ CheckFinishRetMsg,
813
+ ErrorMsg,
814
+ QueryInstMsg,
815
+ QueryInstRetMsg,
816
+ HeartbeatMsg,
817
+ HeartbeatRetMsg,
818
+ BatchedP2PLookupMsg,
819
+ BatchedP2PLookupRetMsg,
820
+ QueryWorkerInfoMsg,
821
+ QueryWorkerInfoRetMsg,
822
+ FullSyncStartMsg,
823
+ FullSyncStartRetMsg,
824
+ FullSyncBatchMsg,
825
+ FullSyncEndMsg,
826
+ FullSyncStatusMsg,
827
+ FullSyncStatusRetMsg,
828
+ ]