edeliver_fork v1.4.6 Edeliver.Relup.Instructions.ResumeChannels

This upgrade instruction resumes the websocket processes

connected to phoenix channels when the upgrade is done to continue handling channel events. Use this instruction at the end of the upgrade modification if the

Edeliver.Relup.Instructions.SuspendChannels

is used at the beginning. Make sure that it is used before the

Edeliver.Relup.Instructions.ResumeRanchAcceptors

instruction to avoid that recently started websockets which were not suspendet are tried to be resumed.

Suspending and resuming websocket processes for phoenix channels requires a recent phoenix version which handles sys events for websockets. It also requires that the builtin phoenix pubsub backend Phoenix.PubSub.PG2 is used for the phoenix channels.

Link to this section Summary

Functions

Returns name of the application

Resumes a list of processes

Calls the run/1 function of this module

Returns a function which inserts the relup instruction

Modifies the relup file

Resumes all websocket channels

Link to this section Functions

Link to this function arguments(instructions, config)
arguments(
  %Edeliver.Relup.Instructions{
    changed_modules: term(),
    down_instructions: term(),
    down_version: term(),
    up_instructions: term(),
    up_version: term()
  },
  Edeliver.Relup.Config.t()
) :: term()

Returns name of the application.

This name is taken as argument for the run/1 function and is required to access the acceptor processes through the supervision tree

Link to this function bulk_resume(processes, timeout \\ 1000)
bulk_resume(processes :: [pid()], timeout :: pos_integer() | :infinity) ::
  :ok
  | {:errors, count :: pos_integer(), [{pid :: pid(), reason :: term()}]}
  | :not_supported

Resumes a list of processes.

Because resume a process might take a while depending on the length of the message queue or duration of current operation processed by the pid, suspending is done asynchronously for each process by spawing a new process which calls :sys.resume/2 and then waiting for all results before returning from this function. Be careful when using :infinity as timeout, because this function might hang for infinite time if one of the process does not handle sys events.

Link to this function call_this(arguments \\ [])
call_this(arguments :: [term()]) ::
  Instruction.instruction() | Instruction.instructions()

Calls the run/1 function of this module

from the relup file during hot code upgrade

Link to this function dependencies()
dependencies() :: [instruction_module :: atom()]
dependencies() :: [Edeliver.Relup.Instructions.CheckRanchAcceptors]

This module depends on the Edeliver.Relup.Instructions.CheckRanchAcceptors and the Edeliver.Relup.Instructions.CheckRanchConnections module

which must be loaded before this instruction for upgrades and unloaded after this instruction for downgrades.

Link to this function insert_where()
insert_where() :: Instruction.insert_fun()

Returns a function which inserts the relup instruction

that calls the Edeliver.Relup.RunnableInstruction.run/1 fuction of this module. Default is inserting it at the end of the instructions

Callback implementation for Edeliver.Relup.RunnableInstruction.insert_where/0.

Link to this function modify_relup(instructions, config)

Modifies the relup file.

Modifies the relup file which will be used to upgrade (or downgrade) from one version to another by inserting, removing, or shifting appup instructions. See Edeliver.Relup.InsertInstruction and Edeliver.Relup.ShiftInstruction for useful helpers to insert / position the instructions and Edeliver.Relup.RunnableInstruction to execute custom code during the upgrade.

Callback implementation for Edeliver.Relup.Instruction.modify_relup/2.

Link to this function run(otp_application_name)
run(otp_application_name :: atom()) :: :ok

Resumes all websocket channels

to continue handling channel events after the upgrade. This is possible only in recent phoenix versions since handling sys events is required for resuming. If an older version is used, a warning is printed that suspending is not supported.