Как создать схему mnesia в указанном каталоге из обратного вызова Application.start в Elixir? - PullRequest
0 голосов
/ 14 марта 2019

Итак, у меня есть приложение Phoenix 1.3. Я прочитал, что вам нужно создать схему mnesia до запуска приложения, чтобы вы могли затем создать таблицу приложения.

В config.exs у меня есть:

config :mnesia, 'path/to/mnesia/#{node()}'

В приложении.ex:

defmodule MyApp do
  use Application

  def start(_, _args) do
        :mnesia.stop()
        :mnesia.create_schema([node() | Node.list()])
        :mnesia.start()
  end
end

Теперь Mnesia.nonode@nohost создается в каталоге самого верхнего уровня моего приложения, если я закомментирую строку в config.exs. Но если я попытаюсь указать каталог в config.exs, я увижу сообщение вроде {:aborted, {:bad_type, :region, :disc_copies, :nonode@nohost}}

1 Ответ

0 голосов
/ 14 марта 2019

Проблема в том, что config - это зверь во время компиляции , нельзя ожидать, что node() будет получено во время выполнения.Он скомпилирован и жестко запрограммирован на то, что node() возвращает в время компиляции .

При этом, если вы компилируете свое приложение на узле foo, конфигурация во время выполнения жестко закодирована в 'path/to/mnesia/foo' на все узлы .(Кажется - в соответствии с ошибкой, которую вы получаете назад - компиляция происходит в :nonode@nohost.)

Чтобы исправить это, вы должны сохранить префикс пути в config и настроить mnesia ввремя выполнения на каждом узле, добавив '#{node()}' к префиксу.

...