[ 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)