[erlang-questions] Where to configure & start mnesia in a release?

Nuku Ameyibor nayibor@REDACTED
Sun Apr 15 23:39:16 CEST 2018


you are welcome iggor but i think we may be talking about two different
things
the relx section like below

> {release, {"app_release", "0.3.3"},[app_name,mnesia]},

would be one way to include mnesia and to have libs added as part of the
release and   mnesia started when your application is started .
another way which is  what i was talking about would be to add it in the
.app.src file like this

>   {applications,[kernel,stdlib,mnesia ]}

you may want mnesia to be started only when specific applications are
started not when the whole release is started .

cheers!!


On Sun, Apr 15, 2018 at 9:01 PM, Igor Clark <igor.clark@REDACTED> wrote:

> Thanks very much Nuku, that's the piece of the puzzle I was missing. I
> hadn't understood properly about the release packaging - I thought that if
> I added mnesia into the relx config, it would automatically start the
> mnesia app too, and I wanted to do that manually in my app. But after
> reading your email I added it into the relx/release section, and as you
> said, the mnesia package is now included in the release, but I can still
> start it manually, and the console boots correctly and accesses the mnesia
> data.
>
> Thank you!
>
> Best,
> Igor
>
>
> On 15/04/2018 21:01, Nuku Ameyibor wrote:
>
>  mnesia is not  included as part of the release .
> when rebar3 shell command is run  the path to mnesia is added
> automatically to the code paths .
> in  a release environment however its not copied  over into the release
> libs unless specified in one of your .app.src files.
> in your app.src  file check to see if mnesia is one  of the applications
> which has to  be started before the main application is started.
>
>
> On Sun, Apr 15, 2018 at 3:50 PM, Igor Clark <igor.clark@REDACTED> wrote:
>
>> Thanks Nuku,
>>
>> - It's definitely crashing due to the mnesia configuration - it shows a
>> {badmatch,undefined} error on the line where I call { ok, MnesiaDir } =
>> application:get_env( mnesia, dir ), and I've tried io:format()'ing the
>> result of application:get_env( mnesia, dir ), which shows 'undefined'
>> when running as a release
>>
>> - relx section of rebar.config is set up exactly like that - I used
>> rebar3 to generate the release
>>
>> - sys.config has exactly that mnesia entry
>>
>> It all works as expected with 'rebar3 shell', environment variable is
>> found, mnesia starts, it all works fine - but when I run 'rebar3 release'
>> and try to run the generated startup script, either with 'console' or with
>> 'start' and looking in the log file, the OTP application included in the
>> release gets 'undefined' from application:get_env( mnesia, dir ).
>>
>> From your sys.config example I realise I could say for example [ {
>> my_app, [ { mnesia_dir, "/tmp/my_db_dir" } ] } ], and use
>> application:get_env( my_app, mnesia_dir ) to initialise; this works and
>> returns { ok, "/tmp/my_db_dir" }, which is great, but then ok =
>> application:ensure_started( mnesia ) fails with {{badmatch, {error,{"no
>> such file or directory","mnesia.app"}}}. I have no idea where mnesia.app
>> should go, and I haven't been able to find any references to this file in
>> docs or online that explain where it should go or what should be in it,
>> except that it exists in the mnesia package under the OTP source tree.
>>
>> So still pretty unclear how to proceed, pointers welcome!
>>
>> Thanks,
>> Igor
>>
>>
>> On 15/04/2018 16:06, Nuku Ameyibor wrote:
>>
>>
>>     - under_build/<profile>/rel/<release>/bin/<release> console it fails
>>> (returns undefined), so the app crashes on start, regardless of whether
>>> <profile> is prod or default
>>
>> it may or may not be crashing due the mnesia configuration .
>> you may have to check the the erl_crash.dump to see the cause of the
>> crash .
>>
>>
>> How do I set mnesia application environment variables in the release
>>> project? (Or, maybe, how do I get the OTP application to be able to access
>>> the release project's application environment variables?)
>>
>>
>> in the relx section of your rebar.config you can set a sys_config to be
>> used
>> {relx,
>> [
>> {sys_config,"config/sys.config"}
>>        ]
>>
>> in that sys.config you can setup environmental variables to be used by
>> your applications including an entry for mnesia.
>> [
>> {mnesia,
>> [{dir,"/tmp/my_db_dir"}]
>> },
>> {app1,[{a,1},{b,2}],
>> {app2,[{a,3},{b,4}]
>> }
>> ]
>> this will be used by your release system when the release is created .
>> check out http://www.rebar3.org/docs/releases .
>>
>>
>>
>>
>> On Sat, Apr 14, 2018 at 3:17 PM, Igor Clark <igor.clark@REDACTED> wrote:
>>
>>> Hi list,
>>>
>>> I have an OTP application which uses mnesia. It checks/ensures the
>>> schema and table files exist and then calls application:ensure_started(
>>> mnesia ) in its application:start/2 callback. It works fine when I run the
>>> application on its own under rebar3 shell, but it doesn't work when I try
>>> to run it from an OTP release:
>>>
>>> - When I run the OTP app under rebar3 shell in its own separate
>>> directory, with { mnesia, [ { dir, "/tmp/my_db_dir" } ] } in
>>> priv/sys.config, it works fine and application:get_env( mnesia, dir )
>>> returns /tmp/my_db_dir as normal/expected
>>>
>>> - If I set { mnesia, [ { dir, "/tmp/my_db_dir" } ] } in
>>> <release>/config/sys.config, then:
>>>
>>>     - under rebar3 shell --name=myapp@REDACTED, calling
>>> application:get_env( mnesia, dir ) succeeds (returns /tmp/my_db_dir) , and
>>> the app uses reads/writes mnesia tables successfully
>>>
>>>     - under_build/<profile>/rel/<release>/bin/<release> console it
>>> fails (returns undefined), so the app crashes on start, regardless of
>>> whether <profile> is prod or default
>>>
>>> How do I set mnesia application environment variables in the release
>>> project? (Or, maybe, how do I get the OTP application to be able to access
>>> the release project's application environment variables?)
>>>
>>> Also, I realise I could be going about this the wrong way - maybe mnesia
>>> should be configured inside the specific OTP app, even under a release?
>>> Apart from the fact that that doesn't seem to work (as I have it set up,
>>> anyway), I'm aware I should steer clear of "included applications" - not
>>> least because I want to be able to use the OTP app in other projects - so I
>>> guess there's a broader question of how to configure mnesia in general, in
>>> how & when to create schema and tables, if it could be used by multiple OTP
>>> apps in a release?
>>>
>>> Bit puzzled, appreciate any advice!
>>>
>>> Cheers,
>>> Igor
>>> _______________________________________________
>>> erlang-questions mailing list
>>> erlang-questions@REDACTED
>>> http://erlang.org/mailman/listinfo/erlang-questions
>>>
>>
>>
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20180415/c1fdd6d2/attachment.htm>


More information about the erlang-questions mailing list