elixir-plug / plug_cowboy

Plug adapter for the Cowboy web server
Other
243 stars 48 forks source link

Heads up: the ranch child spec opts might need to be reworked #5

Closed voughtdq closed 5 years ago

voughtdq commented 5 years ago

I'm on ranch 1.5, so this might not be applicable to you.

I'm using Plug.Cowboy with a Phoenix project and can't confirm if this is caused by Phoenix, Plug.Cowboy, or my own local configuration. Phoenix on master and Plug.Cowboy on master.

  1. Ranch expects the transport opts to be a proplist. They are currently being passed as a map.

  2. After reworking plug_cowboy locally to convert the transport opts %{max_connections: 16384, num_acceptors: 100, socket_opts: [port: 4000]} to a Keyword list/proplist, I was getting a :badarg exception. I'm not sure where socket_opts is coming from (maybe Phoenix?), but I pulled the port config out of socket opts and was able to start without crashing.

Here is the specific exception in question:

[info] Application administration exited: Administration.Application.start(:normal, []) returned an error: shutdown: failed to start child: AdministrationWeb.Endpoint
    ** (EXIT) an exception was raised:
        ** (FunctionClauseError) no function clause matching in :proplists.get_value/3
            (stdlib) proplists.erl:215: :proplists.get_value(:num_acceptors, %{max_connections: 16384, num_acceptors: 100, socket_opts: [port: 4000]}, 10)
            (ranch) /data/repos/turret/deps/ranch/src/ranch.erl:116: :ranch.child_spec/5
            (plug_cowboy) lib/plug/cowboy.ex:185: Plug.Cowboy.child_spec/1
            (phoenix) lib/phoenix/endpoint/cowboy2_adapter.ex:44: Phoenix.Endpoint.Cowboy2Adapter.child_spec/3
            (phoenix) lib/phoenix/endpoint/supervisor.ex:106: anonymous fn/6 in Phoenix.Endpoint.Supervisor.server_children/4
            (elixir) lib/enum.ex:1925: Enum."-reduce/3-lists^foldl/2-0-"/3
            (phoenix) lib/phoenix/endpoint/supervisor.ex:97: Phoenix.Endpoint.Supervisor.server_children/4
            (phoenix) lib/phoenix/endpoint/supervisor.ex:57: Phoenix.Endpoint.Supervisor.init/1
            (stdlib) supervisor.erl:295: :supervisor.init/1
            (stdlib) gen_server.erl:374: :gen_server.init_it/2
            (stdlib) gen_server.erl:342: :gen_server.init_it/6
            (stdlib) proc_lib.erl:249: :proc_lib.init_p_do_apply/3
josevalim commented 5 years ago

Can you please let us know exactly which arguments you are passing here?

Btw, please note that Ranch v1.6 has migrated to a map: https://ninenines.eu/docs/en/ranch/1.6/manual/ranch/ - which this project uses.

voughtdq commented 5 years ago

I changed the arguments to [port: 4000, num_acceptors: 100] and that fixed the problem,

The real problem seems to be that I'm using Ranch 1.5 which I need because another library I have depends on cowlib 2.4. I'll go ahead and close this.