[ 
https://issues.apache.org/jira/browse/COUCHDB-2768?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16259134#comment-16259134
 ] 

Dave Cottlehuber commented on COUCHDB-2768:
-------------------------------------------

thanks for this debugging - it explains why I saw it on some builds and not on 
others, depending on what OTP version was available! We'll address this with  
https://github.com/apache/couchdb/pull/997 finally.

> CouchDB 1.6.1 w/ OTP 17.0 does not support installation paths with spaces.
> --------------------------------------------------------------------------
>
>                 Key: COUCHDB-2768
>                 URL: https://issues.apache.org/jira/browse/COUCHDB-2768
>             Project: CouchDB
>          Issue Type: Bug
>          Components: Database Core
>            Reporter: Ryan Kyser
>            Assignee: Dave Cottlehuber
>
> CouchDB 1.6.1 does not play nice with Erlang OTP 17.0 on Windows when there 
> are spaces in the installation path. The release notes [at this 
> page|http://docs.couchdb.org/en/latest/whatsnew/1.6.html#version-1-6-0] imply 
> this should work with Erlang OTP 17.0.
> h3. Error
> {code:title=localhost:5800/_utils/verify_install.html -> Verifying fails 
> |borderStyle=solid}
> X: CouchError: {{badmatch, {error, {enoent, [{erlang,open_port, [{spawn, 
> "c:/Program Files (x86)/Apache Software 
> Foundation/CouchDB/lib/couch-1.6.1/priv/couchspawnkillable ./couchjs.exe 
> ../share/couchdb/server/main.js"}, 
> [stream,{line,4096},binary,exit_status,hide]], []}, {couch_os_process,init,1, 
> [{file, "c:/cygwin/relax/APACHE~2.1/src/couchdb/couch_os_process.erl"}, 
> {line,148}]}, {gen_server,init_it,6,[{file,"gen_server.erl"},{line,306}]}, 
> {proc_lib,init_p_do_apply,3, [{file,"proc_lib.erl"},{line,239}]}]}}}, 
> [{couch_query_servers,new_process,3, 
> [{file,"c:/cygwin/relax/APACHE~2.1/src/couchdb/couch_query_servers.erl"}, 
> {line,477}]}, {couch_query_servers,lang_proc,3, 
> [{file,"c:/cygwin/relax/APACHE~2.1/src/couchdb/couch_query_servers.erl"}, 
> {line,462}]}, {couch_query_servers,handle_call,3, 
> [{file,"c:/cygwin/relax/APACHE~2.1/src/couchdb/couch_query_servers.erl"}, 
> {line,334}]}, {gen_server,handle_msg,5,[{file,"gen_server.erl"},{line,580}]}, 
> {proc_lib,init_p_do_apply,3,[{file,"proc_lib.erl"},{line,239}]}]}
> {code}
> h3. Analysis
> I traced the problem to this block of code:
> {code:title=couch_os_process.erl|borderStyle=solid}
> init([Command, Options, PortOptions]) ->
>     PrivDir = couch_util:priv_dir(),
>     Spawnkiller = filename:join(PrivDir, "couchspawnkillable"),
>     BaseProc = #os_proc{
>         command=Command,
>         port=open_port({spawn, Spawnkiller ++ " " ++ Command}, PortOptions),
>         writer=fun writejson/2,
>         reader=fun readjson/1
>     },
> {code}
> The reason it fails with OTP 17.0 is because *code:priv_dir(couch)* returns a 
> different value than Erlang 16B02 (*code:priv_dir(couch)* is called by 
> *couch_util:priv_dir()*). See differences below:
> {code:title=w/ Erlang 16B02|borderStyle=solid}
> 2> code:priv_dir(couch).
> "c:/PROGRA~2/APACHE~1/CouchDB2/lib/couch-1.6.1/priv"
> {code}
> {code:title=w/ Erlang OTP 17.0|borderStyle=solid}
> 2> code:priv_dir(couch).
> "c:/Program Files (x86)/Apache Software 
> Foundation/CouchDB/lib/couch-1.6.1/priv"
> {code}
> So when *open_port* is called in OTP 17.0, it is passed a command that looks 
> something like:
> "C:/Program Files (x86)/Apache Software 
> Foundation/CouchDb/lib/couch-1.6.1/priv/couchspawnkillable.exe ./couchjs.exe 
> ../share/couchdb/server/main.js"
> In Erlang 16B02 something like:
> "c:/PROGRA~2/APACHE~1/CouchDB2/lib/couch-1.6.1/priv/couchspawnkillable.exe 
> ./couchjs.exe ../share/couchdb/server/main.js"
> Basically, *open_port* is splitting the command up by spaces and assuming 
> that the C:/Program part is the command it should be executing. Obviously, 
> this doesn't exist and so *open_port* fails. 
> h3. Possible Solution
> Wrap the Spawnkill part in escaped quotes. *open_port* was fixed a long time 
> to handle this (see [erlang release 
> notes|http://erlang.org/doc/apps/erts/notes.html], OTP-8055).
> I changed the init fun to this, compiled on Ubuntu, and tested on Windows. 
> This solved my problem.
> {code:title=fixed couch_os_process.erl|borderStyle=solid}
> init([Command, Options, PortOptions]) ->
>     PrivDir = couch_util:priv_dir(),
>     Spawnkiller = filename:join(PrivDir, "couchspawnkillable"),
>     BaseProc = #os_proc{
>         command=Command,
>         port=open_port({spawn, Spawnkiller ++ " " ++ Command}, PortOptions),
>         writer=fun writejson/2,
>         reader=fun readjson/1
>     },
> {code}



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)

Reply via email to