Packages
spawn
2.0.0-RC10
2.0.0-RC9
2.0.0-RC8
2.0.0-RC7
2.0.0-RC6
2.0.0-RC5
2.0.0-RC4
2.0.0-RC3
2.0.0-RC2
2.0.0-RC14
2.0.0-RC13
2.0.0-RC12
2.0.0-RC11
2.0.0-RC10
2.0.0-RC1
1.4.3
1.4.2
1.4.1
1.4.0
1.3.3
1.3.2
1.3.1
1.3.0
1.2.1
1.2.0
1.1.1
1.1.0
1.0.1
1.0.0
1.0.0-rc3
1.0.0-rc16
1.0.0-rc1
1.0.0-rc.38
1.0.0-rc.37
1.0.0-rc.36
1.0.0-rc.35
1.0.0-rc.34
1.0.0-rc.33
1.0.0-rc.32
1.0.0-rc.31
1.0.0-rc.30
1.0.0-rc.29
1.0.0-rc.28
1.0.0-rc.27
1.0.0-rc.26
1.0.0-rc.25
1.0.0-rc.24
1.0.0-rc.23
1.0.0-rc.22
1.0.0-rc.21
1.0.0-rc.20
1.0.0-rc.19
1.0.0-rc.18
1.0.0-rc.17
1.0.0-rc.2
0.6.3
0.6.2
0.6.1
0.6.0
0.5.5
0.5.4
0.5.3
0.5.1
0.5.0
0.5.0-rc.13
0.5.0-rc.12
0.5.0-rc.11
0.5.0-rc.10
0.5.0-rc.9
0.5.0-rc.8
0.5.0-rc.7
0.5.0-rc.6
0.5.0-rc.5
0.5.0-rc.3
0.5.0-alpha.13
0.5.0-alpha.12
0.5.0-alpha.11
0.5.0-alpha.10
0.5.0-alpha.9
0.5.0-alpha.8
0.5.0-alpha.7
0.5.0-alpha.6
0.5.0-alpha.5
0.5.0-alpha.4
0.5.0-alpha.3
0.5.0-alpha.2
0.5.0-alpha.1
0.1.0
Spawn is the core lib for Spawn Actors System
Current section
Files
Jump to
Current section
Files
lib/spawn/cluster/provisioner/scheduler.ex
defmodule Spawn.Cluster.Provisioner.Scheduler do
@moduledoc """
The `Spawn.Cluster.Provisioner.Scheduler` module is responsible for scheduling tasks and invoking functions in a distributed actor system.
It handles creating worker pools and executing functions with the given task configuration.
This module also contains an implementation of the `Executor` protocol for the `SpawnTask` struct,
defining the execution behavior for tasks in the context of provisioning actors in the cluster.
"""
alias Spawn.Cluster.Provisioner.SpawnTask
alias Spawn.Cluster.ProvisionerPoolSupervisor
import Spawn.Utils.Common, only: [build_worker_pool_name: 2]
defimpl Spawn.Cluster.Provisioner.Executor, for: Spawn.Cluster.Provisioner.SpawnTask do
@doc """
Defines the `Executor` protocol for the `SpawnTask` struct.
This implementation handles the execution of a given function (`func`) in the context of a task,
using the specified actor name, invocation details, options (`opts`), and state.
The task is executed through a worker pool, created using the `build_worker_pool_name/2` function,
and the function is invoked with the `{invocation, opts}` tuple and the current state.
## Parameters
- `%SpawnTask{}`: The task struct containing details about the actor provisioning process.
- `func`: The function to be invoked, which takes the task's `invocation`, `opts`, and `state`.
## Returns
The result of executing the provided function within the context of the actor provisioning system.
"""
def execute(
%SpawnTask{
actor_name: actor_name,
invocation: invocation,
opts: opts,
state: state,
async: false
},
func
)
when is_function(func) do
opts = Keyword.merge(opts, link: false)
build_worker_pool_name(ProvisionerPoolSupervisor, actor_name)
|> FLAME.call(fn -> func.({invocation, opts}, state) end, opts)
end
def execute(
%SpawnTask{
actor_name: actor_name,
invocation: invocation,
opts: opts,
state: state,
async: true
},
func
)
when is_function(func) do
opts = Keyword.merge(opts, link: false)
build_worker_pool_name(ProvisionerPoolSupervisor, actor_name)
|> FLAME.cast(fn -> func.({invocation, opts}, state) end, opts)
end
end
@doc """
Schedules and invokes a task for actor provisioning in another k8s POD.
This function wraps the scheduling logic by leveraging the `Executor` protocol to execute the provided
function (`func`). The function is called with the `invocation`, `opts`, and `state` details encapsulated in a `SpawnTask` struct.
## Parameters
- `actor_name`: The actor name reference used to create the worker pool for the task execution.
- `invocation`: The details of the invocation, typically containing metadata about the actor's execution.
- `opts`: Options passed along with the task, which may modify how the invocation is performed.
- `state`: The current state of the process, to be passed to the function being invoked.
- `func`: A function that will be called with the `{invocation, opts}` tuple and the current `state`.
## Example
```elixir
task = %SpawnTask{
actor: actor,
invocation: invocation,
opts: opts,
state: state
}
Spawn.Cluster.Provisioner.Scheduler.schedule_and_invoke(task, &some_function/2)
"""
def schedule_and_invoke(task, func) when is_function(func) do
Spawn.Cluster.Provisioner.Executor.execute(task, func)
end
end