modal 1.0.2.dev2__py3-none-any.whl → 1.0.2.dev4__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- modal/_utils/bytes_io_segment_payload.py +6 -2
- modal/client.pyi +2 -2
- modal/exception.py +2 -0
- modal/functions.pyi +6 -6
- modal/volume.py +13 -8
- modal/volume.pyi +2 -2
- {modal-1.0.2.dev2.dist-info → modal-1.0.2.dev4.dist-info}/METADATA +1 -1
- {modal-1.0.2.dev2.dist-info → modal-1.0.2.dev4.dist-info}/RECORD +13 -13
- modal_version/__init__.py +1 -1
- {modal-1.0.2.dev2.dist-info → modal-1.0.2.dev4.dist-info}/WHEEL +0 -0
- {modal-1.0.2.dev2.dist-info → modal-1.0.2.dev4.dist-info}/entry_points.txt +0 -0
- {modal-1.0.2.dev2.dist-info → modal-1.0.2.dev4.dist-info}/licenses/LICENSE +0 -0
- {modal-1.0.2.dev2.dist-info → modal-1.0.2.dev4.dist-info}/top_level.txt +0 -0
@@ -52,12 +52,16 @@ class BytesIOSegmentPayload(BytesIOPayload):
|
|
52
52
|
self._value.seek(self.initial_seek_pos)
|
53
53
|
|
54
54
|
@contextmanager
|
55
|
-
def reset_on_error(self):
|
55
|
+
def reset_on_error(self, subtract_progress: bool = False):
|
56
56
|
try:
|
57
57
|
yield
|
58
58
|
except Exception as exc:
|
59
59
|
try:
|
60
|
-
|
60
|
+
if subtract_progress:
|
61
|
+
negative_progress = -self.num_bytes_read
|
62
|
+
self.progress_report_cb(advance=negative_progress)
|
63
|
+
else:
|
64
|
+
self.progress_report_cb(reset=True)
|
61
65
|
except Exception as cb_exc:
|
62
66
|
raise cb_exc from exc
|
63
67
|
raise exc
|
modal/client.pyi
CHANGED
@@ -31,7 +31,7 @@ class _Client:
|
|
31
31
|
server_url: str,
|
32
32
|
client_type: int,
|
33
33
|
credentials: typing.Optional[tuple[str, str]],
|
34
|
-
version: str = "1.0.2.
|
34
|
+
version: str = "1.0.2.dev4",
|
35
35
|
): ...
|
36
36
|
def is_closed(self) -> bool: ...
|
37
37
|
@property
|
@@ -94,7 +94,7 @@ class Client:
|
|
94
94
|
server_url: str,
|
95
95
|
client_type: int,
|
96
96
|
credentials: typing.Optional[tuple[str, str]],
|
97
|
-
version: str = "1.0.2.
|
97
|
+
version: str = "1.0.2.dev4",
|
98
98
|
): ...
|
99
99
|
def is_closed(self) -> bool: ...
|
100
100
|
@property
|
modal/exception.py
CHANGED
@@ -161,6 +161,8 @@ def simulate_preemption(wait_seconds: int, jitter_seconds: int = 0):
|
|
161
161
|
See https://modal.com/docs/guide/preemption for more details on preemption
|
162
162
|
handling.
|
163
163
|
"""
|
164
|
+
if wait_seconds <= 0:
|
165
|
+
raise ValueError("Time to wait must be greater than 0")
|
164
166
|
signal.signal(signal.SIGALRM, _simulate_preemption_interrupt)
|
165
167
|
jitter = random.randrange(0, jitter_seconds) if jitter_seconds else 0
|
166
168
|
signal.alarm(wait_seconds + jitter)
|
modal/functions.pyi
CHANGED
@@ -227,11 +227,11 @@ class Function(
|
|
227
227
|
|
228
228
|
_call_generator: ___call_generator_spec[typing_extensions.Self]
|
229
229
|
|
230
|
-
class __remote_spec(typing_extensions.Protocol[
|
230
|
+
class __remote_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER, SUPERSELF]):
|
231
231
|
def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> ReturnType_INNER: ...
|
232
232
|
async def aio(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> ReturnType_INNER: ...
|
233
233
|
|
234
|
-
remote: __remote_spec[modal._functions.
|
234
|
+
remote: __remote_spec[modal._functions.ReturnType, modal._functions.P, typing_extensions.Self]
|
235
235
|
|
236
236
|
class __remote_gen_spec(typing_extensions.Protocol[SUPERSELF]):
|
237
237
|
def __call__(self, /, *args, **kwargs) -> typing.Generator[typing.Any, None, None]: ...
|
@@ -246,12 +246,12 @@ class Function(
|
|
246
246
|
self, *args: modal._functions.P.args, **kwargs: modal._functions.P.kwargs
|
247
247
|
) -> modal._functions.OriginalReturnType: ...
|
248
248
|
|
249
|
-
class ___experimental_spawn_spec(typing_extensions.Protocol[
|
249
|
+
class ___experimental_spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER, SUPERSELF]):
|
250
250
|
def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]: ...
|
251
251
|
async def aio(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]: ...
|
252
252
|
|
253
253
|
_experimental_spawn: ___experimental_spawn_spec[
|
254
|
-
modal._functions.
|
254
|
+
modal._functions.ReturnType, modal._functions.P, typing_extensions.Self
|
255
255
|
]
|
256
256
|
|
257
257
|
class ___spawn_map_inner_spec(typing_extensions.Protocol[P_INNER, SUPERSELF]):
|
@@ -260,11 +260,11 @@ class Function(
|
|
260
260
|
|
261
261
|
_spawn_map_inner: ___spawn_map_inner_spec[modal._functions.P, typing_extensions.Self]
|
262
262
|
|
263
|
-
class __spawn_spec(typing_extensions.Protocol[
|
263
|
+
class __spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER, SUPERSELF]):
|
264
264
|
def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]: ...
|
265
265
|
async def aio(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]: ...
|
266
266
|
|
267
|
-
spawn: __spawn_spec[modal._functions.
|
267
|
+
spawn: __spawn_spec[modal._functions.ReturnType, modal._functions.P, typing_extensions.Self]
|
268
268
|
|
269
269
|
def get_raw_f(self) -> collections.abc.Callable[..., typing.Any]: ...
|
270
270
|
|
modal/volume.py
CHANGED
@@ -38,6 +38,7 @@ from ._utils.async_utils import (
|
|
38
38
|
async_map,
|
39
39
|
async_map_ordered,
|
40
40
|
asyncnullcontext,
|
41
|
+
retry,
|
41
42
|
synchronize_api,
|
42
43
|
)
|
43
44
|
from ._utils.blob_utils import (
|
@@ -835,7 +836,7 @@ class _VolumeUploadContextManager2(_AbstractVolumeUploadContextManager):
|
|
835
836
|
progress_cb: Optional[Callable[..., Any]] = None,
|
836
837
|
force: bool = False,
|
837
838
|
hash_concurrency: int = multiprocessing.cpu_count(),
|
838
|
-
put_concurrency: int =
|
839
|
+
put_concurrency: int = 128,
|
839
840
|
):
|
840
841
|
"""mdmd:hidden"""
|
841
842
|
self._volume_id = volume_id
|
@@ -1020,6 +1021,16 @@ async def _put_missing_blocks(
|
|
1020
1021
|
file_progress.pending_blocks.add(missing_block.block_index)
|
1021
1022
|
task_progress_cb = functools.partial(progress_cb, task_id=file_progress.task_id)
|
1022
1023
|
|
1024
|
+
@retry(n_attempts=5, base_delay=0.5, timeout=None)
|
1025
|
+
async def put_missing_block_attempt(payload: BytesIOSegmentPayload) -> bytes:
|
1026
|
+
with payload.reset_on_error(subtract_progress=True):
|
1027
|
+
async with ClientSessionRegistry.get_session().put(
|
1028
|
+
missing_block.put_url,
|
1029
|
+
data=payload,
|
1030
|
+
) as response:
|
1031
|
+
response.raise_for_status()
|
1032
|
+
return await response.content.read()
|
1033
|
+
|
1023
1034
|
async with put_semaphore:
|
1024
1035
|
with file_spec.source() as source_fp:
|
1025
1036
|
payload = BytesIOSegmentPayload(
|
@@ -1030,13 +1041,7 @@ async def _put_missing_blocks(
|
|
1030
1041
|
chunk_size=256 * 1024,
|
1031
1042
|
progress_report_cb=task_progress_cb,
|
1032
1043
|
)
|
1033
|
-
|
1034
|
-
async with ClientSessionRegistry.get_session().put(
|
1035
|
-
missing_block.put_url,
|
1036
|
-
data=payload,
|
1037
|
-
) as response:
|
1038
|
-
response.raise_for_status()
|
1039
|
-
resp_data = await response.content.read()
|
1044
|
+
resp_data = await put_missing_block_attempt(payload)
|
1040
1045
|
|
1041
1046
|
file_progress.pending_blocks.remove(missing_block.block_index)
|
1042
1047
|
|
modal/volume.pyi
CHANGED
@@ -494,7 +494,7 @@ class _VolumeUploadContextManager2(_AbstractVolumeUploadContextManager):
|
|
494
494
|
progress_cb: typing.Optional[collections.abc.Callable[..., typing.Any]] = None,
|
495
495
|
force: bool = False,
|
496
496
|
hash_concurrency: int = 4,
|
497
|
-
put_concurrency: int =
|
497
|
+
put_concurrency: int = 128,
|
498
498
|
): ...
|
499
499
|
async def __aenter__(self): ...
|
500
500
|
async def __aexit__(self, exc_type, exc_val, exc_tb): ...
|
@@ -534,7 +534,7 @@ class VolumeUploadContextManager2(AbstractVolumeUploadContextManager):
|
|
534
534
|
progress_cb: typing.Optional[collections.abc.Callable[..., typing.Any]] = None,
|
535
535
|
force: bool = False,
|
536
536
|
hash_concurrency: int = 4,
|
537
|
-
put_concurrency: int =
|
537
|
+
put_concurrency: int = 128,
|
538
538
|
): ...
|
539
539
|
def __enter__(self): ...
|
540
540
|
async def __aenter__(self): ...
|
@@ -22,7 +22,7 @@ modal/app.py,sha256=NZ_rJ9TuMfiNiLg8-gOFgufD5flGtXWPHOZI0gdD3hE,46585
|
|
22
22
|
modal/app.pyi,sha256=4-b_vbe3lNAqQPcMRpQCEDsE1zsVkQRJGUql9B7HvbM,22659
|
23
23
|
modal/call_graph.py,sha256=1g2DGcMIJvRy-xKicuf63IVE98gJSnQsr8R_NVMptNc,2581
|
24
24
|
modal/client.py,sha256=OwISJvkgMb-rHm9Gc4i-7YcDgGiZgwJ7F_PzwZH7a6Q,16847
|
25
|
-
modal/client.pyi,sha256=
|
25
|
+
modal/client.pyi,sha256=VuX_UQXWpe-33b-1nZiBVuPcV7mXtDqAZbi7pw13CD0,8457
|
26
26
|
modal/cloud_bucket_mount.py,sha256=YOe9nnvSr4ZbeCn587d7_VhE9IioZYRvF9VYQTQux08,5914
|
27
27
|
modal/cloud_bucket_mount.pyi,sha256=30T3K1a89l6wzmEJ_J9iWv9SknoGqaZDx59Xs-ZQcmk,1607
|
28
28
|
modal/cls.py,sha256=dBbeARwOWftlKd1cwtM0cHFtQWSWkwVXwVmOV4w0SyI,37907
|
@@ -34,12 +34,12 @@ modal/dict.py,sha256=w-Zuk3FXuwkyxKuF1ry86S8j2cvoC8-u4Ga0h-GfV1s,14324
|
|
34
34
|
modal/dict.pyi,sha256=RBaQyOd1ABRNN7vIf5L_rv94y7Kq5Qn9IlKHSr4j8N0,8120
|
35
35
|
modal/environments.py,sha256=gHFNLG78bqgizpQ4w_elz27QOqmcgAonFsmLs7NjUJ4,6804
|
36
36
|
modal/environments.pyi,sha256=4HbI0kywveaUVI7HqDtZ4HphCTGXYi_wie2hz87up5A,3425
|
37
|
-
modal/exception.py,sha256=
|
37
|
+
modal/exception.py,sha256=2pgq-j8JP-tB3yU2VmYOzn9CsynU9_h8IU_MgqgKegM,5352
|
38
38
|
modal/file_io.py,sha256=lcMs_E9Xfm0YX1t9U2wNIBPnqHRxmImqjLW1GHqVmyg,20945
|
39
39
|
modal/file_io.pyi,sha256=oB7x-rKq7bmm8cA7Z7W9C9yeko7KK9m9i5GidFnkGK4,9569
|
40
40
|
modal/file_pattern_matcher.py,sha256=wov-otB5M1oTdrYDtR2_VgacYin2srdtAP4McA1Cqzw,6516
|
41
41
|
modal/functions.py,sha256=kcNHvqeGBxPI7Cgd57NIBBghkfbeFJzXO44WW0jSmao,325
|
42
|
-
modal/functions.pyi,sha256=
|
42
|
+
modal/functions.pyi,sha256=5T58OucdNU4I-LqhBdwsWSAGka-Wa8nP2GcZ5K1bOL0,16236
|
43
43
|
modal/gpu.py,sha256=Kbhs_u49FaC2Zi0TjCdrpstpRtT5eZgecynmQi5IZVE,6752
|
44
44
|
modal/image.py,sha256=bGs4FF9TofGQOy2RRjedD2MTyIsmF-9Gdk-I7BitMRw,91832
|
45
45
|
modal/image.pyi,sha256=2xjB6XOZDtm_chDdd90UoIj8pnDt5hCg6bOmu5fNaA4,25625
|
@@ -78,8 +78,8 @@ modal/snapshot.pyi,sha256=dIEBdTPb7O3VwkQ8TMPjfyU17RLuS9i0DnACxxHy8X4,676
|
|
78
78
|
modal/stream_type.py,sha256=A6320qoAAWhEfwOCZfGtymQTu5AfLfJXXgARqooTPvY,417
|
79
79
|
modal/token_flow.py,sha256=0_4KabXKsuE4OXTJ1OuLOtA-b1sesShztMZkkRFK7tA,7605
|
80
80
|
modal/token_flow.pyi,sha256=ILbRv6JsZq-jK8jcJM7eB74e0PsbzwBm7hyPcV9lBlQ,2121
|
81
|
-
modal/volume.py,sha256=
|
82
|
-
modal/volume.pyi,sha256=
|
81
|
+
modal/volume.py,sha256=LO8hYt2y0BOXsWzjMUUfOhSxBs7eILgTP5Lvi0IRjxM,44092
|
82
|
+
modal/volume.pyi,sha256=fM1RRKz521eIzM3Cd7osAhQ3UQEboQEjXWLQKerjSzY,21117
|
83
83
|
modal/_runtime/__init__.py,sha256=MIEP8jhXUeGq_eCjYFcqN5b1bxBM4fdk0VESpjWR0fc,28
|
84
84
|
modal/_runtime/asgi.py,sha256=_2xSTsDD27Cit7xnMs4lzkJA2wzer2_N4Oa3BkXFzVA,22521
|
85
85
|
modal/_runtime/container_io_manager.py,sha256=6j0jO2-s9ShckM4SK45OapoQxWW9HQwQjFaBkXPJPwU,44763
|
@@ -93,7 +93,7 @@ modal/_utils/__init__.py,sha256=waLjl5c6IPDhSsdWAm9Bji4e2PVxamYABKAze6CHVXY,28
|
|
93
93
|
modal/_utils/app_utils.py,sha256=88BT4TPLWfYAQwKTHcyzNQRHg8n9B-QE2UyJs96iV-0,108
|
94
94
|
modal/_utils/async_utils.py,sha256=zjdtdA54zvNL_RuREmN5NWFhhiRcNh8z0jT2rBc5RgY,28001
|
95
95
|
modal/_utils/blob_utils.py,sha256=IexC2Jbtqp_Tkmy62ayfgzTYte0UPCNufB_v-DO21g8,18585
|
96
|
-
modal/_utils/bytes_io_segment_payload.py,sha256=
|
96
|
+
modal/_utils/bytes_io_segment_payload.py,sha256=DT4roLCafjexASGyM1lPOR0HlwOYLA9UQqlxzTgUttE,3614
|
97
97
|
modal/_utils/deprecation.py,sha256=EXP1beU4pmEqEzWMLw6E3kUfNfpmNA_VOp6i0EHi93g,4856
|
98
98
|
modal/_utils/docker_utils.py,sha256=h1uETghR40mp_y3fSWuZAfbIASH1HMzuphJHghAL6DU,3722
|
99
99
|
modal/_utils/function_utils.py,sha256=bhrjyOHPPXm6fAyJx3bzI1Yh56j6xh8eeMSFKdAWrHQ,26978
|
@@ -147,7 +147,7 @@ modal/requirements/2024.10.txt,sha256=qD-5cVIVM9wXesJ6JC89Ew-3m2KjEElUz3jaw_MddR
|
|
147
147
|
modal/requirements/PREVIEW.txt,sha256=qD-5cVIVM9wXesJ6JC89Ew-3m2KjEElUz3jaw_MddRo,296
|
148
148
|
modal/requirements/README.md,sha256=9tK76KP0Uph7O0M5oUgsSwEZDj5y-dcUPsnpR0Sc-Ik,854
|
149
149
|
modal/requirements/base-images.json,sha256=57vMSqzMbLBxw5tFWSaMiIkkVEps4JfX5PAtXGnkS4U,740
|
150
|
-
modal-1.0.2.
|
150
|
+
modal-1.0.2.dev4.dist-info/licenses/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
|
151
151
|
modal_docs/__init__.py,sha256=svYKtV8HDwDCN86zbdWqyq5T8sMdGDj0PVlzc2tIxDM,28
|
152
152
|
modal_docs/gen_cli_docs.py,sha256=c1yfBS_x--gL5bs0N4ihMwqwX8l3IBWSkBAKNNIi6bQ,3801
|
153
153
|
modal_docs/gen_reference_docs.py,sha256=d_CQUGQ0rfw28u75I2mov9AlS773z9rG40-yq5o7g2U,6359
|
@@ -170,10 +170,10 @@ modal_proto/options_pb2.pyi,sha256=l7DBrbLO7q3Ir-XDkWsajm0d0TQqqrfuX54i4BMpdQg,1
|
|
170
170
|
modal_proto/options_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
|
171
171
|
modal_proto/options_pb2_grpc.pyi,sha256=CImmhxHsYnF09iENPoe8S4J-n93jtgUYD2JPAc0yJSI,247
|
172
172
|
modal_proto/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
173
|
-
modal_version/__init__.py,sha256=
|
173
|
+
modal_version/__init__.py,sha256=Fa79PSoRVo9x2enS4U-X0x0iNewxTVKIJ8xYL0ZPric,120
|
174
174
|
modal_version/__main__.py,sha256=2FO0yYQQwDTh6udt1h-cBnGd1c4ZyHnHSI4BksxzVac,105
|
175
|
-
modal-1.0.2.
|
176
|
-
modal-1.0.2.
|
177
|
-
modal-1.0.2.
|
178
|
-
modal-1.0.2.
|
179
|
-
modal-1.0.2.
|
175
|
+
modal-1.0.2.dev4.dist-info/METADATA,sha256=HyPUSIJptfUIOb_WQB0Bf1JTB0g0q7xgI717Vfm4qe0,2454
|
176
|
+
modal-1.0.2.dev4.dist-info/WHEEL,sha256=1tXe9gY0PYatrMPMDd6jXqjfpz_B-Wqm32CPfRC58XU,91
|
177
|
+
modal-1.0.2.dev4.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
|
178
|
+
modal-1.0.2.dev4.dist-info/top_level.txt,sha256=4BWzoKYREKUZ5iyPzZpjqx4G8uB5TWxXPDwibLcVa7k,43
|
179
|
+
modal-1.0.2.dev4.dist-info/RECORD,,
|
modal_version/__init__.py
CHANGED
File without changes
|
File without changes
|
File without changes
|
File without changes
|