heroku mongohq and mongoid Mongo::ConnectionFailure
Asked Answered
G

4

15

UPDATE 9th june 2012:

Setup with mongoid 3.0.0.rc at heroku, see this gist: https://gist.github.com/2900804

UPDATE 22th jan 2011:

Uri now takes precedence in mongoid.yml

https://github.com/mongoid/mongoid/issues/issue/266

UPDATE 12th aug 2010: Although I got an accepted answer 6th may from Jackues Crocker, there are aspects of this issue that makes it easy to mess up! It happened to me yet again and I decided to research the mongoid source code. So, here it goes:

Currently, host: port: name/database: settings TAKE PRECEDENCE OVER the uri: setting. Hence, the awfully uninformative error message is happening due to a request to localhost:xxxx and not to flame.local.mongohq.com:xxxx

This will break!

defaults: &defaults
  host: localhost  <- THIS 'OVERWRITES' host in the uri!

production:
  <<: *defaults    <- BE CAREFUL WITH WHAT YOU BRING IN. THE host: FROM DEFAULTS WILL BE THE ONE APPLIED, not your uri host.
  uri: <%= ENV['MONGOHQ_URL'] %>

fix it with either removing the host: in defaults, and/or removing the <<: *defaults


ORIGINAL Q:

I have added the mongoHQ addon for mongodb at heroku. It crashes with :

connect_to_master': failed to connect to any given host:port (Mongo::ConnectionFailure)

The descriptions online (heroku mongohq) are more directed towards mongomapper, as I see it. I'm running ruby 1.9.1 and rails 3-beta with mongoid.

My feeling says that there's something with ENV['MONGOHQ_URL'], which it says the MongoHQ addon sets, but I haven't set MONGOHQ_URL anywhere in my app. I guess the problem is in my mongoid.yml ?

defaults: &defaults
  host: localhost

development:
  <<: *defaults
  database: aliado_development

test:
  <<: *defaults
  database: aliado_test

# set these environment variables on your prod server
production:
  <<: *defaults
  host: <%= ENV['MONGOID_HOST'] %>
  port: <%= ENV['MONGOID_PORT'] %>
  username: <%= ENV['MONGOID_USERNAME'] %>
  password: <%= ENV['MONGOID_PASSWORD'] %>
  database: <%= ENV['MONGOID_DATABASE'] %>

It works fine locally, but fails at heroku, more stack trace:

==> crashlog.log <==
Cannot write to outdated .bundle/environment.rb to update it
/disk1/home/slugs/176479_b14df52_b875/mnt/.bundle/gems/gems/rack-1.1.0/lib/rack.rb:14: warning: already initialized constant VERSION
/disk1/home/slugs/176479_b14df52_b875/mnt/.bundle/gems/gems/mongo-0.20.1/lib/mongo/connection.rb:435:in `connect_to_master': failed to connect to any given host:port (Mongo::ConnectionFailure)
    from /disk1/home/slugs/176479_b14df52_b875/mnt/.bundle/gems/gems/mongo-0.20.1/lib/mongo/connection.rb:112:in `initialize'
    from /disk1/home/slugs/176479_b14df52_b875/mnt/.bundle/gems/gems/mongoid-2.0.0.beta4
/lib/mongoid/railtie.rb:32:in `new'
    from /disk1/home/slugs/176479_b14df52_b875/mnt/.bundle/gems/gems/mongoid-2.0.0.beta4/lib/mongoid/railtie.rb:32:in `block (2 levels) in <class:Railtie>'
    from /disk1/home/slugs/176479_b14df52_b875/mnt/.bundle/gems/gems/mongoid-2.0.0.beta4/lib/mongoid.rb:110:in `configure'
    from /disk1/home/slugs/176479_b14df52_b875/mnt/.bundle/gems/gems/mongoid-2.0.0.beta4/lib/mongoid/railtie.rb:21:in `block in <class:Railtie>'
    from /disk1/home/slugs/176479_b14df52_b875/mnt/.bundle/gems/gems/railties-3.0.0.beta3/lib/rails/initializable.rb:25:in `instance_exec'
.....

It all works locally, both tests and app. I'm out of ideas... Any suggestions?

PS: Somebody with high repu mind create the tag 'mongohq'?

Global answered 6/5, 2010 at 20:52 Comment(0)
V
25

Mongoid (master) now has a URI option in mongoid.yml. So you could do:

production:
  uri: <%= ENV['MONGOHQ_URL'] %>

To use mongoid master in your project, set this in your Gemfile

gem "mongoid", :git => "[email protected]:mongoid/mongoid.git"

Hopefully a new gem will be released soon which will clean things up.

Vesture answered 6/5, 2010 at 22:18 Comment(3)
The uri fix doesn't seem to work yet. I found the ticket/issue at github.com/durran/mongoid and the source of it ragingonrails.com/post/566548996/… . I did it the same way, manipulating the ENV for port, host and so on. That worked!Global
This answer is marked a correct. For others experiencing the same, note that I had to tweek some myself. It should also be :git => git://github.com/durran/mongoid.gitGlobal
Now need to use production > sessions > default > uri - updated the answer to match.Colmar
C
11

It seems to me that specifying host in the defaults hash overrides the value in uri. To fix it just remove the host from the default, here is my config/mongo.yml:

defaults: &defaults
  allow_dynamic_fields: true
  parameterize_keys: true
  persist_in_safe_mode: true
  raise_not_found_error: true
  reconnect_time: 3
  use_object_ids: true

production:
  <<: *defaults
  uri: <%= ENV['MONGOHQ_URL'] %>

Here is the snippet from mongoid's config.rb:

  mongo_uri = settings["uri"].present? ? URI.parse(settings["uri"]) : OpenStruct.new

  name = settings["database"] || mongo_uri.path.to_s.sub("/", "")
  host = settings["host"] || mongo_uri.host || "localhost" # <= look here
  port = settings["port"] || mongo_uri.port || 27017
Condescension answered 31/5, 2010 at 6:16 Comment(0)
V
4

We have some mongoid docs on our heroku section of our docs. They haven't been released officially yet but you can get it to it already. Don't expect much in the way of styles and content yet, but it does have some info that you might find useful for mongoid.

https://devcenter.heroku.com/articles/mongohq

Valorie answered 7/5, 2010 at 2:42 Comment(0)
C
0

Just a note that this works for me without any issues, as advertised on http://mongoid.github.com/docs/installation/

Gemfile:

gem "rails", '3.0.0.beta3'
gem "mongoid", "2.0.0.beta4"
gem "bson_ext", "0.20.1"

mongoid.yml:

host: xxx.mongohq.com
port: xxx
database: db
username: user
password: xxx
Citric answered 10/5, 2010 at 13:17 Comment(1)
how do you know what to put instead of xxx, when deploying to heroku? Are you not using the MongoHQ heroku addon?Global

© 2022 - 2024 — McMap. All rights reserved.