opengris-scaler 1.12.9__cp311-cp311-musllinux_1_2_x86_64.whl → 1.12.12__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.

@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: opengris-scaler
3
- Version: 1.12.9
3
+ Version: 1.12.12
4
4
  Summary: OpenGRIS Scaler Distribution Framework
5
5
  Author-Email: Citi <opensource@citi.com>
6
6
  License: Apache 2.0
@@ -365,6 +365,8 @@ with Client(address="tcp://127.0.0.1:2345") as client:
365
365
  print(future.result()) # 21
366
366
  ```
367
367
 
368
+ **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.
369
+
368
370
  ## Task Routing and Capability Management
369
371
 
370
372
  > **Note**: This feature is experimental and may change in future releases.
@@ -5,9 +5,9 @@ opengris_scaler.libs/libstdc++-08d5c7eb.so.6.0.33,sha256=k0S_imrCh_IE6WpvxrLoVPY
5
5
  scaler/CMakeLists.txt,sha256=60rkhpiwy0F-DSsRX_6nRrjYQvQ1Jp9mGp8fZsi006k,305
6
6
  scaler/__init__.py,sha256=nZU5QZ9oW2YIaGwm3-r-6dfmirTVzZpDPDNtX-ITCV4,513
7
7
  scaler/about.py,sha256=OBcfSvHO0P3mWaa2Ci4WEOTbH7is-3uYymScxgZPxyg,161
8
- scaler/version.txt,sha256=BapNVsomB8f82_4o6SME3mmtU8l5mwsJj9b5hMy6ADk,7
8
+ scaler/version.txt,sha256=_ybmMM5LatOmnnmjaCb5UGsJOUUCujnikVGbB3D0Atg,8
9
9
  scaler/client/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
- scaler/client/client.py,sha256=uyYVNYhLaX3H-Aqecf-yHSqvkKnWeDzpTr2atNUUv0E,24373
10
+ scaler/client/client.py,sha256=9WWclvdsouYPREGwmkWWA3gpz5DVFEAD6HKbtXr3Jx8,25506
11
11
  scaler/client/future.py,sha256=fOl5g4Is4E5jtvO0kmRk4uUs_eUjSjMmyniYhWMAH4w,10041
12
12
  scaler/client/object_buffer.py,sha256=MBjz1Rf6ufgTyjMYoV8V78xpezot0aUit41nj-5kV50,4670
13
13
  scaler/client/object_reference.py,sha256=Pow064leLlO6OhfW-yyEjcesbzn22ijqGBSQlsQNEtU,606
@@ -45,7 +45,7 @@ scaler/config/types/worker.py,sha256=0pt871QcyQ0_PEDVPxxgnnk3l5_syQA-71V1bhUmf0g
45
45
  scaler/config/types/zmq.py,sha256=0VODax61H-4PxN6rIeWKlMXOHiW5elVSt1zc-UF0SL8,2593
46
46
  scaler/entry_points/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
47
47
  scaler/entry_points/cluster.py,sha256=5jPO_fFVe8IiSiAkLhLZ0mXJKXiYUWjvpXjEGlcgwW4,5779
48
- scaler/entry_points/object_storage_server.py,sha256=SEfBC_MdIHdZUxqHhGPb2AHje5dtIEM5uELRdHfFc0o,1316
48
+ scaler/entry_points/object_storage_server.py,sha256=YGDl9-ws0oha1YXXl3gFH660B-IV2o06gCp41zUovdg,1418
49
49
  scaler/entry_points/scheduler.py,sha256=w4Ps1PJX0dnu13xwnnuQFMppkW5Se7cIrcXuJlaWfTA,6025
50
50
  scaler/entry_points/top.py,sha256=pqOPD27HeZrnMvqw4cOF4bvZ-sxgg7zp_Q1v8VtbC4A,9542
51
51
  scaler/entry_points/webui.py,sha256=ypcrE6Lr4rUX_qM0qSsv-dX7kzZiMMWTe5GL-Ol45BI,1067
@@ -110,7 +110,7 @@ scaler/io/ymq/pymod_ymq/python.h,sha256=wb0-WNF4occ4nDphSoUI47_OrfVPP72eLlGC_B59
110
110
  scaler/io/ymq/pymod_ymq/ymq.cpp,sha256=LoxL5ViLK0zyWRSYfmZn0QO-0vLw3xVZrRQJ5rWtc4w,526
111
111
  scaler/io/ymq/pymod_ymq/ymq.h,sha256=juX5DcDMY8rxp5BixFR0NgSlTrLBPog4JdqyQB9NfVI,11936
112
112
  scaler/io/ymq/third_party/concurrentqueue.h,sha256=yN268t8miyojar0bBBPIEjMI3DlHVZci2eufkDDA0FA,152819
113
- scaler/object_storage/CMakeLists.txt,sha256=tmkXHBOe1Gho32n4zEqChZBNlxytRTPnIaJ_hAWHBKg,1665
113
+ scaler/object_storage/CMakeLists.txt,sha256=qexi6sKNGieaRhKkO65kxdaQrKRY-8adYKlvc42aEew,1566
114
114
  scaler/object_storage/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
115
115
  scaler/object_storage/constants.h,sha256=b5iTCS6lxWjNlanaknIheKJocTofopVxpcRCuMxiDaI,304
116
116
  scaler/object_storage/defs.h,sha256=hYFhhYdHgkT6C7iFQuG2d-Rexvkr8VvIy1LLGEh8Mrk,286
@@ -120,9 +120,9 @@ scaler/object_storage/message.cpp,sha256=nOaLu--Q1UyRLLHZY_8obHtGEhSnPiSnMSbF5uO
120
120
  scaler/object_storage/message.h,sha256=8KCts7n36jys3PiX09-lPtfa6DjfHI_2hYvled9afG0,4208
121
121
  scaler/object_storage/object_manager.cpp,sha256=cxNv9vOkCC910hlF5JF0mOUwTho8ieA1RJgF_P4e3ho,3083
122
122
  scaler/object_storage/object_manager.h,sha256=TkxICR8_20I-tkHwnMO0VpLWkm24vOEabrmQG6hdnmQ,1696
123
- scaler/object_storage/object_storage_server.cpp,sha256=lJ863--NU6yzcUJAL4EQ2yQjDBekOaP0dYU581hl_Nc,13635
123
+ scaler/object_storage/object_storage_server.cpp,sha256=ZiMpLOakguD3p108OVRf0XQmsZtHN5tw5Fs46Pq0nwA,13794
124
124
  scaler/object_storage/object_storage_server.h,sha256=11BD3U9NnLcqx8hFXJCnTjvQEgyirj-0LKlTYgtzaXI,4277
125
- scaler/object_storage/object_storage_server.so,sha256=f4XVDHXLYKf-1hN-CcllMh9I5ULNCWhQBS_y5YnjtII,766161
125
+ scaler/object_storage/object_storage_server.so,sha256=B2D_EFPZZFz2BWAuo4Uh3jneZ9a2RiE7iusSvlR-4Pk,766161
126
126
  scaler/object_storage/pymod_object_storage_server.cpp,sha256=D09p81wZF6WnV35I6od3iDhgktV20v82CRR_tQ90ROs,3811
127
127
  scaler/protocol/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
128
128
  scaler/protocol/introduction.md,sha256=G8oRzui4KmSlfFUu70y24tTmDmfEKBkog9tFVUn7G1U,5406
@@ -202,18 +202,18 @@ scaler/utility/queues/async_sorted_priority_queue.py,sha256=f4k1dO34LcJkq1OMLbI_
202
202
  scaler/utility/queues/indexed_queue.py,sha256=MLFkXWEZ8HaJC-gKZD9F9gf-oXL_lJ7O317FnTWFCuQ,3077
203
203
  scaler/worker/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
204
204
  scaler/worker/preload.py,sha256=gjkNx1IvRBk_bJeYCBN_tD6Vyw8n0LJbnI1O2qwZz18,3086
205
- scaler/worker/worker.py,sha256=gMsuHQcnOS9ej1JOTXbB0-bJJfCA2p590kGcg9y0zKk,10892
205
+ scaler/worker/worker.py,sha256=Zj4kGey1FAgF7vzY6R0q2Xp48cJei4jh9IMyi9N2NDc,10937
206
206
  scaler/worker/agent/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
207
207
  scaler/worker/agent/heartbeat_manager.py,sha256=R-pWuH8xixqHsANGVv_pFkJtFie4S2VNHlFa4olWfJA,4730
208
208
  scaler/worker/agent/mixins.py,sha256=fhTytvyBHB3ydIy-J1_q4bvp4fsCTUPAU2ZDC5rCQFI,4067
209
- scaler/worker/agent/processor_holder.py,sha256=VYr-Io-eVZvT9bD0t3h-ESHoBoU1iqYZKQ-Cyvxi8NU,4978
210
- scaler/worker/agent/processor_manager.py,sha256=0AOn1eViRlgPTxsmMGWFvhBiJiRk1p24sbaHK0Q8zPM,13248
209
+ scaler/worker/agent/processor_holder.py,sha256=TZoTG6C7NkSmYkg7MfVEmK2AIxaRBqLVp1ZMZwNlfuE,5065
210
+ scaler/worker/agent/processor_manager.py,sha256=BBBf7DirMvCgfVXzBRgyX76QE8lFnsjIW3KL465bpo0,13375
211
211
  scaler/worker/agent/profiling_manager.py,sha256=77qF_b8LhfKszQ5eNZiUUc9FqcBCH5Uo1jpEklbCExg,3977
212
212
  scaler/worker/agent/task_manager.py,sha256=7X1J9MW8Ib58t1dBb84yhkZVo60zezKn-Z5M2oF-RoA,6149
213
213
  scaler/worker/agent/timeout_manager.py,sha256=HAUBUOhFh8QTeuYTrhInr0mX1O12PGbODBkkUtcLReQ,602
214
214
  scaler/worker/agent/processor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
215
215
  scaler/worker/agent/processor/object_cache.py,sha256=6IlU1hAV3ZgapNj9UMXJI_eN7uwVbCvVh9Vhlv6arEs,3857
216
- scaler/worker/agent/processor/processor.py,sha256=_KZDCmpECwnnnEp_oIg2rb0mIqR1oLpzON5PSXziUag,10843
216
+ scaler/worker/agent/processor/processor.py,sha256=DZgJEvUXKYbpqCO72rCAhYaTJa-ZilShPe_ympy1ksc,11104
217
217
  scaler/worker/agent/processor/streaming_buffer.py,sha256=aOBfbC3VOveYvpR6HIqBcTCXPc--dY0-q1IGIAXeI1k,863
218
218
  scaler/worker_adapter/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
219
219
  scaler/worker_adapter/native.py,sha256=FYlw7TFY5zn2re-9bJ5SnTCAAsx7I_4HEbRJIkRlz9E,6179
@@ -224,10 +224,10 @@ scaler/worker_adapter/symphony/message.py,sha256=HOonEASua8e-uwpPVxprjyl1rrYmFJa
224
224
  scaler/worker_adapter/symphony/task_manager.py,sha256=phgx8dtAv-5ynsvsmG4DKcSlENz4b340FE6LDUWyMwo,12139
225
225
  scaler/worker_adapter/symphony/worker.py,sha256=VIDOoqVXbwrjHYN3lghbQpEIuCbVJUgiYsBknrI-0oc,7957
226
226
  scaler/worker_adapter/symphony/worker_adapter.py,sha256=eAAD1O0Uz1pjEdQPPl2fd8kyaF6q-aqCRrg48k1ocUU,5455
227
- opengris_scaler-1.12.9.dist-info/METADATA,sha256=Yk5bpbJorqpYauwfQ26S-BG7KHYEexvon0rWodbQrp0,26987
228
- opengris_scaler-1.12.9.dist-info/WHEEL,sha256=Y3GjFou-TcvYG8r2iXbNPPSJEiD3r1Fl3pPy2E65s_w,117
229
- opengris_scaler-1.12.9.dist-info/entry_points.txt,sha256=KROw4kj4Z6p8YuOgpOFt5spHskm87A7Z-fOOffT4tVU,446
230
- opengris_scaler-1.12.9.dist-info/RECORD,,
231
- opengris_scaler-1.12.9.dist-info/licenses/LICENSE,sha256=xudC0jta6OXJkSHiLzzQQU50HIwSo0G97exO280dtR8,11345
232
- opengris_scaler-1.12.9.dist-info/licenses/LICENSE.spdx,sha256=i49Qe6AmXxuvocKyExEFduvdh-NQ5YuxdHs515G8VOQ,225
233
- opengris_scaler-1.12.9.dist-info/licenses/NOTICE,sha256=JUHdG2ssq0nP2QsqPM8X2eJhfJhK_lemIvDBqBRXrMo,286
227
+ opengris_scaler-1.12.12.dist-info/METADATA,sha256=It2hi9UNQsgtbh--T9GMMiPlwYH2CnWCXEYrcY_uEV4,27234
228
+ opengris_scaler-1.12.12.dist-info/WHEEL,sha256=Y3GjFou-TcvYG8r2iXbNPPSJEiD3r1Fl3pPy2E65s_w,117
229
+ opengris_scaler-1.12.12.dist-info/entry_points.txt,sha256=KROw4kj4Z6p8YuOgpOFt5spHskm87A7Z-fOOffT4tVU,446
230
+ opengris_scaler-1.12.12.dist-info/RECORD,,
231
+ opengris_scaler-1.12.12.dist-info/licenses/LICENSE,sha256=xudC0jta6OXJkSHiLzzQQU50HIwSo0G97exO280dtR8,11345
232
+ opengris_scaler-1.12.12.dist-info/licenses/LICENSE.spdx,sha256=i49Qe6AmXxuvocKyExEFduvdh-NQ5YuxdHs515G8VOQ,225
233
+ opengris_scaler-1.12.12.dist-info/licenses/NOTICE,sha256=JUHdG2ssq0nP2QsqPM8X2eJhfJhK_lemIvDBqBRXrMo,286
scaler/client/client.py CHANGED
@@ -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__(
@@ -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()
@@ -1,5 +1,6 @@
1
1
  import argparse
2
2
  import logging
3
+ import sys
3
4
 
4
5
  from scaler.config.loader import load_config
5
6
  from scaler.config.section.object_storage_server import ObjectStorageServerConfig
@@ -31,11 +32,14 @@ def main():
31
32
 
32
33
  log_format_str, log_level_str, log_paths = get_logger_info(logging.getLogger())
33
34
 
34
- ObjectStorageServer().run(
35
- oss_config.object_storage_address.host,
36
- oss_config.object_storage_address.port,
37
- oss_config.object_storage_address.identity,
38
- log_level_str,
39
- log_format_str,
40
- log_paths,
41
- )
35
+ try:
36
+ ObjectStorageServer().run(
37
+ oss_config.object_storage_address.host,
38
+ oss_config.object_storage_address.port,
39
+ oss_config.object_storage_address.identity,
40
+ log_level_str,
41
+ log_format_str,
42
+ log_paths,
43
+ )
44
+ except KeyboardInterrupt:
45
+ sys.exit(0)
@@ -31,11 +31,9 @@ set_target_properties(py_object_storage_server PROPERTIES
31
31
  )
32
32
 
33
33
  target_link_libraries(py_object_storage_server PRIVATE
34
- $<$<CXX_COMPILER_ID:GNU,Clang>:-Wl,-Bstatic>
35
34
  capnp_objs
36
35
  ymq_objs
37
36
  object_storage_server_objs
38
- $<$<CXX_COMPILER_ID:GNU,Clang>:-Wl,-Bdynamic>
39
37
  CapnProto::capnp
40
38
  CapnProto::kj
41
39
  Python3::Module
@@ -138,6 +138,8 @@ void ObjectStorageServer::processRequests(std::function<bool()> running)
138
138
  auto maybeMessageFuture = ymq::futureRecvMessage(_ioSocket);
139
139
  while (maybeMessageFuture.wait_for(100ms) == std::future_status::timeout) {
140
140
  if (!running()) {
141
+ _logger.log(scaler::ymq::Logger::LoggingLevel::info, "ObjectStorageServer: stopped by user");
142
+ pendingRequests.clear();
141
143
  return;
142
144
  }
143
145
  }
scaler/version.txt CHANGED
@@ -1 +1 @@
1
- 1.12.9
1
+ 1.12.12
@@ -37,6 +37,7 @@ class Processor(multiprocessing.get_context("spawn").Process): # type: ignore
37
37
  self,
38
38
  event_loop: str,
39
39
  agent_address: ZMQConfig,
40
+ scheduler_address: ZMQConfig,
40
41
  storage_address: ObjectStorageConfig,
41
42
  preload: Optional[str],
42
43
  resume_event: Optional[EventType],
@@ -50,6 +51,7 @@ class Processor(multiprocessing.get_context("spawn").Process): # type: ignore
50
51
 
51
52
  self._event_loop = event_loop
52
53
  self._agent_address = agent_address
54
+ self._scheduler_address = scheduler_address
53
55
  self._storage_address = storage_address
54
56
  self._preload = preload
55
57
 
@@ -74,6 +76,10 @@ class Processor(multiprocessing.get_context("spawn").Process): # type: ignore
74
76
  """Returns the current Processor instance controlling the current process, if any."""
75
77
  return _current_processor.get()
76
78
 
79
+ def scheduler_address(self) -> ZMQConfig:
80
+ """Returns the scheduler address this processor's worker is connected to."""
81
+ return self._scheduler_address
82
+
77
83
  def current_task(self) -> Optional[Task]:
78
84
  return self._current_task
79
85
 
@@ -19,6 +19,7 @@ class ProcessorHolder:
19
19
  self,
20
20
  event_loop: str,
21
21
  agent_address: ZMQConfig,
22
+ scheduler_address: ZMQConfig,
22
23
  storage_address: ObjectStorageConfig,
23
24
  preload: Optional[str],
24
25
  garbage_collect_interval_seconds: int,
@@ -43,6 +44,7 @@ class ProcessorHolder:
43
44
  self._processor = Processor(
44
45
  event_loop=event_loop,
45
46
  agent_address=agent_address,
47
+ scheduler_address=scheduler_address,
46
48
  storage_address=storage_address,
47
49
  preload=preload,
48
50
  resume_event=self._resume_event,
@@ -23,6 +23,7 @@ class VanillaProcessorManager(ProcessorManager):
23
23
  identity: WorkerID,
24
24
  event_loop: str,
25
25
  address_internal: ZMQConfig,
26
+ scheduler_address: ZMQConfig,
26
27
  preload: Optional[str],
27
28
  garbage_collect_interval_seconds: int,
28
29
  trim_memory_threshold_bytes: int,
@@ -34,6 +35,7 @@ class VanillaProcessorManager(ProcessorManager):
34
35
 
35
36
  self._identity = identity
36
37
  self._event_loop = event_loop
38
+ self._scheduler_address = scheduler_address
37
39
  self._preload = preload
38
40
 
39
41
  self._garbage_collect_interval_seconds = garbage_collect_interval_seconds
@@ -299,6 +301,7 @@ class VanillaProcessorManager(ProcessorManager):
299
301
  self._current_holder = ProcessorHolder(
300
302
  self._event_loop,
301
303
  self._address_internal,
304
+ self._scheduler_address,
302
305
  storage_address,
303
306
  self._preload,
304
307
  self._garbage_collect_interval_seconds,
scaler/worker/worker.py CHANGED
@@ -139,6 +139,7 @@ class Worker(multiprocessing.get_context("spawn").Process): # type: ignore
139
139
  identity=self._ident,
140
140
  event_loop=self._event_loop,
141
141
  address_internal=self._address_internal,
142
+ scheduler_address=self._address,
142
143
  preload=self._preload,
143
144
  garbage_collect_interval_seconds=self._garbage_collect_interval_seconds,
144
145
  trim_memory_threshold_bytes=self._trim_memory_threshold_bytes,