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.
@@ -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
- FUNCTION_EXECUTOR_DESTROYED = 2
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 FunctionExecutorDestroyed(BaseEvent):
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, is_success: bool, termination_reason: FunctionExecutorTerminationReason
59
+ self,
60
+ is_success: bool,
61
+ fe_termination_reason: FunctionExecutorTerminationReason,
62
+ allocation_ids_caused_termination: List[str],
60
63
  ):
61
- super().__init__(EventType.FUNCTION_EXECUTOR_DESTROYED)
64
+ super().__init__(EventType.FUNCTION_EXECUTOR_TERMINATED)
62
65
  self.is_success: bool = is_success
63
- self.termination_reason: FunctionExecutorTerminationReason = termination_reason
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"termination_reason={FunctionExecutorTerminationReason.Name(self.termination_reason)})"
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, termination_reason: FunctionExecutorTerminationReason):
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
- FunctionExecutorDestroyed,
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
- METRIC_FUNCTION_EXECUTORS_WITH_STATUS_LABEL_PENDING,
47
- METRIC_FUNCTION_EXECUTORS_WITH_STATUS_LABEL_RUNNING,
48
- METRIC_FUNCTION_EXECUTORS_WITH_STATUS_LABEL_TERMINATED,
49
- METRIC_FUNCTION_EXECUTORS_WITH_STATUS_LABEL_UNKNOWN,
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
- metric_function_executors_with_status,
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
- # Mutable state. No lock needed as it's modified by async tasks running in
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._fe_termination_reason: FunctionExecutorTerminationReason = (
101
- None # Optional
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._control_loop_aio_task is not None:
212
+ if self._internal_state != _FE_CONTROLLER_STATE.NOT_STARTED:
209
213
  self._logger.warning(
210
- "ignoring startup call as the Function Executor is already started"
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._set_status(FunctionExecutorStatus.FUNCTION_EXECUTOR_STATUS_PENDING)
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
- All the tasks are reported as failed with FE Terminated failure code.
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 _set_status(
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
- status: FunctionExecutorStatus,
291
+ new_state: FunctionExecutorState,
265
292
  ) -> None:
266
- """Sets Function Executor status and reports it to the Server.
293
+ """Sets new Function Executor state and reports it to the Server.
267
294
 
268
295
  Not blocking. Never raises exceptions."""
269
- old_status: FunctionExecutorStatus = self._status
270
- new_status: FunctionExecutorStatus = status
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(old_status),
276
- new_status=FunctionExecutorStatus.Name(new_status),
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
- self._fe_termination_reason
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(self._current_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.FUNCTION_EXECUTOR_DESTROYED:
345
- return self._handle_event_function_executor_destroyed(event)
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
- self._destroy_function_executor_before_termination(
458
- event.output.termination_reason
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._set_status(FunctionExecutorStatus.FUNCTION_EXECUTOR_STATUS_RUNNING)
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 _handle_event_function_executor_destroyed(
472
- self, event: FunctionExecutorDestroyed
488
+ def _handle_event_function_executor_terminated(
489
+ self, event: FunctionExecutorTerminated
473
490
  ) -> None:
474
- """Handles the Function Executor destroy finished event.
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 destroy failed unexpectedly, this should never happen",
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
- # Set the status only after the FE got destroyed because Server assumes that all FE resources are freed when the status changes.
483
- self._fe_termination_reason = event.termination_reason
484
- self._set_status(FunctionExecutorStatus.FUNCTION_EXECUTOR_STATUS_TERMINATED)
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
- self._destroy_function_executor_before_termination(
497
- termination_reason=FunctionExecutorTerminationReason.FUNCTION_EXECUTOR_TERMINATION_REASON_UNHEALTHY
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._status not in [
536
- FunctionExecutorStatus.FUNCTION_EXECUTOR_STATUS_RUNNING,
537
- FunctionExecutorStatus.FUNCTION_EXECUTOR_STATUS_TERMINATED,
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 pending task with the current status.
573
+ return # Can't progress runnable tasks in the current state.
540
574
 
541
575
  if (
542
- self._status == FunctionExecutorStatus.FUNCTION_EXECUTOR_STATUS_RUNNING
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._status == FunctionExecutorStatus.FUNCTION_EXECUTOR_STATUS_TERMINATED:
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._status == FunctionExecutorStatus.FUNCTION_EXECUTOR_STATUS_RUNNING:
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._destroy_function_executor_before_termination(
607
- termination_reason=event.function_executor_termination_reason
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 _destroy_function_executor_before_termination(
664
- self, termination_reason: FunctionExecutorTerminationReason
703
+ def _start_termination(
704
+ self,
705
+ fe_termination_reason: FunctionExecutorTerminationReason,
706
+ allocation_ids_caused_termination: List[str],
665
707
  ) -> None:
666
- """Destroys the Function Executor and frees all its resources to prepare for transitioning to the TERMINATED state.
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
- next_aio = destroy_function_executor(
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
- termination_reason=termination_reason,
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=FunctionExecutorDestroyed(
679
- is_success=False, termination_reason=termination_reason
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
- if self._status != FunctionExecutorStatus.FUNCTION_EXECUTOR_STATUS_TERMINATED:
720
- self._handle_event_function_executor_destroyed(
721
- await destroy_function_executor(
722
- function_executor=self._fe,
723
- termination_reason=event.termination_reason,
724
- logger=self._logger,
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
- metric_function_executors_with_status.labels(
728
- status=_to_fe_status_metric_label(self._status, self._logger)
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 _to_fe_status_metric_label(status: FunctionExecutorStatus, logger: Any) -> str:
739
- if status == FunctionExecutorStatus.FUNCTION_EXECUTOR_STATUS_UNKNOWN:
740
- return METRIC_FUNCTION_EXECUTORS_WITH_STATUS_LABEL_UNKNOWN
741
- elif status == FunctionExecutorStatus.FUNCTION_EXECUTOR_STATUS_PENDING:
742
- return METRIC_FUNCTION_EXECUTORS_WITH_STATUS_LABEL_PENDING
743
- elif status == FunctionExecutorStatus.FUNCTION_EXECUTOR_STATUS_RUNNING:
744
- return METRIC_FUNCTION_EXECUTORS_WITH_STATUS_LABEL_RUNNING
745
- elif status == FunctionExecutorStatus.FUNCTION_EXECUTOR_STATUS_TERMINATED:
746
- return METRIC_FUNCTION_EXECUTORS_WITH_STATUS_LABEL_TERMINATED
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 status",
750
- status=FunctionExecutorStatus.Name(status),
807
+ "unexpected Function Executor internal state",
808
+ state=state.name,
751
809
  )
752
- return METRIC_FUNCTION_EXECUTORS_WITH_STATUS_LABEL_UNKNOWN
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
- metric_function_executors_with_status: prometheus_client.Gauge = (
38
- prometheus_client.Gauge(
39
- "function_executors_with_status",
40
- "Number of Function Executors with a particular status",
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
- METRIC_FUNCTION_EXECUTORS_WITH_STATUS_LABEL_UNKNOWN = "unknown"
45
- METRIC_FUNCTION_EXECUTORS_WITH_STATUS_LABEL_PENDING = "pending"
46
- METRIC_FUNCTION_EXECUTORS_WITH_STATUS_LABEL_RUNNING = "running"
47
- METRIC_FUNCTION_EXECUTORS_WITH_STATUS_LABEL_TERMINATED = "terminated"
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
- metric_function_executors_with_status.labels(
50
- status=METRIC_FUNCTION_EXECUTORS_WITH_STATUS_LABEL_UNKNOWN
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
- metric_function_executors_with_status.labels(
53
- status=METRIC_FUNCTION_EXECUTORS_WITH_STATUS_LABEL_PENDING
59
+ metric_function_executors_with_state.labels(
60
+ state=METRIC_FUNCTION_EXECUTORS_WITH_STATE_LABEL_RUNNING
54
61
  )
55
- metric_function_executors_with_status.labels(
56
- status=METRIC_FUNCTION_EXECUTORS_WITH_STATUS_LABEL_RUNNING
62
+ metric_function_executors_with_state.labels(
63
+ state=METRIC_FUNCTION_EXECUTORS_WITH_STATE_LABEL_TERMINATING
57
64
  )
58
- metric_function_executors_with_status.labels(
59
- status=METRIC_FUNCTION_EXECUTORS_WITH_STATUS_LABEL_TERMINATED
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 = 5323
35
- _globals["_DATAPAYLOADENCODING"]._serialized_end = 5532
36
- _globals["_GPUMODEL"]._serialized_start = 5535
37
- _globals["_GPUMODEL"]._serialized_end = 5749
38
- _globals["_FUNCTIONEXECUTORSTATUS"]._serialized_start = 5752
39
- _globals["_FUNCTIONEXECUTORSTATUS"]._serialized_end = 5931
40
- _globals["_FUNCTIONEXECUTORTERMINATIONREASON"]._serialized_start = 5934
41
- _globals["_FUNCTIONEXECUTORTERMINATIONREASON"]._serialized_end = 6595
42
- _globals["_EXECUTORSTATUS"]._serialized_start = 6598
43
- _globals["_EXECUTORSTATUS"]._serialized_end = 6763
44
- _globals["_TASKOUTCOMECODE"]._serialized_start = 6765
45
- _globals["_TASKOUTCOMECODE"]._serialized_end = 6875
46
- _globals["_TASKFAILUREREASON"]._serialized_start = 6878
47
- _globals["_TASKFAILUREREASON"]._serialized_end = 7188
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 = 1860
62
- _globals["_FUNCTIONEXECUTORUPDATE"]._serialized_start = 1863
63
- _globals["_FUNCTIONEXECUTORUPDATE"]._serialized_end = 2131
64
- _globals["_EXECUTORSTATE"]._serialized_start = 2134
65
- _globals["_EXECUTORSTATE"]._serialized_end = 2852
66
- _globals["_EXECUTORSTATE_LABELSENTRY"]._serialized_start = 2665
67
- _globals["_EXECUTORSTATE_LABELSENTRY"]._serialized_end = 2710
68
- _globals["_EXECUTORUPDATE"]._serialized_start = 2855
69
- _globals["_EXECUTORUPDATE"]._serialized_end = 3040
70
- _globals["_REPORTEXECUTORSTATEREQUEST"]._serialized_start = 3043
71
- _globals["_REPORTEXECUTORSTATEREQUEST"]._serialized_end = 3234
72
- _globals["_REPORTEXECUTORSTATERESPONSE"]._serialized_start = 3236
73
- _globals["_REPORTEXECUTORSTATERESPONSE"]._serialized_end = 3265
74
- _globals["_TASKRETRYPOLICY"]._serialized_start = 3268
75
- _globals["_TASKRETRYPOLICY"]._serialized_end = 3475
76
- _globals["_TASK"]._serialized_start = 3478
77
- _globals["_TASK"]._serialized_end = 4060
78
- _globals["_TASKALLOCATION"]._serialized_start = 4063
79
- _globals["_TASKALLOCATION"]._serialized_end = 4236
80
- _globals["_GETDESIREDEXECUTORSTATESREQUEST"]._serialized_start = 4238
81
- _globals["_GETDESIREDEXECUTORSTATESREQUEST"]._serialized_end = 4313
82
- _globals["_DESIREDEXECUTORSTATE"]._serialized_start = 4316
83
- _globals["_DESIREDEXECUTORSTATE"]._serialized_end = 4501
84
- _globals["_TASKRESULT"]._serialized_start = 4504
85
- _globals["_TASKRESULT"]._serialized_end = 5320
86
- _globals["_EXECUTORAPI"]._serialized_start = 7191
87
- _globals["_EXECUTORAPI"]._serialized_end = 7446
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__ = ("description", "status", "termination_reason")
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.10
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.7)
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=KiK0-fNGHyeLfDiw8dKwl_qIMkJPjiUPdLY0FZYaMf8,5467
31
- indexify/executor/function_executor_controller/function_executor_controller.py,sha256=aKyRdxwTeCL9yJpgsJAoqVpYApBcdhvJHod92633oOQ,33391
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=KjUrvsUE9wSW8H0YNYI0BGMftGL10aplYVv_tAr11h4,2322
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=Sbg22yo07FQPyicxKmzPHhWRtELhTR51sF5fZ_y5lIY,9927
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=yCDLRfPmfU71aqUNnRLxDt6y4AWdSVkrEwG2HZq7nso,18125
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=x52XYq4VJLhFGAQ3EaH_hr-wWUTspsKL5XTaPZyi87k,12359
63
- indexify/proto/executor_api_pb2.py,sha256=OjLV2DJZI9zOXcppNniWQOc0wnI9A3Fp52ZEr6TuYOc,16332
64
- indexify/proto/executor_api_pb2.pyi,sha256=CEkNPPyIZK4CAJt7_z-bHiftuiSEjuf3-_p4cMrQP4I,22902
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.10.dist-info/METADATA,sha256=o7zdxoOttCT8_rSI_bgRjW8LX4TIMWzV4-kQhjc0Ux4,1115
67
- indexify-0.4.10.dist-info/WHEEL,sha256=RaoafKOydTQ7I_I3JTrPCg6kUmTgtm4BornzOqyEfJ8,88
68
- indexify-0.4.10.dist-info/entry_points.txt,sha256=rMJqbE5KPZIXTPIfAtVIM4zpUElqYVgEYd6i7N23zzg,49
69
- indexify-0.4.10.dist-info/RECORD,,
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
- )