opengris-scaler 1.12.9__cp310-cp310-manylinux_2_28_x86_64.whl → 1.12.25__cp310-cp310-manylinux_2_28_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 (150) hide show
  1. {opengris_scaler-1.12.9.dist-info → opengris_scaler-1.12.25.dist-info}/METADATA +16 -22
  2. opengris_scaler-1.12.25.dist-info/RECORD +185 -0
  3. {opengris_scaler-1.12.9.dist-info → opengris_scaler-1.12.25.dist-info}/entry_points.txt +1 -0
  4. opengris_scaler.libs/{libcapnp-1-b787335c.1.0.so → libcapnp-1-137b6426.0.1.so} +0 -0
  5. opengris_scaler.libs/{libkj-1-094aa318.1.0.so → libkj-1-c3197b44.0.1.so} +0 -0
  6. scaler/client/agent/client_agent.py +7 -7
  7. scaler/client/agent/heartbeat_manager.py +5 -5
  8. scaler/client/client.py +32 -9
  9. scaler/cluster/cluster.py +4 -4
  10. scaler/cluster/combo.py +15 -13
  11. scaler/cluster/object_storage_server.py +7 -7
  12. scaler/cluster/scheduler.py +8 -5
  13. scaler/config/defaults.py +7 -0
  14. scaler/config/loader.py +1 -1
  15. scaler/config/section/cluster.py +2 -3
  16. scaler/config/section/ecs_worker_adapter.py +85 -0
  17. scaler/config/section/native_worker_adapter.py +2 -3
  18. scaler/config/section/object_storage_server.py +1 -0
  19. scaler/config/section/scheduler.py +8 -7
  20. scaler/config/section/symphony_worker_adapter.py +3 -3
  21. scaler/config/section/webui.py +5 -0
  22. scaler/config/types/network_backend.py +12 -0
  23. scaler/config/types/worker.py +1 -1
  24. scaler/entry_points/cluster.py +3 -3
  25. scaler/entry_points/object_storage_server.py +12 -8
  26. scaler/entry_points/scheduler.py +20 -11
  27. scaler/entry_points/top.py +1 -1
  28. scaler/entry_points/webui.py +23 -1
  29. scaler/entry_points/worker_adapter_ecs.py +191 -0
  30. scaler/entry_points/worker_adapter_native.py +1 -1
  31. scaler/entry_points/worker_adapter_symphony.py +5 -9
  32. scaler/io/async_binder.py +9 -5
  33. scaler/io/async_connector.py +1 -1
  34. scaler/io/async_object_storage_connector.py +74 -34
  35. scaler/io/sync_connector.py +1 -1
  36. scaler/io/sync_object_storage_connector.py +93 -31
  37. scaler/io/sync_subscriber.py +1 -1
  38. scaler/io/utility.py +50 -1
  39. scaler/io/ymq/_ymq.pyi +4 -5
  40. scaler/io/ymq/ymq.py +24 -16
  41. scaler/io/ymq_async_object_storage_connector.py +184 -0
  42. scaler/io/ymq_sync_object_storage_connector.py +184 -0
  43. scaler/object_storage/object_storage_server.so +0 -0
  44. scaler/protocol/capnp/common.capnp +5 -0
  45. scaler/protocol/capnp/message.capnp +4 -2
  46. scaler/protocol/capnp/object_storage.capnp +5 -0
  47. scaler/protocol/python/common.py +5 -0
  48. scaler/protocol/python/message.py +30 -5
  49. scaler/scheduler/allocate_policy/capability_allocate_policy.py +1 -1
  50. scaler/scheduler/controllers/information_controller.py +1 -1
  51. scaler/scheduler/controllers/mixins.py +0 -7
  52. scaler/scheduler/controllers/scaling_policies/__init__.py +0 -0
  53. scaler/scheduler/controllers/scaling_policies/fixed_elastic.py +145 -0
  54. scaler/scheduler/controllers/scaling_policies/mixins.py +10 -0
  55. scaler/scheduler/controllers/scaling_policies/null.py +14 -0
  56. scaler/scheduler/controllers/scaling_policies/types.py +9 -0
  57. scaler/scheduler/controllers/scaling_policies/utility.py +20 -0
  58. scaler/scheduler/controllers/{scaling_controller.py → scaling_policies/vanilla.py} +25 -16
  59. scaler/scheduler/controllers/task_controller.py +4 -1
  60. scaler/scheduler/controllers/worker_controller.py +3 -2
  61. scaler/scheduler/scheduler.py +10 -12
  62. scaler/ui/live_display.py +32 -3
  63. scaler/ui/memory_window.py +14 -14
  64. scaler/ui/setting_page.py +7 -15
  65. scaler/ui/task_graph.py +653 -191
  66. scaler/ui/task_log.py +47 -23
  67. scaler/ui/utility.py +36 -5
  68. scaler/ui/webui.py +38 -16
  69. scaler/ui/worker_processors.py +23 -4
  70. scaler/utility/identifiers.py +7 -5
  71. scaler/version.txt +1 -1
  72. scaler/worker/agent/heartbeat_manager.py +8 -8
  73. scaler/worker/agent/mixins.py +2 -2
  74. scaler/worker/agent/processor/processor.py +11 -5
  75. scaler/worker/agent/processor_holder.py +7 -5
  76. scaler/worker/agent/processor_manager.py +7 -3
  77. scaler/worker/worker.py +9 -8
  78. scaler/worker_adapter/common.py +26 -0
  79. scaler/worker_adapter/ecs.py +269 -0
  80. scaler/worker_adapter/native.py +17 -16
  81. scaler/worker_adapter/symphony/heartbeat_manager.py +7 -7
  82. scaler/worker_adapter/symphony/task_manager.py +2 -1
  83. scaler/worker_adapter/symphony/worker.py +7 -8
  84. scaler/worker_adapter/symphony/worker_adapter.py +12 -15
  85. src/scaler/io/ymq/_ymq.so +0 -0
  86. opengris_scaler-1.12.9.dist-info/RECORD +0 -231
  87. scaler/CMakeLists.txt +0 -11
  88. scaler/io/ymq/CMakeLists.txt +0 -97
  89. scaler/io/ymq/_ymq.so +0 -0
  90. scaler/io/ymq/bytes.h +0 -114
  91. scaler/io/ymq/common.h +0 -29
  92. scaler/io/ymq/configuration.h +0 -60
  93. scaler/io/ymq/epoll_context.cpp +0 -185
  94. scaler/io/ymq/epoll_context.h +0 -84
  95. scaler/io/ymq/error.h +0 -132
  96. scaler/io/ymq/event_loop.h +0 -55
  97. scaler/io/ymq/event_loop_thread.cpp +0 -64
  98. scaler/io/ymq/event_loop_thread.h +0 -46
  99. scaler/io/ymq/event_manager.h +0 -81
  100. scaler/io/ymq/interruptive_concurrent_queue.h +0 -169
  101. scaler/io/ymq/io_context.cpp +0 -98
  102. scaler/io/ymq/io_context.h +0 -44
  103. scaler/io/ymq/io_socket.cpp +0 -299
  104. scaler/io/ymq/io_socket.h +0 -121
  105. scaler/io/ymq/iocp_context.cpp +0 -102
  106. scaler/io/ymq/iocp_context.h +0 -83
  107. scaler/io/ymq/logging.h +0 -163
  108. scaler/io/ymq/message.h +0 -15
  109. scaler/io/ymq/message_connection.h +0 -16
  110. scaler/io/ymq/message_connection_tcp.cpp +0 -672
  111. scaler/io/ymq/message_connection_tcp.h +0 -96
  112. scaler/io/ymq/network_utils.h +0 -179
  113. scaler/io/ymq/pymod_ymq/bytes.h +0 -113
  114. scaler/io/ymq/pymod_ymq/exception.h +0 -124
  115. scaler/io/ymq/pymod_ymq/gil.h +0 -15
  116. scaler/io/ymq/pymod_ymq/io_context.h +0 -166
  117. scaler/io/ymq/pymod_ymq/io_socket.h +0 -285
  118. scaler/io/ymq/pymod_ymq/message.h +0 -99
  119. scaler/io/ymq/pymod_ymq/python.h +0 -153
  120. scaler/io/ymq/pymod_ymq/ymq.cpp +0 -23
  121. scaler/io/ymq/pymod_ymq/ymq.h +0 -357
  122. scaler/io/ymq/readme.md +0 -114
  123. scaler/io/ymq/simple_interface.cpp +0 -80
  124. scaler/io/ymq/simple_interface.h +0 -24
  125. scaler/io/ymq/tcp_client.cpp +0 -367
  126. scaler/io/ymq/tcp_client.h +0 -75
  127. scaler/io/ymq/tcp_operations.h +0 -41
  128. scaler/io/ymq/tcp_server.cpp +0 -410
  129. scaler/io/ymq/tcp_server.h +0 -79
  130. scaler/io/ymq/third_party/concurrentqueue.h +0 -3747
  131. scaler/io/ymq/timed_queue.h +0 -272
  132. scaler/io/ymq/timestamp.h +0 -102
  133. scaler/io/ymq/typedefs.h +0 -20
  134. scaler/io/ymq/utils.h +0 -34
  135. scaler/object_storage/CMakeLists.txt +0 -48
  136. scaler/object_storage/constants.h +0 -11
  137. scaler/object_storage/defs.h +0 -14
  138. scaler/object_storage/io_helper.cpp +0 -44
  139. scaler/object_storage/io_helper.h +0 -9
  140. scaler/object_storage/message.cpp +0 -56
  141. scaler/object_storage/message.h +0 -130
  142. scaler/object_storage/object_manager.cpp +0 -126
  143. scaler/object_storage/object_manager.h +0 -52
  144. scaler/object_storage/object_storage_server.cpp +0 -366
  145. scaler/object_storage/object_storage_server.h +0 -127
  146. scaler/object_storage/pymod_object_storage_server.cpp +0 -115
  147. {opengris_scaler-1.12.9.dist-info → opengris_scaler-1.12.25.dist-info}/WHEEL +0 -0
  148. {opengris_scaler-1.12.9.dist-info → opengris_scaler-1.12.25.dist-info}/licenses/LICENSE +0 -0
  149. {opengris_scaler-1.12.9.dist-info → opengris_scaler-1.12.25.dist-info}/licenses/LICENSE.spdx +0 -0
  150. {opengris_scaler-1.12.9.dist-info → opengris_scaler-1.12.25.dist-info}/licenses/NOTICE +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: opengris-scaler
3
- Version: 1.12.9
3
+ Version: 1.12.25
4
4
  Summary: OpenGRIS Scaler Distribution Framework
5
5
  Author-Email: Citi <opensource@citi.com>
6
6
  License: Apache 2.0
@@ -9,11 +9,11 @@ Classifier: License :: OSI Approved :: Apache Software License
9
9
  Classifier: Intended Audience :: Developers
10
10
  Classifier: Operating System :: OS Independent
11
11
  Classifier: Topic :: System :: Distributed Computing
12
- Project-URL: Home, https://github.com/Citi/scaler
12
+ Project-URL: Home, https://github.com/finos/opengris-scaler
13
13
  Requires-Python: >=3.8
14
14
  Requires-Dist: bidict
15
15
  Requires-Dist: cloudpickle
16
- Requires-Dist: psutil==7.1.0
16
+ Requires-Dist: psutil==7.1.3
17
17
  Requires-Dist: pycapnp==2.1.0
18
18
  Requires-Dist: pyzmq
19
19
  Requires-Dist: sortedcontainers==2.4.0
@@ -21,24 +21,28 @@ Requires-Dist: tblib
21
21
  Requires-Dist: aiohttp
22
22
  Requires-Dist: graphlib-backport; python_version < "3.9"
23
23
  Requires-Dist: typing-extensions>=4.0; python_version < "3.10"
24
+ Requires-Dist: tomli; python_version < "3.11"
24
25
  Provides-Extra: uvloop
25
26
  Requires-Dist: uvloop; platform_system != "Windows" and extra == "uvloop"
26
27
  Provides-Extra: gui
27
28
  Requires-Dist: nicegui[plotly]==2.24.2; python_version == "3.8" and extra == "gui"
28
- Requires-Dist: nicegui[plotly]==3.0.3; python_version >= "3.9" and extra == "gui"
29
+ Requires-Dist: nicegui[plotly]==3.2.0; python_version >= "3.9" and extra == "gui"
29
30
  Provides-Extra: graphblas
30
31
  Requires-Dist: python-graphblas; extra == "graphblas"
31
32
  Requires-Dist: numpy==1.24.4; python_version == "3.8" and extra == "graphblas"
32
33
  Requires-Dist: numpy==2.0.2; python_version == "3.9" and extra == "graphblas"
33
34
  Requires-Dist: numpy==2.2.6; python_version >= "3.10" and extra == "graphblas"
35
+ Provides-Extra: aws
36
+ Requires-Dist: boto3; extra == "aws"
34
37
  Provides-Extra: all
35
38
  Requires-Dist: nicegui[plotly]==2.24.2; python_version == "3.8" and extra == "all"
36
- Requires-Dist: nicegui[plotly]==3.0.3; python_version >= "3.9" and extra == "all"
39
+ Requires-Dist: nicegui[plotly]==3.2.0; python_version >= "3.9" and extra == "all"
37
40
  Requires-Dist: python-graphblas; extra == "all"
38
41
  Requires-Dist: numpy==1.24.4; python_version == "3.8" and extra == "all"
39
42
  Requires-Dist: numpy==2.0.2; python_version == "3.9" and extra == "all"
40
43
  Requires-Dist: numpy==2.2.6; python_version >= "3.10" and extra == "all"
41
44
  Requires-Dist: uvloop; platform_system != "Windows" and extra == "all"
45
+ Requires-Dist: boto3; extra == "all"
42
46
  Description-Content-Type: text/markdown
43
47
 
44
48
  <div align="center">
@@ -58,12 +62,12 @@ Description-Content-Type: text/markdown
58
62
  <img src="https://img.shields.io/badge/Documentation-0f1632">
59
63
  </a>
60
64
  <a href="./LICENSE">
61
- <img src="https://img.shields.io/github/license/citi/scaler?label=license&colorA=0f1632&colorB=255be3">
65
+ <img src="https://img.shields.io/github/license/finos/opengris-scaler?label=license&colorA=0f1632&colorB=255be3">
62
66
  </a>
63
- <a href="https://pypi.org/project/scaler">
64
- <img alt="PyPI - Version" src="https://img.shields.io/pypi/v/scaler?colorA=0f1632&colorB=255be3">
67
+ <a href="https://pypi.org/project/opengris-scaler">
68
+ <img alt="PyPI - Version" src="https://img.shields.io/pypi/v/opengris-scaler?colorA=0f1632&colorB=255be3">
65
69
  </a>
66
- <img src="https://api.securityscorecards.dev/projects/github.com/Citi/scaler/badge">
70
+ <img src="https://api.securityscorecards.dev/projects/github.com/finos/opengris-scaler/badge">
67
71
  </p>
68
72
  </div>
69
73
 
@@ -365,6 +369,8 @@ with Client(address="tcp://127.0.0.1:2345") as client:
365
369
  print(future.result()) # 21
366
370
  ```
367
371
 
372
+ **Note**: When creating a `Client` inside a task (nested client), the `address` parameter is optional. If omitted, the client automatically uses the scheduler address from the worker context. If provided, the specified address takes precedence.
373
+
368
374
  ## Task Routing and Capability Management
369
375
 
370
376
  > **Note**: This feature is experimental and may change in future releases.
@@ -669,21 +675,9 @@ Windows.
669
675
  Build the Python wheel for Scaler using `cibuildwheel`:
670
676
 
671
677
  ```bash
672
- pip install build cibuildwheel==2.23.3
673
-
674
- # Parametrize the cibuildwheel's container to build the Boost and Cap'n Proto dependencies.
675
- export CIBW_BEFORE_ALL='
676
- yum install sudo -y;
677
- sudo ./scripts/library_tool.sh capnp compile
678
- sudo ./scripts/library_tool.sh capnp install
679
- sudo ./scripts/library_tool.sh boost compile
680
- sudo ./scripts/library_tool.sh boost install'
681
- export CIBW_BUILD="*manylinux_x86_64"
682
- export CIBW_SKIP="pp*"
683
- export CIBW_MANYLINUX_X86_64_IMAGE="manylinux_2_28"
678
+ pip install build cibuildwheel
684
679
 
685
680
  python -m cibuildwheel --output-dir wheelhouse
686
-
687
681
  python -m build --sdist
688
682
  ```
689
683
 
@@ -0,0 +1,185 @@
1
+ opengris_scaler.libs/libcapnp-1-137b6426.0.1.so,sha256=4KTrkbBHZXfEDTLhqzpzD9xdfhPWb5h4YE91ueCbw80,4099705
2
+ opengris_scaler.libs/libkj-1-c3197b44.0.1.so,sha256=mPaFmGWCX4oh-xNhVVUmu2DDE7ColL3xzBW6oQinh3w,2769281
3
+ scaler/__init__.py,sha256=nZU5QZ9oW2YIaGwm3-r-6dfmirTVzZpDPDNtX-ITCV4,513
4
+ scaler/about.py,sha256=OBcfSvHO0P3mWaa2Ci4WEOTbH7is-3uYymScxgZPxyg,161
5
+ scaler/version.txt,sha256=48jrGjRqJO8UZKkPuDzsUwD-BKPHQuDKo9tu24YVxKw,8
6
+ scaler/client/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
+ scaler/client/client.py,sha256=tZywq0208n7as62ShckPdeI8soFXh3AaS1pGBCVJrZo,25535
8
+ scaler/client/future.py,sha256=fOl5g4Is4E5jtvO0kmRk4uUs_eUjSjMmyniYhWMAH4w,10041
9
+ scaler/client/object_buffer.py,sha256=MBjz1Rf6ufgTyjMYoV8V78xpezot0aUit41nj-5kV50,4670
10
+ scaler/client/object_reference.py,sha256=Pow064leLlO6OhfW-yyEjcesbzn22ijqGBSQlsQNEtU,606
11
+ scaler/client/agent/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
12
+ scaler/client/agent/client_agent.py,sha256=nPYGl1qpKLAPRMI5ip5o5F5fU-6Yl_M2Nk3Ln8qPkD8,8078
13
+ scaler/client/agent/disconnect_manager.py,sha256=eNy8QKYgsJi4xnyJING0URx48lyaK2GxNYv-GYWYUmg,1189
14
+ scaler/client/agent/future_manager.py,sha256=SS4ucAjg_p8pAH3VSgfhC8dur6xvEyljwbaOoxoNA2g,4713
15
+ scaler/client/agent/heartbeat_manager.py,sha256=1iF3UKQXHe_UK83HFCZFBMOiqZQzg3yCd2Y6cEIJHtw,2772
16
+ scaler/client/agent/mixins.py,sha256=L7G2XwvSUvlHq5bYQfPCstYbQUtSh0r4A69cq69jh2w,2429
17
+ scaler/client/agent/object_manager.py,sha256=ATAjsxcTc4zbT1SEA-1e4aoCPteFczdWKfbsgRYWf9s,4226
18
+ scaler/client/agent/task_manager.py,sha256=7dr6rv3IAlyISII_SPzeLgQCEZnskiv9Qw3cfV4Sg7U,2833
19
+ scaler/client/serializer/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
20
+ scaler/client/serializer/default.py,sha256=MU0xosP_IRiTlDHogZtceM6Dfl54KvxHGnnbuwmLlb0,385
21
+ scaler/client/serializer/mixins.py,sha256=R3HWteJ54AC5yAK8nsyhWbYTuMDdkQgDi95aOtAS3Qs,1401
22
+ scaler/cluster/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
23
+ scaler/cluster/cluster.py,sha256=so9qfYC0stvXyULK5-gvDqwdF2SRRMPMGGjHTPYp4uA,4505
24
+ scaler/cluster/combo.py,sha256=B6nDOcSoNGhQLJQGEyJVyhjPLNxfUSknwg_UfF1VNnU,6584
25
+ scaler/cluster/object_storage_server.py,sha256=0X6afXygpEB1xJ9MAgMIjcH2uufTT8L8RGA2MVmQVmc,1684
26
+ scaler/cluster/scheduler.py,sha256=pg-sLzuDuBWifmcb0wcQB1kSZZu0y7FinHWsnGGxT5I,3509
27
+ scaler/config/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
28
+ scaler/config/defaults.py,sha256=qh8zWrevVPBOLW5O85Tz031oiPUpkHbRal5fWBDuVGQ,3047
29
+ scaler/config/loader.py,sha256=bjBGPv0AeYH8Hh3hOs2GsMB3M2Y5nXWL5eKG4r6KKYU,3866
30
+ scaler/config/mixins.py,sha256=o1YivS_8AzejSQ_jfSt5bkaA59DQGbw9P-rO5Z7LFVs,443
31
+ scaler/config/section/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
32
+ scaler/config/section/cluster.py,sha256=A17dfUUOUmT4f8UIFB6gBv2TaFCVlhcgXVx1MbbN7x4,2861
33
+ scaler/config/section/ecs_worker_adapter.py,sha256=hNTA6OZbUk1BxVQDiOhvdPriM_w77o19jzJ8c0JlZZ8,4225
34
+ scaler/config/section/native_worker_adapter.py,sha256=yu5NTJscxtOqvTJHwXlKPgBkIi4nRz8-LfGfsD7UCzk,2268
35
+ scaler/config/section/object_storage_server.py,sha256=XmRBD4Bl7Xs1wiEzppIG0JFS9Ma4NbC6sKiTKc_aMuI,200
36
+ scaler/config/section/scheduler.py,sha256=XtZ6fd51SVpkBjYG_XDmu2DqRZuLCTOD1vWYgplh5Yc,2883
37
+ scaler/config/section/symphony_worker_adapter.py,sha256=PJTuSppV7iObfLvXaUVf3vbcNQlipaE5hqkPtArG1Yg,2024
38
+ scaler/config/section/top.py,sha256=4YUCyZTRVfINUhV56j50pg8be5o8nlWxG08fDqofHrA,288
39
+ scaler/config/section/webui.py,sha256=WOiwbDcL7jJ0EPCwlWp-9XWoPFRRQUYQJkIYtk5qVRo,727
40
+ scaler/config/types/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
41
+ scaler/config/types/network_backend.py,sha256=o-tBD08ScOohuffqLyN3qeB-Ng4o-cGI8LWDR1ZLE4Y,321
42
+ scaler/config/types/object_storage_server.py,sha256=xvuCwiAQ4C_hKgTI4y6XMx9NKE0aX2QC6dlWNyvJyk4,1338
43
+ scaler/config/types/worker.py,sha256=ney8uqCzf5j_uPIghzj6Nd-OHDeTK6tZF8m4sVNCUM8,1708
44
+ scaler/config/types/zmq.py,sha256=0VODax61H-4PxN6rIeWKlMXOHiW5elVSt1zc-UF0SL8,2593
45
+ scaler/entry_points/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
46
+ scaler/entry_points/cluster.py,sha256=6EX08djqhtQZfwUiqeyOVJBytWCYFehqs9Utas--wy4,5801
47
+ scaler/entry_points/object_storage_server.py,sha256=YGDl9-ws0oha1YXXl3gFH660B-IV2o06gCp41zUovdg,1418
48
+ scaler/entry_points/scheduler.py,sha256=OMaxx45d7ErzcAs57DgmYEqm28sHLTrIsuUJy9sLGdU,6476
49
+ scaler/entry_points/top.py,sha256=FRlF6Dk8b3sL41CTENGauBBxrMZx5JjoufqFbGiwQCU,9531
50
+ scaler/entry_points/webui.py,sha256=2xiii_T0PI8pTLJB0RKLMajRDaNYFOKaSP2X9bujMlU,1823
51
+ scaler/entry_points/worker_adapter_ecs.py,sha256=O6ypeF4asnqAw1037O2Ams2Q0kivYIeYKwTUu9hI4Rk,7836
52
+ scaler/entry_points/worker_adapter_native.py,sha256=7oN6nOdri0qvvLB6YrnF1SwExQklKFkLQMo26PPXZG8,5426
53
+ scaler/entry_points/worker_adapter_symphony.py,sha256=D1X0Y_-6lbVnVCHtwZ8fSEbgtAkMU6JLqjgEdmO_VWI,4408
54
+ scaler/io/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
55
+ scaler/io/async_binder.py,sha256=KNZSnHD9rNbxuxGd5U0gU023Z5Ys3nVsn31KGvjOVoE,3101
56
+ scaler/io/async_connector.py,sha256=7op2onZTGVzEiBWMH3ZMAEdST01SPzu8FvyWskI768U,2638
57
+ scaler/io/async_object_storage_connector.py,sha256=F6CVMn4iMMynuMEmgH2dVAUBOnYIsQGLbnL4U1m2r3o,7767
58
+ scaler/io/mixins.py,sha256=915V2W1NU1SjC94ioPQs0SlWlo4DiZs1YqE2POIxoRQ,4150
59
+ scaler/io/sync_connector.py,sha256=S3kQkzliIlW2-EXEOjkCl6_tw0l6ur3HdVR7RQvcrho,1964
60
+ scaler/io/sync_object_storage_connector.py,sha256=NkmjfYYbeXy0Tdw5gQNirzMAHxWv8Po6DXON83-JdfU,9352
61
+ scaler/io/sync_subscriber.py,sha256=2DOKd2xKIGc8-J2hUtqT8uO7RxGwjJQMtfqHF4fvgH0,2523
62
+ scaler/io/utility.py,sha256=qVz-ama9_fuiUk6uvoghD7g8f2c8PVU-N725nwMdKm8,3131
63
+ scaler/io/ymq_async_object_storage_connector.py,sha256=_eWEkOtpQGk3FtEqczILrohxy-LfCncVV2Q-h-hwrzc,6635
64
+ scaler/io/ymq_sync_object_storage_connector.py,sha256=E-pwyXtHHbU9IZ2NAeMO-n1Y04Gx5cp41fFcdOqTkEQ,7329
65
+ scaler/io/ymq/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
66
+ scaler/io/ymq/_ymq.pyi,sha256=1yD4ZzoKsHwHGVfaAm1X24LCg0rgMidj8ILiq_81Gug,3063
67
+ scaler/io/ymq/ymq.py,sha256=iu0xEkn2mONDB9MkDolYwZ9COtKFsCJU0Q23tRYosS8,4919
68
+ scaler/object_storage/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
69
+ scaler/object_storage/object_storage_server.so,sha256=kr-B1r21AlGaSG5pNGZHHrg4aI1bmQRoeGMD49dlOy0,1372993
70
+ scaler/protocol/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
71
+ scaler/protocol/introduction.md,sha256=G8oRzui4KmSlfFUu70y24tTmDmfEKBkog9tFVUn7G1U,5406
72
+ scaler/protocol/worker.md,sha256=o2Hh_HCooqrptpXcHGzuzUkO_o4NWOurp7ja-DQi5ho,10503
73
+ scaler/protocol/capnp/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
74
+ scaler/protocol/capnp/_python.py,sha256=VfKp2UQBJHiW8Lh6sjQnmW4tl0BQenIPHKD05ALC_dk,284
75
+ scaler/protocol/capnp/common.capnp,sha256=OAXGJt8cAVQATh3h-SBiEVZ5znC78VblMg1m6Uq-Azo,1733
76
+ scaler/protocol/capnp/message.capnp,sha256=SxgeMdT4YsJQIxjq5Ab3TITmhKKkh_WEYQx9HFsD0sQ,4598
77
+ scaler/protocol/capnp/object_storage.capnp,sha256=YFOMPggwqwZXRW-U5WUzR8kEFN-tNBrxppCWywGIiDI,1764
78
+ scaler/protocol/capnp/status.capnp,sha256=Jr3fGv46CdhN-UmWAmLvNWaPUxcUulOActbA5rvrsa8,1359
79
+ scaler/protocol/python/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
80
+ scaler/protocol/python/common.py,sha256=Xb2289e-C13sY8_piZf_Gz4eX20mp_dhdSUjxr5Rnqc,5238
81
+ scaler/protocol/python/message.py,sha256=de4g1ck82fH5l8xbTS2xUKc_dW8PMmPrxjiQLFXHQNk,22518
82
+ scaler/protocol/python/mixins.py,sha256=BjGRDyjgezg6_3-68NO-E-0nhu20RQ8CJTyLZBCo9vo,238
83
+ scaler/protocol/python/object_storage.py,sha256=gWmtwtAbUOEZUNooDpvU5jUvdfZGFuzY0ehSptAyH3w,3915
84
+ scaler/protocol/python/status.py,sha256=u_5leag2vHhpbA4lw2U9FJyWC8_b7rnXPhK5FelGBwk,7808
85
+ scaler/scheduler/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
86
+ scaler/scheduler/scheduler.py,sha256=JX-FR-CgtgfVp9Nw1mg-T7pPGXOdPiBkhLHJDYAfjXw,11163
87
+ scaler/scheduler/allocate_policy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
88
+ scaler/scheduler/allocate_policy/allocate_policy.py,sha256=efBAR2bzkct3mRf94NLlYtVszdWLrm5CTWuyAD9LH-s,315
89
+ scaler/scheduler/allocate_policy/capability_allocate_policy.py,sha256=ya47keTt679fADdHyqPDohthx0aO2AG1LlIqx3lf0EU,11836
90
+ scaler/scheduler/allocate_policy/even_load_allocate_policy.py,sha256=zzeRfbw7_SqZdQf7DC9Gf1CIA65DQL44q9K56pyEr8E,5906
91
+ scaler/scheduler/allocate_policy/mixins.py,sha256=LKcG-B_Xb7WvueD59ZThEaLTD8yFwf3u9oi0wkLtN00,2229
92
+ scaler/scheduler/controllers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
93
+ scaler/scheduler/controllers/balance_controller.py,sha256=b5HfiR0C4zu0NhXgEAQvaQ00rM82txeq7VSuLqMpyPY,2858
94
+ scaler/scheduler/controllers/client_controller.py,sha256=_BJbHEz7MPPMgb7vw8qwZYokFQPAjY5JOdO0sy5ZYHk,5262
95
+ scaler/scheduler/controllers/config_controller.py,sha256=8YM4Ofg8biZLfkkQUEIhgnWBjOVp_5iYieNeavkt4zA,1064
96
+ scaler/scheduler/controllers/graph_controller.py,sha256=RmqzLjZ8e5X2IZdcnQrbNBYcrCe-8oy1-RX64U6kCP4,17549
97
+ scaler/scheduler/controllers/information_controller.py,sha256=34BRJ6JzPrtE3QHn87uMnCtuW7_YILZjA9OLDCB7PkM,3318
98
+ scaler/scheduler/controllers/mixins.py,sha256=7zdcIln95MEOuv0hECT7uIXFmTwWcrCdx-7ES66BNNY,6149
99
+ scaler/scheduler/controllers/object_controller.py,sha256=PNHiQ3-92jbbHwKjQ_YVbupmFbBhMJ5ilom1MxnRIm4,6173
100
+ scaler/scheduler/controllers/task_controller.py,sha256=9Rhenwqeqypb2uBpF7wCXOKur618O2ZmOTOmtzRezLw,18208
101
+ scaler/scheduler/controllers/worker_controller.py,sha256=GJ3MthFyijwRcn2J_LZWAoKLbGTO33_qqROelGjywqA,7024
102
+ scaler/scheduler/controllers/scaling_policies/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
103
+ scaler/scheduler/controllers/scaling_policies/fixed_elastic.py,sha256=jJKpDFkGxhO4_cwA0rJohLtwEGvmVGte0HM5U46EZLM,6607
104
+ scaler/scheduler/controllers/scaling_policies/mixins.py,sha256=-j1YCJLNO5T7s4H3WvpDVLfBSGHzcN2V6k-yobI1rBc,279
105
+ scaler/scheduler/controllers/scaling_policies/null.py,sha256=Z15jvo2WoWUNLYw19GSE1uxXWILRRYB58seK8e39BCc,475
106
+ scaler/scheduler/controllers/scaling_policies/types.py,sha256=tGFq2HNWJoc06P5KKHzH3uq0LfjPtfkZpMcVjIxeTuM,159
107
+ scaler/scheduler/controllers/scaling_policies/utility.py,sha256=WWcCBzNL87gZr2ygKBIMKgWh0oFvI-K3PkAXUQozCSU,1146
108
+ scaler/scheduler/controllers/scaling_policies/vanilla.py,sha256=PdfdJzd2SlQ5CEXv7JHe0hAMzW3vUuYU0mnTFr_fPTQ,4253
109
+ scaler/scheduler/object_usage/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
110
+ scaler/scheduler/object_usage/object_tracker.py,sha256=cx7n-TsgvhXK7bVqeam0LW6C8vaOPwKLeIRHSzW6Cxs,4600
111
+ scaler/scheduler/task/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
112
+ scaler/scheduler/task/task_state_machine.py,sha256=j743KFNK-NAv3XePnYK8rIzkwQbHYmJSpVKPEuD8d0o,3555
113
+ scaler/scheduler/task/task_state_manager.py,sha256=wrpLc-HsW7VzUTiNK8LsUPHxMrm8fiC9Rk3g29dwkt8,2590
114
+ scaler/ui/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
115
+ scaler/ui/constants.py,sha256=GVljwcm14bTpEj5k0Cfoe5NFXxepGFZl3Rm-mSHoZ-A,167
116
+ scaler/ui/live_display.py,sha256=eA44CkZlWW8Iovhc80AfhpRXdJ_CjErLd71ms6o1_LA,5525
117
+ scaler/ui/memory_window.py,sha256=lIyj-kM0oAzU1fAJpaBcoDOGPKnrHwRVvq8RAW68IgA,5578
118
+ scaler/ui/setting_page.py,sha256=crM_khWAe5sObYY7tM2umz1rCdDYsLVeYo7LDyS1onA,1277
119
+ scaler/ui/task_graph.py,sha256=El5JLRVAN1tyy3d31KCrTvAAiG4fmed0c-FZsdSiLNQ,34706
120
+ scaler/ui/task_log.py,sha256=RAHmytaaSuTJP8AmUb75-gSsyhIxWmxfjp6AxrcFU9M,3808
121
+ scaler/ui/utility.py,sha256=3mPucmAxd3mVvgGm-YFeyDVZsbc5hhsv5OllnP5r3Rk,2033
122
+ scaler/ui/webui.py,sha256=0L9WLF87oJsQ4QDw5AkXx9GHa9beH00sgIApA98zgxc,5836
123
+ scaler/ui/worker_processors.py,sha256=5oBmHVRunbJrZvq9z2aikYbEXmyn54M47BgN0KMFr9o,3837
124
+ scaler/utility/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
125
+ scaler/utility/debug.py,sha256=FKJZ0xyy9XFEzYB86H_Cfs-0Fd42oUr9rppY1Qd8Ikw,407
126
+ scaler/utility/event_list.py,sha256=-ifYdr2IiLNRzY72l6iAdDpkg8Rgfz5YkRxqudSKPX4,1532
127
+ scaler/utility/event_loop.py,sha256=BDKzbecbAfLWORGAIAiAG4KbObWCRnReD6t6o2IhIPE,1838
128
+ scaler/utility/exceptions.py,sha256=vXV1fUebZ8tRFGqTEDM6O5LsL_vScDHNQ8ZezdjEiPk,532
129
+ scaler/utility/formatter.py,sha256=QJUAxZWqWqrJb-MGRkHTeRHkJNRcpPg4Q_E5VOlhMsI,1008
130
+ scaler/utility/identifiers.py,sha256=zh6LGFmk6DZ7Hdz1a56dH_nWXqfbbwn82lGjRfRXrjA,2991
131
+ scaler/utility/many_to_many_dict.py,sha256=JLv3a3Wb6OcXT462exMZ_LsrizXWXUdQCz_WCTBV3bM,4641
132
+ scaler/utility/mixins.py,sha256=0b4_tTc35J5Aa8Ac9hn5j6-OL6sLmgD-9xm24-C51YA,266
133
+ scaler/utility/network_util.py,sha256=OeypHvDEHNlz-U7MucBDglyVg9LahLNsqwwpXjW-ot0,243
134
+ scaler/utility/one_to_many_dict.py,sha256=NpRrTfw9ubSTxyzt1RNp6CpKhehyny6ZM0mWr7rouhI,2223
135
+ scaler/utility/serialization.py,sha256=JRHHJjmYKi9GaGZ0ukxFD35QDxmU2dts6PsXfd2WbJY,214
136
+ scaler/utility/graph/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
137
+ scaler/utility/graph/optimization.py,sha256=xp5JAkdnkzpdH3k6lw0aHYy1sKZo5iAaww0VfjHUx9s,785
138
+ scaler/utility/graph/topological_sorter.py,sha256=9_CfWpJLZ1A9SAJgg03RQspjf1dRFV2cqQoJ6ZCOScs,354
139
+ scaler/utility/graph/topological_sorter_graphblas.py,sha256=BwAafDQsF8iNUVWrZ2R0aUKxKMcISI3xC2bmJVhm5SE,6856
140
+ scaler/utility/logging/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
141
+ scaler/utility/logging/decorators.py,sha256=QvObAsCD29Q9u4LL9jr8HYvYASSlLmkjftPXoa2rBRg,759
142
+ scaler/utility/logging/scoped_logger.py,sha256=mOWJBsKxANCXPRW3D9eUOWVcz0BEZAFLJoYG5nXOtI4,1024
143
+ scaler/utility/logging/utility.py,sha256=ob4VWkRJKQcQXMrtoIwgP6drHH4n3SZ3t4arqcj8okM,5799
144
+ scaler/utility/metadata/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
145
+ scaler/utility/metadata/profile_result.py,sha256=5GXVet_oAOnAl94vQ6LrPMpaKrG9KBLKoOfUTq8_pI8,1000
146
+ scaler/utility/metadata/task_flags.py,sha256=b-3iwr9IyCfTGV6b-21FjnHxHccFI9zXFEbmXoY93vY,864
147
+ scaler/utility/queues/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
148
+ scaler/utility/queues/async_indexed_queue.py,sha256=QeEXa1l9ujsvPmn2blBODouNjcAVhM21DoeIEMV4Zfs,1171
149
+ scaler/utility/queues/async_priority_queue.py,sha256=IgLs9Ll3QNoYTI7Wp0sqLcb71wFasU6epCAmHjJ5v5k,2709
150
+ scaler/utility/queues/async_sorted_priority_queue.py,sha256=f4k1dO34LcJkq1OMLbI_nLg23R_Vmj1SGNTJ8oESdUk,1448
151
+ scaler/utility/queues/indexed_queue.py,sha256=MLFkXWEZ8HaJC-gKZD9F9gf-oXL_lJ7O317FnTWFCuQ,3077
152
+ scaler/worker/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
153
+ scaler/worker/preload.py,sha256=gjkNx1IvRBk_bJeYCBN_tD6Vyw8n0LJbnI1O2qwZz18,3086
154
+ scaler/worker/worker.py,sha256=Z8l4NhyinnjZsTdpeUbQII9sC9LoJzg2DMrVQlgNDKE,10986
155
+ scaler/worker/agent/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
156
+ scaler/worker/agent/heartbeat_manager.py,sha256=9eeFDYuYcn6teuIRIcA3LJts8VN-DsGiJR4N0QgAHWY,4793
157
+ scaler/worker/agent/mixins.py,sha256=ckpb2tjLW6mFY3S_tFkUzvKi2dkCb_datKWLJqYDNDs,4074
158
+ scaler/worker/agent/processor_holder.py,sha256=Jlu2o0tArrRo5RnympYiF5EaSPNbLPceg3nbx2d2fu4,5096
159
+ scaler/worker/agent/processor_manager.py,sha256=jso_12HDEt5CvGlVslH_w_B2C5YNmbPm4LKk_zHEcjk,13397
160
+ scaler/worker/agent/profiling_manager.py,sha256=77qF_b8LhfKszQ5eNZiUUc9FqcBCH5Uo1jpEklbCExg,3977
161
+ scaler/worker/agent/task_manager.py,sha256=7X1J9MW8Ib58t1dBb84yhkZVo60zezKn-Z5M2oF-RoA,6149
162
+ scaler/worker/agent/timeout_manager.py,sha256=HAUBUOhFh8QTeuYTrhInr0mX1O12PGbODBkkUtcLReQ,602
163
+ scaler/worker/agent/processor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
164
+ scaler/worker/agent/processor/object_cache.py,sha256=6IlU1hAV3ZgapNj9UMXJI_eN7uwVbCvVh9Vhlv6arEs,3857
165
+ scaler/worker/agent/processor/processor.py,sha256=6H26lFUd5QSc7XI-w8BVYlA_5oa06bL2UeeTja6T18A,11133
166
+ scaler/worker/agent/processor/streaming_buffer.py,sha256=aOBfbC3VOveYvpR6HIqBcTCXPc--dY0-q1IGIAXeI1k,863
167
+ scaler/worker_adapter/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
168
+ scaler/worker_adapter/common.py,sha256=6i6rhgoOioDDkBKGFCsrTTlI3OJnc3r-cKCNoR_GLls,636
169
+ scaler/worker_adapter/ecs.py,sha256=KNQhOkzS4xTTtqmmWhK_PZtngPtqErXbd6akek6hYIo,11596
170
+ scaler/worker_adapter/native.py,sha256=yFgjCwmOmWRzKrWgaRswtpUMOTKQHEN1L1x2DdX58js,6551
171
+ scaler/worker_adapter/symphony/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
172
+ scaler/worker_adapter/symphony/callback.py,sha256=ofy3rstxgezT8uT7Y1B9im-CwMPGlJHCd1EuHuViGqw,1534
173
+ scaler/worker_adapter/symphony/heartbeat_manager.py,sha256=PukyrkU7Ea8M-Icgx3KHhFNaKmizj7g71iFzj-N1TZo,3264
174
+ scaler/worker_adapter/symphony/message.py,sha256=HOonEASua8e-uwpPVxprjyl1rrYmFJaSd8FaobbK5VE,688
175
+ scaler/worker_adapter/symphony/task_manager.py,sha256=C-qAn0dH57rEEIjnqV8KLKF48bq0dAKSomgS7ITS1c0,12181
176
+ scaler/worker_adapter/symphony/worker.py,sha256=0GGHo-7uWDISvJKw94r1wfAQr-5_esVtoRXa1jdFVyo,7932
177
+ scaler/worker_adapter/symphony/worker_adapter.py,sha256=bFQ_LkAg8wqNzzQkBZRAVvzlNF8RnIWtWfnQBg7KJ9U,5732
178
+ src/scaler/io/ymq/_ymq.so,sha256=X1_ngAo4xYQn40wJOMDoZhNX8EHGXTurzlaoaikmVJk,1142912
179
+ opengris_scaler-1.12.25.dist-info/METADATA,sha256=rMoLupnifJ50ydxaNWDYiSWS2XMOubNHQMsG300NSuE,26920
180
+ opengris_scaler-1.12.25.dist-info/WHEEL,sha256=WfUIOrZZjmphW6XvWWOC-3zHgyiL7DZcrARpY3z4EcQ,118
181
+ opengris_scaler-1.12.25.dist-info/entry_points.txt,sha256=1nvHjpnx1XRfxDTeR9MzO30-jsBHAHrd2YRFp2FvtwE,518
182
+ opengris_scaler-1.12.25.dist-info/RECORD,,
183
+ opengris_scaler-1.12.25.dist-info/licenses/LICENSE,sha256=xudC0jta6OXJkSHiLzzQQU50HIwSo0G97exO280dtR8,11345
184
+ opengris_scaler-1.12.25.dist-info/licenses/LICENSE.spdx,sha256=i49Qe6AmXxuvocKyExEFduvdh-NQ5YuxdHs515G8VOQ,225
185
+ opengris_scaler-1.12.25.dist-info/licenses/NOTICE,sha256=JUHdG2ssq0nP2QsqPM8X2eJhfJhK_lemIvDBqBRXrMo,286
@@ -6,4 +6,5 @@ scaler_ui = scaler.entry_points.webui:main
6
6
  scaler_object_storage_server = scaler.entry_points.object_storage_server:main
7
7
  scaler_worker_adapter_native = scaler.entry_points.worker_adapter_native:main
8
8
  scaler_worker_adapter_symphony = scaler.entry_points.worker_adapter_symphony:main
9
+ scaler_worker_adapter_ecs = scaler.entry_points.worker_adapter_ecs:main
9
10
 
@@ -13,6 +13,7 @@ from scaler.client.agent.heartbeat_manager import ClientHeartbeatManager
13
13
  from scaler.client.agent.object_manager import ClientObjectManager
14
14
  from scaler.client.agent.task_manager import ClientTaskManager
15
15
  from scaler.client.serializer.mixins import Serializer
16
+ from scaler.config.types.zmq import ZMQConfig
16
17
  from scaler.io.async_connector import ZMQAsyncConnector
17
18
  from scaler.io.mixins import AsyncConnector
18
19
  from scaler.protocol.python.common import ObjectStorageAddress
@@ -32,7 +33,6 @@ from scaler.protocol.python.mixins import Message
32
33
  from scaler.utility.event_loop import create_async_loop_routine
33
34
  from scaler.utility.exceptions import ClientCancelledException, ClientQuitException, ClientShutdownException
34
35
  from scaler.utility.identifiers import ClientID
35
- from scaler.config.types.zmq import ZMQConfig
36
36
 
37
37
 
38
38
  class ClientAgent(threading.Thread):
@@ -59,7 +59,7 @@ class ClientAgent(threading.Thread):
59
59
  self._client_agent_address = client_agent_address
60
60
  self._scheduler_address = scheduler_address
61
61
  self._context = context
62
- self._storage_address: Future[ObjectStorageAddress] = Future()
62
+ self._object_storage_address: Future[ObjectStorageAddress] = Future()
63
63
 
64
64
  self._future_manager = future_manager
65
65
 
@@ -89,7 +89,7 @@ class ClientAgent(threading.Thread):
89
89
  def __initialize(self):
90
90
  self._disconnect_manager = ClientDisconnectManager()
91
91
  self._heartbeat_manager = ClientHeartbeatManager(
92
- death_timeout_seconds=self._timeout_seconds, storage_address_future=self._storage_address
92
+ death_timeout_seconds=self._timeout_seconds, storage_address_future=self._object_storage_address
93
93
  )
94
94
  self._object_manager = ClientObjectManager(identity=self._identity)
95
95
  self._task_manager = ClientTaskManager()
@@ -118,9 +118,9 @@ class ClientAgent(threading.Thread):
118
118
  self.__initialize()
119
119
  self.__run_loop()
120
120
 
121
- def get_storage_address(self) -> ObjectStorageAddress:
121
+ def get_object_storage_address(self) -> ObjectStorageAddress:
122
122
  """Returns the object storage address, or block until it receives it."""
123
- return self._storage_address.result()
123
+ return self._object_storage_address.result()
124
124
 
125
125
  async def __on_receive_from_client(self, message: Message):
126
126
  if isinstance(message, ClientDisconnect):
@@ -194,8 +194,8 @@ class ClientAgent(threading.Thread):
194
194
  if exception is None:
195
195
  return
196
196
 
197
- if not self._storage_address.done():
198
- self._storage_address.set_exception(exception)
197
+ if not self._object_storage_address.done():
198
+ self._object_storage_address.set_exception(exception)
199
199
 
200
200
  if isinstance(exception, asyncio.CancelledError):
201
201
  logging.error("ClientAgent: async. loop cancelled")
@@ -15,7 +15,7 @@ from scaler.utility.mixins import Looper
15
15
  class ClientHeartbeatManager(Looper, HeartbeatManager):
16
16
  def __init__(self, death_timeout_seconds: int, storage_address_future: Future):
17
17
  self._death_timeout_seconds = death_timeout_seconds
18
- self._storage_address = storage_address_future
18
+ self._object_storage_address = storage_address_future
19
19
 
20
20
  self._process = psutil.Process()
21
21
 
@@ -50,10 +50,10 @@ class ClientHeartbeatManager(Looper, HeartbeatManager):
50
50
  self._latency_us = int(((time.time_ns() - self._start_timestamp_ns) / 2) // 1_000)
51
51
  self._start_timestamp_ns = 0
52
52
 
53
- if self._storage_address.done():
53
+ if self._object_storage_address.done():
54
54
  return
55
55
 
56
- self._storage_address.set_result(heartbeat.object_storage_address())
56
+ self._object_storage_address.set_result(heartbeat.object_storage_address())
57
57
 
58
58
  async def routine(self):
59
59
  if time.time() - self._last_scheduler_contact > self._death_timeout_seconds:
@@ -69,6 +69,6 @@ class ClientHeartbeatManager(Looper, HeartbeatManager):
69
69
  await self.send_heartbeat()
70
70
  self._start_timestamp_ns = time.time_ns()
71
71
 
72
- def get_storage_address(self) -> ObjectStorageAddress:
72
+ def get_object_storage_address(self) -> ObjectStorageAddress:
73
73
  """Returns the object storage configuration, or block until it receives it."""
74
- return self._storage_address.result()
74
+ return self._object_storage_address.result()
scaler/client/client.py CHANGED
@@ -17,9 +17,10 @@ from scaler.client.object_reference import ObjectReference
17
17
  from scaler.client.serializer.default import DefaultSerializer
18
18
  from scaler.client.serializer.mixins import Serializer
19
19
  from scaler.config.defaults import DEFAULT_CLIENT_TIMEOUT_SECONDS, DEFAULT_HEARTBEAT_INTERVAL_SECONDS
20
+ from scaler.config.types.zmq import ZMQConfig, ZMQType
20
21
  from scaler.io.mixins import SyncConnector, SyncObjectStorageConnector
21
22
  from scaler.io.sync_connector import ZMQSyncConnector
22
- from scaler.io.sync_object_storage_connector import PySyncObjectStorageConnector
23
+ from scaler.io.utility import create_sync_object_storage_connector
23
24
  from scaler.protocol.python.message import ClientDisconnect, ClientShutdownResponse, GraphTask, Task
24
25
  from scaler.utility.exceptions import ClientQuitException, MissingObjects
25
26
  from scaler.utility.graph.optimization import cull_graph
@@ -27,7 +28,6 @@ from scaler.utility.graph.topological_sorter import TopologicalSorter
27
28
  from scaler.utility.identifiers import ClientID, ObjectID, TaskID
28
29
  from scaler.utility.metadata.profile_result import ProfileResult
29
30
  from scaler.utility.metadata.task_flags import TaskFlags, retrieve_task_flags_from_task
30
- from scaler.config.types.zmq import ZMQConfig, ZMQType
31
31
  from scaler.worker.agent.processor.processor import Processor
32
32
 
33
33
 
@@ -51,7 +51,7 @@ class _CallNode:
51
51
  class Client:
52
52
  def __init__(
53
53
  self,
54
- address: str,
54
+ address: Optional[str] = None,
55
55
  profiling: bool = False,
56
56
  timeout_seconds: int = DEFAULT_CLIENT_TIMEOUT_SECONDS,
57
57
  heartbeat_interval_seconds: int = DEFAULT_HEARTBEAT_INTERVAL_SECONDS,
@@ -61,8 +61,9 @@ class Client:
61
61
  """
62
62
  The Scaler Client used to send tasks to a scheduler.
63
63
 
64
- :param address: Address of Scheduler to submit work to
65
- :type address: str
64
+ :param address: Address of Scheduler to submit work to. If None, will attempt to auto-detect
65
+ when running inside a worker context.
66
+ :type address: Optional[str]
66
67
  :param profiling: If True, the returned futures will have the `task_duration()` property enabled.
67
68
  :type profiling: bool
68
69
  :param timeout_seconds: Seconds until heartbeat times out
@@ -72,6 +73,7 @@ class Client:
72
73
  :param stream_output: If True, stdout/stderr will be streamed to client during task execution
73
74
  :type stream_output: bool
74
75
  """
76
+ address = self._resolve_scheduler_address(address)
75
77
  self.__initialize__(address, profiling, timeout_seconds, heartbeat_interval_seconds, serializer, stream_output)
76
78
 
77
79
  def __initialize__(
@@ -117,11 +119,11 @@ class Client:
117
119
  logging.info(f"ScalerClient: connect to scheduler at {self._scheduler_address}")
118
120
 
119
121
  # Blocks until the agent receives the object storage address
120
- self._storage_address = self._agent.get_storage_address()
122
+ self._object_storage_address = self._agent.get_object_storage_address()
121
123
 
122
- logging.info(f"ScalerClient: connect to object storage at {self._storage_address}")
123
- self._connector_storage: SyncObjectStorageConnector = PySyncObjectStorageConnector(
124
- self._storage_address.host, self._storage_address.port
124
+ logging.info(f"ScalerClient: connect to object storage at {self._object_storage_address}")
125
+ self._connector_storage: SyncObjectStorageConnector = create_sync_object_storage_connector(
126
+ self._object_storage_address.host, self._object_storage_address.port
125
127
  )
126
128
 
127
129
  self._object_buffer = ObjectBuffer(
@@ -380,6 +382,10 @@ class Client:
380
382
  disconnect from connected scheduler, this will not shut down the scheduler
381
383
  """
382
384
 
385
+ # Handle case where client wasn't fully initialized
386
+ if not hasattr(self, "_stop_event"):
387
+ return
388
+
383
389
  if self._stop_event.is_set():
384
390
  self.__destroy()
385
391
  return
@@ -633,3 +639,20 @@ class Client:
633
639
  assert current_task is not None
634
640
 
635
641
  return retrieve_task_flags_from_task(current_task).priority
642
+
643
+ def _resolve_scheduler_address(self, address: Optional[str]) -> str:
644
+ """Resolve the scheduler address based on the provided address and worker context."""
645
+ # Provided address always takes precedence
646
+ if address is not None:
647
+ return address
648
+
649
+ # No address provided, check if we're running inside a worker context
650
+ current_processor = Processor.get_current_processor()
651
+ if current_processor is None:
652
+ raise ValueError(
653
+ "No scheduler address provided and not running inside a worker context. "
654
+ "Please provide a scheduler address when creating the Client outside of a worker."
655
+ )
656
+
657
+ # Return the scheduler address from the current processor
658
+ return current_processor.scheduler_address().to_address()
scaler/cluster/cluster.py CHANGED
@@ -4,9 +4,9 @@ import os
4
4
  import signal
5
5
  from typing import Dict, List, Optional, Tuple
6
6
 
7
- from scaler.utility.logging.utility import setup_logger
8
7
  from scaler.config.types.object_storage_server import ObjectStorageConfig
9
8
  from scaler.config.types.zmq import ZMQConfig
9
+ from scaler.utility.logging.utility import setup_logger
10
10
  from scaler.worker.worker import Worker
11
11
 
12
12
 
@@ -15,7 +15,7 @@ class Cluster(multiprocessing.get_context("spawn").Process): # type: ignore[mis
15
15
  def __init__(
16
16
  self,
17
17
  address: ZMQConfig,
18
- storage_address: Optional[ObjectStorageConfig],
18
+ object_storage_address: Optional[ObjectStorageConfig],
19
19
  preload: Optional[str],
20
20
  worker_io_threads: int,
21
21
  worker_names: List[str],
@@ -35,7 +35,7 @@ class Cluster(multiprocessing.get_context("spawn").Process): # type: ignore[mis
35
35
  multiprocessing.Process.__init__(self, name="WorkerMaster")
36
36
 
37
37
  self._address = address
38
- self._storage_address = storage_address
38
+ self._object_storage_address = object_storage_address
39
39
  self._preload = preload
40
40
  self._worker_io_threads = worker_io_threads
41
41
  self._worker_names = worker_names
@@ -83,7 +83,7 @@ class Cluster(multiprocessing.get_context("spawn").Process): # type: ignore[mis
83
83
  event_loop=self._event_loop,
84
84
  name=name,
85
85
  address=self._address,
86
- storage_address=self._storage_address,
86
+ object_storage_address=self._object_storage_address,
87
87
  capabilities=self._per_worker_capabilities,
88
88
  preload=self._preload,
89
89
  io_threads=self._worker_io_threads,
scaler/cluster/combo.py CHANGED
@@ -13,6 +13,8 @@ from scaler.config.defaults import (
13
13
  DEFAULT_IO_THREADS,
14
14
  DEFAULT_LOAD_BALANCE_SECONDS,
15
15
  DEFAULT_LOAD_BALANCE_TRIGGER_TIMES,
16
+ DEFAULT_LOGGING_LEVEL,
17
+ DEFAULT_LOGGING_PATHS,
16
18
  DEFAULT_MAX_NUMBER_OF_TASKS_WAITING,
17
19
  DEFAULT_OBJECT_RETENTION_SECONDS,
18
20
  DEFAULT_PER_WORKER_QUEUE_SIZE,
@@ -20,13 +22,12 @@ from scaler.config.defaults import (
20
22
  DEFAULT_TRIM_MEMORY_THRESHOLD_BYTES,
21
23
  DEFAULT_WORKER_DEATH_TIMEOUT,
22
24
  DEFAULT_WORKER_TIMEOUT_SECONDS,
23
- DEFAULT_LOGGING_LEVEL,
24
- DEFAULT_LOGGING_PATHS,
25
25
  )
26
- from scaler.scheduler.allocate_policy.allocate_policy import AllocatePolicy
27
- from scaler.utility.network_util import get_available_tcp_port
28
26
  from scaler.config.types.object_storage_server import ObjectStorageConfig
29
27
  from scaler.config.types.zmq import ZMQConfig
28
+ from scaler.scheduler.allocate_policy.allocate_policy import AllocatePolicy
29
+ from scaler.scheduler.controllers.scaling_policies.types import ScalingControllerStrategy
30
+ from scaler.utility.network_util import get_available_tcp_port
30
31
 
31
32
 
32
33
  class SchedulerClusterCombo:
@@ -34,7 +35,7 @@ class SchedulerClusterCombo:
34
35
  self,
35
36
  n_workers: int,
36
37
  address: Optional[str] = None,
37
- storage_address: Optional[str] = None,
38
+ object_storage_address: Optional[str] = None,
38
39
  monitor_address: Optional[str] = None,
39
40
  per_worker_capabilities: Optional[Dict[str, int]] = None,
40
41
  worker_io_threads: int = DEFAULT_IO_THREADS,
@@ -64,10 +65,10 @@ class SchedulerClusterCombo:
64
65
  else:
65
66
  self._address = ZMQConfig.from_string(address)
66
67
 
67
- if storage_address is None:
68
- self._storage_address = ObjectStorageConfig(self._address.host, get_available_tcp_port())
68
+ if object_storage_address is None:
69
+ self._object_storage_address = ObjectStorageConfig(self._address.host, get_available_tcp_port())
69
70
  else:
70
- self._storage_address = ObjectStorageConfig.from_string(storage_address)
71
+ self._object_storage_address = ObjectStorageConfig.from_string(object_storage_address)
71
72
 
72
73
  if monitor_address is None:
73
74
  self._monitor_address = None
@@ -75,7 +76,7 @@ class SchedulerClusterCombo:
75
76
  self._monitor_address = ZMQConfig.from_string(monitor_address)
76
77
 
77
78
  self._object_storage = ObjectStorageServerProcess(
78
- storage_address=self._storage_address,
79
+ object_storage_address=self._object_storage_address,
79
80
  logging_paths=logging_paths,
80
81
  logging_level=logging_level,
81
82
  logging_config_file=logging_config_file,
@@ -85,10 +86,10 @@ class SchedulerClusterCombo:
85
86
 
86
87
  self._cluster = Cluster(
87
88
  address=self._address,
88
- storage_address=self._storage_address,
89
+ object_storage_address=self._object_storage_address,
89
90
  preload=None,
90
91
  worker_io_threads=worker_io_threads,
91
- worker_names=[f"{socket.gethostname().split('.')[0]}_{i}" for i in range(n_workers)],
92
+ worker_names=[f"{socket.gethostname().split('.')[0]}" for _ in range(n_workers)],
92
93
  per_worker_capabilities=per_worker_capabilities or {},
93
94
  per_worker_task_queue_size=per_worker_task_queue_size,
94
95
  heartbeat_interval_seconds=heartbeat_interval_seconds,
@@ -105,12 +106,13 @@ class SchedulerClusterCombo:
105
106
 
106
107
  self._scheduler = SchedulerProcess(
107
108
  address=self._address,
108
- storage_address=self._storage_address,
109
+ object_storage_address=self._object_storage_address,
109
110
  monitor_address=self._monitor_address,
110
111
  io_threads=scheduler_io_threads,
111
112
  max_number_of_tasks_waiting=max_number_of_tasks_waiting,
112
113
  client_timeout_seconds=client_timeout_seconds,
113
- adapter_webhook_url=None,
114
+ scaling_controller_strategy=ScalingControllerStrategy.NULL,
115
+ adapter_webhook_urls=(),
114
116
  worker_timeout_seconds=worker_timeout_seconds,
115
117
  object_retention_seconds=object_retention_seconds,
116
118
  load_balance_seconds=load_balance_seconds,