indexify 0.4.10__py3-none-any.whl → 0.4.12__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.
- indexify/executor/function_executor_controller/events.py +18 -16
- indexify/executor/function_executor_controller/function_executor_controller.py +177 -121
- indexify/executor/function_executor_controller/metrics/function_executor_controller.py +25 -18
- indexify/executor/function_executor_controller/run_task.py +14 -0
- indexify/executor/function_executor_controller/terminate_function_executor.py +38 -0
- indexify/executor/state_reconciler.py +2 -7
- indexify/proto/executor_api.proto +2 -4
- indexify/proto/executor_api_pb2.py +42 -42
- indexify/proto/executor_api_pb2.pyi +9 -13
- {indexify-0.4.10.dist-info → indexify-0.4.12.dist-info}/METADATA +2 -2
- {indexify-0.4.10.dist-info → indexify-0.4.12.dist-info}/RECORD +13 -13
- indexify/executor/function_executor_controller/destroy_function_executor.py +0 -28
- {indexify-0.4.10.dist-info → indexify-0.4.12.dist-info}/WHEEL +0 -0
- {indexify-0.4.10.dist-info → indexify-0.4.12.dist-info}/entry_points.txt +0 -0
@@ -1,5 +1,5 @@
|
|
1
1
|
from enum import Enum
|
2
|
-
from typing import Optional
|
2
|
+
from typing import List, Optional
|
3
3
|
|
4
4
|
from indexify.executor.function_executor.function_executor import (
|
5
5
|
FunctionExecutor,
|
@@ -12,7 +12,7 @@ from .task_info import TaskInfo
|
|
12
12
|
|
13
13
|
class EventType(Enum):
|
14
14
|
FUNCTION_EXECUTOR_CREATED = 1
|
15
|
-
|
15
|
+
FUNCTION_EXECUTOR_TERMINATED = 2
|
16
16
|
SHUTDOWN_INITIATED = 3
|
17
17
|
TASK_PREPARATION_FINISHED = 4
|
18
18
|
SCHEDULE_TASK_EXECUTION = 5
|
@@ -50,23 +50,32 @@ class FunctionExecutorCreated(BaseEvent):
|
|
50
50
|
self.output: FunctionExecutorStartupOutput = output
|
51
51
|
|
52
52
|
|
53
|
-
class
|
53
|
+
class FunctionExecutorTerminated(BaseEvent):
|
54
54
|
"""
|
55
|
-
Event indicating that Function Executor has been destroyed.
|
55
|
+
Event indicating that Function Executor has been terminated (destroyed).
|
56
56
|
"""
|
57
57
|
|
58
58
|
def __init__(
|
59
|
-
self,
|
59
|
+
self,
|
60
|
+
is_success: bool,
|
61
|
+
fe_termination_reason: FunctionExecutorTerminationReason,
|
62
|
+
allocation_ids_caused_termination: List[str],
|
60
63
|
):
|
61
|
-
super().__init__(EventType.
|
64
|
+
super().__init__(EventType.FUNCTION_EXECUTOR_TERMINATED)
|
62
65
|
self.is_success: bool = is_success
|
63
|
-
self.
|
66
|
+
self.fe_termination_reason: FunctionExecutorTerminationReason = (
|
67
|
+
fe_termination_reason
|
68
|
+
)
|
69
|
+
self.allocation_ids_caused_termination: List[str] = (
|
70
|
+
allocation_ids_caused_termination
|
71
|
+
)
|
64
72
|
|
65
73
|
def __str__(self) -> str:
|
66
74
|
return (
|
67
75
|
f"Event(type={self.event_type.name}, "
|
68
76
|
f"is_success={self.is_success}, "
|
69
|
-
f"
|
77
|
+
f"fe_termination_reason={FunctionExecutorTerminationReason.Name(self.fe_termination_reason)}, "
|
78
|
+
f"allocation_ids_caused_termination={self.allocation_ids_caused_termination})"
|
70
79
|
)
|
71
80
|
|
72
81
|
|
@@ -75,15 +84,8 @@ class ShutdownInitiated(BaseEvent):
|
|
75
84
|
Event indicating that Function Executor shutdown has been initiated.
|
76
85
|
"""
|
77
86
|
|
78
|
-
def __init__(self
|
87
|
+
def __init__(self):
|
79
88
|
super().__init__(EventType.SHUTDOWN_INITIATED)
|
80
|
-
self.termination_reason: FunctionExecutorTerminationReason = termination_reason
|
81
|
-
|
82
|
-
def __str__(self) -> str:
|
83
|
-
return (
|
84
|
-
f"Event(type={self.event_type.name}, "
|
85
|
-
f"termination_reason={FunctionExecutorTerminationReason.Name(self.termination_reason)})"
|
86
|
-
)
|
87
89
|
|
88
90
|
|
89
91
|
class TaskPreparationFinished(BaseEvent):
|
@@ -1,6 +1,7 @@
|
|
1
1
|
import asyncio
|
2
2
|
import time
|
3
3
|
from collections.abc import Coroutine
|
4
|
+
from enum import Enum
|
4
5
|
from pathlib import Path
|
5
6
|
from typing import Any, Dict, List, Optional
|
6
7
|
|
@@ -28,12 +29,11 @@ from .debug_event_loop import (
|
|
28
29
|
debug_print_events,
|
29
30
|
debug_print_processing_event,
|
30
31
|
)
|
31
|
-
from .destroy_function_executor import destroy_function_executor
|
32
32
|
from .events import (
|
33
33
|
BaseEvent,
|
34
34
|
EventType,
|
35
35
|
FunctionExecutorCreated,
|
36
|
-
|
36
|
+
FunctionExecutorTerminated,
|
37
37
|
ScheduleTaskExecution,
|
38
38
|
ShutdownInitiated,
|
39
39
|
TaskExecutionFinished,
|
@@ -43,12 +43,14 @@ from .events import (
|
|
43
43
|
from .function_executor_startup_output import FunctionExecutorStartupOutput
|
44
44
|
from .loggers import function_executor_logger, task_allocation_logger
|
45
45
|
from .metrics.function_executor_controller import (
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
46
|
+
METRIC_FUNCTION_EXECUTORS_WITH_STATE_LABEL_NOT_STARTED,
|
47
|
+
METRIC_FUNCTION_EXECUTORS_WITH_STATE_LABEL_RUNNING,
|
48
|
+
METRIC_FUNCTION_EXECUTORS_WITH_STATE_LABEL_STARTING_UP,
|
49
|
+
METRIC_FUNCTION_EXECUTORS_WITH_STATE_LABEL_TERMINATED,
|
50
|
+
METRIC_FUNCTION_EXECUTORS_WITH_STATE_LABEL_TERMINATING,
|
51
|
+
METRIC_FUNCTION_EXECUTORS_WITH_STATE_LABEL_UNKNOWN,
|
50
52
|
metric_control_loop_handle_event_latency,
|
51
|
-
|
53
|
+
metric_function_executors_with_state,
|
52
54
|
metric_runnable_tasks,
|
53
55
|
metric_runnable_tasks_per_function_name,
|
54
56
|
metric_schedule_task_latency,
|
@@ -58,9 +60,20 @@ from .prepare_task import prepare_task
|
|
58
60
|
from .run_task import run_task_on_function_executor
|
59
61
|
from .task_info import TaskInfo
|
60
62
|
from .task_output import TaskOutput
|
63
|
+
from .terminate_function_executor import terminate_function_executor
|
61
64
|
from .upload_task_output import upload_task_output
|
62
65
|
|
63
66
|
|
67
|
+
# Actual FE controller states, they are a bit different from statuses reported to the Server.
|
68
|
+
# All the valid state transitions are forward only (can skip multiple states in a row).
|
69
|
+
class _FE_CONTROLLER_STATE(Enum):
|
70
|
+
NOT_STARTED = 1
|
71
|
+
STARTING_UP = 2
|
72
|
+
RUNNING = 3
|
73
|
+
TERMINATING = 4
|
74
|
+
TERMINATED = 5
|
75
|
+
|
76
|
+
|
64
77
|
class FunctionExecutorController:
|
65
78
|
def __init__(
|
66
79
|
self,
|
@@ -94,19 +107,17 @@ class FunctionExecutorController:
|
|
94
107
|
self._logger: Any = function_executor_logger(
|
95
108
|
function_executor_description, logger.bind(module=__name__)
|
96
109
|
)
|
97
|
-
|
98
|
-
# the same event loop.
|
110
|
+
self._destroy_lock: asyncio.Lock = asyncio.Lock()
|
111
|
+
# Mutable state. No lock needed as it's modified by async tasks running in the same event loop.
|
99
112
|
self._fe: Optional[FunctionExecutor] = None
|
100
|
-
self.
|
101
|
-
|
102
|
-
|
103
|
-
# FE Status reported to Server.
|
104
|
-
self._status: FunctionExecutorStatus = (
|
105
|
-
FunctionExecutorStatus.FUNCTION_EXECUTOR_STATUS_UNKNOWN
|
106
|
-
)
|
107
|
-
metric_function_executors_with_status.labels(
|
108
|
-
status=_to_fe_status_metric_label(self._status, self._logger)
|
113
|
+
self._internal_state = _FE_CONTROLLER_STATE.NOT_STARTED
|
114
|
+
metric_function_executors_with_state.labels(
|
115
|
+
state=_to_fe_state_metric_label(self._internal_state, self._logger)
|
109
116
|
).inc()
|
117
|
+
self._reported_state: FunctionExecutorState = FunctionExecutorState(
|
118
|
+
description=function_executor_description,
|
119
|
+
status=FunctionExecutorStatus.FUNCTION_EXECUTOR_STATUS_UNKNOWN,
|
120
|
+
)
|
110
121
|
# Ordered list of events to be processed by the control loop.
|
111
122
|
self._events: List[BaseEvent] = []
|
112
123
|
# Asyncio event used to notify the control loop that there are new events to process.
|
@@ -124,13 +135,6 @@ class FunctionExecutorController:
|
|
124
135
|
def function_executor_id(self) -> str:
|
125
136
|
return self._fe_description.id
|
126
137
|
|
127
|
-
def status(self) -> FunctionExecutorStatus:
|
128
|
-
"""Returns the current status of the Function Executor.
|
129
|
-
|
130
|
-
Not blocking.
|
131
|
-
"""
|
132
|
-
return self._status
|
133
|
-
|
134
138
|
def add_task_allocation(self, task_allocation: TaskAllocation) -> None:
|
135
139
|
"""Adds a task to the Function Executor.
|
136
140
|
|
@@ -205,9 +209,10 @@ class FunctionExecutorController:
|
|
205
209
|
"""Starts up the Function Executor and prepares it to run tasks.
|
206
210
|
|
207
211
|
Not blocking. Never raises exceptions."""
|
208
|
-
if self.
|
212
|
+
if self._internal_state != _FE_CONTROLLER_STATE.NOT_STARTED:
|
209
213
|
self._logger.warning(
|
210
|
-
"
|
214
|
+
"function executor state is not NOT_STARTED, ignoring startup call",
|
215
|
+
internal_state=self._internal_state.name,
|
211
216
|
)
|
212
217
|
return
|
213
218
|
|
@@ -215,7 +220,13 @@ class FunctionExecutorController:
|
|
215
220
|
self._control_loop(),
|
216
221
|
name="function executor control loop",
|
217
222
|
)
|
218
|
-
self.
|
223
|
+
self._update_internal_state(_FE_CONTROLLER_STATE.STARTING_UP)
|
224
|
+
self._update_reported_state(
|
225
|
+
FunctionExecutorState(
|
226
|
+
description=self._fe_description,
|
227
|
+
status=FunctionExecutorStatus.FUNCTION_EXECUTOR_STATUS_PENDING,
|
228
|
+
)
|
229
|
+
)
|
219
230
|
next_aio = create_function_executor(
|
220
231
|
function_executor_description=self._fe_description,
|
221
232
|
function_executor_server_factory=self._fe_server_factory,
|
@@ -237,17 +248,13 @@ class FunctionExecutorController:
|
|
237
248
|
),
|
238
249
|
)
|
239
250
|
|
240
|
-
async def shutdown(
|
241
|
-
self, termination_reason: FunctionExecutorTerminationReason
|
242
|
-
) -> None:
|
251
|
+
async def shutdown(self) -> None:
|
243
252
|
"""Shutsdown the Function Executor and frees all of its resources.
|
244
253
|
|
245
|
-
|
254
|
+
No task outcomes and outputs are getting reported to Server after this call.
|
246
255
|
Doesn't raise any exceptions. Blocks until the shutdown is complete.
|
247
256
|
"""
|
248
|
-
self._add_event(
|
249
|
-
ShutdownInitiated(termination_reason=termination_reason), source="shutdown"
|
250
|
-
)
|
257
|
+
self._add_event(ShutdownInitiated(), source="shutdown")
|
251
258
|
try:
|
252
259
|
await self._control_loop_aio_task
|
253
260
|
except asyncio.CancelledError:
|
@@ -259,51 +266,49 @@ class FunctionExecutorController:
|
|
259
266
|
)
|
260
267
|
self._logger.info("function executor controller shutdown finished")
|
261
268
|
|
262
|
-
def
|
269
|
+
def _update_internal_state(self, new_state: _FE_CONTROLLER_STATE) -> None:
|
270
|
+
"""Updates the internal state of the Function Executor Controller.
|
271
|
+
|
272
|
+
Not blocking. Never raises exceptions."""
|
273
|
+
old_state: _FE_CONTROLLER_STATE = self._internal_state
|
274
|
+
self._internal_state = new_state
|
275
|
+
|
276
|
+
self._logger.info(
|
277
|
+
"function executor internal state changed",
|
278
|
+
old_state=old_state.name,
|
279
|
+
new_state=new_state.name,
|
280
|
+
)
|
281
|
+
|
282
|
+
metric_function_executors_with_state.labels(
|
283
|
+
state=_to_fe_state_metric_label(old_state, self._logger)
|
284
|
+
).dec()
|
285
|
+
metric_function_executors_with_state.labels(
|
286
|
+
state=_to_fe_state_metric_label(new_state, self._logger)
|
287
|
+
).inc()
|
288
|
+
|
289
|
+
def _update_reported_state(
|
263
290
|
self,
|
264
|
-
|
291
|
+
new_state: FunctionExecutorState,
|
265
292
|
) -> None:
|
266
|
-
"""Sets Function Executor
|
293
|
+
"""Sets new Function Executor state and reports it to the Server.
|
267
294
|
|
268
295
|
Not blocking. Never raises exceptions."""
|
269
|
-
|
270
|
-
|
271
|
-
self._status: FunctionExecutorStatus = new_status
|
296
|
+
old_state: FunctionExecutorState = self._reported_state
|
297
|
+
self._reported_state = new_state
|
272
298
|
|
273
299
|
self._logger.info(
|
274
|
-
"function executor status changed",
|
275
|
-
old_status=FunctionExecutorStatus.Name(
|
276
|
-
new_status=FunctionExecutorStatus.Name(
|
300
|
+
"function executor grpc status changed",
|
301
|
+
old_status=FunctionExecutorStatus.Name(old_state.status),
|
302
|
+
new_status=FunctionExecutorStatus.Name(new_state.status),
|
277
303
|
termination_reason=_termination_reason_to_short_name(
|
278
|
-
|
304
|
+
new_state.termination_reason
|
279
305
|
),
|
280
306
|
)
|
281
|
-
metric_function_executors_with_status.labels(
|
282
|
-
status=_to_fe_status_metric_label(old_status, self._logger)
|
283
|
-
).dec()
|
284
|
-
metric_function_executors_with_status.labels(
|
285
|
-
status=_to_fe_status_metric_label(new_status, self._logger)
|
286
|
-
).inc()
|
287
307
|
|
288
|
-
self._state_reporter.update_function_executor_state(
|
308
|
+
self._state_reporter.update_function_executor_state(new_state)
|
289
309
|
# Report the status change to the Server asap to reduce latency in the system.
|
290
310
|
self._state_reporter.schedule_state_report()
|
291
311
|
|
292
|
-
def _current_state(self) -> FunctionExecutorState:
|
293
|
-
"""Returns the current state of the Function Executor.
|
294
|
-
|
295
|
-
Not blocking. Never raises exceptions.
|
296
|
-
"""
|
297
|
-
termination_reason: Optional[FunctionExecutorTerminationReason] = None
|
298
|
-
if self._fe_termination_reason is not None:
|
299
|
-
termination_reason = self._fe_termination_reason
|
300
|
-
|
301
|
-
return FunctionExecutorState(
|
302
|
-
description=self._fe_description,
|
303
|
-
status=self._status,
|
304
|
-
termination_reason=termination_reason,
|
305
|
-
)
|
306
|
-
|
307
312
|
async def _control_loop(self) -> None:
|
308
313
|
"""Runs control loop that coordinates all the work done by the Function Executor.
|
309
314
|
|
@@ -341,8 +346,8 @@ class FunctionExecutorController:
|
|
341
346
|
"""
|
342
347
|
if event.event_type == EventType.FUNCTION_EXECUTOR_CREATED:
|
343
348
|
return self._handle_event_function_executor_created(event)
|
344
|
-
elif event.event_type == EventType.
|
345
|
-
return self.
|
349
|
+
elif event.event_type == EventType.FUNCTION_EXECUTOR_TERMINATED:
|
350
|
+
return self._handle_event_function_executor_terminated(event)
|
346
351
|
elif event.event_type == EventType.TASK_PREPARATION_FINISHED:
|
347
352
|
return self._handle_event_task_preparation_finished(event)
|
348
353
|
elif event.event_type == EventType.SCHEDULE_TASK_EXECUTION:
|
@@ -454,13 +459,25 @@ class FunctionExecutorController:
|
|
454
459
|
self._state_reporter.schedule_state_report()
|
455
460
|
|
456
461
|
if event.function_executor is None:
|
457
|
-
|
458
|
-
|
462
|
+
# Server needs to increment attempts counter for all the tasks that were pending while FE was starting up.
|
463
|
+
# This prevents infinite retries if FEs consistently fail to start up.
|
464
|
+
self._start_termination(
|
465
|
+
fe_termination_reason=event.output.termination_reason,
|
466
|
+
allocation_ids_caused_termination=[
|
467
|
+
task_info.allocation.allocation_id
|
468
|
+
for task_info in self._tasks.values()
|
469
|
+
],
|
459
470
|
)
|
460
471
|
return
|
461
472
|
|
462
473
|
self._fe = event.function_executor
|
463
|
-
self.
|
474
|
+
self._update_internal_state(_FE_CONTROLLER_STATE.RUNNING)
|
475
|
+
self._update_reported_state(
|
476
|
+
FunctionExecutorState(
|
477
|
+
description=self._fe_description,
|
478
|
+
status=FunctionExecutorStatus.FUNCTION_EXECUTOR_STATUS_RUNNING,
|
479
|
+
)
|
480
|
+
)
|
464
481
|
# Health checker starts after FE creation and gets automatically stopped on FE destroy.
|
465
482
|
self._fe.health_checker().start(self._health_check_failed_callback)
|
466
483
|
self._add_event(
|
@@ -468,20 +485,30 @@ class FunctionExecutorController:
|
|
468
485
|
source="_handle_event_function_executor_created",
|
469
486
|
)
|
470
487
|
|
471
|
-
def
|
472
|
-
self, event:
|
488
|
+
def _handle_event_function_executor_terminated(
|
489
|
+
self, event: FunctionExecutorTerminated
|
473
490
|
) -> None:
|
474
|
-
"""Handles the Function Executor
|
491
|
+
"""Handles the Function Executor terminated event.
|
475
492
|
|
476
493
|
Doesn't raise any exceptions. Doesn't block.
|
477
494
|
"""
|
478
495
|
if not event.is_success:
|
479
496
|
self._logger.error(
|
480
|
-
"Function Executor
|
497
|
+
"Function Executor termination failed unexpectedly, this should never happen",
|
498
|
+
)
|
499
|
+
|
500
|
+
self._fe = None
|
501
|
+
# Set reported status only after the FE got destroyed because Server assumes that all FE resources are freed when the status changes.
|
502
|
+
self._update_reported_state(
|
503
|
+
FunctionExecutorState(
|
504
|
+
description=self._fe_description,
|
505
|
+
status=FunctionExecutorStatus.FUNCTION_EXECUTOR_STATUS_TERMINATED,
|
506
|
+
termination_reason=event.fe_termination_reason,
|
507
|
+
allocation_ids_caused_termination=event.allocation_ids_caused_termination,
|
481
508
|
)
|
482
|
-
|
483
|
-
self.
|
484
|
-
|
509
|
+
)
|
510
|
+
self._update_internal_state(_FE_CONTROLLER_STATE.TERMINATED)
|
511
|
+
|
485
512
|
# Invoke the scheduler so it can fail runnable tasks with FE Terminated error.
|
486
513
|
self._add_event(
|
487
514
|
ScheduleTaskExecution(),
|
@@ -493,8 +520,14 @@ class FunctionExecutorController:
|
|
493
520
|
"Function Executor health check failed, terminating Function Executor",
|
494
521
|
reason=result.reason,
|
495
522
|
)
|
496
|
-
|
497
|
-
|
523
|
+
|
524
|
+
self._start_termination(
|
525
|
+
fe_termination_reason=FunctionExecutorTerminationReason.FUNCTION_EXECUTOR_TERMINATION_REASON_UNHEALTHY,
|
526
|
+
allocation_ids_caused_termination=(
|
527
|
+
[]
|
528
|
+
if self._running_task is None
|
529
|
+
else [self._running_task.allocation.allocation_id]
|
530
|
+
),
|
498
531
|
)
|
499
532
|
|
500
533
|
def _handle_event_task_preparation_finished(
|
@@ -532,14 +565,15 @@ class FunctionExecutorController:
|
|
532
565
|
if len(self._runnable_tasks) == 0:
|
533
566
|
return
|
534
567
|
|
535
|
-
if self.
|
536
|
-
|
537
|
-
|
568
|
+
if self._internal_state not in [
|
569
|
+
_FE_CONTROLLER_STATE.RUNNING,
|
570
|
+
_FE_CONTROLLER_STATE.TERMINATING,
|
571
|
+
_FE_CONTROLLER_STATE.TERMINATED,
|
538
572
|
]:
|
539
|
-
return # Can't progress
|
573
|
+
return # Can't progress runnable tasks in the current state.
|
540
574
|
|
541
575
|
if (
|
542
|
-
self.
|
576
|
+
self._internal_state == _FE_CONTROLLER_STATE.RUNNING
|
543
577
|
and self._running_task is not None
|
544
578
|
):
|
545
579
|
return
|
@@ -555,12 +589,15 @@ class FunctionExecutorController:
|
|
555
589
|
if task_info.is_cancelled:
|
556
590
|
task_info.output = TaskOutput.task_cancelled(task_info.allocation)
|
557
591
|
self._start_task_output_upload(task_info)
|
558
|
-
elif self.
|
592
|
+
elif self._internal_state in [
|
593
|
+
_FE_CONTROLLER_STATE.TERMINATING,
|
594
|
+
_FE_CONTROLLER_STATE.TERMINATED,
|
595
|
+
]:
|
559
596
|
task_info.output = TaskOutput.function_executor_terminated(
|
560
597
|
task_info.allocation
|
561
598
|
)
|
562
599
|
self._start_task_output_upload(task_info)
|
563
|
-
elif self.
|
600
|
+
elif self._internal_state == _FE_CONTROLLER_STATE.RUNNING:
|
564
601
|
self._running_task = task_info
|
565
602
|
next_aio = run_task_on_function_executor(
|
566
603
|
task_info=task_info,
|
@@ -603,8 +640,11 @@ class FunctionExecutorController:
|
|
603
640
|
ScheduleTaskExecution(), source="_handle_event_task_execution_finished"
|
604
641
|
)
|
605
642
|
else:
|
606
|
-
self.
|
607
|
-
|
643
|
+
self._start_termination(
|
644
|
+
fe_termination_reason=event.function_executor_termination_reason,
|
645
|
+
allocation_ids_caused_termination=[
|
646
|
+
event.task_info.allocation.allocation_id
|
647
|
+
],
|
608
648
|
)
|
609
649
|
|
610
650
|
# Ignore is_cancelled because cancelling a task still involves uploading its output.
|
@@ -660,23 +700,37 @@ class FunctionExecutorController:
|
|
660
700
|
)
|
661
701
|
self._state_reporter.schedule_state_report()
|
662
702
|
|
663
|
-
def
|
664
|
-
self,
|
703
|
+
def _start_termination(
|
704
|
+
self,
|
705
|
+
fe_termination_reason: FunctionExecutorTerminationReason,
|
706
|
+
allocation_ids_caused_termination: List[str],
|
665
707
|
) -> None:
|
666
|
-
"""
|
708
|
+
"""Starts termination of the Function Executor if it's not started yet.
|
667
709
|
|
668
710
|
Doesn't raise any exceptions. Doesn't block.
|
669
711
|
"""
|
670
|
-
|
712
|
+
if self._internal_state in [
|
713
|
+
_FE_CONTROLLER_STATE.TERMINATING,
|
714
|
+
_FE_CONTROLLER_STATE.TERMINATED,
|
715
|
+
]:
|
716
|
+
# _start_termination() can be called multiple times, e.g. by each failed task alloc
|
717
|
+
# when the FE is unhealthy. Dedup the calls to keep state machine consistent.
|
718
|
+
return
|
719
|
+
|
720
|
+
self._update_internal_state(_FE_CONTROLLER_STATE.TERMINATING)
|
721
|
+
next_aio = terminate_function_executor(
|
671
722
|
function_executor=self._fe,
|
672
|
-
|
723
|
+
lock=self._destroy_lock,
|
724
|
+
fe_termination_reason=fe_termination_reason,
|
725
|
+
allocation_ids_caused_termination=allocation_ids_caused_termination,
|
673
726
|
logger=self._logger,
|
674
727
|
)
|
675
|
-
self._fe = None
|
676
728
|
self._spawn_aio_for_fe(
|
677
729
|
aio=next_aio,
|
678
|
-
on_exception=
|
679
|
-
is_success=False,
|
730
|
+
on_exception=FunctionExecutorTerminated(
|
731
|
+
is_success=False,
|
732
|
+
fe_termination_reason=fe_termination_reason,
|
733
|
+
allocation_ids_caused_termination=allocation_ids_caused_termination,
|
680
734
|
),
|
681
735
|
)
|
682
736
|
|
@@ -716,16 +770,18 @@ class FunctionExecutorController:
|
|
716
770
|
# BaseException includes asyncio.CancelledError which is always raised here.
|
717
771
|
pass
|
718
772
|
|
719
|
-
|
720
|
-
|
721
|
-
|
722
|
-
|
723
|
-
|
724
|
-
|
773
|
+
# Makes sure we don't run fe destroy concurrently with an event loop task.
|
774
|
+
# FE destroy uses asyncio.to_thread() calls so it doesn't get cancelled with all the tasks above.
|
775
|
+
async with self._destroy_lock:
|
776
|
+
if self._fe is not None:
|
777
|
+
self._logger.info(
|
778
|
+
"destroying function executor",
|
725
779
|
)
|
726
|
-
|
727
|
-
|
728
|
-
|
780
|
+
await self._fe.destroy()
|
781
|
+
|
782
|
+
# Cleanup the metric from this FE.
|
783
|
+
metric_function_executors_with_state.labels(
|
784
|
+
state=_to_fe_state_metric_label(self._internal_state, self._logger)
|
729
785
|
).dec()
|
730
786
|
|
731
787
|
self._state_reporter.remove_function_executor_state(self.function_executor_id())
|
@@ -735,21 +791,23 @@ class FunctionExecutorController:
|
|
735
791
|
debug_print_events(events=self._events, logger=self._logger)
|
736
792
|
|
737
793
|
|
738
|
-
def
|
739
|
-
if
|
740
|
-
return
|
741
|
-
elif
|
742
|
-
return
|
743
|
-
elif
|
744
|
-
return
|
745
|
-
elif
|
746
|
-
return
|
794
|
+
def _to_fe_state_metric_label(state: _FE_CONTROLLER_STATE, logger: Any) -> str:
|
795
|
+
if state == _FE_CONTROLLER_STATE.NOT_STARTED:
|
796
|
+
return METRIC_FUNCTION_EXECUTORS_WITH_STATE_LABEL_NOT_STARTED
|
797
|
+
elif state == _FE_CONTROLLER_STATE.STARTING_UP:
|
798
|
+
return METRIC_FUNCTION_EXECUTORS_WITH_STATE_LABEL_STARTING_UP
|
799
|
+
elif state == _FE_CONTROLLER_STATE.RUNNING:
|
800
|
+
return METRIC_FUNCTION_EXECUTORS_WITH_STATE_LABEL_RUNNING
|
801
|
+
elif state == _FE_CONTROLLER_STATE.TERMINATING:
|
802
|
+
return METRIC_FUNCTION_EXECUTORS_WITH_STATE_LABEL_TERMINATING
|
803
|
+
elif state == _FE_CONTROLLER_STATE.TERMINATED:
|
804
|
+
return METRIC_FUNCTION_EXECUTORS_WITH_STATE_LABEL_TERMINATED
|
747
805
|
else:
|
748
806
|
logger.error(
|
749
|
-
"unexpected Function Executor
|
750
|
-
|
807
|
+
"unexpected Function Executor internal state",
|
808
|
+
state=state.name,
|
751
809
|
)
|
752
|
-
return
|
810
|
+
return METRIC_FUNCTION_EXECUTORS_WITH_STATE_LABEL_UNKNOWN
|
753
811
|
|
754
812
|
|
755
813
|
_termination_reason_to_short_name_map = {
|
@@ -757,8 +815,6 @@ _termination_reason_to_short_name_map = {
|
|
757
815
|
FunctionExecutorTerminationReason.FUNCTION_EXECUTOR_TERMINATION_REASON_STARTUP_FAILED_INTERNAL_ERROR: "STARTUP_FAILED_INTERNAL_ERROR",
|
758
816
|
FunctionExecutorTerminationReason.FUNCTION_EXECUTOR_TERMINATION_REASON_STARTUP_FAILED_FUNCTION_ERROR: "STARTUP_FAILED_FUNCTION_ERROR",
|
759
817
|
FunctionExecutorTerminationReason.FUNCTION_EXECUTOR_TERMINATION_REASON_STARTUP_FAILED_FUNCTION_TIMEOUT: "STARTUP_FAILED_FUNCTION_TIMEOUT",
|
760
|
-
FunctionExecutorTerminationReason.FUNCTION_EXECUTOR_TERMINATION_REASON_EXECUTOR_SHUTDOWN: "EXECUTOR_SHUTDOWN",
|
761
|
-
FunctionExecutorTerminationReason.FUNCTION_EXECUTOR_TERMINATION_REASON_REMOVED_FROM_DESIRED_STATE: "REMOVED_FROM_DESIRED_STATE",
|
762
818
|
FunctionExecutorTerminationReason.FUNCTION_EXECUTOR_TERMINATION_REASON_UNHEALTHY: "UNHEALTHY",
|
763
819
|
FunctionExecutorTerminationReason.FUNCTION_EXECUTOR_TERMINATION_REASON_INTERNAL_ERROR: "INTERNAL_ERROR",
|
764
820
|
FunctionExecutorTerminationReason.FUNCTION_EXECUTOR_TERMINATION_REASON_FUNCTION_TIMEOUT: "FUNCTION_TIMEOUT",
|
@@ -34,27 +34,34 @@ metric_runnable_tasks_per_function_name: prometheus_client.Gauge = (
|
|
34
34
|
)
|
35
35
|
)
|
36
36
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
["status"],
|
42
|
-
)
|
37
|
+
metric_function_executors_with_state: prometheus_client.Gauge = prometheus_client.Gauge(
|
38
|
+
"function_executors_with_state",
|
39
|
+
"Number of Function Executors with a particular internal state",
|
40
|
+
["state"],
|
43
41
|
)
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
42
|
+
METRIC_FUNCTION_EXECUTORS_WITH_STATE_LABEL_UNKNOWN = "unknown"
|
43
|
+
METRIC_FUNCTION_EXECUTORS_WITH_STATE_LABEL_NOT_STARTED = "not_started"
|
44
|
+
METRIC_FUNCTION_EXECUTORS_WITH_STATE_LABEL_STARTING_UP = "starting_up"
|
45
|
+
METRIC_FUNCTION_EXECUTORS_WITH_STATE_LABEL_RUNNING = "running"
|
46
|
+
METRIC_FUNCTION_EXECUTORS_WITH_STATE_LABEL_TERMINATING = "terminating"
|
47
|
+
METRIC_FUNCTION_EXECUTORS_WITH_STATE_LABEL_TERMINATED = "terminated"
|
48
|
+
|
48
49
|
|
49
|
-
|
50
|
-
|
50
|
+
metric_function_executors_with_state.labels(
|
51
|
+
state=METRIC_FUNCTION_EXECUTORS_WITH_STATE_LABEL_UNKNOWN
|
52
|
+
)
|
53
|
+
metric_function_executors_with_state.labels(
|
54
|
+
state=METRIC_FUNCTION_EXECUTORS_WITH_STATE_LABEL_NOT_STARTED
|
55
|
+
)
|
56
|
+
metric_function_executors_with_state.labels(
|
57
|
+
state=METRIC_FUNCTION_EXECUTORS_WITH_STATE_LABEL_STARTING_UP
|
51
58
|
)
|
52
|
-
|
53
|
-
|
59
|
+
metric_function_executors_with_state.labels(
|
60
|
+
state=METRIC_FUNCTION_EXECUTORS_WITH_STATE_LABEL_RUNNING
|
54
61
|
)
|
55
|
-
|
56
|
-
|
62
|
+
metric_function_executors_with_state.labels(
|
63
|
+
state=METRIC_FUNCTION_EXECUTORS_WITH_STATE_LABEL_TERMINATING
|
57
64
|
)
|
58
|
-
|
59
|
-
|
65
|
+
metric_function_executors_with_state.labels(
|
66
|
+
state=METRIC_FUNCTION_EXECUTORS_WITH_STATE_LABEL_TERMINATED
|
60
67
|
)
|
@@ -1,4 +1,6 @@
|
|
1
1
|
import asyncio
|
2
|
+
import os
|
3
|
+
import random
|
2
4
|
import time
|
3
5
|
from typing import Any, Optional
|
4
6
|
|
@@ -38,6 +40,10 @@ from .metrics.run_task import (
|
|
38
40
|
from .task_info import TaskInfo
|
39
41
|
from .task_output import TaskMetrics, TaskOutput
|
40
42
|
|
43
|
+
_ENABLE_INJECT_TASK_CANCELLATIONS = (
|
44
|
+
os.getenv("INDEXIFY_INJECT_TASK_CANCELLATIONS", "0") == "1"
|
45
|
+
)
|
46
|
+
|
41
47
|
|
42
48
|
async def run_task_on_function_executor(
|
43
49
|
task_info: TaskInfo, function_executor: FunctionExecutor, logger: Any
|
@@ -177,6 +183,14 @@ def _task_output_from_function_executor_response(
|
|
177
183
|
response_validator.required_field("invocation_error_output")
|
178
184
|
invocation_error_output = response.invocation_error_output
|
179
185
|
|
186
|
+
if _ENABLE_INJECT_TASK_CANCELLATIONS:
|
187
|
+
logger.warning("injecting cancellation failure for the task allocation")
|
188
|
+
if (
|
189
|
+
random.random() < 0.5
|
190
|
+
): # 50% chance to get stable reproduction in manual testing
|
191
|
+
outcome_code = TaskOutcomeCode.TASK_OUTCOME_CODE_FAILURE
|
192
|
+
failure_reason = TaskFailureReason.TASK_FAILURE_REASON_TASK_CANCELLED
|
193
|
+
|
180
194
|
return TaskOutput(
|
181
195
|
allocation=allocation,
|
182
196
|
outcome_code=outcome_code,
|
@@ -0,0 +1,38 @@
|
|
1
|
+
import asyncio
|
2
|
+
from typing import Any, List, Optional
|
3
|
+
|
4
|
+
from indexify.executor.function_executor.function_executor import FunctionExecutor
|
5
|
+
from indexify.proto.executor_api_pb2 import FunctionExecutorTerminationReason
|
6
|
+
|
7
|
+
from .events import FunctionExecutorTerminated
|
8
|
+
|
9
|
+
|
10
|
+
async def terminate_function_executor(
|
11
|
+
function_executor: Optional[FunctionExecutor],
|
12
|
+
lock: asyncio.Lock,
|
13
|
+
fe_termination_reason: FunctionExecutorTerminationReason,
|
14
|
+
allocation_ids_caused_termination: List[str],
|
15
|
+
logger: Any,
|
16
|
+
) -> FunctionExecutorTerminated:
|
17
|
+
"""Destroys the function executor if it's not None.
|
18
|
+
|
19
|
+
The supplied lock is used to ensure that if a destroy operation is in progress,
|
20
|
+
then another caller won't return immediately assuming that the destroy is complete
|
21
|
+
due to its idempotency.
|
22
|
+
|
23
|
+
Doesn't raise any exceptions.
|
24
|
+
"""
|
25
|
+
logger = logger.bind(module=__name__)
|
26
|
+
|
27
|
+
if function_executor is not None:
|
28
|
+
async with lock:
|
29
|
+
logger.info(
|
30
|
+
"destroying function executor",
|
31
|
+
)
|
32
|
+
await function_executor.destroy()
|
33
|
+
|
34
|
+
return FunctionExecutorTerminated(
|
35
|
+
is_success=True,
|
36
|
+
fe_termination_reason=fe_termination_reason,
|
37
|
+
allocation_ids_caused_termination=allocation_ids_caused_termination,
|
38
|
+
)
|
@@ -7,7 +7,6 @@ from tensorlake.function_executor.proto.message_validator import MessageValidato
|
|
7
7
|
from indexify.proto.executor_api_pb2 import (
|
8
8
|
DesiredExecutorState,
|
9
9
|
FunctionExecutorDescription,
|
10
|
-
FunctionExecutorTerminationReason,
|
11
10
|
GetDesiredExecutorStatesRequest,
|
12
11
|
TaskAllocation,
|
13
12
|
)
|
@@ -123,9 +122,7 @@ class ExecutorStateReconciler:
|
|
123
122
|
for fe_controller in self._function_executor_controllers.values():
|
124
123
|
fe_shutdown_tasks.append(
|
125
124
|
asyncio.create_task(
|
126
|
-
fe_controller.shutdown(
|
127
|
-
termination_reason=FunctionExecutorTerminationReason.FUNCTION_EXECUTOR_TERMINATION_REASON_EXECUTOR_SHUTDOWN
|
128
|
-
),
|
125
|
+
fe_controller.shutdown(),
|
129
126
|
name=f"Shutdown Function Executor {fe_controller.function_executor_id()}",
|
130
127
|
)
|
131
128
|
)
|
@@ -327,9 +324,7 @@ class ExecutorStateReconciler:
|
|
327
324
|
self._function_executor_controllers.pop(function_executor_id)
|
328
325
|
)
|
329
326
|
asyncio.create_task(
|
330
|
-
fe_controller.shutdown(
|
331
|
-
termination_reason=FunctionExecutorTerminationReason.FUNCTION_EXECUTOR_TERMINATION_REASON_REMOVED_FROM_DESIRED_STATE
|
332
|
-
),
|
327
|
+
fe_controller.shutdown(),
|
333
328
|
name=f"Shutdown Function Executor {function_executor_id}",
|
334
329
|
)
|
335
330
|
|
@@ -69,6 +69,7 @@ enum FunctionExecutorStatus {
|
|
69
69
|
FUNCTION_EXECUTOR_STATUS_TERMINATED = 3;
|
70
70
|
}
|
71
71
|
|
72
|
+
// The reasons why an Executor decided to terminate a Function Executor.
|
72
73
|
enum FunctionExecutorTerminationReason {
|
73
74
|
FUNCTION_EXECUTOR_TERMINATION_REASON_UNKNOWN = 0;
|
74
75
|
// Internal error aka platform error on FE startup.
|
@@ -79,10 +80,6 @@ enum FunctionExecutorTerminationReason {
|
|
79
80
|
// Timeout on FE startup while running the function constructor.
|
80
81
|
FUNCTION_EXECUTOR_TERMINATION_REASON_STARTUP_FAILED_FUNCTION_TIMEOUT = 3;
|
81
82
|
|
82
|
-
// FE was terminated on Executor shutdown.
|
83
|
-
FUNCTION_EXECUTOR_TERMINATION_REASON_EXECUTOR_SHUTDOWN = 10;
|
84
|
-
// FE was removed from the Executor desired state by Server.
|
85
|
-
FUNCTION_EXECUTOR_TERMINATION_REASON_REMOVED_FROM_DESIRED_STATE = 11;
|
86
83
|
// FE was terminated because it failed a health check.
|
87
84
|
FUNCTION_EXECUTOR_TERMINATION_REASON_UNHEALTHY = 12;
|
88
85
|
// FE was terminated due to an unrecoverable internal error on Executor.
|
@@ -128,6 +125,7 @@ message FunctionExecutorState {
|
|
128
125
|
optional FunctionExecutorDescription description = 1;
|
129
126
|
optional FunctionExecutorStatus status = 2;
|
130
127
|
optional FunctionExecutorTerminationReason termination_reason = 3;
|
128
|
+
repeated string allocation_ids_caused_termination = 4;
|
131
129
|
}
|
132
130
|
|
133
131
|
message FunctionExecutorUpdate {
|
@@ -19,7 +19,7 @@ _sym_db = _symbol_database.Default()
|
|
19
19
|
|
20
20
|
|
21
21
|
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(
|
22
|
-
b'\n!indexify/proto/executor_api.proto\x12\x0f\x65xecutor_api_pb"\xeb\x01\n\x0b\x44\x61taPayload\x12\x11\n\x04size\x18\x02 \x01(\x04H\x00\x88\x01\x01\x12\x18\n\x0bsha256_hash\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x10\n\x03uri\x18\x04 \x01(\tH\x02\x88\x01\x01\x12;\n\x08\x65ncoding\x18\x05 \x01(\x0e\x32$.executor_api_pb.DataPayloadEncodingH\x03\x88\x01\x01\x12\x1d\n\x10\x65ncoding_version\x18\x06 \x01(\x04H\x04\x88\x01\x01\x42\x07\n\x05_sizeB\x0e\n\x0c_sha256_hashB\x06\n\x04_uriB\x0b\n\t_encodingB\x13\n\x11_encoding_version"e\n\x0cGPUResources\x12\x12\n\x05\x63ount\x18\x01 \x01(\rH\x00\x88\x01\x01\x12-\n\x05model\x18\x02 \x01(\x0e\x32\x19.executor_api_pb.GPUModelH\x01\x88\x01\x01\x42\x08\n\x06_countB\x08\n\x06_model"\xc2\x01\n\rHostResources\x12\x16\n\tcpu_count\x18\x01 \x01(\rH\x00\x88\x01\x01\x12\x19\n\x0cmemory_bytes\x18\x02 \x01(\x04H\x01\x88\x01\x01\x12\x17\n\ndisk_bytes\x18\x03 \x01(\x04H\x02\x88\x01\x01\x12/\n\x03gpu\x18\x04 \x01(\x0b\x32\x1d.executor_api_pb.GPUResourcesH\x03\x88\x01\x01\x42\x0c\n\n_cpu_countB\x0f\n\r_memory_bytesB\r\n\x0b_disk_bytesB\x06\n\x04_gpu"\xbb\x01\n\x0f\x41llowedFunction\x12\x16\n\tnamespace\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x17\n\ngraph_name\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x1a\n\rfunction_name\x18\x03 \x01(\tH\x02\x88\x01\x01\x12\x1a\n\rgraph_version\x18\x04 \x01(\tH\x03\x88\x01\x01\x42\x0c\n\n_namespaceB\r\n\x0b_graph_nameB\x10\n\x0e_function_nameB\x10\n\x0e_graph_version"\xd8\x01\n\x19\x46unctionExecutorResources\x12\x1b\n\x0e\x63pu_ms_per_sec\x18\x01 \x01(\rH\x00\x88\x01\x01\x12\x19\n\x0cmemory_bytes\x18\x02 \x01(\x04H\x01\x88\x01\x01\x12\x17\n\ndisk_bytes\x18\x03 \x01(\x04H\x02\x88\x01\x01\x12/\n\x03gpu\x18\x04 \x01(\x0b\x32\x1d.executor_api_pb.GPUResourcesH\x03\x88\x01\x01\x42\x11\n\x0f_cpu_ms_per_secB\x0f\n\r_memory_bytesB\r\n\x0b_disk_bytesB\x06\n\x04_gpu"\xb3\x04\n\x1b\x46unctionExecutorDescription\x12\x0f\n\x02id\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x16\n\tnamespace\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x17\n\ngraph_name\x18\x03 \x01(\tH\x02\x88\x01\x01\x12\x1a\n\rgraph_version\x18\x04 \x01(\tH\x03\x88\x01\x01\x12\x1a\n\rfunction_name\x18\x05 \x01(\tH\x04\x88\x01\x01\x12\x16\n\timage_uri\x18\x06 \x01(\tH\x05\x88\x01\x01\x12\x14\n\x0csecret_names\x18\x07 \x03(\t\x12%\n\x18\x63ustomer_code_timeout_ms\x18\t \x01(\rH\x06\x88\x01\x01\x12\x30\n\x05graph\x18\n \x01(\x0b\x32\x1c.executor_api_pb.DataPayloadH\x07\x88\x01\x01\x12\x42\n\tresources\x18\x0b \x01(\x0b\x32*.executor_api_pb.FunctionExecutorResourcesH\x08\x88\x01\x01\x12&\n\x19output_payload_uri_prefix\x18\x0c \x01(\tH\t\x88\x01\x01\x42\x05\n\x03_idB\x0c\n\n_namespaceB\r\n\x0b_graph_nameB\x10\n\x0e_graph_versionB\x10\n\x0e_function_nameB\x0c\n\n_image_uriB\x1b\n\x19_customer_code_timeout_msB\x08\n\x06_graphB\x0c\n\n_resourcesB\x1c\n\x1a_output_payload_uri_prefix"\xa4\x02\n\x15\x46unctionExecutorState\x12\x46\n\x0b\x64\x65scription\x18\x01 \x01(\x0b\x32,.executor_api_pb.FunctionExecutorDescriptionH\x00\x88\x01\x01\x12<\n\x06status\x18\x02 \x01(\x0e\x32\'.executor_api_pb.FunctionExecutorStatusH\x01\x88\x01\x01\x12S\n\x12termination_reason\x18\x03 \x01(\x0e\x32\x32.executor_api_pb.FunctionExecutorTerminationReasonH\x02\x88\x01\x01\x42\x0e\n\x0c_descriptionB\t\n\x07_statusB\x15\n\x13_termination_reason"\x8c\x02\n\x16\x46unctionExecutorUpdate\x12\x46\n\x0b\x64\x65scription\x18\x01 \x01(\x0b\x32,.executor_api_pb.FunctionExecutorDescriptionH\x00\x88\x01\x01\x12\x39\n\x0estartup_stdout\x18\x02 \x01(\x0b\x32\x1c.executor_api_pb.DataPayloadH\x01\x88\x01\x01\x12\x39\n\x0estartup_stderr\x18\x03 \x01(\x0b\x32\x1c.executor_api_pb.DataPayloadH\x02\x88\x01\x01\x42\x0e\n\x0c_descriptionB\x11\n\x0f_startup_stdoutB\x11\n\x0f_startup_stderr"\xce\x05\n\rExecutorState\x12\x18\n\x0b\x65xecutor_id\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x15\n\x08hostname\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x14\n\x07version\x18\x05 \x01(\tH\x02\x88\x01\x01\x12\x34\n\x06status\x18\x06 \x01(\x0e\x32\x1f.executor_api_pb.ExecutorStatusH\x03\x88\x01\x01\x12<\n\x0ftotal_resources\x18\r \x01(\x0b\x32\x1e.executor_api_pb.HostResourcesH\x04\x88\x01\x01\x12N\n!total_function_executor_resources\x18\x07 \x01(\x0b\x32\x1e.executor_api_pb.HostResourcesH\x05\x88\x01\x01\x12;\n\x11\x61llowed_functions\x18\x08 \x03(\x0b\x32 .executor_api_pb.AllowedFunction\x12H\n\x18\x66unction_executor_states\x18\t \x03(\x0b\x32&.executor_api_pb.FunctionExecutorState\x12:\n\x06labels\x18\n \x03(\x0b\x32*.executor_api_pb.ExecutorState.LabelsEntry\x12\x17\n\nstate_hash\x18\x0b \x01(\tH\x06\x88\x01\x01\x12\x19\n\x0cserver_clock\x18\x0c \x01(\x04H\x07\x88\x01\x01\x1a-\n\x0bLabelsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x42\x0e\n\x0c_executor_idB\x0b\n\t_hostnameB\n\n\x08_versionB\t\n\x07_statusB\x12\n\x10_total_resourcesB$\n"_total_function_executor_resourcesB\r\n\x0b_state_hashB\x0f\n\r_server_clock"\xb9\x01\n\x0e\x45xecutorUpdate\x12\x18\n\x0b\x65xecutor_id\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x31\n\x0ctask_results\x18\x02 \x03(\x0b\x32\x1b.executor_api_pb.TaskResult\x12J\n\x19\x66unction_executor_updates\x18\x03 \x03(\x0b\x32\'.executor_api_pb.FunctionExecutorUpdateB\x0e\n\x0c_executor_id"\xbf\x01\n\x1aReportExecutorStateRequest\x12;\n\x0e\x65xecutor_state\x18\x01 \x01(\x0b\x32\x1e.executor_api_pb.ExecutorStateH\x00\x88\x01\x01\x12=\n\x0f\x65xecutor_update\x18\x02 \x01(\x0b\x32\x1f.executor_api_pb.ExecutorUpdateH\x01\x88\x01\x01\x42\x11\n\x0f_executor_stateB\x12\n\x10_executor_update"\x1d\n\x1bReportExecutorStateResponse"\xcf\x01\n\x0fTaskRetryPolicy\x12\x18\n\x0bmax_retries\x18\x01 \x01(\rH\x00\x88\x01\x01\x12\x1d\n\x10initial_delay_ms\x18\x02 \x01(\rH\x01\x88\x01\x01\x12\x19\n\x0cmax_delay_ms\x18\x03 \x01(\rH\x02\x88\x01\x01\x12\x1d\n\x10\x64\x65lay_multiplier\x18\x04 \x01(\rH\x03\x88\x01\x01\x42\x0e\n\x0c_max_retriesB\x13\n\x11_initial_delay_msB\x0f\n\r_max_delay_msB\x13\n\x11_delay_multiplier"\xc6\x04\n\x04Task\x12\x0f\n\x02id\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x16\n\tnamespace\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x17\n\ngraph_name\x18\x03 \x01(\tH\x02\x88\x01\x01\x12\x1a\n\rgraph_version\x18\x04 \x01(\tH\x03\x88\x01\x01\x12\x1a\n\rfunction_name\x18\x05 \x01(\tH\x04\x88\x01\x01\x12 \n\x13graph_invocation_id\x18\x06 \x01(\tH\x05\x88\x01\x01\x12\x17\n\ntimeout_ms\x18\n \x01(\rH\x06\x88\x01\x01\x12\x30\n\x05input\x18\x0b \x01(\x0b\x32\x1c.executor_api_pb.DataPayloadH\x07\x88\x01\x01\x12\x38\n\rreducer_input\x18\x0c \x01(\x0b\x32\x1c.executor_api_pb.DataPayloadH\x08\x88\x01\x01\x12&\n\x19output_payload_uri_prefix\x18\r \x01(\tH\t\x88\x01\x01\x12;\n\x0cretry_policy\x18\x0e \x01(\x0b\x32 .executor_api_pb.TaskRetryPolicyH\n\x88\x01\x01\x42\x05\n\x03_idB\x0c\n\n_namespaceB\r\n\x0b_graph_nameB\x10\n\x0e_graph_versionB\x10\n\x0e_function_nameB\x16\n\x14_graph_invocation_idB\r\n\x0b_timeout_msB\x08\n\x06_inputB\x10\n\x0e_reducer_inputB\x1c\n\x1a_output_payload_uri_prefixB\x0f\n\r_retry_policy"\xad\x01\n\x0eTaskAllocation\x12!\n\x14\x66unction_executor_id\x18\x01 \x01(\tH\x00\x88\x01\x01\x12(\n\x04task\x18\x02 \x01(\x0b\x32\x15.executor_api_pb.TaskH\x01\x88\x01\x01\x12\x1a\n\rallocation_id\x18\x03 \x01(\tH\x02\x88\x01\x01\x42\x17\n\x15_function_executor_idB\x07\n\x05_taskB\x10\n\x0e_allocation_id"K\n\x1fGetDesiredExecutorStatesRequest\x12\x18\n\x0b\x65xecutor_id\x18\x01 \x01(\tH\x00\x88\x01\x01\x42\x0e\n\x0c_executor_id"\xb9\x01\n\x14\x44\x65siredExecutorState\x12H\n\x12\x66unction_executors\x18\x01 \x03(\x0b\x32,.executor_api_pb.FunctionExecutorDescription\x12\x39\n\x10task_allocations\x18\x02 \x03(\x0b\x32\x1f.executor_api_pb.TaskAllocation\x12\x12\n\x05\x63lock\x18\x03 \x01(\x04H\x00\x88\x01\x01\x42\x08\n\x06_clock"\xb0\x06\n\nTaskResult\x12\x14\n\x07task_id\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x1a\n\rallocation_id\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x16\n\tnamespace\x18\x03 \x01(\tH\x02\x88\x01\x01\x12\x17\n\ngraph_name\x18\x04 \x01(\tH\x03\x88\x01\x01\x12\x1a\n\rgraph_version\x18\x05 \x01(\tH\x04\x88\x01\x01\x12\x1a\n\rfunction_name\x18\x06 \x01(\tH\x05\x88\x01\x01\x12 \n\x13graph_invocation_id\x18\x07 \x01(\tH\x06\x88\x01\x01\x12\x14\n\x07reducer\x18\x08 \x01(\x08H\x07\x88\x01\x01\x12;\n\x0coutcome_code\x18\t \x01(\x0e\x32 .executor_api_pb.TaskOutcomeCodeH\x08\x88\x01\x01\x12?\n\x0e\x66\x61ilure_reason\x18\n \x01(\x0e\x32".executor_api_pb.TaskFailureReasonH\t\x88\x01\x01\x12\x16\n\x0enext_functions\x18\x0b \x03(\t\x12\x36\n\x10\x66unction_outputs\x18\x0c \x03(\x0b\x32\x1c.executor_api_pb.DataPayload\x12\x31\n\x06stdout\x18\r \x01(\x0b\x32\x1c.executor_api_pb.DataPayloadH\n\x88\x01\x01\x12\x31\n\x06stderr\x18\x0e \x01(\x0b\x32\x1c.executor_api_pb.DataPayloadH\x0b\x88\x01\x01\x12\x42\n\x17invocation_error_output\x18\x0f \x01(\x0b\x32\x1c.executor_api_pb.DataPayloadH\x0c\x88\x01\x01\x42\n\n\x08_task_idB\x10\n\x0e_allocation_idB\x0c\n\n_namespaceB\r\n\x0b_graph_nameB\x10\n\x0e_graph_versionB\x10\n\x0e_function_nameB\x16\n\x14_graph_invocation_idB\n\n\x08_reducerB\x0f\n\r_outcome_codeB\x11\n\x0f_failure_reasonB\t\n\x07_stdoutB\t\n\x07_stderrB\x1a\n\x18_invocation_error_output*\xd1\x01\n\x13\x44\x61taPayloadEncoding\x12!\n\x1d\x44\x41TA_PAYLOAD_ENCODING_UNKNOWN\x10\x00\x12#\n\x1f\x44\x41TA_PAYLOAD_ENCODING_UTF8_JSON\x10\x01\x12#\n\x1f\x44\x41TA_PAYLOAD_ENCODING_UTF8_TEXT\x10\x02\x12\'\n#DATA_PAYLOAD_ENCODING_BINARY_PICKLE\x10\x03\x12$\n DATA_PAYLOAD_ENCODING_BINARY_ZIP\x10\x04*\xd6\x01\n\x08GPUModel\x12\x15\n\x11GPU_MODEL_UNKNOWN\x10\x00\x12\x1e\n\x1aGPU_MODEL_NVIDIA_A100_40GB\x10\x01\x12\x1e\n\x1aGPU_MODEL_NVIDIA_A100_80GB\x10\x02\x12\x1e\n\x1aGPU_MODEL_NVIDIA_H100_80GB\x10\x03\x12\x1d\n\x19GPU_MODEL_NVIDIA_TESLA_T4\x10\x04\x12\x1a\n\x16GPU_MODEL_NVIDIA_A6000\x10\x05\x12\x18\n\x14GPU_MODEL_NVIDIA_A10\x10\x06*\xb3\x01\n\x16\x46unctionExecutorStatus\x12$\n FUNCTION_EXECUTOR_STATUS_UNKNOWN\x10\x00\x12$\n FUNCTION_EXECUTOR_STATUS_PENDING\x10\x01\x12$\n FUNCTION_EXECUTOR_STATUS_RUNNING\x10\x02\x12\'\n#FUNCTION_EXECUTOR_STATUS_TERMINATED\x10\x03*\x95\x05\n!FunctionExecutorTerminationReason\x12\x30\n,FUNCTION_EXECUTOR_TERMINATION_REASON_UNKNOWN\x10\x00\x12\x46\nBFUNCTION_EXECUTOR_TERMINATION_REASON_STARTUP_FAILED_INTERNAL_ERROR\x10\x01\x12\x46\nBFUNCTION_EXECUTOR_TERMINATION_REASON_STARTUP_FAILED_FUNCTION_ERROR\x10\x02\x12H\nDFUNCTION_EXECUTOR_TERMINATION_REASON_STARTUP_FAILED_FUNCTION_TIMEOUT\x10\x03\x12:\n6FUNCTION_EXECUTOR_TERMINATION_REASON_EXECUTOR_SHUTDOWN\x10\n\x12\x43\n?FUNCTION_EXECUTOR_TERMINATION_REASON_REMOVED_FROM_DESIRED_STATE\x10\x0b\x12\x32\n.FUNCTION_EXECUTOR_TERMINATION_REASON_UNHEALTHY\x10\x0c\x12\x37\n3FUNCTION_EXECUTOR_TERMINATION_REASON_INTERNAL_ERROR\x10\r\x12\x39\n5FUNCTION_EXECUTOR_TERMINATION_REASON_FUNCTION_TIMEOUT\x10\x0e\x12;\n7FUNCTION_EXECUTOR_TERMINATION_REASON_FUNCTION_CANCELLED\x10\x0f*\xa5\x01\n\x0e\x45xecutorStatus\x12\x1b\n\x17\x45XECUTOR_STATUS_UNKNOWN\x10\x00\x12\x1f\n\x1b\x45XECUTOR_STATUS_STARTING_UP\x10\x01\x12\x1b\n\x17\x45XECUTOR_STATUS_RUNNING\x10\x02\x12\x1b\n\x17\x45XECUTOR_STATUS_DRAINED\x10\x03\x12\x1b\n\x17\x45XECUTOR_STATUS_STOPPED\x10\x04*n\n\x0fTaskOutcomeCode\x12\x1d\n\x19TASK_OUTCOME_CODE_UNKNOWN\x10\x00\x12\x1d\n\x19TASK_OUTCOME_CODE_SUCCESS\x10\x01\x12\x1d\n\x19TASK_OUTCOME_CODE_FAILURE\x10\x02*\xb6\x02\n\x11TaskFailureReason\x12\x1f\n\x1bTASK_FAILURE_REASON_UNKNOWN\x10\x00\x12&\n"TASK_FAILURE_REASON_INTERNAL_ERROR\x10\x01\x12&\n"TASK_FAILURE_REASON_FUNCTION_ERROR\x10\x02\x12(\n$TASK_FAILURE_REASON_FUNCTION_TIMEOUT\x10\x03\x12(\n$TASK_FAILURE_REASON_INVOCATION_ERROR\x10\x04\x12&\n"TASK_FAILURE_REASON_TASK_CANCELLED\x10\x05\x12\x34\n0TASK_FAILURE_REASON_FUNCTION_EXECUTOR_TERMINATED\x10\x06\x32\xff\x01\n\x0b\x45xecutorAPI\x12t\n\x15report_executor_state\x12+.executor_api_pb.ReportExecutorStateRequest\x1a,.executor_api_pb.ReportExecutorStateResponse"\x00\x12z\n\x1bget_desired_executor_states\x12\x30.executor_api_pb.GetDesiredExecutorStatesRequest\x1a%.executor_api_pb.DesiredExecutorState"\x00\x30\x01\x62\x06proto3'
|
22
|
+
b'\n!indexify/proto/executor_api.proto\x12\x0f\x65xecutor_api_pb"\xeb\x01\n\x0b\x44\x61taPayload\x12\x11\n\x04size\x18\x02 \x01(\x04H\x00\x88\x01\x01\x12\x18\n\x0bsha256_hash\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x10\n\x03uri\x18\x04 \x01(\tH\x02\x88\x01\x01\x12;\n\x08\x65ncoding\x18\x05 \x01(\x0e\x32$.executor_api_pb.DataPayloadEncodingH\x03\x88\x01\x01\x12\x1d\n\x10\x65ncoding_version\x18\x06 \x01(\x04H\x04\x88\x01\x01\x42\x07\n\x05_sizeB\x0e\n\x0c_sha256_hashB\x06\n\x04_uriB\x0b\n\t_encodingB\x13\n\x11_encoding_version"e\n\x0cGPUResources\x12\x12\n\x05\x63ount\x18\x01 \x01(\rH\x00\x88\x01\x01\x12-\n\x05model\x18\x02 \x01(\x0e\x32\x19.executor_api_pb.GPUModelH\x01\x88\x01\x01\x42\x08\n\x06_countB\x08\n\x06_model"\xc2\x01\n\rHostResources\x12\x16\n\tcpu_count\x18\x01 \x01(\rH\x00\x88\x01\x01\x12\x19\n\x0cmemory_bytes\x18\x02 \x01(\x04H\x01\x88\x01\x01\x12\x17\n\ndisk_bytes\x18\x03 \x01(\x04H\x02\x88\x01\x01\x12/\n\x03gpu\x18\x04 \x01(\x0b\x32\x1d.executor_api_pb.GPUResourcesH\x03\x88\x01\x01\x42\x0c\n\n_cpu_countB\x0f\n\r_memory_bytesB\r\n\x0b_disk_bytesB\x06\n\x04_gpu"\xbb\x01\n\x0f\x41llowedFunction\x12\x16\n\tnamespace\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x17\n\ngraph_name\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x1a\n\rfunction_name\x18\x03 \x01(\tH\x02\x88\x01\x01\x12\x1a\n\rgraph_version\x18\x04 \x01(\tH\x03\x88\x01\x01\x42\x0c\n\n_namespaceB\r\n\x0b_graph_nameB\x10\n\x0e_function_nameB\x10\n\x0e_graph_version"\xd8\x01\n\x19\x46unctionExecutorResources\x12\x1b\n\x0e\x63pu_ms_per_sec\x18\x01 \x01(\rH\x00\x88\x01\x01\x12\x19\n\x0cmemory_bytes\x18\x02 \x01(\x04H\x01\x88\x01\x01\x12\x17\n\ndisk_bytes\x18\x03 \x01(\x04H\x02\x88\x01\x01\x12/\n\x03gpu\x18\x04 \x01(\x0b\x32\x1d.executor_api_pb.GPUResourcesH\x03\x88\x01\x01\x42\x11\n\x0f_cpu_ms_per_secB\x0f\n\r_memory_bytesB\r\n\x0b_disk_bytesB\x06\n\x04_gpu"\xb3\x04\n\x1b\x46unctionExecutorDescription\x12\x0f\n\x02id\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x16\n\tnamespace\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x17\n\ngraph_name\x18\x03 \x01(\tH\x02\x88\x01\x01\x12\x1a\n\rgraph_version\x18\x04 \x01(\tH\x03\x88\x01\x01\x12\x1a\n\rfunction_name\x18\x05 \x01(\tH\x04\x88\x01\x01\x12\x16\n\timage_uri\x18\x06 \x01(\tH\x05\x88\x01\x01\x12\x14\n\x0csecret_names\x18\x07 \x03(\t\x12%\n\x18\x63ustomer_code_timeout_ms\x18\t \x01(\rH\x06\x88\x01\x01\x12\x30\n\x05graph\x18\n \x01(\x0b\x32\x1c.executor_api_pb.DataPayloadH\x07\x88\x01\x01\x12\x42\n\tresources\x18\x0b \x01(\x0b\x32*.executor_api_pb.FunctionExecutorResourcesH\x08\x88\x01\x01\x12&\n\x19output_payload_uri_prefix\x18\x0c \x01(\tH\t\x88\x01\x01\x42\x05\n\x03_idB\x0c\n\n_namespaceB\r\n\x0b_graph_nameB\x10\n\x0e_graph_versionB\x10\n\x0e_function_nameB\x0c\n\n_image_uriB\x1b\n\x19_customer_code_timeout_msB\x08\n\x06_graphB\x0c\n\n_resourcesB\x1c\n\x1a_output_payload_uri_prefix"\xcf\x02\n\x15\x46unctionExecutorState\x12\x46\n\x0b\x64\x65scription\x18\x01 \x01(\x0b\x32,.executor_api_pb.FunctionExecutorDescriptionH\x00\x88\x01\x01\x12<\n\x06status\x18\x02 \x01(\x0e\x32\'.executor_api_pb.FunctionExecutorStatusH\x01\x88\x01\x01\x12S\n\x12termination_reason\x18\x03 \x01(\x0e\x32\x32.executor_api_pb.FunctionExecutorTerminationReasonH\x02\x88\x01\x01\x12)\n!allocation_ids_caused_termination\x18\x04 \x03(\tB\x0e\n\x0c_descriptionB\t\n\x07_statusB\x15\n\x13_termination_reason"\x8c\x02\n\x16\x46unctionExecutorUpdate\x12\x46\n\x0b\x64\x65scription\x18\x01 \x01(\x0b\x32,.executor_api_pb.FunctionExecutorDescriptionH\x00\x88\x01\x01\x12\x39\n\x0estartup_stdout\x18\x02 \x01(\x0b\x32\x1c.executor_api_pb.DataPayloadH\x01\x88\x01\x01\x12\x39\n\x0estartup_stderr\x18\x03 \x01(\x0b\x32\x1c.executor_api_pb.DataPayloadH\x02\x88\x01\x01\x42\x0e\n\x0c_descriptionB\x11\n\x0f_startup_stdoutB\x11\n\x0f_startup_stderr"\xce\x05\n\rExecutorState\x12\x18\n\x0b\x65xecutor_id\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x15\n\x08hostname\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x14\n\x07version\x18\x05 \x01(\tH\x02\x88\x01\x01\x12\x34\n\x06status\x18\x06 \x01(\x0e\x32\x1f.executor_api_pb.ExecutorStatusH\x03\x88\x01\x01\x12<\n\x0ftotal_resources\x18\r \x01(\x0b\x32\x1e.executor_api_pb.HostResourcesH\x04\x88\x01\x01\x12N\n!total_function_executor_resources\x18\x07 \x01(\x0b\x32\x1e.executor_api_pb.HostResourcesH\x05\x88\x01\x01\x12;\n\x11\x61llowed_functions\x18\x08 \x03(\x0b\x32 .executor_api_pb.AllowedFunction\x12H\n\x18\x66unction_executor_states\x18\t \x03(\x0b\x32&.executor_api_pb.FunctionExecutorState\x12:\n\x06labels\x18\n \x03(\x0b\x32*.executor_api_pb.ExecutorState.LabelsEntry\x12\x17\n\nstate_hash\x18\x0b \x01(\tH\x06\x88\x01\x01\x12\x19\n\x0cserver_clock\x18\x0c \x01(\x04H\x07\x88\x01\x01\x1a-\n\x0bLabelsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x42\x0e\n\x0c_executor_idB\x0b\n\t_hostnameB\n\n\x08_versionB\t\n\x07_statusB\x12\n\x10_total_resourcesB$\n"_total_function_executor_resourcesB\r\n\x0b_state_hashB\x0f\n\r_server_clock"\xb9\x01\n\x0e\x45xecutorUpdate\x12\x18\n\x0b\x65xecutor_id\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x31\n\x0ctask_results\x18\x02 \x03(\x0b\x32\x1b.executor_api_pb.TaskResult\x12J\n\x19\x66unction_executor_updates\x18\x03 \x03(\x0b\x32\'.executor_api_pb.FunctionExecutorUpdateB\x0e\n\x0c_executor_id"\xbf\x01\n\x1aReportExecutorStateRequest\x12;\n\x0e\x65xecutor_state\x18\x01 \x01(\x0b\x32\x1e.executor_api_pb.ExecutorStateH\x00\x88\x01\x01\x12=\n\x0f\x65xecutor_update\x18\x02 \x01(\x0b\x32\x1f.executor_api_pb.ExecutorUpdateH\x01\x88\x01\x01\x42\x11\n\x0f_executor_stateB\x12\n\x10_executor_update"\x1d\n\x1bReportExecutorStateResponse"\xcf\x01\n\x0fTaskRetryPolicy\x12\x18\n\x0bmax_retries\x18\x01 \x01(\rH\x00\x88\x01\x01\x12\x1d\n\x10initial_delay_ms\x18\x02 \x01(\rH\x01\x88\x01\x01\x12\x19\n\x0cmax_delay_ms\x18\x03 \x01(\rH\x02\x88\x01\x01\x12\x1d\n\x10\x64\x65lay_multiplier\x18\x04 \x01(\rH\x03\x88\x01\x01\x42\x0e\n\x0c_max_retriesB\x13\n\x11_initial_delay_msB\x0f\n\r_max_delay_msB\x13\n\x11_delay_multiplier"\xc6\x04\n\x04Task\x12\x0f\n\x02id\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x16\n\tnamespace\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x17\n\ngraph_name\x18\x03 \x01(\tH\x02\x88\x01\x01\x12\x1a\n\rgraph_version\x18\x04 \x01(\tH\x03\x88\x01\x01\x12\x1a\n\rfunction_name\x18\x05 \x01(\tH\x04\x88\x01\x01\x12 \n\x13graph_invocation_id\x18\x06 \x01(\tH\x05\x88\x01\x01\x12\x17\n\ntimeout_ms\x18\n \x01(\rH\x06\x88\x01\x01\x12\x30\n\x05input\x18\x0b \x01(\x0b\x32\x1c.executor_api_pb.DataPayloadH\x07\x88\x01\x01\x12\x38\n\rreducer_input\x18\x0c \x01(\x0b\x32\x1c.executor_api_pb.DataPayloadH\x08\x88\x01\x01\x12&\n\x19output_payload_uri_prefix\x18\r \x01(\tH\t\x88\x01\x01\x12;\n\x0cretry_policy\x18\x0e \x01(\x0b\x32 .executor_api_pb.TaskRetryPolicyH\n\x88\x01\x01\x42\x05\n\x03_idB\x0c\n\n_namespaceB\r\n\x0b_graph_nameB\x10\n\x0e_graph_versionB\x10\n\x0e_function_nameB\x16\n\x14_graph_invocation_idB\r\n\x0b_timeout_msB\x08\n\x06_inputB\x10\n\x0e_reducer_inputB\x1c\n\x1a_output_payload_uri_prefixB\x0f\n\r_retry_policy"\xad\x01\n\x0eTaskAllocation\x12!\n\x14\x66unction_executor_id\x18\x01 \x01(\tH\x00\x88\x01\x01\x12(\n\x04task\x18\x02 \x01(\x0b\x32\x15.executor_api_pb.TaskH\x01\x88\x01\x01\x12\x1a\n\rallocation_id\x18\x03 \x01(\tH\x02\x88\x01\x01\x42\x17\n\x15_function_executor_idB\x07\n\x05_taskB\x10\n\x0e_allocation_id"K\n\x1fGetDesiredExecutorStatesRequest\x12\x18\n\x0b\x65xecutor_id\x18\x01 \x01(\tH\x00\x88\x01\x01\x42\x0e\n\x0c_executor_id"\xb9\x01\n\x14\x44\x65siredExecutorState\x12H\n\x12\x66unction_executors\x18\x01 \x03(\x0b\x32,.executor_api_pb.FunctionExecutorDescription\x12\x39\n\x10task_allocations\x18\x02 \x03(\x0b\x32\x1f.executor_api_pb.TaskAllocation\x12\x12\n\x05\x63lock\x18\x03 \x01(\x04H\x00\x88\x01\x01\x42\x08\n\x06_clock"\xb0\x06\n\nTaskResult\x12\x14\n\x07task_id\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x1a\n\rallocation_id\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x16\n\tnamespace\x18\x03 \x01(\tH\x02\x88\x01\x01\x12\x17\n\ngraph_name\x18\x04 \x01(\tH\x03\x88\x01\x01\x12\x1a\n\rgraph_version\x18\x05 \x01(\tH\x04\x88\x01\x01\x12\x1a\n\rfunction_name\x18\x06 \x01(\tH\x05\x88\x01\x01\x12 \n\x13graph_invocation_id\x18\x07 \x01(\tH\x06\x88\x01\x01\x12\x14\n\x07reducer\x18\x08 \x01(\x08H\x07\x88\x01\x01\x12;\n\x0coutcome_code\x18\t \x01(\x0e\x32 .executor_api_pb.TaskOutcomeCodeH\x08\x88\x01\x01\x12?\n\x0e\x66\x61ilure_reason\x18\n \x01(\x0e\x32".executor_api_pb.TaskFailureReasonH\t\x88\x01\x01\x12\x16\n\x0enext_functions\x18\x0b \x03(\t\x12\x36\n\x10\x66unction_outputs\x18\x0c \x03(\x0b\x32\x1c.executor_api_pb.DataPayload\x12\x31\n\x06stdout\x18\r \x01(\x0b\x32\x1c.executor_api_pb.DataPayloadH\n\x88\x01\x01\x12\x31\n\x06stderr\x18\x0e \x01(\x0b\x32\x1c.executor_api_pb.DataPayloadH\x0b\x88\x01\x01\x12\x42\n\x17invocation_error_output\x18\x0f \x01(\x0b\x32\x1c.executor_api_pb.DataPayloadH\x0c\x88\x01\x01\x42\n\n\x08_task_idB\x10\n\x0e_allocation_idB\x0c\n\n_namespaceB\r\n\x0b_graph_nameB\x10\n\x0e_graph_versionB\x10\n\x0e_function_nameB\x16\n\x14_graph_invocation_idB\n\n\x08_reducerB\x0f\n\r_outcome_codeB\x11\n\x0f_failure_reasonB\t\n\x07_stdoutB\t\n\x07_stderrB\x1a\n\x18_invocation_error_output*\xd1\x01\n\x13\x44\x61taPayloadEncoding\x12!\n\x1d\x44\x41TA_PAYLOAD_ENCODING_UNKNOWN\x10\x00\x12#\n\x1f\x44\x41TA_PAYLOAD_ENCODING_UTF8_JSON\x10\x01\x12#\n\x1f\x44\x41TA_PAYLOAD_ENCODING_UTF8_TEXT\x10\x02\x12\'\n#DATA_PAYLOAD_ENCODING_BINARY_PICKLE\x10\x03\x12$\n DATA_PAYLOAD_ENCODING_BINARY_ZIP\x10\x04*\xd6\x01\n\x08GPUModel\x12\x15\n\x11GPU_MODEL_UNKNOWN\x10\x00\x12\x1e\n\x1aGPU_MODEL_NVIDIA_A100_40GB\x10\x01\x12\x1e\n\x1aGPU_MODEL_NVIDIA_A100_80GB\x10\x02\x12\x1e\n\x1aGPU_MODEL_NVIDIA_H100_80GB\x10\x03\x12\x1d\n\x19GPU_MODEL_NVIDIA_TESLA_T4\x10\x04\x12\x1a\n\x16GPU_MODEL_NVIDIA_A6000\x10\x05\x12\x18\n\x14GPU_MODEL_NVIDIA_A10\x10\x06*\xb3\x01\n\x16\x46unctionExecutorStatus\x12$\n FUNCTION_EXECUTOR_STATUS_UNKNOWN\x10\x00\x12$\n FUNCTION_EXECUTOR_STATUS_PENDING\x10\x01\x12$\n FUNCTION_EXECUTOR_STATUS_RUNNING\x10\x02\x12\'\n#FUNCTION_EXECUTOR_STATUS_TERMINATED\x10\x03*\x94\x04\n!FunctionExecutorTerminationReason\x12\x30\n,FUNCTION_EXECUTOR_TERMINATION_REASON_UNKNOWN\x10\x00\x12\x46\nBFUNCTION_EXECUTOR_TERMINATION_REASON_STARTUP_FAILED_INTERNAL_ERROR\x10\x01\x12\x46\nBFUNCTION_EXECUTOR_TERMINATION_REASON_STARTUP_FAILED_FUNCTION_ERROR\x10\x02\x12H\nDFUNCTION_EXECUTOR_TERMINATION_REASON_STARTUP_FAILED_FUNCTION_TIMEOUT\x10\x03\x12\x32\n.FUNCTION_EXECUTOR_TERMINATION_REASON_UNHEALTHY\x10\x0c\x12\x37\n3FUNCTION_EXECUTOR_TERMINATION_REASON_INTERNAL_ERROR\x10\r\x12\x39\n5FUNCTION_EXECUTOR_TERMINATION_REASON_FUNCTION_TIMEOUT\x10\x0e\x12;\n7FUNCTION_EXECUTOR_TERMINATION_REASON_FUNCTION_CANCELLED\x10\x0f*\xa5\x01\n\x0e\x45xecutorStatus\x12\x1b\n\x17\x45XECUTOR_STATUS_UNKNOWN\x10\x00\x12\x1f\n\x1b\x45XECUTOR_STATUS_STARTING_UP\x10\x01\x12\x1b\n\x17\x45XECUTOR_STATUS_RUNNING\x10\x02\x12\x1b\n\x17\x45XECUTOR_STATUS_DRAINED\x10\x03\x12\x1b\n\x17\x45XECUTOR_STATUS_STOPPED\x10\x04*n\n\x0fTaskOutcomeCode\x12\x1d\n\x19TASK_OUTCOME_CODE_UNKNOWN\x10\x00\x12\x1d\n\x19TASK_OUTCOME_CODE_SUCCESS\x10\x01\x12\x1d\n\x19TASK_OUTCOME_CODE_FAILURE\x10\x02*\xb6\x02\n\x11TaskFailureReason\x12\x1f\n\x1bTASK_FAILURE_REASON_UNKNOWN\x10\x00\x12&\n"TASK_FAILURE_REASON_INTERNAL_ERROR\x10\x01\x12&\n"TASK_FAILURE_REASON_FUNCTION_ERROR\x10\x02\x12(\n$TASK_FAILURE_REASON_FUNCTION_TIMEOUT\x10\x03\x12(\n$TASK_FAILURE_REASON_INVOCATION_ERROR\x10\x04\x12&\n"TASK_FAILURE_REASON_TASK_CANCELLED\x10\x05\x12\x34\n0TASK_FAILURE_REASON_FUNCTION_EXECUTOR_TERMINATED\x10\x06\x32\xff\x01\n\x0b\x45xecutorAPI\x12t\n\x15report_executor_state\x12+.executor_api_pb.ReportExecutorStateRequest\x1a,.executor_api_pb.ReportExecutorStateResponse"\x00\x12z\n\x1bget_desired_executor_states\x12\x30.executor_api_pb.GetDesiredExecutorStatesRequest\x1a%.executor_api_pb.DesiredExecutorState"\x00\x30\x01\x62\x06proto3'
|
23
23
|
)
|
24
24
|
|
25
25
|
_globals = globals()
|
@@ -31,20 +31,20 @@ if not _descriptor._USE_C_DESCRIPTORS:
|
|
31
31
|
DESCRIPTOR._loaded_options = None
|
32
32
|
_globals["_EXECUTORSTATE_LABELSENTRY"]._loaded_options = None
|
33
33
|
_globals["_EXECUTORSTATE_LABELSENTRY"]._serialized_options = b"8\001"
|
34
|
-
_globals["_DATAPAYLOADENCODING"]._serialized_start =
|
35
|
-
_globals["_DATAPAYLOADENCODING"]._serialized_end =
|
36
|
-
_globals["_GPUMODEL"]._serialized_start =
|
37
|
-
_globals["_GPUMODEL"]._serialized_end =
|
38
|
-
_globals["_FUNCTIONEXECUTORSTATUS"]._serialized_start =
|
39
|
-
_globals["_FUNCTIONEXECUTORSTATUS"]._serialized_end =
|
40
|
-
_globals["_FUNCTIONEXECUTORTERMINATIONREASON"]._serialized_start =
|
41
|
-
_globals["_FUNCTIONEXECUTORTERMINATIONREASON"]._serialized_end =
|
42
|
-
_globals["_EXECUTORSTATUS"]._serialized_start =
|
43
|
-
_globals["_EXECUTORSTATUS"]._serialized_end =
|
44
|
-
_globals["_TASKOUTCOMECODE"]._serialized_start =
|
45
|
-
_globals["_TASKOUTCOMECODE"]._serialized_end =
|
46
|
-
_globals["_TASKFAILUREREASON"]._serialized_start =
|
47
|
-
_globals["_TASKFAILUREREASON"]._serialized_end =
|
34
|
+
_globals["_DATAPAYLOADENCODING"]._serialized_start = 5366
|
35
|
+
_globals["_DATAPAYLOADENCODING"]._serialized_end = 5575
|
36
|
+
_globals["_GPUMODEL"]._serialized_start = 5578
|
37
|
+
_globals["_GPUMODEL"]._serialized_end = 5792
|
38
|
+
_globals["_FUNCTIONEXECUTORSTATUS"]._serialized_start = 5795
|
39
|
+
_globals["_FUNCTIONEXECUTORSTATUS"]._serialized_end = 5974
|
40
|
+
_globals["_FUNCTIONEXECUTORTERMINATIONREASON"]._serialized_start = 5977
|
41
|
+
_globals["_FUNCTIONEXECUTORTERMINATIONREASON"]._serialized_end = 6509
|
42
|
+
_globals["_EXECUTORSTATUS"]._serialized_start = 6512
|
43
|
+
_globals["_EXECUTORSTATUS"]._serialized_end = 6677
|
44
|
+
_globals["_TASKOUTCOMECODE"]._serialized_start = 6679
|
45
|
+
_globals["_TASKOUTCOMECODE"]._serialized_end = 6789
|
46
|
+
_globals["_TASKFAILUREREASON"]._serialized_start = 6792
|
47
|
+
_globals["_TASKFAILUREREASON"]._serialized_end = 7102
|
48
48
|
_globals["_DATAPAYLOAD"]._serialized_start = 55
|
49
49
|
_globals["_DATAPAYLOAD"]._serialized_end = 290
|
50
50
|
_globals["_GPURESOURCES"]._serialized_start = 292
|
@@ -58,31 +58,31 @@ if not _descriptor._USE_C_DESCRIPTORS:
|
|
58
58
|
_globals["_FUNCTIONEXECUTORDESCRIPTION"]._serialized_start = 1002
|
59
59
|
_globals["_FUNCTIONEXECUTORDESCRIPTION"]._serialized_end = 1565
|
60
60
|
_globals["_FUNCTIONEXECUTORSTATE"]._serialized_start = 1568
|
61
|
-
_globals["_FUNCTIONEXECUTORSTATE"]._serialized_end =
|
62
|
-
_globals["_FUNCTIONEXECUTORUPDATE"]._serialized_start =
|
63
|
-
_globals["_FUNCTIONEXECUTORUPDATE"]._serialized_end =
|
64
|
-
_globals["_EXECUTORSTATE"]._serialized_start =
|
65
|
-
_globals["_EXECUTORSTATE"]._serialized_end =
|
66
|
-
_globals["_EXECUTORSTATE_LABELSENTRY"]._serialized_start =
|
67
|
-
_globals["_EXECUTORSTATE_LABELSENTRY"]._serialized_end =
|
68
|
-
_globals["_EXECUTORUPDATE"]._serialized_start =
|
69
|
-
_globals["_EXECUTORUPDATE"]._serialized_end =
|
70
|
-
_globals["_REPORTEXECUTORSTATEREQUEST"]._serialized_start =
|
71
|
-
_globals["_REPORTEXECUTORSTATEREQUEST"]._serialized_end =
|
72
|
-
_globals["_REPORTEXECUTORSTATERESPONSE"]._serialized_start =
|
73
|
-
_globals["_REPORTEXECUTORSTATERESPONSE"]._serialized_end =
|
74
|
-
_globals["_TASKRETRYPOLICY"]._serialized_start =
|
75
|
-
_globals["_TASKRETRYPOLICY"]._serialized_end =
|
76
|
-
_globals["_TASK"]._serialized_start =
|
77
|
-
_globals["_TASK"]._serialized_end =
|
78
|
-
_globals["_TASKALLOCATION"]._serialized_start =
|
79
|
-
_globals["_TASKALLOCATION"]._serialized_end =
|
80
|
-
_globals["_GETDESIREDEXECUTORSTATESREQUEST"]._serialized_start =
|
81
|
-
_globals["_GETDESIREDEXECUTORSTATESREQUEST"]._serialized_end =
|
82
|
-
_globals["_DESIREDEXECUTORSTATE"]._serialized_start =
|
83
|
-
_globals["_DESIREDEXECUTORSTATE"]._serialized_end =
|
84
|
-
_globals["_TASKRESULT"]._serialized_start =
|
85
|
-
_globals["_TASKRESULT"]._serialized_end =
|
86
|
-
_globals["_EXECUTORAPI"]._serialized_start =
|
87
|
-
_globals["_EXECUTORAPI"]._serialized_end =
|
61
|
+
_globals["_FUNCTIONEXECUTORSTATE"]._serialized_end = 1903
|
62
|
+
_globals["_FUNCTIONEXECUTORUPDATE"]._serialized_start = 1906
|
63
|
+
_globals["_FUNCTIONEXECUTORUPDATE"]._serialized_end = 2174
|
64
|
+
_globals["_EXECUTORSTATE"]._serialized_start = 2177
|
65
|
+
_globals["_EXECUTORSTATE"]._serialized_end = 2895
|
66
|
+
_globals["_EXECUTORSTATE_LABELSENTRY"]._serialized_start = 2708
|
67
|
+
_globals["_EXECUTORSTATE_LABELSENTRY"]._serialized_end = 2753
|
68
|
+
_globals["_EXECUTORUPDATE"]._serialized_start = 2898
|
69
|
+
_globals["_EXECUTORUPDATE"]._serialized_end = 3083
|
70
|
+
_globals["_REPORTEXECUTORSTATEREQUEST"]._serialized_start = 3086
|
71
|
+
_globals["_REPORTEXECUTORSTATEREQUEST"]._serialized_end = 3277
|
72
|
+
_globals["_REPORTEXECUTORSTATERESPONSE"]._serialized_start = 3279
|
73
|
+
_globals["_REPORTEXECUTORSTATERESPONSE"]._serialized_end = 3308
|
74
|
+
_globals["_TASKRETRYPOLICY"]._serialized_start = 3311
|
75
|
+
_globals["_TASKRETRYPOLICY"]._serialized_end = 3518
|
76
|
+
_globals["_TASK"]._serialized_start = 3521
|
77
|
+
_globals["_TASK"]._serialized_end = 4103
|
78
|
+
_globals["_TASKALLOCATION"]._serialized_start = 4106
|
79
|
+
_globals["_TASKALLOCATION"]._serialized_end = 4279
|
80
|
+
_globals["_GETDESIREDEXECUTORSTATESREQUEST"]._serialized_start = 4281
|
81
|
+
_globals["_GETDESIREDEXECUTORSTATESREQUEST"]._serialized_end = 4356
|
82
|
+
_globals["_DESIREDEXECUTORSTATE"]._serialized_start = 4359
|
83
|
+
_globals["_DESIREDEXECUTORSTATE"]._serialized_end = 4544
|
84
|
+
_globals["_TASKRESULT"]._serialized_start = 4547
|
85
|
+
_globals["_TASKRESULT"]._serialized_end = 5363
|
86
|
+
_globals["_EXECUTORAPI"]._serialized_start = 7105
|
87
|
+
_globals["_EXECUTORAPI"]._serialized_end = 7360
|
88
88
|
# @@protoc_insertion_point(module_scope)
|
@@ -52,12 +52,6 @@ class FunctionExecutorTerminationReason(
|
|
52
52
|
FUNCTION_EXECUTOR_TERMINATION_REASON_STARTUP_FAILED_FUNCTION_TIMEOUT: _ClassVar[
|
53
53
|
FunctionExecutorTerminationReason
|
54
54
|
]
|
55
|
-
FUNCTION_EXECUTOR_TERMINATION_REASON_EXECUTOR_SHUTDOWN: _ClassVar[
|
56
|
-
FunctionExecutorTerminationReason
|
57
|
-
]
|
58
|
-
FUNCTION_EXECUTOR_TERMINATION_REASON_REMOVED_FROM_DESIRED_STATE: _ClassVar[
|
59
|
-
FunctionExecutorTerminationReason
|
60
|
-
]
|
61
55
|
FUNCTION_EXECUTOR_TERMINATION_REASON_UNHEALTHY: _ClassVar[
|
62
56
|
FunctionExecutorTerminationReason
|
63
57
|
]
|
@@ -121,12 +115,6 @@ FUNCTION_EXECUTOR_TERMINATION_REASON_STARTUP_FAILED_FUNCTION_ERROR: (
|
|
121
115
|
FUNCTION_EXECUTOR_TERMINATION_REASON_STARTUP_FAILED_FUNCTION_TIMEOUT: (
|
122
116
|
FunctionExecutorTerminationReason
|
123
117
|
)
|
124
|
-
FUNCTION_EXECUTOR_TERMINATION_REASON_EXECUTOR_SHUTDOWN: (
|
125
|
-
FunctionExecutorTerminationReason
|
126
|
-
)
|
127
|
-
FUNCTION_EXECUTOR_TERMINATION_REASON_REMOVED_FROM_DESIRED_STATE: (
|
128
|
-
FunctionExecutorTerminationReason
|
129
|
-
)
|
130
118
|
FUNCTION_EXECUTOR_TERMINATION_REASON_UNHEALTHY: FunctionExecutorTerminationReason
|
131
119
|
FUNCTION_EXECUTOR_TERMINATION_REASON_INTERNAL_ERROR: FunctionExecutorTerminationReason
|
132
120
|
FUNCTION_EXECUTOR_TERMINATION_REASON_FUNCTION_TIMEOUT: FunctionExecutorTerminationReason
|
@@ -286,13 +274,20 @@ class FunctionExecutorDescription(_message.Message):
|
|
286
274
|
) -> None: ...
|
287
275
|
|
288
276
|
class FunctionExecutorState(_message.Message):
|
289
|
-
__slots__ = (
|
277
|
+
__slots__ = (
|
278
|
+
"description",
|
279
|
+
"status",
|
280
|
+
"termination_reason",
|
281
|
+
"allocation_ids_caused_termination",
|
282
|
+
)
|
290
283
|
DESCRIPTION_FIELD_NUMBER: _ClassVar[int]
|
291
284
|
STATUS_FIELD_NUMBER: _ClassVar[int]
|
292
285
|
TERMINATION_REASON_FIELD_NUMBER: _ClassVar[int]
|
286
|
+
ALLOCATION_IDS_CAUSED_TERMINATION_FIELD_NUMBER: _ClassVar[int]
|
293
287
|
description: FunctionExecutorDescription
|
294
288
|
status: FunctionExecutorStatus
|
295
289
|
termination_reason: FunctionExecutorTerminationReason
|
290
|
+
allocation_ids_caused_termination: _containers.RepeatedScalarFieldContainer[str]
|
296
291
|
def __init__(
|
297
292
|
self,
|
298
293
|
description: _Optional[_Union[FunctionExecutorDescription, _Mapping]] = ...,
|
@@ -300,6 +295,7 @@ class FunctionExecutorState(_message.Message):
|
|
300
295
|
termination_reason: _Optional[
|
301
296
|
_Union[FunctionExecutorTerminationReason, str]
|
302
297
|
] = ...,
|
298
|
+
allocation_ids_caused_termination: _Optional[_Iterable[str]] = ...,
|
303
299
|
) -> None: ...
|
304
300
|
|
305
301
|
class FunctionExecutorUpdate(_message.Message):
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.3
|
2
2
|
Name: indexify
|
3
|
-
Version: 0.4.
|
3
|
+
Version: 0.4.12
|
4
4
|
Summary: Open Source Indexify components and helper tools
|
5
5
|
Home-page: https://github.com/tensorlakeai/indexify
|
6
6
|
License: Apache 2.0
|
@@ -17,7 +17,7 @@ Requires-Dist: aiohttp (>=3.11.0,<4.0.0)
|
|
17
17
|
Requires-Dist: boto3 (>=1.37.30,<2.0.0)
|
18
18
|
Requires-Dist: prometheus-client (>=0.21.1,<0.22.0)
|
19
19
|
Requires-Dist: psutil (>=7.0.0,<8.0.0)
|
20
|
-
Requires-Dist: tensorlake (==0.2.
|
20
|
+
Requires-Dist: tensorlake (==0.2.8)
|
21
21
|
Project-URL: Repository, https://github.com/tensorlakeai/indexify
|
22
22
|
Description-Content-Type: text/markdown
|
23
23
|
|
@@ -25,22 +25,22 @@ indexify/executor/function_executor_controller/__init__.py,sha256=VPuuBEYOKf7OWy
|
|
25
25
|
indexify/executor/function_executor_controller/completed_task_metrics.py,sha256=MhnC-ddgmTK4yTsuZxgTKnqZ-YSVeWn2EhbbiggsSKk,3664
|
26
26
|
indexify/executor/function_executor_controller/create_function_executor.py,sha256=qQ_xBQRYUwz8SbNH7-H6D9GP-NJM3OlxPaIuLnPpbRM,9996
|
27
27
|
indexify/executor/function_executor_controller/debug_event_loop.py,sha256=VJOKe_c9HjIDVCjhMY3Yqyeq1tAM1eVa2chZa6CMf-U,1016
|
28
|
-
indexify/executor/function_executor_controller/destroy_function_executor.py,sha256=D2idVC-q4etkt65C0qH7TENHDVidSLsSalr6e3HwZWU,843
|
29
28
|
indexify/executor/function_executor_controller/downloads.py,sha256=XjCUmLY_jrI3AlnXC7aDwwKWTvsQjV7I9AXzrbIeY6c,7063
|
30
|
-
indexify/executor/function_executor_controller/events.py,sha256=
|
31
|
-
indexify/executor/function_executor_controller/function_executor_controller.py,sha256=
|
29
|
+
indexify/executor/function_executor_controller/events.py,sha256=r2K3k9Nnkzh0j6HHZC0DxOdQ3HtCmzt4eN2DIwTa7NM,5456
|
30
|
+
indexify/executor/function_executor_controller/function_executor_controller.py,sha256=OgPlcYELVehuDVd1mzo2-LMzvIKBsYMZDGUaGDwkigc,35454
|
32
31
|
indexify/executor/function_executor_controller/function_executor_startup_output.py,sha256=PXg2r440kqHI3oHGZbb58ehuAuW_fmEdxLTAa-0V3p4,715
|
33
32
|
indexify/executor/function_executor_controller/loggers.py,sha256=zEY2nt15gboX3SX6Kh1xjeCljZJZSE4lp27qNrg8yPY,3637
|
34
33
|
indexify/executor/function_executor_controller/message_validators.py,sha256=aNiZhYA87pnxUJtZKvKGDt40rfox-TYH2J6mW7o-Pkw,2981
|
35
34
|
indexify/executor/function_executor_controller/metrics/completed_task_metrics.py,sha256=53EGBCLwCEV-RBBeyLPTElrtcveaEM0Fwxs9NmC1Hn8,2724
|
36
35
|
indexify/executor/function_executor_controller/metrics/downloads.py,sha256=KOVTE2OZPCewnCooPyCK1maKe9ddMPvBFp7D_igqugQ,2708
|
37
|
-
indexify/executor/function_executor_controller/metrics/function_executor_controller.py,sha256=
|
36
|
+
indexify/executor/function_executor_controller/metrics/function_executor_controller.py,sha256=gyIZHbdsNSnrA6z4WDaRAunNolFrbbg1pa8JaL_ODNE,2666
|
38
37
|
indexify/executor/function_executor_controller/metrics/run_task.py,sha256=kdjw-Bi788B8Pq4eL08k8HVtcjIA3y8pLLSNWRBI8YA,1006
|
39
38
|
indexify/executor/function_executor_controller/metrics/upload_task_output.py,sha256=Ppf8NujCNbQzFelJiuh8Sutcjty7hnkFz1dWQLYIgQI,1464
|
40
39
|
indexify/executor/function_executor_controller/prepare_task.py,sha256=AKbo_H_5pOKdxFKKkzdOb1WhQ0XT-4Qm9D3iIsukyMU,1247
|
41
|
-
indexify/executor/function_executor_controller/run_task.py,sha256=
|
40
|
+
indexify/executor/function_executor_controller/run_task.py,sha256=ARa-OgqgJ1o_LmO1FIhkXBvqLWXCzYLiSiG2jGw_NR8,10448
|
42
41
|
indexify/executor/function_executor_controller/task_info.py,sha256=ZEdypd8QVmYbrLt1186Ed9YEQwrO0Sx_hKH0QLg1DVY,1181
|
43
42
|
indexify/executor/function_executor_controller/task_output.py,sha256=A5KJh60OI1FdHw6ABX3KxL9OMrC6ZADJHeo0W5iZpz8,3764
|
43
|
+
indexify/executor/function_executor_controller/terminate_function_executor.py,sha256=YLDlKoanfUBcy7A9ydCYdUsDwApjcTTn1o4tjNVN_QA,1281
|
44
44
|
indexify/executor/function_executor_controller/upload_task_output.py,sha256=fEZm5eodx5rNLQYFhmdkMDD9qjX3_wKo64x4aUKTu34,10403
|
45
45
|
indexify/executor/host_resources/host_resources.py,sha256=ZSfox24jaz1IIaQWUmciOoev0l35rk8LHbnb_koJWno,3810
|
46
46
|
indexify/executor/host_resources/nvidia_gpu.py,sha256=BIxBcWenyhZe0fuPQT9I0g6zAWMDPcm_oZEfgOoYsFU,3306
|
@@ -57,13 +57,13 @@ indexify/executor/monitoring/metrics.py,sha256=Dx2wPcTKvbd5Y5rGOfeyscFtAQ2DZ16_s
|
|
57
57
|
indexify/executor/monitoring/prometheus_metrics_handler.py,sha256=KiGqSf7rkXTfbDwThyXFpFe2jnuZD5q-5SBP_0GDo8Y,591
|
58
58
|
indexify/executor/monitoring/server.py,sha256=yzdYhcxnmY6uTQUMt3vatF5jilN52ZtfFseOmHyQpTo,1254
|
59
59
|
indexify/executor/monitoring/startup_probe_handler.py,sha256=zXXsBU15SMlBx1bSFpxWDfed1VHtKKnwvLQ8-frpG98,425
|
60
|
-
indexify/executor/state_reconciler.py,sha256=
|
60
|
+
indexify/executor/state_reconciler.py,sha256=pZ4a0OHeLkPHTuqiwh1G8YXvh23kERVUWZemol6F5E8,17787
|
61
61
|
indexify/executor/state_reporter.py,sha256=0qs9n2n8bWn77hdW8qsuUqHS7G8iyW7-9_-s8l6aJSU,14195
|
62
|
-
indexify/proto/executor_api.proto,sha256=
|
63
|
-
indexify/proto/executor_api_pb2.py,sha256=
|
64
|
-
indexify/proto/executor_api_pb2.pyi,sha256=
|
62
|
+
indexify/proto/executor_api.proto,sha256=MEsBzpL5tlBd6Yc3ZfheQ60DbXAZWQWGM1dlldhH4i8,12240
|
63
|
+
indexify/proto/executor_api_pb2.py,sha256=w2Wj1MEtTihNZ4TvPKPYDjMryO52fPa7A4dKv7vb__s,16236
|
64
|
+
indexify/proto/executor_api_pb2.pyi,sha256=AEHW4YFm5FT8f66qKGkPH36szlWgCgXrH3CQ8rgxSps,22754
|
65
65
|
indexify/proto/executor_api_pb2_grpc.py,sha256=JpT5K6jiS0NJVNyTt1mAPpyJMXuEGeNN2V6R3KmLHZ4,7607
|
66
|
-
indexify-0.4.
|
67
|
-
indexify-0.4.
|
68
|
-
indexify-0.4.
|
69
|
-
indexify-0.4.
|
66
|
+
indexify-0.4.12.dist-info/METADATA,sha256=r21ToO5MZ3_RK7w-iSaXuwXjHSCwx_8-JdTF8_a9lTc,1115
|
67
|
+
indexify-0.4.12.dist-info/WHEEL,sha256=RaoafKOydTQ7I_I3JTrPCg6kUmTgtm4BornzOqyEfJ8,88
|
68
|
+
indexify-0.4.12.dist-info/entry_points.txt,sha256=rMJqbE5KPZIXTPIfAtVIM4zpUElqYVgEYd6i7N23zzg,49
|
69
|
+
indexify-0.4.12.dist-info/RECORD,,
|
@@ -1,28 +0,0 @@
|
|
1
|
-
from typing import Any, Optional
|
2
|
-
|
3
|
-
from indexify.executor.function_executor.function_executor import FunctionExecutor
|
4
|
-
from indexify.proto.executor_api_pb2 import FunctionExecutorTerminationReason
|
5
|
-
|
6
|
-
from .events import FunctionExecutorDestroyed
|
7
|
-
|
8
|
-
|
9
|
-
async def destroy_function_executor(
|
10
|
-
function_executor: Optional[FunctionExecutor],
|
11
|
-
termination_reason: FunctionExecutorTerminationReason,
|
12
|
-
logger: Any,
|
13
|
-
) -> FunctionExecutorDestroyed:
|
14
|
-
"""Destroys a function executor if it's not None.
|
15
|
-
|
16
|
-
Doesn't raise any exceptions.
|
17
|
-
"""
|
18
|
-
logger = logger.bind(module=__name__)
|
19
|
-
|
20
|
-
if function_executor is not None:
|
21
|
-
logger.info(
|
22
|
-
"destroying function executor",
|
23
|
-
)
|
24
|
-
await function_executor.destroy()
|
25
|
-
|
26
|
-
return FunctionExecutorDestroyed(
|
27
|
-
is_success=True, termination_reason=termination_reason
|
28
|
-
)
|
File without changes
|
File without changes
|