opengris-scaler 1.12.7__cp311-cp311-musllinux_1_2_x86_64.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.

Potentially problematic release.


This version of opengris-scaler might be problematic. Click here for more details.

Files changed (234) hide show
  1. opengris_scaler-1.12.7.dist-info/METADATA +729 -0
  2. opengris_scaler-1.12.7.dist-info/RECORD +234 -0
  3. opengris_scaler-1.12.7.dist-info/WHEEL +5 -0
  4. opengris_scaler-1.12.7.dist-info/entry_points.txt +9 -0
  5. opengris_scaler-1.12.7.dist-info/licenses/LICENSE +201 -0
  6. opengris_scaler-1.12.7.dist-info/licenses/LICENSE.spdx +7 -0
  7. opengris_scaler-1.12.7.dist-info/licenses/NOTICE +8 -0
  8. opengris_scaler.libs/libcapnp-1-61c06778.1.0.so +0 -0
  9. opengris_scaler.libs/libgcc_s-2298274a.so.1 +0 -0
  10. opengris_scaler.libs/libkj-1-21b63b70.1.0.so +0 -0
  11. opengris_scaler.libs/libstdc++-08d5c7eb.so.6.0.33 +0 -0
  12. scaler/CMakeLists.txt +11 -0
  13. scaler/__init__.py +14 -0
  14. scaler/about.py +5 -0
  15. scaler/client/__init__.py +0 -0
  16. scaler/client/agent/__init__.py +0 -0
  17. scaler/client/agent/client_agent.py +210 -0
  18. scaler/client/agent/disconnect_manager.py +27 -0
  19. scaler/client/agent/future_manager.py +112 -0
  20. scaler/client/agent/heartbeat_manager.py +74 -0
  21. scaler/client/agent/mixins.py +89 -0
  22. scaler/client/agent/object_manager.py +98 -0
  23. scaler/client/agent/task_manager.py +64 -0
  24. scaler/client/client.py +635 -0
  25. scaler/client/future.py +252 -0
  26. scaler/client/object_buffer.py +129 -0
  27. scaler/client/object_reference.py +25 -0
  28. scaler/client/serializer/__init__.py +0 -0
  29. scaler/client/serializer/default.py +16 -0
  30. scaler/client/serializer/mixins.py +38 -0
  31. scaler/cluster/__init__.py +0 -0
  32. scaler/cluster/cluster.py +115 -0
  33. scaler/cluster/combo.py +148 -0
  34. scaler/cluster/object_storage_server.py +45 -0
  35. scaler/cluster/scheduler.py +83 -0
  36. scaler/config/__init__.py +0 -0
  37. scaler/config/defaults.py +87 -0
  38. scaler/config/loader.py +95 -0
  39. scaler/config/mixins.py +15 -0
  40. scaler/config/section/__init__.py +0 -0
  41. scaler/config/section/cluster.py +56 -0
  42. scaler/config/section/native_worker_adapter.py +44 -0
  43. scaler/config/section/object_storage_server.py +7 -0
  44. scaler/config/section/scheduler.py +53 -0
  45. scaler/config/section/symphony_worker_adapter.py +47 -0
  46. scaler/config/section/top.py +13 -0
  47. scaler/config/section/webui.py +16 -0
  48. scaler/config/types/__init__.py +0 -0
  49. scaler/config/types/object_storage_server.py +45 -0
  50. scaler/config/types/worker.py +57 -0
  51. scaler/config/types/zmq.py +79 -0
  52. scaler/entry_points/__init__.py +0 -0
  53. scaler/entry_points/cluster.py +133 -0
  54. scaler/entry_points/object_storage_server.py +41 -0
  55. scaler/entry_points/scheduler.py +135 -0
  56. scaler/entry_points/top.py +286 -0
  57. scaler/entry_points/webui.py +26 -0
  58. scaler/entry_points/worker_adapter_native.py +137 -0
  59. scaler/entry_points/worker_adapter_symphony.py +102 -0
  60. scaler/io/__init__.py +0 -0
  61. scaler/io/async_binder.py +85 -0
  62. scaler/io/async_connector.py +95 -0
  63. scaler/io/async_object_storage_connector.py +185 -0
  64. scaler/io/mixins.py +154 -0
  65. scaler/io/sync_connector.py +68 -0
  66. scaler/io/sync_object_storage_connector.py +185 -0
  67. scaler/io/sync_subscriber.py +83 -0
  68. scaler/io/utility.py +31 -0
  69. scaler/io/ymq/CMakeLists.txt +98 -0
  70. scaler/io/ymq/__init__.py +0 -0
  71. scaler/io/ymq/_ymq.pyi +96 -0
  72. scaler/io/ymq/_ymq.so +0 -0
  73. scaler/io/ymq/bytes.h +114 -0
  74. scaler/io/ymq/common.h +29 -0
  75. scaler/io/ymq/configuration.h +60 -0
  76. scaler/io/ymq/epoll_context.cpp +185 -0
  77. scaler/io/ymq/epoll_context.h +85 -0
  78. scaler/io/ymq/error.h +132 -0
  79. scaler/io/ymq/event_loop.h +55 -0
  80. scaler/io/ymq/event_loop_thread.cpp +64 -0
  81. scaler/io/ymq/event_loop_thread.h +46 -0
  82. scaler/io/ymq/event_manager.h +81 -0
  83. scaler/io/ymq/file_descriptor.h +203 -0
  84. scaler/io/ymq/interruptive_concurrent_queue.h +169 -0
  85. scaler/io/ymq/io_context.cpp +98 -0
  86. scaler/io/ymq/io_context.h +44 -0
  87. scaler/io/ymq/io_socket.cpp +299 -0
  88. scaler/io/ymq/io_socket.h +121 -0
  89. scaler/io/ymq/iocp_context.cpp +102 -0
  90. scaler/io/ymq/iocp_context.h +83 -0
  91. scaler/io/ymq/logging.h +163 -0
  92. scaler/io/ymq/message.h +15 -0
  93. scaler/io/ymq/message_connection.h +16 -0
  94. scaler/io/ymq/message_connection_tcp.cpp +672 -0
  95. scaler/io/ymq/message_connection_tcp.h +96 -0
  96. scaler/io/ymq/network_utils.h +179 -0
  97. scaler/io/ymq/pymod_ymq/bytes.h +113 -0
  98. scaler/io/ymq/pymod_ymq/exception.h +124 -0
  99. scaler/io/ymq/pymod_ymq/gil.h +15 -0
  100. scaler/io/ymq/pymod_ymq/io_context.h +166 -0
  101. scaler/io/ymq/pymod_ymq/io_socket.h +285 -0
  102. scaler/io/ymq/pymod_ymq/message.h +99 -0
  103. scaler/io/ymq/pymod_ymq/python.h +153 -0
  104. scaler/io/ymq/pymod_ymq/ymq.cpp +23 -0
  105. scaler/io/ymq/pymod_ymq/ymq.h +357 -0
  106. scaler/io/ymq/readme.md +114 -0
  107. scaler/io/ymq/simple_interface.cpp +80 -0
  108. scaler/io/ymq/simple_interface.h +24 -0
  109. scaler/io/ymq/tcp_client.cpp +367 -0
  110. scaler/io/ymq/tcp_client.h +75 -0
  111. scaler/io/ymq/tcp_operations.h +41 -0
  112. scaler/io/ymq/tcp_server.cpp +410 -0
  113. scaler/io/ymq/tcp_server.h +79 -0
  114. scaler/io/ymq/third_party/concurrentqueue.h +3747 -0
  115. scaler/io/ymq/timed_queue.h +272 -0
  116. scaler/io/ymq/timestamp.h +102 -0
  117. scaler/io/ymq/typedefs.h +20 -0
  118. scaler/io/ymq/utils.h +34 -0
  119. scaler/io/ymq/ymq.py +130 -0
  120. scaler/object_storage/CMakeLists.txt +50 -0
  121. scaler/object_storage/__init__.py +0 -0
  122. scaler/object_storage/constants.h +11 -0
  123. scaler/object_storage/defs.h +14 -0
  124. scaler/object_storage/io_helper.cpp +44 -0
  125. scaler/object_storage/io_helper.h +9 -0
  126. scaler/object_storage/message.cpp +56 -0
  127. scaler/object_storage/message.h +130 -0
  128. scaler/object_storage/object_manager.cpp +126 -0
  129. scaler/object_storage/object_manager.h +52 -0
  130. scaler/object_storage/object_storage_server.cpp +359 -0
  131. scaler/object_storage/object_storage_server.h +126 -0
  132. scaler/object_storage/object_storage_server.so +0 -0
  133. scaler/object_storage/pymod_object_storage_server.cpp +104 -0
  134. scaler/protocol/__init__.py +0 -0
  135. scaler/protocol/capnp/__init__.py +0 -0
  136. scaler/protocol/capnp/_python.py +6 -0
  137. scaler/protocol/capnp/common.capnp +63 -0
  138. scaler/protocol/capnp/message.capnp +216 -0
  139. scaler/protocol/capnp/object_storage.capnp +52 -0
  140. scaler/protocol/capnp/status.capnp +73 -0
  141. scaler/protocol/introduction.md +105 -0
  142. scaler/protocol/python/__init__.py +0 -0
  143. scaler/protocol/python/common.py +135 -0
  144. scaler/protocol/python/message.py +726 -0
  145. scaler/protocol/python/mixins.py +13 -0
  146. scaler/protocol/python/object_storage.py +118 -0
  147. scaler/protocol/python/status.py +279 -0
  148. scaler/protocol/worker.md +228 -0
  149. scaler/scheduler/__init__.py +0 -0
  150. scaler/scheduler/allocate_policy/__init__.py +0 -0
  151. scaler/scheduler/allocate_policy/allocate_policy.py +9 -0
  152. scaler/scheduler/allocate_policy/capability_allocate_policy.py +280 -0
  153. scaler/scheduler/allocate_policy/even_load_allocate_policy.py +159 -0
  154. scaler/scheduler/allocate_policy/mixins.py +55 -0
  155. scaler/scheduler/controllers/__init__.py +0 -0
  156. scaler/scheduler/controllers/balance_controller.py +65 -0
  157. scaler/scheduler/controllers/client_controller.py +131 -0
  158. scaler/scheduler/controllers/config_controller.py +31 -0
  159. scaler/scheduler/controllers/graph_controller.py +424 -0
  160. scaler/scheduler/controllers/information_controller.py +81 -0
  161. scaler/scheduler/controllers/mixins.py +201 -0
  162. scaler/scheduler/controllers/object_controller.py +147 -0
  163. scaler/scheduler/controllers/scaling_controller.py +86 -0
  164. scaler/scheduler/controllers/task_controller.py +373 -0
  165. scaler/scheduler/controllers/worker_controller.py +168 -0
  166. scaler/scheduler/object_usage/__init__.py +0 -0
  167. scaler/scheduler/object_usage/object_tracker.py +131 -0
  168. scaler/scheduler/scheduler.py +253 -0
  169. scaler/scheduler/task/__init__.py +0 -0
  170. scaler/scheduler/task/task_state_machine.py +92 -0
  171. scaler/scheduler/task/task_state_manager.py +61 -0
  172. scaler/ui/__init__.py +0 -0
  173. scaler/ui/constants.py +9 -0
  174. scaler/ui/live_display.py +118 -0
  175. scaler/ui/memory_window.py +146 -0
  176. scaler/ui/setting_page.py +47 -0
  177. scaler/ui/task_graph.py +370 -0
  178. scaler/ui/task_log.py +83 -0
  179. scaler/ui/utility.py +35 -0
  180. scaler/ui/webui.py +125 -0
  181. scaler/ui/worker_processors.py +85 -0
  182. scaler/utility/__init__.py +0 -0
  183. scaler/utility/debug.py +19 -0
  184. scaler/utility/event_list.py +63 -0
  185. scaler/utility/event_loop.py +58 -0
  186. scaler/utility/exceptions.py +42 -0
  187. scaler/utility/formatter.py +44 -0
  188. scaler/utility/graph/__init__.py +0 -0
  189. scaler/utility/graph/optimization.py +27 -0
  190. scaler/utility/graph/topological_sorter.py +11 -0
  191. scaler/utility/graph/topological_sorter_graphblas.py +174 -0
  192. scaler/utility/identifiers.py +105 -0
  193. scaler/utility/logging/__init__.py +0 -0
  194. scaler/utility/logging/decorators.py +25 -0
  195. scaler/utility/logging/scoped_logger.py +33 -0
  196. scaler/utility/logging/utility.py +183 -0
  197. scaler/utility/many_to_many_dict.py +123 -0
  198. scaler/utility/metadata/__init__.py +0 -0
  199. scaler/utility/metadata/profile_result.py +31 -0
  200. scaler/utility/metadata/task_flags.py +30 -0
  201. scaler/utility/mixins.py +13 -0
  202. scaler/utility/network_util.py +7 -0
  203. scaler/utility/one_to_many_dict.py +72 -0
  204. scaler/utility/queues/__init__.py +0 -0
  205. scaler/utility/queues/async_indexed_queue.py +37 -0
  206. scaler/utility/queues/async_priority_queue.py +70 -0
  207. scaler/utility/queues/async_sorted_priority_queue.py +45 -0
  208. scaler/utility/queues/indexed_queue.py +114 -0
  209. scaler/utility/serialization.py +9 -0
  210. scaler/version.txt +1 -0
  211. scaler/worker/__init__.py +0 -0
  212. scaler/worker/agent/__init__.py +0 -0
  213. scaler/worker/agent/heartbeat_manager.py +107 -0
  214. scaler/worker/agent/mixins.py +137 -0
  215. scaler/worker/agent/processor/__init__.py +0 -0
  216. scaler/worker/agent/processor/object_cache.py +107 -0
  217. scaler/worker/agent/processor/processor.py +279 -0
  218. scaler/worker/agent/processor/streaming_buffer.py +28 -0
  219. scaler/worker/agent/processor_holder.py +145 -0
  220. scaler/worker/agent/processor_manager.py +365 -0
  221. scaler/worker/agent/profiling_manager.py +109 -0
  222. scaler/worker/agent/task_manager.py +150 -0
  223. scaler/worker/agent/timeout_manager.py +19 -0
  224. scaler/worker/preload.py +84 -0
  225. scaler/worker/worker.py +264 -0
  226. scaler/worker_adapter/__init__.py +0 -0
  227. scaler/worker_adapter/native.py +154 -0
  228. scaler/worker_adapter/symphony/__init__.py +0 -0
  229. scaler/worker_adapter/symphony/callback.py +45 -0
  230. scaler/worker_adapter/symphony/heartbeat_manager.py +79 -0
  231. scaler/worker_adapter/symphony/message.py +24 -0
  232. scaler/worker_adapter/symphony/task_manager.py +288 -0
  233. scaler/worker_adapter/symphony/worker.py +205 -0
  234. scaler/worker_adapter/symphony/worker_adapter.py +142 -0
@@ -0,0 +1,726 @@
1
+ import dataclasses
2
+ import enum
3
+ from typing import Dict, List, Optional, Set, Type, Union
4
+
5
+ import bidict
6
+
7
+ from scaler.protocol.capnp._python import _message # noqa
8
+ from scaler.protocol.python.common import (
9
+ ObjectMetadata,
10
+ ObjectStorageAddress,
11
+ TaskCancelConfirmType,
12
+ TaskCapability,
13
+ TaskResultType,
14
+ TaskState,
15
+ )
16
+ from scaler.protocol.python.mixins import Message
17
+ from scaler.protocol.python.status import (
18
+ BinderStatus,
19
+ ClientManagerStatus,
20
+ ObjectManagerStatus,
21
+ ProcessorStatus,
22
+ Resource,
23
+ ScalingManagerStatus,
24
+ TaskManagerStatus,
25
+ WorkerManagerStatus,
26
+ )
27
+ from scaler.utility.identifiers import ClientID, ObjectID, TaskID, WorkerID
28
+
29
+
30
+ class Task(Message):
31
+ def __init__(self, msg):
32
+ super().__init__(msg)
33
+
34
+ def __repr__(self):
35
+ return (
36
+ f"Task(task_id={self.task_id!r}, source={self.source!r}, metadata={self.metadata.hex()},"
37
+ f"func_object_id={self.func_object_id!r}, function_args={self.function_args})"
38
+ )
39
+
40
+ @property
41
+ def task_id(self) -> TaskID:
42
+ return TaskID(self._msg.taskId)
43
+
44
+ @property
45
+ def source(self) -> ClientID:
46
+ return ClientID(self._msg.source)
47
+
48
+ @property
49
+ def metadata(self) -> bytes:
50
+ return self._msg.metadata
51
+
52
+ @property
53
+ def func_object_id(self) -> Optional[ObjectID]:
54
+ if len(self._msg.funcObjectId) > 0:
55
+ return ObjectID(self._msg.funcObjectId)
56
+ else:
57
+ return None
58
+
59
+ @property
60
+ def function_args(self) -> List[Union[ObjectID, TaskID]]:
61
+ return [self._from_capnp_task_argument(arg) for arg in self._msg.functionArgs]
62
+
63
+ @property
64
+ def capabilities(self) -> Dict[str, int]:
65
+ return {capability.name: capability.value for capability in self._msg.capabilities}
66
+
67
+ @staticmethod
68
+ def new_msg(
69
+ task_id: TaskID,
70
+ source: ClientID,
71
+ metadata: bytes,
72
+ func_object_id: Optional[ObjectID],
73
+ function_args: List[Union[ObjectID, TaskID]],
74
+ capabilities: Dict[str, int],
75
+ ) -> "Task":
76
+ return Task(
77
+ _message.Task(
78
+ taskId=bytes(task_id),
79
+ source=bytes(source),
80
+ metadata=metadata,
81
+ funcObjectId=bytes(func_object_id) if func_object_id is not None else b"",
82
+ functionArgs=[Task._to_capnp_task_argument(arg) for arg in function_args],
83
+ capabilities=[
84
+ TaskCapability.new_msg(name, value).get_message() for name, value in capabilities.items()
85
+ ],
86
+ )
87
+ )
88
+
89
+ @staticmethod
90
+ def _from_capnp_task_argument(value: _message.Task.Argument) -> Union[ObjectID, TaskID]:
91
+ if value.type.raw == _message.Task.Argument.ArgumentType.task:
92
+ return TaskID(value.data)
93
+ else:
94
+ assert value.type.raw == _message.Task.Argument.ArgumentType.objectID
95
+ return ObjectID(value.data)
96
+
97
+ @staticmethod
98
+ def _to_capnp_task_argument(value: Union[ObjectID, TaskID]) -> _message.Task.Argument:
99
+ if isinstance(value, TaskID):
100
+ return _message.Task.Argument(type=_message.Task.Argument.ArgumentType.task, data=bytes(value))
101
+ else:
102
+ assert isinstance(value, ObjectID)
103
+ return _message.Task.Argument(type=_message.Task.Argument.ArgumentType.objectID, data=bytes(value))
104
+
105
+
106
+ class TaskCancel(Message):
107
+ def __init__(self, msg):
108
+ super().__init__(msg)
109
+
110
+ @dataclasses.dataclass
111
+ class TaskCancelFlags:
112
+ force: bool
113
+
114
+ @property
115
+ def task_id(self) -> TaskID:
116
+ return TaskID(self._msg.taskId)
117
+
118
+ @property
119
+ def flags(self) -> TaskCancelFlags:
120
+ return TaskCancel.TaskCancelFlags(force=self._msg.flags.force)
121
+
122
+ @staticmethod
123
+ def new_msg(task_id: TaskID, flags: Optional[TaskCancelFlags] = None) -> "TaskCancel":
124
+ if flags is None:
125
+ flags = TaskCancel.TaskCancelFlags(force=False)
126
+
127
+ return TaskCancel(
128
+ _message.TaskCancel(taskId=bytes(task_id), flags=_message.TaskCancel.TaskCancelFlags(force=flags.force))
129
+ )
130
+
131
+
132
+ class TaskLog(Message):
133
+ class LogType(enum.Enum):
134
+ Stdout = _message.TaskLog.LogType.stdout
135
+ Stderr = _message.TaskLog.LogType.stderr
136
+
137
+ def __init__(self, msg):
138
+ super().__init__(msg)
139
+
140
+ @property
141
+ def task_id(self) -> TaskID:
142
+ return TaskID(self._msg.taskId)
143
+
144
+ @property
145
+ def log_type(self) -> "TaskLog.LogType":
146
+ return TaskLog.LogType(self._msg.logType.raw)
147
+
148
+ @property
149
+ def content(self) -> str:
150
+ return self._msg.content
151
+
152
+ @staticmethod
153
+ def new_msg(task_id: TaskID, log_type: "TaskLog.LogType", content: str) -> "TaskLog":
154
+ return TaskLog(_message.TaskLog(taskId=bytes(task_id), logType=log_type.value, content=content))
155
+
156
+
157
+ class TaskResult(Message):
158
+ def __init__(self, msg):
159
+ super().__init__(msg)
160
+
161
+ @property
162
+ def task_id(self) -> TaskID:
163
+ return TaskID(self._msg.taskId)
164
+
165
+ @property
166
+ def result_type(self) -> TaskResultType:
167
+ return TaskResultType(self._msg.resultType.raw)
168
+
169
+ @property
170
+ def metadata(self) -> bytes:
171
+ return self._msg.metadata
172
+
173
+ @property
174
+ def results(self) -> List[bytes]:
175
+ return self._msg.results
176
+
177
+ @staticmethod
178
+ def new_msg(
179
+ task_id: TaskID,
180
+ result_type: TaskResultType,
181
+ metadata: Optional[bytes] = None,
182
+ results: Optional[List[bytes]] = None,
183
+ ) -> "TaskResult":
184
+ if metadata is None:
185
+ metadata = bytes()
186
+
187
+ if results is None:
188
+ results = list()
189
+
190
+ return TaskResult(
191
+ _message.TaskResult(taskId=bytes(task_id), resultType=result_type.value, metadata=metadata, results=results)
192
+ )
193
+
194
+
195
+ class TaskCancelConfirm(Message):
196
+ def __init__(self, msg):
197
+ super().__init__(msg)
198
+
199
+ @property
200
+ def task_id(self) -> TaskID:
201
+ return TaskID(self._msg.taskId)
202
+
203
+ @property
204
+ def cancel_confirm_type(self) -> TaskCancelConfirmType:
205
+ return TaskCancelConfirmType(self._msg.cancelConfirmType.raw)
206
+
207
+ @staticmethod
208
+ def new_msg(task_id: TaskID, cancel_confirm_type: TaskCancelConfirmType) -> "TaskCancelConfirm":
209
+ return TaskCancelConfirm(
210
+ _message.TaskCancelConfirm(taskId=bytes(task_id), cancelConfirmType=cancel_confirm_type.value)
211
+ )
212
+
213
+
214
+ class GraphTask(Message):
215
+ def __init__(self, msg):
216
+ super().__init__(msg)
217
+
218
+ def __repr__(self):
219
+ return (
220
+ f"GraphTask(\n"
221
+ f" task_id={self.task_id!r},\n"
222
+ f" targets=[\n"
223
+ f" {', '.join(repr(target) for target in self.targets)}\n"
224
+ f" ]\n"
225
+ f" graph={self.graph!r}\n"
226
+ f")"
227
+ )
228
+
229
+ @property
230
+ def task_id(self) -> TaskID:
231
+ return TaskID(self._msg.taskId)
232
+
233
+ @property
234
+ def source(self) -> ClientID:
235
+ return ClientID(self._msg.source)
236
+
237
+ @property
238
+ def targets(self) -> List[TaskID]:
239
+ return [TaskID(target) for target in self._msg.targets]
240
+
241
+ @property
242
+ def graph(self) -> List[Task]:
243
+ return [Task(task) for task in self._msg.graph]
244
+
245
+ @staticmethod
246
+ def new_msg(task_id: TaskID, source: ClientID, targets: List[TaskID], graph: List[Task]) -> "GraphTask":
247
+ return GraphTask(
248
+ _message.GraphTask(
249
+ taskId=bytes(task_id),
250
+ source=bytes(source),
251
+ targets=[bytes(target) for target in targets],
252
+ graph=[task.get_message() for task in graph],
253
+ )
254
+ )
255
+
256
+
257
+ class ClientHeartbeat(Message):
258
+ def __init__(self, msg):
259
+ super().__init__(msg)
260
+
261
+ @property
262
+ def resource(self) -> Resource:
263
+ return Resource(self._msg.resource)
264
+
265
+ @property
266
+ def latency_us(self) -> int:
267
+ return self._msg.latencyUS
268
+
269
+ @staticmethod
270
+ def new_msg(resource: Resource, latency_us: int) -> "ClientHeartbeat":
271
+ return ClientHeartbeat(_message.ClientHeartbeat(resource=resource.get_message(), latencyUS=latency_us))
272
+
273
+
274
+ class ClientHeartbeatEcho(Message):
275
+ def __init__(self, msg):
276
+ super().__init__(msg)
277
+
278
+ def object_storage_address(self) -> ObjectStorageAddress:
279
+ return ObjectStorageAddress(self._msg.objectStorageAddress)
280
+
281
+ @staticmethod
282
+ def new_msg(object_storage_address: ObjectStorageAddress) -> "ClientHeartbeatEcho":
283
+ return ClientHeartbeatEcho(
284
+ _message.ClientHeartbeatEcho(objectStorageAddress=object_storage_address.get_message())
285
+ )
286
+
287
+
288
+ class WorkerHeartbeat(Message):
289
+ def __init__(self, msg):
290
+ super().__init__(msg)
291
+
292
+ @property
293
+ def agent(self) -> Resource:
294
+ return Resource(self._msg.agent)
295
+
296
+ @property
297
+ def rss_free(self) -> int:
298
+ return self._msg.rssFree
299
+
300
+ @property
301
+ def queue_size(self) -> int:
302
+ return self._msg.queueSize
303
+
304
+ @property
305
+ def queued_tasks(self) -> int:
306
+ return self._msg.queuedTasks
307
+
308
+ @property
309
+ def latency_us(self) -> int:
310
+ return self._msg.latencyUS
311
+
312
+ @property
313
+ def task_lock(self) -> bool:
314
+ return self._msg.taskLock
315
+
316
+ @property
317
+ def processors(self) -> List[ProcessorStatus]:
318
+ return [ProcessorStatus(p) for p in self._msg.processors]
319
+
320
+ @property
321
+ def capabilities(self) -> Dict[str, int]:
322
+ return {capability.name: capability.value for capability in self._msg.capabilities}
323
+
324
+ @staticmethod
325
+ def new_msg(
326
+ agent: Resource,
327
+ rss_free: int,
328
+ queue_size: int,
329
+ queued_tasks: int,
330
+ latency_us: int,
331
+ task_lock: bool,
332
+ processors: List[ProcessorStatus],
333
+ capabilities: Dict[str, int],
334
+ ) -> "WorkerHeartbeat":
335
+ return WorkerHeartbeat(
336
+ _message.WorkerHeartbeat(
337
+ agent=agent.get_message(),
338
+ rssFree=rss_free,
339
+ queueSize=queue_size,
340
+ queuedTasks=queued_tasks,
341
+ latencyUS=latency_us,
342
+ taskLock=task_lock,
343
+ processors=[p.get_message() for p in processors],
344
+ capabilities=[
345
+ TaskCapability.new_msg(name, value).get_message() for name, value in capabilities.items()
346
+ ],
347
+ )
348
+ )
349
+
350
+
351
+ class WorkerHeartbeatEcho(Message):
352
+ def __init__(self, msg):
353
+ super().__init__(msg)
354
+
355
+ def object_storage_address(self) -> ObjectStorageAddress:
356
+ return ObjectStorageAddress(self._msg.objectStorageAddress)
357
+
358
+ @staticmethod
359
+ def new_msg(object_storage_address: ObjectStorageAddress) -> "WorkerHeartbeatEcho":
360
+ return WorkerHeartbeatEcho(
361
+ _message.WorkerHeartbeatEcho(objectStorageAddress=object_storage_address.get_message())
362
+ )
363
+
364
+
365
+ class ObjectInstruction(Message):
366
+ class ObjectInstructionType(enum.Enum):
367
+ Create = _message.ObjectInstruction.ObjectInstructionType.create
368
+ Delete = _message.ObjectInstruction.ObjectInstructionType.delete
369
+ Clear = _message.ObjectInstruction.ObjectInstructionType.clear
370
+
371
+ def __init__(self, msg):
372
+ super().__init__(msg)
373
+
374
+ @property
375
+ def instruction_type(self) -> ObjectInstructionType:
376
+ return ObjectInstruction.ObjectInstructionType(self._msg.instructionType.raw)
377
+
378
+ @property
379
+ def object_user(self) -> Optional[ClientID]:
380
+ return ClientID(self._msg.objectUser) if len(self._msg.objectUser) > 0 else None
381
+
382
+ @property
383
+ def object_metadata(self) -> ObjectMetadata:
384
+ return ObjectMetadata(self._msg.objectMetadata)
385
+
386
+ @staticmethod
387
+ def new_msg(
388
+ instruction_type: ObjectInstructionType, object_user: Optional[ClientID], object_metadata: ObjectMetadata
389
+ ) -> "ObjectInstruction":
390
+ return ObjectInstruction(
391
+ _message.ObjectInstruction(
392
+ instructionType=instruction_type.value,
393
+ objectUser=bytes(object_user) if object_user is not None else b"",
394
+ objectMetadata=object_metadata.get_message(),
395
+ )
396
+ )
397
+
398
+
399
+ class DisconnectRequest(Message):
400
+ def __init__(self, msg):
401
+ super().__init__(msg)
402
+
403
+ @property
404
+ def worker(self) -> WorkerID:
405
+ return WorkerID(self._msg.worker)
406
+
407
+ @staticmethod
408
+ def new_msg(worker: WorkerID) -> "DisconnectRequest":
409
+ return DisconnectRequest(_message.DisconnectRequest(worker=bytes(worker)))
410
+
411
+
412
+ @dataclasses.dataclass
413
+ class DisconnectResponse(Message):
414
+ def __init__(self, msg):
415
+ super().__init__(msg)
416
+
417
+ @property
418
+ def worker(self) -> WorkerID:
419
+ return WorkerID(self._msg.worker)
420
+
421
+ @staticmethod
422
+ def new_msg(worker: WorkerID) -> "DisconnectResponse":
423
+ return DisconnectResponse(_message.DisconnectResponse(worker=bytes(worker)))
424
+
425
+
426
+ class ClientDisconnect(Message):
427
+ class DisconnectType(enum.Enum):
428
+ Disconnect = _message.ClientDisconnect.DisconnectType.disconnect
429
+ Shutdown = _message.ClientDisconnect.DisconnectType.shutdown
430
+
431
+ def __init__(self, msg):
432
+ super().__init__(msg)
433
+
434
+ @property
435
+ def disconnect_type(self) -> DisconnectType:
436
+ return ClientDisconnect.DisconnectType(self._msg.disconnectType.raw)
437
+
438
+ @staticmethod
439
+ def new_msg(disconnect_type: DisconnectType) -> "ClientDisconnect":
440
+ return ClientDisconnect(_message.ClientDisconnect(disconnectType=disconnect_type.value))
441
+
442
+
443
+ class ClientShutdownResponse(Message):
444
+ def __init__(self, msg):
445
+ super().__init__(msg)
446
+
447
+ @property
448
+ def accepted(self) -> bool:
449
+ return self._msg.accepted
450
+
451
+ @staticmethod
452
+ def new_msg(accepted: bool) -> "ClientShutdownResponse":
453
+ return ClientShutdownResponse(_message.ClientShutdownResponse(accepted=accepted))
454
+
455
+
456
+ class StateClient(Message):
457
+ def __init__(self, msg):
458
+ super().__init__(msg)
459
+
460
+ @staticmethod
461
+ def new_msg() -> "StateClient":
462
+ return StateClient(_message.StateClient())
463
+
464
+
465
+ class StateObject(Message):
466
+ def __init__(self, msg):
467
+ super().__init__(msg)
468
+
469
+ @staticmethod
470
+ def new_msg() -> "StateObject":
471
+ return StateObject(_message.StateObject())
472
+
473
+
474
+ class StateBalanceAdvice(Message):
475
+ def __init__(self, msg):
476
+ super().__init__(msg)
477
+
478
+ @property
479
+ def worker_id(self) -> WorkerID:
480
+ return WorkerID(self._msg.workerId)
481
+
482
+ @property
483
+ def task_ids(self) -> List[TaskID]:
484
+ return [TaskID(task_id) for task_id in self._msg.taskIds]
485
+
486
+ @staticmethod
487
+ def new_msg(worker_id: WorkerID, task_ids: List[TaskID]) -> "StateBalanceAdvice":
488
+ return StateBalanceAdvice(
489
+ _message.StateBalanceAdvice(workerId=bytes(worker_id), taskIds=[bytes(task_id) for task_id in task_ids])
490
+ )
491
+
492
+
493
+ class StateScheduler(Message):
494
+ def __init__(self, msg):
495
+ super().__init__(msg)
496
+
497
+ @property
498
+ def binder(self) -> BinderStatus:
499
+ return BinderStatus(self._msg.binder)
500
+
501
+ @property
502
+ def scheduler(self) -> Resource:
503
+ return Resource(self._msg.scheduler)
504
+
505
+ @property
506
+ def rss_free(self) -> int:
507
+ return self._msg.rssFree
508
+
509
+ @property
510
+ def client_manager(self) -> ClientManagerStatus:
511
+ return ClientManagerStatus(self._msg.clientManager)
512
+
513
+ @property
514
+ def object_manager(self) -> ObjectManagerStatus:
515
+ return ObjectManagerStatus(self._msg.objectManager)
516
+
517
+ @property
518
+ def task_manager(self) -> TaskManagerStatus:
519
+ return TaskManagerStatus(self._msg.taskManager)
520
+
521
+ @property
522
+ def worker_manager(self) -> WorkerManagerStatus:
523
+ return WorkerManagerStatus(self._msg.workerManager)
524
+
525
+ @property
526
+ def scaling_manager(self) -> ScalingManagerStatus:
527
+ return ScalingManagerStatus(self._msg.scalingManager)
528
+
529
+ @staticmethod
530
+ def new_msg(
531
+ binder: BinderStatus,
532
+ scheduler: Resource,
533
+ rss_free: int,
534
+ client_manager: ClientManagerStatus,
535
+ object_manager: ObjectManagerStatus,
536
+ task_manager: TaskManagerStatus,
537
+ worker_manager: WorkerManagerStatus,
538
+ scaling_manager: ScalingManagerStatus,
539
+ ) -> "StateScheduler":
540
+ return StateScheduler(
541
+ _message.StateScheduler(
542
+ binder=binder.get_message(),
543
+ scheduler=scheduler.get_message(),
544
+ rssFree=rss_free,
545
+ clientManager=client_manager.get_message(),
546
+ objectManager=object_manager.get_message(),
547
+ taskManager=task_manager.get_message(),
548
+ workerManager=worker_manager.get_message(),
549
+ scalingManager=scaling_manager.get_message(),
550
+ )
551
+ )
552
+
553
+
554
+ class StateWorker(Message):
555
+ def __init__(self, msg):
556
+ super().__init__(msg)
557
+
558
+ @property
559
+ def worker_id(self) -> WorkerID:
560
+ return WorkerID(self._msg.workerId)
561
+
562
+ @property
563
+ def message(self) -> bytes:
564
+ return self._msg.message
565
+
566
+ @staticmethod
567
+ def new_msg(worker_id: WorkerID, message: bytes) -> "StateWorker":
568
+ return StateWorker(_message.StateWorker(workerId=bytes(worker_id), message=message))
569
+
570
+
571
+ class StateTask(Message):
572
+ def __init__(self, msg):
573
+ super().__init__(msg)
574
+
575
+ @property
576
+ def task_id(self) -> TaskID:
577
+ return TaskID(self._msg.taskId)
578
+
579
+ @property
580
+ def function_name(self) -> bytes:
581
+ return self._msg.functionName
582
+
583
+ @property
584
+ def state(self) -> TaskState:
585
+ return TaskState(self._msg.state.raw)
586
+
587
+ @property
588
+ def worker(self) -> WorkerID:
589
+ return WorkerID(self._msg.worker)
590
+
591
+ @property
592
+ def metadata(self) -> bytes:
593
+ return self._msg.metadata
594
+
595
+ @staticmethod
596
+ def new_msg(
597
+ task_id: TaskID, function_name: bytes, task_state: TaskState, worker: WorkerID, metadata: bytes = b""
598
+ ) -> "StateTask":
599
+ return StateTask(
600
+ _message.StateTask(
601
+ taskId=bytes(task_id),
602
+ functionName=function_name,
603
+ state=task_state.value,
604
+ worker=bytes(worker),
605
+ metadata=metadata,
606
+ )
607
+ )
608
+
609
+
610
+ class StateGraphTask(Message):
611
+ class NodeTaskType(enum.Enum):
612
+ Normal = _message.StateGraphTask.NodeTaskType.normal
613
+ Target = _message.StateGraphTask.NodeTaskType.target
614
+
615
+ def __init__(self, msg):
616
+ super().__init__(msg)
617
+
618
+ @property
619
+ def graph_task_id(self) -> TaskID:
620
+ return self._msg.graphTaskId
621
+
622
+ @property
623
+ def task_id(self) -> TaskID:
624
+ return self._msg.taskId
625
+
626
+ @property
627
+ def node_task_type(self) -> NodeTaskType:
628
+ return StateGraphTask.NodeTaskType(self._msg.nodeTaskType.raw)
629
+
630
+ @property
631
+ def parent_task_ids(self) -> Set[TaskID]:
632
+ return {TaskID(parent_task_id) for parent_task_id in self._msg.parentTaskIds}
633
+
634
+ @staticmethod
635
+ def new_msg(
636
+ graph_task_id: TaskID, task_id: TaskID, node_task_type: NodeTaskType, parent_task_ids: Set[TaskID]
637
+ ) -> "StateGraphTask":
638
+ return StateGraphTask(
639
+ _message.StateGraphTask(
640
+ graphTaskId=bytes(graph_task_id),
641
+ taskId=bytes(task_id),
642
+ nodeTaskType=node_task_type.value,
643
+ parentTaskIds=[bytes(parent_task_id) for parent_task_id in parent_task_ids],
644
+ )
645
+ )
646
+
647
+
648
+ class ProcessorInitialized(Message):
649
+ def __init__(self, msg):
650
+ super().__init__(msg)
651
+
652
+ @staticmethod
653
+ def new_msg() -> "ProcessorInitialized":
654
+ return ProcessorInitialized(_message.ProcessorInitialized())
655
+
656
+
657
+ class InformationRequest(Message):
658
+ def __init__(self, msg):
659
+ super().__init__(msg)
660
+
661
+ @property
662
+ def request(self) -> bytes:
663
+ return self._msg.request
664
+
665
+ @staticmethod
666
+ def new_msg(request: bytes) -> "InformationRequest":
667
+ return InformationRequest(_message.InformationRequest(request=request))
668
+
669
+
670
+ class InformationResponse(Message):
671
+ def __init__(self, msg):
672
+ super().__init__(msg)
673
+
674
+ @property
675
+ def response(self) -> bytes:
676
+ return self._msg.response
677
+
678
+ @staticmethod
679
+ def new_msg(response: bytes) -> "InformationResponse":
680
+ return InformationResponse(_message.InformationResponse(response=response))
681
+
682
+
683
+ # NOTE: This class is not a Message and does not have serialization methods. This is intentional.
684
+ class InformationSnapshot:
685
+ def __init__(self, tasks: Dict[TaskID, Task], workers: Dict[WorkerID, WorkerHeartbeat]):
686
+ self._tasks = tasks
687
+ self._workers = workers
688
+
689
+ @property
690
+ def tasks(self) -> Dict[TaskID, Task]:
691
+ return self._tasks
692
+
693
+ @property
694
+ def workers(self) -> Dict[WorkerID, WorkerHeartbeat]:
695
+ return self._workers
696
+
697
+
698
+ PROTOCOL: bidict.bidict[str, Type[Message]] = bidict.bidict(
699
+ {
700
+ "task": Task,
701
+ "taskCancel": TaskCancel,
702
+ "taskCancelConfirm": TaskCancelConfirm,
703
+ "taskResult": TaskResult,
704
+ "taskLog": TaskLog,
705
+ "graphTask": GraphTask,
706
+ "objectInstruction": ObjectInstruction,
707
+ "clientHeartbeat": ClientHeartbeat,
708
+ "clientHeartbeatEcho": ClientHeartbeatEcho,
709
+ "workerHeartbeat": WorkerHeartbeat,
710
+ "workerHeartbeatEcho": WorkerHeartbeatEcho,
711
+ "disconnectRequest": DisconnectRequest,
712
+ "disconnectResponse": DisconnectResponse,
713
+ "stateClient": StateClient,
714
+ "stateObject": StateObject,
715
+ "stateBalanceAdvice": StateBalanceAdvice,
716
+ "stateScheduler": StateScheduler,
717
+ "stateWorker": StateWorker,
718
+ "stateTask": StateTask,
719
+ "stateGraphTask": StateGraphTask,
720
+ "clientDisconnect": ClientDisconnect,
721
+ "clientShutdownResponse": ClientShutdownResponse,
722
+ "processorInitialized": ProcessorInitialized,
723
+ "informationRequest": InformationRequest,
724
+ "informationResponse": InformationResponse,
725
+ }
726
+ )