Giter VIP home page Giter VIP logo

active_record_replica's People

Contributors

abelorian avatar ali-ehmed avatar goodgravy avatar joshuapinter avatar mattprivman avatar reidmorrison avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

active_record_replica's Issues

Is it possible to by default read/write from master db and on specific condition it reads from slave?

I have a big code base in which every query read/writes is executed against Master DB. Now I want (On some specific areas) to read only from Slave DB. This gem seems very useful for my case but by defaults it reads from slave and writes in master. I want this default behavior turn off and force a read against slave on specific active record query.

may be something like

ActiveRecordSlave.read_from_slave do
@users = User.count
end

Is this possible?

possible to allow salves via a url?

Hi,
Is it possible to connect to slaves via

  slave:
    adapter:   mysql2
    url: <%= ENV['DATABASE_SLAVE_URL'] %>

Im seeing this error NoMethodError: undefined method []' for nil:NilClass active_record_slave-1.3.0/lib/active_record_slave/active_record_slave.rb:20:in install!'

AR Slave forces a DB connection on precompile

Hi,
After I added AR Slave gem to my project and database.yml it fails due to this gem now requiring DB connection during RAILS_ENV=production bundle exec rake assets:precompile.

It wasn't required before.

Any ideas?

Read from Master as default doesn't work in Puma

Rails: 4.2.11.1
Puma: 3.6.2
Active_record_slave: 1.5.0

I think Thread.current.thread_variable_get(:active_record_slave) fail in puma cluster.

I set ActiveRecordSlave.read_from_master! in an initializer but 'reads' go to slave instead by default

Default to master configuration unless specified in slave.

To keep things DRY, what do you think about defaulting to the master's database configuration unless specified in the slave configuration. For the example in your README:

production:
  database: production
  username: username
  password: password
  encoding: utf8
  adapter:  mysql
  host:     master1
  pool:     50
  slave:
    database: production
    username: username
    password: password
    encoding: utf8
    adapter:  mysql
    host:     slave1
    pool:     50

Typically with slave databases, most of the settings are actually the exact same as the master, except for host (usually).

Wouldn't it be nice to write this instead:

production:
  database: production
  username: username
  password: password
  encoding: utf8
  adapter:  mysql
  host:     master1
  pool:     50
  slave:
    host: slave1

And have the slave configuration just inherit from the master configuration?

Let me know what you think and I'll look at doing a PR.

Thanks!

Environment

Provide at least:

  • Ruby Version.
$ ruby -v
ruby 2.5.3p105 (2018-10-18 revision 65156) [x86_64-darwin18]
  • Active Record Slave Version.
    1.4.0

  • Application/framework names and versions (e.g. Rails, Sinatra, Puma, etc.).
    Rails

  • Full Stack Trace, if an exception is being raised.

Traceback (most recent call last):
  43: from bin/rails:4:in `<main>'
  42: from /Users/me/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/activesupport-4.2.11/lib/active_support/dependencies.rb:274:in `require'
  41: from /Users/me/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/activesupport-4.2.11/lib/active_support/dependencies.rb:240:in `load_dependency'
  40: from /Users/me/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/activesupport-4.2.11/lib/active_support/dependencies.rb:274:in `block in require'
  39: from /Users/me/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/bootsnap-1.3.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:29:in `require'
  38: from /Users/me/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/bootsnap-1.3.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:20:in `require_with_bootsnap_lfi'
  37: from /Users/me/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/bootsnap-1.3.2/lib/bootsnap/load_path_cache/loaded_features_index.rb:65:in `register'
  36: from /Users/me/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/bootsnap-1.3.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:21:in `block in require_with_bootsnap_lfi'
  35: from /Users/me/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/bootsnap-1.3.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:21:in `require'
  34: from /Users/me/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/railties-4.2.11/lib/rails/commands.rb:17:in `<main>'
  33: from /Users/me/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/railties-4.2.11/lib/rails/commands/commands_tasks.rb:39:in `run_command!'
  32: from /Users/me/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/railties-4.2.11/lib/rails/commands/commands_tasks.rb:67:in `console'
  31: from /Users/me/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/railties-4.2.11/lib/rails/commands/commands_tasks.rb:142:in `require_application_and_environment!'
  30: from /Users/me/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/railties-4.2.11/lib/rails/application.rb:328:in `require_environment!'
  29: from /Users/me/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/activesupport-4.2.11/lib/active_support/dependencies.rb:274:in `require'
  28: from /Users/me/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/activesupport-4.2.11/lib/active_support/dependencies.rb:240:in `load_dependency'
  27: from /Users/me/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/activesupport-4.2.11/lib/active_support/dependencies.rb:274:in `block in require'
  26: from /Users/me/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/skylight-core-3.1.2/lib/skylight/core/probes.rb:119:in `require'
  25: from /Users/me/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/bootsnap-1.3.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:29:in `require'
  24: from /Users/me/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/bootsnap-1.3.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:20:in `require_with_bootsnap_lfi'
  23: from /Users/me/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/bootsnap-1.3.2/lib/bootsnap/load_path_cache/loaded_features_index.rb:65:in `register'
  22: from /Users/me/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/bootsnap-1.3.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:21:in `block in require_with_bootsnap_lfi'
  21: from /Users/me/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/bootsnap-1.3.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:21:in `require'
  20: from /Users/me/Development/cntral/config/environment.rb:5:in `<main>'
  19: from /Users/me/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/railties-4.2.11/lib/rails/railtie.rb:194:in `method_missing'
  18: from /Users/me/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/railties-4.2.11/lib/rails/railtie.rb:194:in `public_send'
  17: from /Users/me/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/railties-4.2.11/lib/rails/application.rb:352:in `initialize!'
  16: from /Users/me/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/railties-4.2.11/lib/rails/initializable.rb:54:in `run_initializers'
  15: from /Users/me/.rbenv/versions/2.5.3/lib/ruby/2.5.0/tsort.rb:205:in `tsort_each'
  14: from /Users/me/.rbenv/versions/2.5.3/lib/ruby/2.5.0/tsort.rb:226:in `tsort_each'
  13: from /Users/me/.rbenv/versions/2.5.3/lib/ruby/2.5.0/tsort.rb:347:in `each_strongly_connected_component'
  12: from /Users/me/.rbenv/versions/2.5.3/lib/ruby/2.5.0/tsort.rb:347:in `call'
  11: from /Users/me/.rbenv/versions/2.5.3/lib/ruby/2.5.0/tsort.rb:347:in `each'
  10: from /Users/me/.rbenv/versions/2.5.3/lib/ruby/2.5.0/tsort.rb:349:in `block in each_strongly_connected_component'
   9: from /Users/me/.rbenv/versions/2.5.3/lib/ruby/2.5.0/tsort.rb:431:in `each_strongly_connected_component_from'
   8: from /Users/me/.rbenv/versions/2.5.3/lib/ruby/2.5.0/tsort.rb:350:in `block (2 levels) in each_strongly_connected_component'
   7: from /Users/me/.rbenv/versions/2.5.3/lib/ruby/2.5.0/tsort.rb:228:in `block in tsort_each'
   6: from /Users/me/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/railties-4.2.11/lib/rails/initializable.rb:55:in `block in run_initializers'
   5: from /Users/me/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/railties-4.2.11/lib/rails/initializable.rb:30:in `run'
   4: from /Users/me/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/railties-4.2.11/lib/rails/initializable.rb:30:in `instance_exec'
   3: from /Users/me/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/active_record_slave-1.4.0/lib/active_record_slave/railtie.rb:21:in `block in <class:Railtie>'
   2: from /Users/me/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/active_record_slave-1.4.0/lib/active_record_slave/active_record_slave.rb:24:in `install!'
   1: from /Users/me/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/activerecord-4.2.11/lib/active_record/connection_handling.rb:50:in `establish_connection'
/Users/me/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/activerecord-4.2.11/lib/active_record/connection_adapters/connection_specification.rb:171:in `spec': database configuration does not specify adapter (ActiveRecord::AdapterNotSpecified)

Reads can go to wrong place in multi-threaded environment

Environment

  • Ruby 2.4.5p335
  • Active Record Slave 1.6.0

Expected Behavior

The current state of Active Record Slave (e.g. whether we should be reading from master or the slave) is transferred from one thread to another when a new thread is created. For example, in a multi-threaded Rails server where only one thread runs the initializer code, all the child threads should behave as the initializer specifies.

Actual Behaviour

I found this limitation in Sidekiq, and I suspect #19 is related, however the behaviour can be seen in a plain irb session. Specifically, the Active Record Slave state is thread local:

[1] pry(main)> ActiveRecordSlave.read_from_master!
=> :master
[2] pry(main)> puts "In main thread: #{Thread.current.thread_variable_get(:active_record_slave).inspect}"
In main thread: :master
=> nil
[3] pry(main)> Thread.new { puts "In child thread: #{Thread.current.thread_variable_get(:active_record_slave).inspect}" }.join
In child thread: nil

As this is a fairly fundamental design decision, I don't know if there's going to be a solution here… Do you have any suggestions for how we can use Active Record Slave with e.g. Puma and Sidekiq?

db:create fails in Rails 5.2

Environment

Ruby Version:
Active Record Slave Version: 1.4.0
Rails: 5.2
Puma 3.12.0

Expected Behavior

The following command should create the database.
bundle exec rake db:create

Actual Behavior

Instead it errors out. It looks to be that the initializer is being called before the database is created.

Joshs-MacBook-Pro-3:my-proj jchappelle$ RAILS_ENV=test bundle exec rake db:create --trace > slave_error.txt
** Invoke db:create (first_time)
** Invoke db:load_config (first_time)
** Invoke environment (first_time)
** Execute environment
rake aborted!
ActiveRecord::NoDatabaseError: FATAL:  database "my-proj_test" does not exist
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/activerecord-5.2.0/lib/active_record/connection_adapters/postgresql_adapter.rb:688:in `rescue in connect'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/activerecord-5.2.0/lib/active_record/connection_adapters/postgresql_adapter.rb:684:in `connect'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/activerecord-5.2.0/lib/active_record/connection_adapters/postgresql_adapter.rb:215:in `initialize'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/activerecord-5.2.0/lib/active_record/connection_adapters/postgresql_adapter.rb:40:in `new'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/activerecord-5.2.0/lib/active_record/connection_adapters/postgresql_adapter.rb:40:in `postgresql_connection'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/activerecord-5.2.0/lib/active_record/connection_adapters/abstract/connection_pool.rb:809:in `new_connection'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/activerecord-5.2.0/lib/active_record/connection_adapters/abstract/connection_pool.rb:853:in `checkout_new_connection'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/activerecord-5.2.0/lib/active_record/connection_adapters/abstract/connection_pool.rb:832:in `try_to_checkout_new_connection'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/activerecord-5.2.0/lib/active_record/connection_adapters/abstract/connection_pool.rb:793:in `acquire_connection'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/activerecord-5.2.0/lib/active_record/connection_adapters/abstract/connection_pool.rb:521:in `checkout'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/activerecord-5.2.0/lib/active_record/connection_adapters/abstract/connection_pool.rb:380:in `connection'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/activerecord-5.2.0/lib/active_record/connection_adapters/abstract/connection_pool.rb:1008:in `retrieve_connection'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/activerecord-5.2.0/lib/active_record/connection_handling.rb:118:in `retrieve_connection'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/activerecord-5.2.0/lib/active_record/connection_handling.rb:90:in `connection'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/active_record_slave-1.4.0/lib/active_record_slave/active_record_slave.rb:17:in `install!'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/active_record_slave-1.4.0/lib/active_record_slave/railtie.rb:21:in `block in <class:Railtie>'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/railties-5.2.0/lib/rails/initializable.rb:32:in `instance_exec'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/railties-5.2.0/lib/rails/initializable.rb:32:in `run'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/railties-5.2.0/lib/rails/initializable.rb:61:in `block in run_initializers'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/2.4.0/tsort.rb:228:in `block in tsort_each'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/2.4.0/tsort.rb:350:in `block (2 levels) in each_strongly_connected_component'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/2.4.0/tsort.rb:431:in `each_strongly_connected_component_from'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/2.4.0/tsort.rb:349:in `block in each_strongly_connected_component'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/2.4.0/tsort.rb:347:in `each'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/2.4.0/tsort.rb:347:in `call'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/2.4.0/tsort.rb:347:in `each_strongly_connected_component'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/2.4.0/tsort.rb:226:in `tsort_each'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/2.4.0/tsort.rb:205:in `tsort_each'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/railties-5.2.0/lib/rails/initializable.rb:60:in `run_initializers'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/railties-5.2.0/lib/rails/application.rb:361:in `initialize!'
/Users/jchappelle/Code/my-proj/config/environment.rb:5:in `<main>'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/bootsnap-1.3.1/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:21:in `require'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/bootsnap-1.3.1/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:21:in `block in require_with_bootsnap_lfi'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/bootsnap-1.3.1/lib/bootsnap/load_path_cache/loaded_features_index.rb:65:in `register'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/bootsnap-1.3.1/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:20:in `require_with_bootsnap_lfi'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/bootsnap-1.3.1/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:29:in `require'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/activesupport-5.2.0/lib/active_support/dependencies.rb:283:in `block in require'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/activesupport-5.2.0/lib/active_support/dependencies.rb:249:in `load_dependency'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/activesupport-5.2.0/lib/active_support/dependencies.rb:283:in `require'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/railties-5.2.0/lib/rails/application.rb:337:in `require_environment!'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/railties-5.2.0/lib/rails/application.rb:520:in `block in run_tasks_blocks'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/rake-12.3.1/lib/rake/task.rb:271:in `block in execute'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/rake-12.3.1/lib/rake/task.rb:271:in `each'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/rake-12.3.1/lib/rake/task.rb:271:in `execute'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/rake-12.3.1/lib/rake/task.rb:213:in `block in invoke_with_call_chain'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/2.4.0/monitor.rb:214:in `mon_synchronize'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/rake-12.3.1/lib/rake/task.rb:193:in `invoke_with_call_chain'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/rake-12.3.1/lib/rake/task.rb:237:in `block in invoke_prerequisites'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/rake-12.3.1/lib/rake/task.rb:235:in `each'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/rake-12.3.1/lib/rake/task.rb:235:in `invoke_prerequisites'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/rake-12.3.1/lib/rake/task.rb:212:in `block in invoke_with_call_chain'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/2.4.0/monitor.rb:214:in `mon_synchronize'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/rake-12.3.1/lib/rake/task.rb:193:in `invoke_with_call_chain'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/rake-12.3.1/lib/rake/task.rb:237:in `block in invoke_prerequisites'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/rake-12.3.1/lib/rake/task.rb:235:in `each'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/rake-12.3.1/lib/rake/task.rb:235:in `invoke_prerequisites'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/rake-12.3.1/lib/rake/task.rb:212:in `block in invoke_with_call_chain'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/2.4.0/monitor.rb:214:in `mon_synchronize'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/rake-12.3.1/lib/rake/task.rb:193:in `invoke_with_call_chain'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/rake-12.3.1/lib/rake/task.rb:182:in `invoke'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/rake-12.3.1/lib/rake/application.rb:160:in `invoke_task'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/rake-12.3.1/lib/rake/application.rb:116:in `block (2 levels) in top_level'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/rake-12.3.1/lib/rake/application.rb:116:in `each'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/rake-12.3.1/lib/rake/application.rb:116:in `block in top_level'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/rake-12.3.1/lib/rake/application.rb:125:in `run_with_threads'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/rake-12.3.1/lib/rake/application.rb:110:in `top_level'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/rake-12.3.1/lib/rake/application.rb:83:in `block in run'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/rake-12.3.1/lib/rake/application.rb:186:in `standard_exception_handling'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/rake-12.3.1/lib/rake/application.rb:80:in `run'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/rake-12.3.1/exe/rake:27:in `<top (required)>'
/Users/jchappelle/.rbenv/versions/2.4.2/bin/rake:23:in `load'
/Users/jchappelle/.rbenv/versions/2.4.2/bin/rake:23:in `<top (required)>'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/bundler-1.16.1/lib/bundler/cli/exec.rb:75:in `load'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/bundler-1.16.1/lib/bundler/cli/exec.rb:75:in `kernel_load'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/bundler-1.16.1/lib/bundler/cli/exec.rb:28:in `run'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/bundler-1.16.1/lib/bundler/cli.rb:424:in `exec'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/bundler-1.16.1/lib/bundler/vendor/thor/lib/thor/command.rb:27:in `run'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/bundler-1.16.1/lib/bundler/vendor/thor/lib/thor/invocation.rb:126:in `invoke_command'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/bundler-1.16.1/lib/bundler/vendor/thor/lib/thor.rb:387:in `dispatch'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/bundler-1.16.1/lib/bundler/cli.rb:27:in `dispatch'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/bundler-1.16.1/lib/bundler/vendor/thor/lib/thor/base.rb:466:in `start'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/bundler-1.16.1/lib/bundler/cli.rb:18:in `start'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/bundler-1.16.1/exe/bundle:30:in `block in <top (required)>'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/bundler-1.16.1/lib/bundler/friendly_errors.rb:122:in `with_friendly_errors'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/bundler-1.16.1/exe/bundle:22:in `<top (required)>'
/Users/jchappelle/.rbenv/versions/2.4.2/bin/bundle:23:in `load'
/Users/jchappelle/.rbenv/versions/2.4.2/bin/bundle:23:in `<main>'

Can we use a better metaphor?

The Master/Slave terminology used by this gem is unnecessarily harsh, as well as insensitive to the human suffering brought about by slavery throughout the world (past and present). I think we can do better. 🙂

Would you be open to renaming the gem using different, less brutal terms? Perhaps Primary/Replica, or Primary/Reader, etc.?

I'm happy to submit a PR and help in any other way.

Here's a fork exploring the idea: https://github.com/jbarrieault/active_record_reader

Not having been the one to invent the verbiage is not a good reason to perpetuate it.

Support for multiple slaves?

The readme refers to the slave database in plural form in many places, but looking at the code and example it seems it only supports one slave.

Does this currently support multiple slaves?

Sometimes sending request to salve during update_attributes

Hello,

I'm seeing errors like the following occasionally:

ActiveRecord::StatementInvalid: Mysql2::Error: The MySQL server is running with the --read-only option so it cannot execute this statement: INSERT INTO ...

When calling update_attributes

In an environment without a slave the an error is raised

on a Rails 3 app the following is raised when running an environment without a slave defined:

/root/.rbenv/versions/2.2.7/lib/ruby/gems/2.2.0/gems/active_record_slave-1.3.0/lib/active_record_slave/active_record_slave.rb:20:in `install!': undefined method `[]' for nil:NilClass (NoMethodError)
	from /root/.rbenv/versions/2.2.7/lib/ruby/gems/2.2.0/gems/active_record_slave-1.3.0/lib/active_record_slave/railtie.rb:21:in `block in <class:Railtie>'

Multiple databases

Consider there is a model like this:

class DifferentStorage::Base < ActiveRecord::Base
  establish_connection(YAML.load(File.read('config/database.yml')))["different_storage_#{Rails.env}"])

  self.abstract_class = true
end

Expected Behavior

I expect that read queries for that model will be executed against different database (not master or slave). As well as for all child models.

Actual Behavior

Read queries for that model are executed on slave database, which does not contain these models.
Update/delete queries are executed against right database, which constains these models.


Do you have a plan to support models which are stored in different database?

Does this support failover?

Hello, everyone,

Sorry for not following the format but this is a simple question that doesn't really fit into it.

Basically, what happens if one of the slave databases is unreachable for any reason? It will surely not fallback to another slave since you can only have one slave per instance, but would it fallback to master?

I think this information should be added to README.md.

LMK, thank you

Sorry if I created an issue for something that might not be one.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.