davisp opened a new issue #1772: Slow operation in couch_proc_manager
URL: https://github.com/apache/couchdb/issues/1772
 
 
   We've noticed a couple couch_proc_manager backups when deploying the latest 
version. Inspecting code I ended up stumbling over the new config code. Its 
theoretically quite a bit slower than the old code since its doing OS env 
checking but its also doing things quite inefficiently beyond that.
   
   
https://github.com/apache/couchdb/blob/master/src/couch/src/couch_proc_manager.erl#L375-L383
   
   The three big things to notice here are that we're joining the variable 
names inside the loop which is a bit wasteful. Given the size of the strings 
I'm not sure how bad that is though. I'd wager it likely depends on how many 
environment variables there are to know whether its making a difference. The 
tokens call with a pattern match also seems like an expensive thing to be 
doing. However the killer bit is probably that we're looping over `os:getenv()` 
every time we create a new process which is likely what's caused the backups.
   
   I'd propose two changes. The first simpler of the two is to just create our 
expected environment variable and use `os:getenv/1`.
   
   Something like:
   
   ```erlang
   get_env_for_spec(Spec, Target) ->
       SpecStr = Spec ++ Target,
       os:getenv(SpecStr, undefined).
   ```
   
   We're still going to be hitting `os:getenv/1` every time we create a new 
process though so I'd also recommend caching succcessful finds in an ets table 
or similar. That would allow us to have similar speed to before the patch while 
still maintaining the OS env config approach.
   

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
[email protected]


With regards,
Apache Git Services

Reply via email to