I have a Phoenix application that uses elasticsearch-elixir. I’m deploying with Mix releases, and trying to call an indexing function against this compiled release.
The docs have a guide on running these tasks in a Distillery release. They suggest adding the following module:
defmodule Backend.Release do
# OTP apps that must be started in order for the code in this module
# to function properly.
#
# Don't forget about Ecto and Postgrex if you're using Ecto to load documents
# in your Elasticsearch.Store module!
@start_apps [
:crypto,
:ssl,
:postgrex,
:ecto,
:elasticsearch
]
# Ecto repos to start, if any
@repos Application.get_env(:my_app, :ecto_repos, [])
# Elasticsearch clusters to start
@clusters [Backend.Elasticsearch.Cluster]
# Elasticsearch indexes to build
@indexes [:instances]
def build_elasticsearch_indexes() do
start_services()
IO.puts("Building indexes...")
Enum.each(@indexes, &Elasticsearch.Index.hot_swap(Backend.Elasticsearch.Cluster, &1))
stop_services()
end
# Ensure that all OTP apps, repos used by your Elasticsearch store,
# and your Elasticsearch Cluster(s) are started
defp start_services do
IO.puts("Starting dependencies...")
Enum.each(@start_apps, &Application.ensure_all_started/1)
IO.puts("Starting repos...")
Enum.each(@repos, & &1.start_link(pool_size: 1))
IO.puts("Starting clusters...")
Enum.each(@clusters, & &1.start_link())
end
defp stop_services do
:init.stop()
end
end
I’ve tried this setup, and then running my_app eval "MyApp.ReleaseTasks.build_elasticsearch_indexes"
against the compiled binary. However, it causes an error:
Starting dependencies...
Starting repos...
Starting clusters...
Building indexes...
** (exit) exited in: GenServer.call(Backend.Elasticsearch.Cluster, :config, 5000)
** (EXIT) no process: the process is not alive or there's no process currently associated with the given name, possibly because its application isn't started
(elixir) lib/gen_server.ex:1000: GenServer.call/3
(elasticsearch) lib/elasticsearch/indexing/index.ex:32: Elasticsearch.Index.hot_swap/2
(elixir) lib/enum.ex:783: Enum."-each/2-lists^foreach/1-0-"/2
(elixir) lib/enum.ex:783: Enum.each/2
lib/backend/release.ex:29: Backend.Release.build_elasticsearch_indexes/0
(stdlib) erl_eval.erl:680: :erl_eval.do_apply/6
(elixir) lib/code.ex:240: Code.eval_string/3
I think I remember reading somewhere that Application.ensure_all_started
is no longer the recommended way to do something like this, but I can’t find it now. Does the above module look reasonable for Elixir 1.9 releases? Is there an obvious reason I’m missing that this doesn’t work?