MeliGraph.Distributed (MeliGraph v0.3.0)

Copy Markdown View Source

Supervisor de cluster da lib — base do modo distribuído opt-in (v0.3).

O app consumidor adiciona MeliGraph.Distributed uma única vez na sua árvore de supervisão (junto a outros componentes Horde, se houver). Ele sobe:

Tudo aqui depende de :horde/:libring, que são deps opcionais. Num app single-node que não as inclui, este módulo nunca é adicionado à árvore, e o gate distributed_context?/0 faz o resto do código degradar para :local.

Os nomes MeliGraph.HordeRegistry/MeliGraph.HordeSupervisor são fixos (mesmo padrão de TrucoRegistry/GameSupervisor); override multi-tenant fica para uma versão futura.

Summary

Functions

true se as deps Horde estão compiladas/carregáveis neste runtime.

Returns a specification to start this module under a supervisor.

Gate de ativação do modo distribuído: Horde disponível e nó vivo (Node.alive?()). Sob ExUnit normal (sem :net_kernel) é false, então uma instância distribution: :horde degrada para a árvore local de hoje.

Garante que a árvore do grafo está iniciada em algum nó do cluster.

Descobre o nó dono de um grafo via Horde.Registry.

Registra o processo chamador como dono de conf.name no Horde.Registry, com o %Config{} como metadata.

Nome fixo do Horde.Registry de descoberta.

Nome fixo do Horde.DynamicSupervisor que hospeda os grafos.

Functions

available?()

@spec available?() :: boolean()

true se as deps Horde estão compiladas/carregáveis neste runtime.

child_spec(init_arg)

Returns a specification to start this module under a supervisor.

See Supervisor.

distributed_context?()

@spec distributed_context?() :: boolean()

Gate de ativação do modo distribuído: Horde disponível e nó vivo (Node.alive?()). Sob ExUnit normal (sem :net_kernel) é false, então uma instância distribution: :horde degrada para a árvore local de hoje.

ensure_started(conf)

@spec ensure_started(MeliGraph.Config.t()) ::
  {:ok, pid() | :ignore} | {:error, term()}

Garante que a árvore do grafo está iniciada em algum nó do cluster.

Chamado por todos os nós no boot; o Horde.UniformDistribution elege um único dono por name. Os demais recebem {:error, {:already_started, _}}, tratado como sucesso (convergência).

O child id é estável ({MeliGraph.Supervisor, name}) e não inclui o conf — caso contrário nós com on_ready/timeout diferentes gerariam ids distintos e o Horde subiria duas árvores para o mesmo grafo. Contrato: todos os nós chamam start_link com opts idênticos por name.

lookup_owner(name)

@spec lookup_owner(atom()) :: {:ok, pid(), MeliGraph.Config.t()} | :error

Descobre o nó dono de um grafo via Horde.Registry.

Retorna {:ok, pid, conf} (com node(pid) = dono) ou :error se a entrada ainda não propagou (a janela de consistência é tratada com retry no Router).

register_owner(conf)

@spec register_owner(MeliGraph.Config.t()) :: :ok

Registra o processo chamador como dono de conf.name no Horde.Registry, com o %Config{} como metadata.

Chamado pelo ConfigHolder no seu init/1 (no nó dono). Ligar a entrada ao ciclo de vida do ConfigHolder garante que, no failover, quando a árvore cai, o deltacrdt dropa a entrada stale e o novo dono re-registra. Tolera `{:error, {:already_registered, }}` (reentrância benigna).

registry_name()

@spec registry_name() :: module()

Nome fixo do Horde.Registry de descoberta.

start_link(init_arg \\ [])

supervisor_name()

@spec supervisor_name() :: module()

Nome fixo do Horde.DynamicSupervisor que hospeda os grafos.