2
votes

I am successfully using the rebar-friendly package of rabbitmq-erlang-client for a simple Hello World rebarized and OTP "compliant" app and things work fine on the dev environment. I am able to fire up an erl console and do my application:start(helloworld). and connect to the broker, open up a channel and communicate to queues.

However, then I proceed to do rebar generate and it builds up the release just fine, but when I try to fire up from the self contained release package then things suddenly explode.

I know rebar releases are known to be an obscure art, but I would like to know what are my options as far as deployment for an app using the rabbitmq-erlang-client.

Below you will find the output of the console on the crash:

=INFO REPORT==== 18-Dec-2012::16:41:35 ===
    application: session_record
    exited: {{{badmatch,
               {error,
                {'EXIT',
                 {undef,
                  [{amqp_connection_sup,start_link,
                    [{amqp_params_network,<<"guest">>,<<"guest">>,<<"/">>,
                      "127.0.0.1",5672,0,0,0,infinity,none,
                      [#Fun<amqp_auth_mechanisms.plain.3>,
                       #Fun<amqp_auth_mechanisms.amqplain.3>],
                      [],[]}],
                    []},
                   {supervisor2,do_start_child_i,3,
                    [{file,"src/supervisor2.erl"},{line,391}]}, 
                   {supervisor2,handle_call,3,
                    [{file,"src/supervisor2.erl"},{line,413}]}, 
                   {gen_server,handle_msg,5,
                    [{file,"gen_server.erl"},{line,588}]},
                   {proc_lib,init_p_do_apply,3,
                    [{file,"proc_lib.erl"},{line,227}]}]}}}},
              [{amqp_connection,start,1,
                [{file,"src/amqp_connection.erl"},{line,164}]}, 
               {hello_qp,start_link,0,[{file,"src/hello_qp.erl"},{line,10}]},
               {session_record_sup,init,1,
                [{file,"src/session_record_sup.erl"},{line,55}]},
               {supervisor_bridge,init,1,
                [{file,"supervisor_bridge.erl"},{line,79}]},
               {gen_server,init_it,6,[{file,"gen_server.erl"},{line,304}]},
               {proc_lib,init_p_do_apply,3,
                [{file,"proc_lib.erl"},{line,227}]}]},
             {session_record_app,start,[normal,[]]}}
    type: permanent {"Kernel pid terminated",application_controller

EDIT: As requested in the comments.

reltool.config

{sys, [
       {lib_dirs, ["..", "../deps"]},
       {erts, [{mod_cond, derived}, {app_file, strip}]},
       {app_file, strip},
       {rel, "session_record", "0.1.0",
        [
         kernel,
         stdlib,
         sasl,
         session_record
        ]},
       {rel, "start_clean", "",
        [
         kernel,
         stdlib
        ]},
       {boot_rel, "session_record"},
       {profile, embedded},
       {incl_cond, derived},
       {mod_cond, derived},
       {excl_archive_filters, [".*"]}, %% Do not archive built libs
       {excl_sys_filters, ["^bin/.*", "^erts.*/bin/(dialyzer|typer)",
                           "^erts.*/(doc|info|include|lib|man|src)"]},
       {excl_app_filters, ["\.gitignore"]},
       {app, session_record, [{mod_cond, app}, {incl_cond, include}, {lib_dir, ".."}]},
       {app, hipe, [{incl_cond, exclude}]}
      ]}.

{target_dir, "session_record"}.

{overlay, [
           {mkdir, "log/sasl"},
           {copy, "files/erl", "\{\{erts_vsn\}\}/bin/erl"},
           {copy, "files/nodetool", "\{\{erts_vsn\}\}/bin/nodetool"},
           {copy, "files/session_record", "bin/session_record"},
           {copy, "files/session_record.cmd", "bin/session_record.cmd"},
           {copy, "files/start_erl.cmd", "bin/start_erl.cmd"},
           {copy, "files/install_upgrade.escript", "bin/install_upgrade.escript"},
           {copy, "files/sys.config", "releases/\{\{rel_vsn\}\}/sys.config"},
           {copy, "files/vm.args", "releases/\{\{rel_vsn\}\}/vm.args"}
          ]}.
2
Could you post your reltool.config file?kjw0188
@kjw0188 I posted the requested config file, the strange thing is that generating the release does not fail and the code that seems to be failing is from amqp_client while opening the connection. I tripled checked all network settings on the rabbitmq server a.s.o. Thanks for your helplfurrea
Generating the release just moves files around, so it's possible your release is not including the amqp client, leading to an undefined error.kjw0188
Right, I do see the amqp_client on the lib along with other dependencies/apps, furthermore there is a sasl log that shows how the code goes into the amqp_client modules and crashes, I suspect this is an issue with the client code and has nothing to do with the release.lfurrea

2 Answers

2
votes

Try changing {mod_cond, derived} to {mod_cond, all}. That means that reltool will not try to be clever about which modules to take from the included applications. I suspect that your problem is that reltool didn't consider amqp_connection_sup to be necessary; you could confirm that by checking whether it's present in lib/amqp_client-0.8/ebin.

0
votes

Answer given by @legoscia worked. Here is sample, reltool.config

    %% -*- mode: erlang -*-
%% ex: ft=erlang
{sys, [
       {lib_dirs, ["..","../deps"]},
       {erts, [{mod_cond, all}, {app_file, strip}]},
       {app_file, strip},
       {rel, "chat_grabber", "1",
        [
         kernel,
         stdlib,
         sasl,
           couchbeam,
         chat_grabber
        ]},
       {rel, "start_clean", "",
        [
         kernel,
         stdlib
        ]},
       {boot_rel, "chat_grabber"},
       {profile, embedded},
       {incl_cond, derived},
       {excl_archive_filters, [".*"]}, %% Do not archive built libs
       {excl_sys_filters, ["^bin/(?!start_clean.boot)",
                           "^erts.*/bin/(dialyzer|typer)",
                           "^erts.*/(doc|info|include|lib|man|src)"]},
       {excl_app_filters, ["\.gitignore"]},
       {app,couchbeam,[{mod_cond,app},{incl_cond,include},{lib_dir, "../deps/"}]},
       {app, chat_grabber, [{mod_cond, app}, {incl_cond, include}, {lib_dir, ".."}]}
      ]}.

{target_dir, "chat_grabber"}.

{overlay, [
           {mkdir, "log/sasl"},
           {copy, "files/erl", "\{\{erts_vsn\}\}/bin/erl"},
           {copy, "files/nodetool", "releases/\{\{rel_vsn\}\}/nodetool"},
           {copy, "chat_grabber/bin/start_clean.boot",
                  "\{\{erts_vsn\}\}/bin/start_clean.boot"},
           {copy, "files/chat_grabber", "bin/chat_grabber"},
           {copy, "files/chat_grabber.cmd", "bin/chat_grabber.cmd"},
           {copy, "files/start_erl.cmd", "bin/start_erl.cmd"},
           {copy, "files/install_upgrade.escript", "bin/install_upgrade.escript"},
           {copy, "files/sys.config", "releases/\{\{rel_vsn\}\}/sys.config"},
           {copy, "files/vm.args", "releases/\{\{rel_vsn\}\}/vm.args"}
          ]}.