indexify 0.3.31__py3-none-any.whl → 0.4.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. indexify/cli/__init__.py +18 -0
  2. indexify/cli/build_image.py +51 -0
  3. indexify/cli/deploy.py +57 -0
  4. indexify/cli/executor.py +205 -0
  5. indexify/executor/{grpc/channel_manager.py → channel_manager.py} +17 -11
  6. indexify/executor/executor.py +57 -313
  7. indexify/executor/function_allowlist.py +59 -0
  8. indexify/executor/function_executor/function_executor.py +12 -6
  9. indexify/executor/function_executor/invocation_state_client.py +25 -3
  10. indexify/executor/function_executor/server/function_executor_server_factory.py +3 -3
  11. indexify/executor/function_executor/server/subprocess_function_executor_server_factory.py +22 -11
  12. indexify/executor/function_executor_controller/__init__.py +13 -0
  13. indexify/executor/function_executor_controller/completed_task_metrics.py +82 -0
  14. indexify/executor/function_executor_controller/create_function_executor.py +154 -0
  15. indexify/executor/function_executor_controller/debug_event_loop.py +37 -0
  16. indexify/executor/function_executor_controller/destroy_function_executor.py +28 -0
  17. indexify/executor/function_executor_controller/downloads.py +199 -0
  18. indexify/executor/function_executor_controller/events.py +172 -0
  19. indexify/executor/function_executor_controller/function_executor_controller.py +759 -0
  20. indexify/executor/function_executor_controller/loggers.py +57 -0
  21. indexify/executor/function_executor_controller/message_validators.py +65 -0
  22. indexify/executor/function_executor_controller/metrics/completed_task_metrics.py +68 -0
  23. indexify/executor/{metrics/downloader.py → function_executor_controller/metrics/downloads.py} +1 -3
  24. indexify/executor/function_executor_controller/metrics/function_executor_controller.py +60 -0
  25. indexify/executor/{function_executor/metrics/single_task_runner.py → function_executor_controller/metrics/run_task.py} +9 -3
  26. indexify/executor/function_executor_controller/metrics/upload_task_output.py +39 -0
  27. indexify/executor/function_executor_controller/prepare_task.py +38 -0
  28. indexify/executor/function_executor_controller/run_task.py +201 -0
  29. indexify/executor/function_executor_controller/task_info.py +33 -0
  30. indexify/executor/function_executor_controller/task_output.py +122 -0
  31. indexify/executor/function_executor_controller/upload_task_output.py +234 -0
  32. indexify/executor/host_resources/host_resources.py +20 -25
  33. indexify/executor/{grpc/metrics → metrics}/channel_manager.py +1 -1
  34. indexify/executor/metrics/executor.py +0 -47
  35. indexify/executor/{grpc/metrics → metrics}/state_reconciler.py +1 -1
  36. indexify/executor/{grpc/metrics → metrics}/state_reporter.py +1 -1
  37. indexify/executor/monitoring/health_checker/generic_health_checker.py +6 -59
  38. indexify/executor/monitoring/health_checker/health_checker.py +0 -11
  39. indexify/executor/{grpc/state_reconciler.py → state_reconciler.py} +139 -141
  40. indexify/executor/state_reporter.py +364 -0
  41. indexify/proto/executor_api.proto +67 -59
  42. indexify/proto/executor_api_pb2.py +52 -52
  43. indexify/proto/executor_api_pb2.pyi +125 -104
  44. indexify/proto/executor_api_pb2_grpc.py +0 -47
  45. {indexify-0.3.31.dist-info → indexify-0.4.2.dist-info}/METADATA +1 -3
  46. indexify-0.4.2.dist-info/RECORD +68 -0
  47. indexify-0.4.2.dist-info/entry_points.txt +3 -0
  48. indexify/cli/cli.py +0 -268
  49. indexify/executor/api_objects.py +0 -92
  50. indexify/executor/downloader.py +0 -417
  51. indexify/executor/executor_flavor.py +0 -7
  52. indexify/executor/function_executor/function_executor_state.py +0 -107
  53. indexify/executor/function_executor/function_executor_states_container.py +0 -93
  54. indexify/executor/function_executor/function_executor_status.py +0 -95
  55. indexify/executor/function_executor/metrics/function_executor_state.py +0 -46
  56. indexify/executor/function_executor/metrics/function_executor_state_container.py +0 -10
  57. indexify/executor/function_executor/single_task_runner.py +0 -345
  58. indexify/executor/function_executor/task_input.py +0 -21
  59. indexify/executor/function_executor/task_output.py +0 -105
  60. indexify/executor/grpc/function_executor_controller.py +0 -418
  61. indexify/executor/grpc/metrics/task_controller.py +0 -8
  62. indexify/executor/grpc/state_reporter.py +0 -317
  63. indexify/executor/grpc/task_controller.py +0 -508
  64. indexify/executor/metrics/task_fetcher.py +0 -21
  65. indexify/executor/metrics/task_reporter.py +0 -53
  66. indexify/executor/metrics/task_runner.py +0 -52
  67. indexify/executor/monitoring/function_allowlist.py +0 -25
  68. indexify/executor/runtime_probes.py +0 -68
  69. indexify/executor/task_fetcher.py +0 -96
  70. indexify/executor/task_reporter.py +0 -459
  71. indexify/executor/task_runner.py +0 -177
  72. indexify-0.3.31.dist-info/RECORD +0 -68
  73. indexify-0.3.31.dist-info/entry_points.txt +0 -3
  74. {indexify-0.3.31.dist-info → indexify-0.4.2.dist-info}/WHEEL +0 -0
@@ -1,177 +0,0 @@
1
- from typing import Any, Optional
2
-
3
- from .api_objects import Task
4
- from .function_executor.function_executor_state import (
5
- FunctionExecutorState,
6
- FunctionExecutorStatus,
7
- )
8
- from .function_executor.function_executor_states_container import (
9
- FunctionExecutorStatesContainer,
10
- )
11
- from .function_executor.server.function_executor_server_factory import (
12
- FunctionExecutorServerFactory,
13
- )
14
- from .function_executor.single_task_runner import SingleTaskRunner
15
- from .function_executor.task_input import TaskInput
16
- from .function_executor.task_output import TaskOutput
17
- from .metrics.task_runner import (
18
- metric_task_policy_errors,
19
- metric_task_policy_latency,
20
- metric_task_policy_runs,
21
- metric_task_run_latency,
22
- metric_task_run_platform_errors,
23
- metric_task_runs,
24
- metric_tasks_blocked_by_policy,
25
- metric_tasks_blocked_by_policy_per_function_name,
26
- metric_tasks_running,
27
- )
28
-
29
-
30
- class TaskRunner:
31
- """Routes a task to its container following a scheduling policy.
32
-
33
- Due to the scheduling policy a task might be blocked for a while."""
34
-
35
- def __init__(
36
- self,
37
- executor_id: str,
38
- function_executor_server_factory: FunctionExecutorServerFactory,
39
- base_url: str,
40
- function_executor_states: FunctionExecutorStatesContainer,
41
- config_path: Optional[str],
42
- ):
43
- self._executor_id: str = executor_id
44
- self._factory: FunctionExecutorServerFactory = function_executor_server_factory
45
- self._base_url: str = base_url
46
- self._config_path: Optional[str] = config_path
47
- self._function_executor_states: FunctionExecutorStatesContainer = (
48
- function_executor_states
49
- )
50
-
51
- async def run(self, task_input: TaskInput, logger: Any) -> TaskOutput:
52
- logger = logger.bind(module=__name__)
53
- state: Optional[FunctionExecutorState] = None
54
-
55
- try:
56
- with (
57
- metric_task_policy_errors.count_exceptions(),
58
- metric_tasks_blocked_by_policy.track_inprogress(),
59
- metric_tasks_blocked_by_policy_per_function_name.labels(
60
- function_name=task_input.task.compute_fn
61
- ).track_inprogress(),
62
- metric_task_policy_latency.time(),
63
- ):
64
- metric_task_policy_runs.inc()
65
- state = await self._acquire_function_executor_for_task_execution(
66
- task_input, logger
67
- )
68
-
69
- with (
70
- metric_task_run_platform_errors.count_exceptions(),
71
- metric_tasks_running.track_inprogress(),
72
- metric_task_run_latency.time(),
73
- ):
74
- metric_task_runs.inc()
75
- return await self._run_task(state, task_input, logger)
76
- except Exception as e:
77
- logger.error(
78
- "failed running the task:",
79
- exc_info=e,
80
- )
81
- return TaskOutput.internal_error(
82
- task_id=task_input.task.id,
83
- namespace=task_input.task.namespace,
84
- graph_name=task_input.task.compute_graph,
85
- function_name=task_input.task.compute_fn,
86
- graph_version=task_input.task.graph_version,
87
- graph_invocation_id=task_input.task.invocation_id,
88
- output_payload_uri_prefix=task_input.task.output_payload_uri_prefix,
89
- )
90
- finally:
91
- if state is not None:
92
- state.lock.release()
93
-
94
- async def _acquire_function_executor_for_task_execution(
95
- self, task_input: TaskInput, logger: Any
96
- ) -> FunctionExecutorState:
97
- """Waits untils the task acquires a Function Executor state where the task can run.
98
-
99
- The returned Function Executor state is locked and the caller is responsible for releasing the lock.
100
- """
101
- logger.info("task is blocked by policy")
102
- state = await self._function_executor_states.get_or_create_state(
103
- id=_function_id_without_version(task_input.task),
104
- namespace=task_input.task.namespace,
105
- graph_name=task_input.task.compute_graph,
106
- graph_version=task_input.task.graph_version,
107
- function_name=task_input.task.compute_fn,
108
- image_uri=task_input.task.image_uri,
109
- secret_names=task_input.task.secret_names or [],
110
- )
111
- await state.lock.acquire()
112
-
113
- try:
114
- await self._run_task_policy(state, task_input.task)
115
- return state
116
- except Exception:
117
- state.lock.release()
118
- raise
119
-
120
- async def _run_task_policy(self, state: FunctionExecutorState, task: Task) -> None:
121
- """Runs the task policy until the task can run on the Function Executor.
122
-
123
- On successful return the Function Executor status is either IDLE or DESTROYED.
124
- """
125
- # Current policy for running tasks:
126
- # - There can only be a single Function Executor per function regardless of function versions.
127
- # -- If a Function Executor already exists for a different function version then wait until
128
- # all the tasks finish in the existing Function Executor and then destroy it.
129
- # -- This prevents failed tasks for different versions of the same function continiously
130
- # destroying each other's Function Executors.
131
- # - Each Function Executor rans at most 1 task concurrently.
132
- await state.wait_status(
133
- [
134
- FunctionExecutorStatus.DESTROYED,
135
- FunctionExecutorStatus.IDLE,
136
- FunctionExecutorStatus.UNHEALTHY,
137
- FunctionExecutorStatus.SHUTDOWN,
138
- ]
139
- )
140
- # We only shutdown the Function Executor on full Executor shutdown so it's fine to raise error here.
141
- if state.status == FunctionExecutorStatus.SHUTDOWN:
142
- raise Exception("Function Executor state is shutting down")
143
-
144
- if state.status == FunctionExecutorStatus.UNHEALTHY:
145
- await state.destroy_function_executor()
146
-
147
- if state.graph_version == task.graph_version:
148
- return # All good, we can run on this Function Executor.
149
-
150
- if state.status in [FunctionExecutorStatus.IDLE]:
151
- await state.destroy_function_executor()
152
-
153
- state.graph_version = task.graph_version
154
- # At this point the state belongs to the version of the function from the task
155
- # and there are no running tasks in the Function Executor.
156
-
157
- async def _run_task(
158
- self, state: FunctionExecutorState, task_input: TaskInput, logger: Any
159
- ) -> TaskOutput:
160
- logger.info("task execution started")
161
- runner: SingleTaskRunner = SingleTaskRunner(
162
- executor_id=self._executor_id,
163
- function_executor_state=state,
164
- task_input=task_input,
165
- function_executor_server_factory=self._factory,
166
- base_url=self._base_url,
167
- config_path=self._config_path,
168
- logger=logger,
169
- )
170
- return await runner.run()
171
-
172
- async def shutdown(self) -> None:
173
- pass
174
-
175
-
176
- def _function_id_without_version(task: Task) -> str:
177
- return f"not_versioned/{task.namespace}/{task.compute_graph}/{task.compute_fn}"
@@ -1,68 +0,0 @@
1
- indexify/cli/cli.py,sha256=5nAjgtQT96inBIeXUHkMyeNB0oQ7vqbbGiC8Oace44Q,9200
2
- indexify/executor/README.md,sha256=ozC6_hMkhQQNVCMEpBxwiUALz6lwErPQxNxQfQDqnG4,2029
3
- indexify/executor/api_objects.py,sha256=kHx5gKPwM0Rm64Ea__kPFwuarStX0u_9uaE7vV5M5z8,2222
4
- indexify/executor/blob_store/blob_store.py,sha256=XViw_KRfFSNqwcFYwMZixZF-EYCjXK2AQHdt0xh4UVo,2368
5
- indexify/executor/blob_store/local_fs_blob_store.py,sha256=6LexqMBGXp8f6Ka95R6xMIUyDutrZJABOMNcp-ssa98,1809
6
- indexify/executor/blob_store/metrics/blob_store.py,sha256=5_xiPREeHWFtxFh1NupDsF8zP4pmUPgLNNn-UE9Uzvc,1008
7
- indexify/executor/blob_store/s3_blob_store.py,sha256=G3B_V3gUE7XbUY42lDtBczUKuA7q8S7MD43tx1aHrJo,3445
8
- indexify/executor/downloader.py,sha256=k9VbfOa-D6YH-cX8Sz-W-gWTsxmeVpSaIOq0xTC9KB0,15474
9
- indexify/executor/executor.py,sha256=LRCYdhImMQ8Uj-N8iEIcInRNlwAR822rJpJfFJ31T6A,16959
10
- indexify/executor/executor_flavor.py,sha256=uilzDQVVYlQGR1MVnrUC4NevUActDWHdnJkr38M6kTk,118
11
- indexify/executor/function_executor/function_executor.py,sha256=agfUxzSQ-2TqkpMhW3OvOSMF_EhpemetaL3_dYp29Ro,11888
12
- indexify/executor/function_executor/function_executor_state.py,sha256=_bxUKNtuIMDVHVnDzMzMj-Qy4sR18MTwBtakdoAQ0y0,4209
13
- indexify/executor/function_executor/function_executor_states_container.py,sha256=ht2xcFXWgCjYxCoeMffB0WHUPgSKJ3QIoswiomwP9WA,3899
14
- indexify/executor/function_executor/function_executor_status.py,sha256=Ms8tHG0wlw__pToeQIfBV6SO9c4tPu3UQgJAwXUkg2M,3597
15
- indexify/executor/function_executor/health_checker.py,sha256=IxE0jnC99K_lvnizFLjXqS1942H8-FNAN4AlhLIjg2Y,6373
16
- indexify/executor/function_executor/invocation_state_client.py,sha256=VTpeNxxfsa0ej20Q_ker5RZVdHiu59HWd5qNOjo6DBQ,9800
17
- indexify/executor/function_executor/metrics/function_executor.py,sha256=TDksxLRJr-P9ZKhF2Orsaxzzb4lVIBxFEjd_9Zv53Ng,6313
18
- indexify/executor/function_executor/metrics/function_executor_state.py,sha256=qheMhnoiYLiZB7ky5EyegfDy4Mr0Zh83bOE0gJ38YmU,1607
19
- indexify/executor/function_executor/metrics/function_executor_state_container.py,sha256=6rrAfml-TivjkHatCM4BLY7jmVs523Wzb6QIysncc-0,302
20
- indexify/executor/function_executor/metrics/health_checker.py,sha256=EaeIYJPrQ-qqNMGZVGkvjPoeQSCl4FzPKXEv3Cly1NE,456
21
- indexify/executor/function_executor/metrics/invocation_state_client.py,sha256=6FCW6rXHVZZSmwLquZdpjgQPSmE_99naDLke5rZiwMI,1867
22
- indexify/executor/function_executor/metrics/single_task_runner.py,sha256=7BJlGkdPGKeufMs3zWNO_1GRVzjINRY5rW3Mp4oWWec,805
23
- indexify/executor/function_executor/server/client_configuration.py,sha256=gOywMus0cotlX6NKIadEJwvOmBE-LbGE_wvoMi5-HzY,994
24
- indexify/executor/function_executor/server/function_executor_server.py,sha256=_DLivLDikupZusRk8gVWDk7fWPT9XjZ4un1yWSlOObs,883
25
- indexify/executor/function_executor/server/function_executor_server_factory.py,sha256=xWEuDoxFqF-oC4RoiEer4S0Tk2tNbbJfA2kANZVShpM,1873
26
- indexify/executor/function_executor/server/subprocess_function_executor_server.py,sha256=JekDOqF7oFD4J6zcN3xB0Dxd1cgpEXMOsb_rKZOeBlI,668
27
- indexify/executor/function_executor/server/subprocess_function_executor_server_factory.py,sha256=hHYA-WSJMguvzGeSKWsMS95Xpub43Rg8NBpOuJDmcuM,3730
28
- indexify/executor/function_executor/single_task_runner.py,sha256=6Fb9icnZ21pJcCq3mddFRoonPdNpUdSjTSQYh9nJXS0,14977
29
- indexify/executor/function_executor/task_input.py,sha256=wSrHR4m0juiGClQyeVdhRC37QzDt6Rrjq-ZXJkfBi9k,584
30
- indexify/executor/function_executor/task_output.py,sha256=LpdQZuL1s7FDNk-3TwA__4g5twyfmv45ezBf5Ckf6IE,3434
31
- indexify/executor/grpc/channel_manager.py,sha256=ihDkLoiGBLfSmoA2szbntjCfL3E_NDf5LABRXE7YRec,6330
32
- indexify/executor/grpc/function_executor_controller.py,sha256=GRAwhCIDZA-mFGGiyZyOlcezxZ4LXQPkuH_ooTrKEgc,17418
33
- indexify/executor/grpc/metrics/channel_manager.py,sha256=k-WArgklmP5WhjcmFmrgRblB7yc3XlaOXO8owRyV-mw,649
34
- indexify/executor/grpc/metrics/state_reconciler.py,sha256=0aI2IM4XztKxFa7NCxYSLafw_iiej3p07yEiKyewXIM,585
35
- indexify/executor/grpc/metrics/state_reporter.py,sha256=GggBEjMzQUYIG95LtTS4fUg1u9jYowkaXoUXppAXucs,543
36
- indexify/executor/grpc/metrics/task_controller.py,sha256=9Nm86nGxL2rZ3rAORB0_CBdO--Fe4MBrewVW4CqGyOU,222
37
- indexify/executor/grpc/state_reconciler.py,sha256=vAT8LLPUQHDF42c5sa1-4T7FRBka3Bdv88Tv0L_jagk,19957
38
- indexify/executor/grpc/state_reporter.py,sha256=VzNnLPHs6IaaZVo9SqHyB9FrnJtxigUVZZ-jNRlKmQk,13165
39
- indexify/executor/grpc/task_controller.py,sha256=53QJsKQSHIbath8qB8Wgf44l-Ybj40VJ5TLm1Ra1InE,20976
40
- indexify/executor/host_resources/host_resources.py,sha256=bp4TK167Av700lVhWDMg_2bV_Vbt8dpPgYA-RJJ5H38,4078
41
- indexify/executor/host_resources/nvidia_gpu.py,sha256=BIxBcWenyhZe0fuPQT9I0g6zAWMDPcm_oZEfgOoYsFU,3306
42
- indexify/executor/host_resources/nvidia_gpu_allocator.py,sha256=oULSjL0AVo_nqR_pquq17079UalHQkhMwMqf72gbPHo,1872
43
- indexify/executor/metrics/downloader.py,sha256=lctPh8xjkXeLEFJnl1hNrD1yEhLhIl5sggsR4Yoe_Zc,2746
44
- indexify/executor/metrics/executor.py,sha256=ua-Vv_k1CB4juJdF7tEBQbBMksqWAA3iXKKMKXZUCLk,2369
45
- indexify/executor/metrics/task_fetcher.py,sha256=iJEwCLzYr2cuz7hRvNiqaa2nvQP4OrA0hm0iJY0YKG0,736
46
- indexify/executor/metrics/task_reporter.py,sha256=DKieoeNvyyP5R0V62OZns_dDjr_UkFcJ4eeuiy4kvkM,1837
47
- indexify/executor/metrics/task_runner.py,sha256=ZGFrl7zzfUdgPZnklxRIbnv9wVcHIQRhOGNqn9V2hSk,2047
48
- indexify/executor/monitoring/function_allowlist.py,sha256=wUGeiv3aAGWMlQXzHXq9O6MVHby6Tu-zY4U0MyWiQu0,683
49
- indexify/executor/monitoring/handler.py,sha256=Cj1cu_LcsAP0tdviqNhoEtGm4h0OJAxxzW9C2YdNXYU,240
50
- indexify/executor/monitoring/health_check_handler.py,sha256=e1pEtWFKaVs6H57Z4YLejNECrJtC38PweZc7xTJeqVw,695
51
- indexify/executor/monitoring/health_checker/generic_health_checker.py,sha256=ot-nan5kDMFwXanJu0_OKV65fIoqhvATIoFW4LOO6V8,3373
52
- indexify/executor/monitoring/health_checker/health_checker.py,sha256=c6UooJUIKaj2dYwU3507nnOglU51TC4FB9npCnLHjbY,838
53
- indexify/executor/monitoring/metrics.py,sha256=Dx2wPcTKvbd5Y5rGOfeyscFtAQ2DZ16_s5BX6d4nhI8,6660
54
- indexify/executor/monitoring/prometheus_metrics_handler.py,sha256=KiGqSf7rkXTfbDwThyXFpFe2jnuZD5q-5SBP_0GDo8Y,591
55
- indexify/executor/monitoring/server.py,sha256=yzdYhcxnmY6uTQUMt3vatF5jilN52ZtfFseOmHyQpTo,1254
56
- indexify/executor/monitoring/startup_probe_handler.py,sha256=zXXsBU15SMlBx1bSFpxWDfed1VHtKKnwvLQ8-frpG98,425
57
- indexify/executor/runtime_probes.py,sha256=bo6Dq6AGZpJH099j0DHtVSDEH80tv3j9MXf3VXSx_p8,2182
58
- indexify/executor/task_fetcher.py,sha256=p3iEsWyGi0ZMPAv0183smzOUD1KycQ_dXsyd9mpB9IU,3529
59
- indexify/executor/task_reporter.py,sha256=gFERv8r7dEYazmx0E6nujXsglzpy9iS-5-fqn9BESI8,16622
60
- indexify/executor/task_runner.py,sha256=UupZbGxU9BN4i1t6M8tH-5k3s4eUPEhMhar1YI0Aztk,7219
61
- indexify/proto/executor_api.proto,sha256=_gvLB6JYXa-wR-Uh7ZWtHyb3AFO7S9__3Q8IGxrwhg4,10368
62
- indexify/proto/executor_api_pb2.py,sha256=xXtHaDHVCffFuGpQ-1Bb4Wp29E4l7D-Sed0-wfCNyfo,15195
63
- indexify/proto/executor_api_pb2.pyi,sha256=i8VQQ33QpqS8cB2uWf05MQ8ooYl6dKux40rkVrs50vo,19942
64
- indexify/proto/executor_api_pb2_grpc.py,sha256=GGiDtyQlA2382E_ZyKUBYcWNEJHH_RlulieStKfkJXI,9514
65
- indexify-0.3.31.dist-info/METADATA,sha256=LJbCD7kYJ2cwHl5Vtp1K2uA8CpOREm395tgMXbpg9Dc,1237
66
- indexify-0.3.31.dist-info/WHEEL,sha256=RaoafKOydTQ7I_I3JTrPCg6kUmTgtm4BornzOqyEfJ8,88
67
- indexify-0.3.31.dist-info/entry_points.txt,sha256=GU9wmsgvN7nQw3N2X0PMYn1RSvF6CrhH9RuC2D8d3Gk,53
68
- indexify-0.3.31.dist-info/RECORD,,
@@ -1,3 +0,0 @@
1
- [console_scripts]
2
- indexify-cli=indexify.cli.cli:app
3
-