makara 0.3.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +19 -0
- data/.rspec +2 -0
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/.travis.yml +28 -0
- data/CHANGELOG.md +27 -0
- data/Gemfile +18 -0
- data/LICENSE.txt +22 -0
- data/README.md +278 -0
- data/Rakefile +9 -0
- data/gemfiles/ar30.gemfile +30 -0
- data/gemfiles/ar31.gemfile +29 -0
- data/gemfiles/ar32.gemfile +29 -0
- data/gemfiles/ar40.gemfile +15 -0
- data/gemfiles/ar41.gemfile +15 -0
- data/gemfiles/ar42.gemfile +15 -0
- data/lib/active_record/connection_adapters/jdbcmysql_makara_adapter.rb +25 -0
- data/lib/active_record/connection_adapters/jdbcpostgresql_makara_adapter.rb +25 -0
- data/lib/active_record/connection_adapters/makara_abstract_adapter.rb +209 -0
- data/lib/active_record/connection_adapters/makara_jdbcmysql_adapter.rb +25 -0
- data/lib/active_record/connection_adapters/makara_jdbcpostgresql_adapter.rb +25 -0
- data/lib/active_record/connection_adapters/makara_mysql2_adapter.rb +44 -0
- data/lib/active_record/connection_adapters/makara_postgresql_adapter.rb +44 -0
- data/lib/active_record/connection_adapters/mysql2_makara_adapter.rb +44 -0
- data/lib/active_record/connection_adapters/postgresql_makara_adapter.rb +44 -0
- data/lib/makara.rb +25 -0
- data/lib/makara/cache.rb +53 -0
- data/lib/makara/cache/memory_store.rb +28 -0
- data/lib/makara/cache/noop_store.rb +15 -0
- data/lib/makara/config_parser.rb +200 -0
- data/lib/makara/connection_wrapper.rb +170 -0
- data/lib/makara/context.rb +46 -0
- data/lib/makara/error_handler.rb +39 -0
- data/lib/makara/errors/all_connections_blacklisted.rb +13 -0
- data/lib/makara/errors/blacklist_connection.rb +14 -0
- data/lib/makara/errors/no_connections_available.rb +14 -0
- data/lib/makara/logging/logger.rb +23 -0
- data/lib/makara/logging/subscriber.rb +38 -0
- data/lib/makara/middleware.rb +109 -0
- data/lib/makara/pool.rb +188 -0
- data/lib/makara/proxy.rb +277 -0
- data/lib/makara/railtie.rb +14 -0
- data/lib/makara/version.rb +15 -0
- data/makara.gemspec +19 -0
- data/spec/active_record/connection_adapters/makara_abstract_adapter_error_handling_spec.rb +92 -0
- data/spec/active_record/connection_adapters/makara_abstract_adapter_spec.rb +114 -0
- data/spec/active_record/connection_adapters/makara_mysql2_adapter_spec.rb +183 -0
- data/spec/active_record/connection_adapters/makara_postgresql_adapter_spec.rb +121 -0
- data/spec/cache_spec.rb +59 -0
- data/spec/config_parser_spec.rb +102 -0
- data/spec/connection_wrapper_spec.rb +33 -0
- data/spec/context_spec.rb +107 -0
- data/spec/middleware_spec.rb +84 -0
- data/spec/pool_spec.rb +158 -0
- data/spec/proxy_spec.rb +182 -0
- data/spec/spec_helper.rb +46 -0
- data/spec/support/configurator.rb +13 -0
- data/spec/support/deep_dup.rb +12 -0
- data/spec/support/mock_objects.rb +67 -0
- data/spec/support/mysql2_database.yml +17 -0
- data/spec/support/mysql2_database_with_custom_errors.yml +17 -0
- data/spec/support/pool_extensions.rb +14 -0
- data/spec/support/postgresql_database.yml +13 -0
- data/spec/support/proxy_extensions.rb +33 -0
- data/spec/support/schema.rb +7 -0
- metadata +144 -0
data/spec/proxy_spec.rb
ADDED
@@ -0,0 +1,182 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Makara::Proxy do
|
4
|
+
|
5
|
+
let(:klass){ FakeProxy }
|
6
|
+
|
7
|
+
|
8
|
+
it 'sets up a master and slave pool no matter the number of connections' do
|
9
|
+
proxy = klass.new(config(0, 0))
|
10
|
+
expect(proxy.master_pool).to be_a(Makara::Pool)
|
11
|
+
expect(proxy.slave_pool).to be_a(Makara::Pool)
|
12
|
+
|
13
|
+
proxy = klass.new(config(2, 0))
|
14
|
+
expect(proxy.master_pool).to be_a(Makara::Pool)
|
15
|
+
expect(proxy.slave_pool).to be_a(Makara::Pool)
|
16
|
+
|
17
|
+
proxy = klass.new(config(0, 2))
|
18
|
+
expect(proxy.master_pool).to be_a(Makara::Pool)
|
19
|
+
expect(proxy.slave_pool).to be_a(Makara::Pool)
|
20
|
+
|
21
|
+
proxy = klass.new(config(2, 2))
|
22
|
+
expect(proxy.master_pool).to be_a(Makara::Pool)
|
23
|
+
expect(proxy.slave_pool).to be_a(Makara::Pool)
|
24
|
+
end
|
25
|
+
|
26
|
+
|
27
|
+
it 'instantiates N connections within each pool' do
|
28
|
+
proxy = klass.new(config(1, 2))
|
29
|
+
|
30
|
+
expect(proxy.master_pool.connection_count).to eq(1)
|
31
|
+
expect(proxy.slave_pool.connection_count).to eq(2)
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'should delegate any unknown method to a connection in the master pool' do
|
35
|
+
proxy = klass.new(config(1, 2))
|
36
|
+
|
37
|
+
con = proxy.master_pool.connections.first
|
38
|
+
allow(con).to receive(:irespondtothis){ 'hello!' }
|
39
|
+
|
40
|
+
expect(proxy).to respond_to(:irespondtothis)
|
41
|
+
expect(proxy.irespondtothis).to eq('hello!')
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'should use master if manually forced' do
|
45
|
+
proxy = klass.new(config(1, 2))
|
46
|
+
|
47
|
+
expect(proxy.master_for?('select * from users')).to eq(false)
|
48
|
+
|
49
|
+
proxy.stick_to_master!
|
50
|
+
|
51
|
+
expect(proxy.master_for?('select * from users')).to eq(true)
|
52
|
+
end
|
53
|
+
|
54
|
+
|
55
|
+
context '#appropriate_pool' do
|
56
|
+
|
57
|
+
let(:proxy){ klass.new(config(1,1)) }
|
58
|
+
|
59
|
+
it 'should be sticky by default' do
|
60
|
+
expect(proxy.sticky).to eq(true)
|
61
|
+
end
|
62
|
+
|
63
|
+
it 'should provide the slave pool for a read' do
|
64
|
+
expect(proxy.master_for?('select * from users')).to eq(false)
|
65
|
+
end
|
66
|
+
|
67
|
+
it 'should provide the master pool for a write' do
|
68
|
+
expect(proxy.master_for?('insert into users values (a,b,c)')).to eq(true)
|
69
|
+
end
|
70
|
+
|
71
|
+
# master is used, it should continue being used for the duration of the context
|
72
|
+
it 'should stick to master once used for a sticky operation' do
|
73
|
+
expect(proxy.master_for?('insert into users values (a,b,c)')).to eq(true)
|
74
|
+
expect(proxy.master_for?('select * from users')).to eq(true)
|
75
|
+
end
|
76
|
+
|
77
|
+
it 'should not stick to master if stickiness is disabled' do
|
78
|
+
proxy.sticky = false
|
79
|
+
expect(proxy.master_for?('insert into users values (a,b,c)')).to eq(true)
|
80
|
+
expect(proxy.master_for?('select * from users')).to eq(false)
|
81
|
+
end
|
82
|
+
|
83
|
+
it 'should not stick to master if we are in a without_sticking block' do
|
84
|
+
proxy.without_sticking do
|
85
|
+
expect(proxy.master_for?('insert into users values (a,b,c)')).to eq(true)
|
86
|
+
expect(proxy.master_for?('select * from users')).to eq(false)
|
87
|
+
end
|
88
|
+
|
89
|
+
expect(proxy.master_for?('insert into users values (a,b,c)')).to eq(true)
|
90
|
+
expect(proxy.master_for?('select * from users')).to eq(true)
|
91
|
+
end
|
92
|
+
|
93
|
+
# if the context changes we should still use master until the previous context is no longer relevant
|
94
|
+
it 'should release master if the context changes and enough time passes' do
|
95
|
+
expect(proxy.master_for?('insert into users values (a,b,c)')).to eq(true)
|
96
|
+
expect(proxy.master_for?('select * from users')).to eq(true)
|
97
|
+
|
98
|
+
change_context
|
99
|
+
|
100
|
+
Timecop.travel Time.now + 10 do
|
101
|
+
expect(proxy.master_for?('select * from users')).to eq(false)
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
it 'should not release master if the previous context is still relevant' do
|
106
|
+
expect(proxy.master_for?('insert into users values (a,b,c)')).to eq(true)
|
107
|
+
expect(proxy.master_for?('select * from users')).to eq(true)
|
108
|
+
|
109
|
+
roll_context
|
110
|
+
|
111
|
+
proxy.master_for?('select * from users')
|
112
|
+
expect(proxy.master_for?('select * from users')).to eq(true)
|
113
|
+
|
114
|
+
Timecop.travel Time.now + 10 do
|
115
|
+
# cache is expired but context has not changed
|
116
|
+
expect(proxy.master_for?('select * from users')).to eq(true)
|
117
|
+
|
118
|
+
roll_context
|
119
|
+
|
120
|
+
expect(proxy.master_for?('select * from users')).to eq(false)
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
it 'should release master if context changes enough' do
|
125
|
+
expect(proxy.master_for?('insert into users values (a,b,c)')).to eq(true)
|
126
|
+
roll_context
|
127
|
+
roll_context
|
128
|
+
expect(proxy.master_for?('select * from users')).to eq(false)
|
129
|
+
end
|
130
|
+
|
131
|
+
it 'should use master if all slaves are blacklisted' do
|
132
|
+
allow(proxy.slave_pool).to receive(:completely_blacklisted?){ true }
|
133
|
+
expect(proxy.master_for?('select * from users')).to eq(true)
|
134
|
+
end
|
135
|
+
|
136
|
+
it 'should use master if all slaves become blacklisted as part of the invocation' do
|
137
|
+
allow(proxy.slave_pool).to receive(:next).and_return(nil)
|
138
|
+
|
139
|
+
test = double
|
140
|
+
expect(test).to receive(:blacklisting).once
|
141
|
+
expect(test).to receive(:using_master).once
|
142
|
+
|
143
|
+
proxy.send(:appropriate_pool, :execute, ['select * from users']) do |pool|
|
144
|
+
if pool == proxy.slave_pool
|
145
|
+
test.blacklisting
|
146
|
+
pool.instance_variable_get('@blacklist_errors') << StandardError.new('some connection issue')
|
147
|
+
pool.connections.each(&:_makara_blacklist!)
|
148
|
+
pool.provide
|
149
|
+
else
|
150
|
+
test.using_master
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
it 'should raise the error and whitelist all connections if everything is blacklisted (start over)' do
|
156
|
+
proxy.ping
|
157
|
+
|
158
|
+
# weird setup to allow for the correct
|
159
|
+
proxy.slave_pool.connections.each(&:_makara_blacklist!)
|
160
|
+
proxy.slave_pool.instance_variable_get('@blacklist_errors') << StandardError.new('some slave connection issue')
|
161
|
+
proxy.master_pool.connections.each(&:_makara_blacklist!)
|
162
|
+
proxy.master_pool.instance_variable_get('@blacklist_errors') << StandardError.new('some master connection issue')
|
163
|
+
|
164
|
+
allow(proxy).to receive(:_appropriate_pool).and_return(proxy.slave_pool, proxy.master_pool)
|
165
|
+
|
166
|
+
begin
|
167
|
+
proxy.send(:appropriate_pool, :execute, ['select * from users']) do |pool|
|
168
|
+
pool.provide{|c| c }
|
169
|
+
end
|
170
|
+
rescue Makara::Errors::AllConnectionsBlacklisted => e
|
171
|
+
expect(e.message).to eq('[Makara/master] All connections are blacklisted -> some master connection issue -> [Makara/slave] All connections are blacklisted -> some slave connection issue')
|
172
|
+
end
|
173
|
+
|
174
|
+
proxy.slave_pool.connections.each{|con| expect(con._makara_blacklisted?).to eq(false) }
|
175
|
+
proxy.master_pool.connections.each{|con| expect(con._makara_blacklisted?).to eq(false) }
|
176
|
+
end
|
177
|
+
|
178
|
+
end
|
179
|
+
|
180
|
+
|
181
|
+
|
182
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'active_record'
|
2
|
+
require 'makara'
|
3
|
+
require 'timecop'
|
4
|
+
require 'yaml'
|
5
|
+
|
6
|
+
begin
|
7
|
+
require 'byebug'
|
8
|
+
rescue LoadError
|
9
|
+
end
|
10
|
+
|
11
|
+
begin
|
12
|
+
require 'ruby-debug'
|
13
|
+
rescue LoadError
|
14
|
+
end
|
15
|
+
|
16
|
+
RSpec.configure do |config|
|
17
|
+
config.run_all_when_everything_filtered = true
|
18
|
+
config.filter_run :focus
|
19
|
+
|
20
|
+
config.order = 'random'
|
21
|
+
|
22
|
+
require "#{File.dirname(__FILE__)}/support/proxy_extensions"
|
23
|
+
require "#{File.dirname(__FILE__)}/support/pool_extensions"
|
24
|
+
require "#{File.dirname(__FILE__)}/support/configurator"
|
25
|
+
require "#{File.dirname(__FILE__)}/support/mock_objects"
|
26
|
+
require "#{File.dirname(__FILE__)}/support/deep_dup"
|
27
|
+
|
28
|
+
config.include Configurator
|
29
|
+
|
30
|
+
config.before :each do
|
31
|
+
Makara::Cache.store = :memory
|
32
|
+
change_context
|
33
|
+
allow_any_instance_of(Makara::Pool).to receive(:should_shuffle?){ false }
|
34
|
+
end
|
35
|
+
|
36
|
+
def change_context
|
37
|
+
Makara::Context.set_previous nil
|
38
|
+
Makara::Context.set_current nil
|
39
|
+
end
|
40
|
+
|
41
|
+
def roll_context
|
42
|
+
Makara::Context.set_previous Makara::Context.get_current
|
43
|
+
Makara::Context.set_current Makara::Context.generate
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module Configurator
|
2
|
+
def config(masters = 1, slaves = 2)
|
3
|
+
connections = []
|
4
|
+
masters.times{ connections << {:role => 'master'} }
|
5
|
+
slaves.times{ connections << {:role => 'slave'} }
|
6
|
+
{
|
7
|
+
:makara => {
|
8
|
+
:blacklist_duration => 30,
|
9
|
+
:connections => connections
|
10
|
+
}
|
11
|
+
}
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require 'active_record/connection_adapters/makara_abstract_adapter'
|
2
|
+
|
3
|
+
class FakeConnection < Struct.new(:config)
|
4
|
+
|
5
|
+
attr_accessor :something
|
6
|
+
|
7
|
+
def ping
|
8
|
+
'ping!'
|
9
|
+
end
|
10
|
+
|
11
|
+
def irespondtothis
|
12
|
+
'hey!'
|
13
|
+
end
|
14
|
+
|
15
|
+
def query(content)
|
16
|
+
[]
|
17
|
+
end
|
18
|
+
|
19
|
+
def active?
|
20
|
+
true
|
21
|
+
end
|
22
|
+
|
23
|
+
def disconnect!
|
24
|
+
true
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
class FakeDatabaseAdapter < Struct.new(:config)
|
29
|
+
|
30
|
+
def execute(sql, name = nil)
|
31
|
+
[]
|
32
|
+
end
|
33
|
+
|
34
|
+
def exec_query(sql, name = 'SQL', binds = [])
|
35
|
+
[]
|
36
|
+
end
|
37
|
+
|
38
|
+
def select_rows(sql, name = nil)
|
39
|
+
[]
|
40
|
+
end
|
41
|
+
|
42
|
+
def active?
|
43
|
+
true
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
|
48
|
+
class FakeProxy < Makara::Proxy
|
49
|
+
|
50
|
+
send_to_all :ping
|
51
|
+
hijack_method :execute
|
52
|
+
|
53
|
+
def connection_for(config)
|
54
|
+
FakeConnection.new(config)
|
55
|
+
end
|
56
|
+
|
57
|
+
def needs_master?(method_name, args)
|
58
|
+
return false if args.first =~ /^select/
|
59
|
+
true
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
class FakeAdapter < ::ActiveRecord::ConnectionAdapters::MakaraAbstractAdapter
|
64
|
+
def connection_for(config)
|
65
|
+
FakeDatabaseAdapter.new(config)
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
test:
|
2
|
+
adapter: 'mysql2_makara'
|
3
|
+
database: 'makara_test'
|
4
|
+
username: 'root'
|
5
|
+
password: ''
|
6
|
+
|
7
|
+
connect_timeout: 1
|
8
|
+
read_timeout: 1
|
9
|
+
write_timeout: 2
|
10
|
+
|
11
|
+
makara:
|
12
|
+
blacklist_duration: 2
|
13
|
+
master_ttl: 5
|
14
|
+
connections:
|
15
|
+
- role: master
|
16
|
+
- role: slave
|
17
|
+
- role: slave
|
@@ -0,0 +1,17 @@
|
|
1
|
+
test:
|
2
|
+
adapter: 'mysql2_makara'
|
3
|
+
database: 'makara_test'
|
4
|
+
username: 'root'
|
5
|
+
password: ''
|
6
|
+
|
7
|
+
makara:
|
8
|
+
blacklist_duration: 2
|
9
|
+
master_ttl: 5
|
10
|
+
connections:
|
11
|
+
- role: master
|
12
|
+
- role: slave
|
13
|
+
- role: slave
|
14
|
+
connection_error_matchers:
|
15
|
+
- !ruby/regexp '/^ActiveRecord::StatementInvalid: Mysql2::Error: Unknown command1:/'
|
16
|
+
- "/^ActiveRecord::StatementInvalid: Mysql2::Error: Unknown command2:/i"
|
17
|
+
- "ActiveRecord::StatementInvalid: Mysql2::Error: Unknown command3:"
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module ProxyExtensions
|
2
|
+
|
3
|
+
attr_reader :master_pool, :slave_pool, :master_context, :id
|
4
|
+
|
5
|
+
def master_for?(sql)
|
6
|
+
pool_for(sql) == master_pool
|
7
|
+
end
|
8
|
+
|
9
|
+
def would_stick?(sql)
|
10
|
+
should_stick?(:execute, [sql])
|
11
|
+
end
|
12
|
+
|
13
|
+
def connection_for(sql)
|
14
|
+
pool_for(sql) do |pool|
|
15
|
+
pool.provide do |connection|
|
16
|
+
connection
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def pool_for(sql)
|
22
|
+
appropriate_pool(:execute, [sql]) do |pool|
|
23
|
+
pool
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def sticky=(s)
|
28
|
+
@sticky = s
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
Makara::Proxy.send(:include, ProxyExtensions)
|
metadata
ADDED
@@ -0,0 +1,144 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: makara
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.3.5
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Mike Nelson
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-03-03 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: activerecord
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 3.0.0
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 3.0.0
|
27
|
+
description: Read-write split your DB yo
|
28
|
+
email:
|
29
|
+
- mike@mikeonrails.com
|
30
|
+
executables: []
|
31
|
+
extensions: []
|
32
|
+
extra_rdoc_files: []
|
33
|
+
files:
|
34
|
+
- ".gitignore"
|
35
|
+
- ".rspec"
|
36
|
+
- ".ruby-gemset"
|
37
|
+
- ".ruby-version"
|
38
|
+
- ".travis.yml"
|
39
|
+
- CHANGELOG.md
|
40
|
+
- Gemfile
|
41
|
+
- LICENSE.txt
|
42
|
+
- README.md
|
43
|
+
- Rakefile
|
44
|
+
- gemfiles/ar30.gemfile
|
45
|
+
- gemfiles/ar31.gemfile
|
46
|
+
- gemfiles/ar32.gemfile
|
47
|
+
- gemfiles/ar40.gemfile
|
48
|
+
- gemfiles/ar41.gemfile
|
49
|
+
- gemfiles/ar42.gemfile
|
50
|
+
- lib/active_record/connection_adapters/jdbcmysql_makara_adapter.rb
|
51
|
+
- lib/active_record/connection_adapters/jdbcpostgresql_makara_adapter.rb
|
52
|
+
- lib/active_record/connection_adapters/makara_abstract_adapter.rb
|
53
|
+
- lib/active_record/connection_adapters/makara_jdbcmysql_adapter.rb
|
54
|
+
- lib/active_record/connection_adapters/makara_jdbcpostgresql_adapter.rb
|
55
|
+
- lib/active_record/connection_adapters/makara_mysql2_adapter.rb
|
56
|
+
- lib/active_record/connection_adapters/makara_postgresql_adapter.rb
|
57
|
+
- lib/active_record/connection_adapters/mysql2_makara_adapter.rb
|
58
|
+
- lib/active_record/connection_adapters/postgresql_makara_adapter.rb
|
59
|
+
- lib/makara.rb
|
60
|
+
- lib/makara/cache.rb
|
61
|
+
- lib/makara/cache/memory_store.rb
|
62
|
+
- lib/makara/cache/noop_store.rb
|
63
|
+
- lib/makara/config_parser.rb
|
64
|
+
- lib/makara/connection_wrapper.rb
|
65
|
+
- lib/makara/context.rb
|
66
|
+
- lib/makara/error_handler.rb
|
67
|
+
- lib/makara/errors/all_connections_blacklisted.rb
|
68
|
+
- lib/makara/errors/blacklist_connection.rb
|
69
|
+
- lib/makara/errors/no_connections_available.rb
|
70
|
+
- lib/makara/logging/logger.rb
|
71
|
+
- lib/makara/logging/subscriber.rb
|
72
|
+
- lib/makara/middleware.rb
|
73
|
+
- lib/makara/pool.rb
|
74
|
+
- lib/makara/proxy.rb
|
75
|
+
- lib/makara/railtie.rb
|
76
|
+
- lib/makara/version.rb
|
77
|
+
- makara.gemspec
|
78
|
+
- spec/active_record/connection_adapters/makara_abstract_adapter_error_handling_spec.rb
|
79
|
+
- spec/active_record/connection_adapters/makara_abstract_adapter_spec.rb
|
80
|
+
- spec/active_record/connection_adapters/makara_mysql2_adapter_spec.rb
|
81
|
+
- spec/active_record/connection_adapters/makara_postgresql_adapter_spec.rb
|
82
|
+
- spec/cache_spec.rb
|
83
|
+
- spec/config_parser_spec.rb
|
84
|
+
- spec/connection_wrapper_spec.rb
|
85
|
+
- spec/context_spec.rb
|
86
|
+
- spec/middleware_spec.rb
|
87
|
+
- spec/pool_spec.rb
|
88
|
+
- spec/proxy_spec.rb
|
89
|
+
- spec/spec_helper.rb
|
90
|
+
- spec/support/configurator.rb
|
91
|
+
- spec/support/deep_dup.rb
|
92
|
+
- spec/support/mock_objects.rb
|
93
|
+
- spec/support/mysql2_database.yml
|
94
|
+
- spec/support/mysql2_database_with_custom_errors.yml
|
95
|
+
- spec/support/pool_extensions.rb
|
96
|
+
- spec/support/postgresql_database.yml
|
97
|
+
- spec/support/proxy_extensions.rb
|
98
|
+
- spec/support/schema.rb
|
99
|
+
homepage: ''
|
100
|
+
licenses: []
|
101
|
+
metadata: {}
|
102
|
+
post_install_message:
|
103
|
+
rdoc_options: []
|
104
|
+
require_paths:
|
105
|
+
- lib
|
106
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
112
|
+
requirements:
|
113
|
+
- - ">="
|
114
|
+
- !ruby/object:Gem::Version
|
115
|
+
version: '0'
|
116
|
+
requirements: []
|
117
|
+
rubyforge_project:
|
118
|
+
rubygems_version: 2.6.1
|
119
|
+
signing_key:
|
120
|
+
specification_version: 4
|
121
|
+
summary: Read-write split your DB yo
|
122
|
+
test_files:
|
123
|
+
- spec/active_record/connection_adapters/makara_abstract_adapter_error_handling_spec.rb
|
124
|
+
- spec/active_record/connection_adapters/makara_abstract_adapter_spec.rb
|
125
|
+
- spec/active_record/connection_adapters/makara_mysql2_adapter_spec.rb
|
126
|
+
- spec/active_record/connection_adapters/makara_postgresql_adapter_spec.rb
|
127
|
+
- spec/cache_spec.rb
|
128
|
+
- spec/config_parser_spec.rb
|
129
|
+
- spec/connection_wrapper_spec.rb
|
130
|
+
- spec/context_spec.rb
|
131
|
+
- spec/middleware_spec.rb
|
132
|
+
- spec/pool_spec.rb
|
133
|
+
- spec/proxy_spec.rb
|
134
|
+
- spec/spec_helper.rb
|
135
|
+
- spec/support/configurator.rb
|
136
|
+
- spec/support/deep_dup.rb
|
137
|
+
- spec/support/mock_objects.rb
|
138
|
+
- spec/support/mysql2_database.yml
|
139
|
+
- spec/support/mysql2_database_with_custom_errors.yml
|
140
|
+
- spec/support/pool_extensions.rb
|
141
|
+
- spec/support/postgresql_database.yml
|
142
|
+
- spec/support/proxy_extensions.rb
|
143
|
+
- spec/support/schema.rb
|
144
|
+
has_rdoc:
|