makara 0.3.9 → 0.5.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (92) hide show
  1. checksums.yaml +5 -5
  2. data/.github/dependabot.yml +11 -0
  3. data/.github/workflows/CI.yml +88 -0
  4. data/.github/workflows/gem-publish-public.yml +36 -0
  5. data/.rspec +1 -1
  6. data/.rubocop.yml +15 -0
  7. data/.rubocop_todo.yml +670 -0
  8. data/CHANGELOG.md +88 -32
  9. data/Gemfile +1 -16
  10. data/README.md +39 -35
  11. data/Rakefile +1 -1
  12. data/gemfiles/activerecord_5.2.gemfile +8 -0
  13. data/gemfiles/activerecord_6.0.gemfile +8 -0
  14. data/gemfiles/activerecord_6.1.gemfile +8 -0
  15. data/gemfiles/activerecord_head.gemfile +6 -0
  16. data/lib/active_record/connection_adapters/jdbcmysql_makara_adapter.rb +4 -18
  17. data/lib/active_record/connection_adapters/jdbcpostgresql_makara_adapter.rb +4 -18
  18. data/lib/active_record/connection_adapters/makara_abstract_adapter.rb +111 -33
  19. data/lib/active_record/connection_adapters/makara_jdbcmysql_adapter.rb +4 -18
  20. data/lib/active_record/connection_adapters/makara_jdbcpostgresql_adapter.rb +4 -18
  21. data/lib/active_record/connection_adapters/makara_mysql2_adapter.rb +4 -20
  22. data/lib/active_record/connection_adapters/makara_postgis_adapter.rb +4 -19
  23. data/lib/active_record/connection_adapters/makara_postgresql_adapter.rb +4 -20
  24. data/lib/active_record/connection_adapters/mysql2_makara_adapter.rb +4 -20
  25. data/lib/active_record/connection_adapters/postgresql_makara_adapter.rb +4 -20
  26. data/lib/makara.rb +14 -5
  27. data/lib/makara/cache.rb +4 -42
  28. data/lib/makara/config_parser.rb +18 -16
  29. data/lib/makara/connection_wrapper.rb +43 -22
  30. data/lib/makara/context.rb +108 -37
  31. data/lib/makara/cookie.rb +53 -0
  32. data/lib/makara/error_handler.rb +2 -11
  33. data/lib/makara/errors/all_connections_blacklisted.rb +0 -2
  34. data/lib/makara/errors/blacklist_connection.rb +0 -2
  35. data/lib/makara/errors/blacklisted_while_in_transaction.rb +12 -0
  36. data/lib/makara/errors/invalid_shard.rb +14 -0
  37. data/lib/makara/errors/makara_error.rb +0 -1
  38. data/lib/makara/errors/no_connections_available.rb +0 -2
  39. data/lib/makara/logging/logger.rb +1 -5
  40. data/lib/makara/logging/subscriber.rb +0 -2
  41. data/lib/makara/middleware.rb +12 -76
  42. data/lib/makara/pool.rb +55 -47
  43. data/lib/makara/proxy.rb +76 -56
  44. data/lib/makara/railtie.rb +0 -8
  45. data/lib/makara/strategies/abstract.rb +1 -0
  46. data/lib/makara/strategies/priority_failover.rb +2 -0
  47. data/lib/makara/strategies/round_robin.rb +7 -3
  48. data/lib/makara/strategies/shard_aware.rb +45 -0
  49. data/lib/makara/version.rb +2 -4
  50. data/makara.gemspec +26 -3
  51. data/spec/active_record/connection_adapters/makara_abstract_adapter_error_handling_spec.rb +1 -6
  52. data/spec/active_record/connection_adapters/makara_abstract_adapter_spec.rb +10 -14
  53. data/spec/active_record/connection_adapters/makara_mysql2_adapter_spec.rb +18 -16
  54. data/spec/active_record/connection_adapters/makara_postgis_adapter_spec.rb +6 -9
  55. data/spec/active_record/connection_adapters/makara_postgresql_adapter_spec.rb +70 -10
  56. data/spec/cache_spec.rb +2 -53
  57. data/spec/config_parser_spec.rb +75 -57
  58. data/spec/connection_wrapper_spec.rb +6 -4
  59. data/spec/context_spec.rb +163 -100
  60. data/spec/cookie_spec.rb +72 -0
  61. data/spec/middleware_spec.rb +27 -56
  62. data/spec/pool_spec.rb +25 -14
  63. data/spec/proxy_spec.rb +50 -39
  64. data/spec/spec_helper.rb +10 -10
  65. data/spec/strategies/priority_failover_spec.rb +3 -4
  66. data/spec/strategies/round_robin_spec.rb +4 -8
  67. data/spec/strategies/shard_aware_spec.rb +218 -0
  68. data/spec/support/deep_dup.rb +1 -1
  69. data/spec/support/helpers.rb +10 -6
  70. data/spec/support/mock_objects.rb +6 -5
  71. data/spec/support/mysql2_database.yml +3 -2
  72. data/spec/support/mysql2_database_with_custom_errors.yml +6 -1
  73. data/spec/support/pool_extensions.rb +0 -3
  74. data/spec/support/postgis_database.yml +2 -0
  75. data/spec/support/postgis_schema.rb +6 -3
  76. data/spec/support/postgresql_database.yml +2 -2
  77. data/spec/support/proxy_extensions.rb +1 -3
  78. data/spec/support/schema.rb +6 -6
  79. data/spec/support/user.rb +4 -0
  80. metadata +170 -22
  81. data/.travis.yml +0 -70
  82. data/gemfiles/ar-head.gemfile +0 -15
  83. data/gemfiles/ar30.gemfile +0 -32
  84. data/gemfiles/ar31.gemfile +0 -31
  85. data/gemfiles/ar32.gemfile +0 -31
  86. data/gemfiles/ar40.gemfile +0 -17
  87. data/gemfiles/ar41.gemfile +0 -17
  88. data/gemfiles/ar42.gemfile +0 -17
  89. data/gemfiles/ar50.gemfile +0 -15
  90. data/gemfiles/ar51.gemfile +0 -15
  91. data/lib/makara/cache/memory_store.rb +0 -28
  92. data/lib/makara/cache/noop_store.rb +0 -15
@@ -9,4 +9,4 @@ unless Hash.respond_to?(:deep_dup)
9
9
  duplicate
10
10
  end
11
11
  end
12
- end
12
+ end
@@ -11,13 +11,17 @@ module SpecHelpers
11
11
 
12
12
  def config(masters = 1, slaves = 2)
13
13
  connections = []
14
- masters.times{ connections << {:role => 'master'} }
15
- slaves.times{ connections << {:role => 'slave'} }
14
+ masters.times{ connections << {role: 'master'} }
15
+ slaves.times{ connections << {role: 'slave'} }
16
16
  {
17
- :makara => {
18
- :blacklist_duration => 30,
19
- :connections => connections
17
+ makara: {
18
+ # Defaults:
19
+ # :master_ttl => 5,
20
+ # :blacklist_duration => 30,
21
+ # :sticky => true
22
+ id: 'mock_mysql',
23
+ connections: connections
20
24
  }
21
25
  }
22
26
  end
23
- end
27
+ end
@@ -1,7 +1,6 @@
1
1
  require 'active_record/connection_adapters/makara_abstract_adapter'
2
2
 
3
3
  class FakeConnection < Struct.new(:config)
4
-
5
4
  def ping
6
5
  'ping!'
7
6
  end
@@ -11,13 +10,17 @@ class FakeConnection < Struct.new(:config)
11
10
  end
12
11
 
13
12
  def query(content)
14
- []
13
+ config[:name]
15
14
  end
16
15
 
17
16
  def active?
18
17
  true
19
18
  end
20
19
 
20
+ def open_transactions
21
+ (config || {}).fetch(:open_transactions, 0)
22
+ end
23
+
21
24
  def disconnect!
22
25
  true
23
26
  end
@@ -28,7 +31,6 @@ class FakeConnection < Struct.new(:config)
28
31
  end
29
32
 
30
33
  class FakeDatabaseAdapter < Struct.new(:config)
31
-
32
34
  def execute(sql, name = nil)
33
35
  []
34
36
  end
@@ -44,11 +46,9 @@ class FakeDatabaseAdapter < Struct.new(:config)
44
46
  def active?
45
47
  true
46
48
  end
47
-
48
49
  end
49
50
 
50
51
  class FakeProxy < Makara::Proxy
51
-
52
52
  send_to_all :ping
53
53
  hijack_method :execute
54
54
 
@@ -58,6 +58,7 @@ class FakeProxy < Makara::Proxy
58
58
 
59
59
  def needs_master?(method_name, args)
60
60
  return false if args.first =~ /^select/
61
+
61
62
  true
62
63
  end
63
64
  end
@@ -1,9 +1,10 @@
1
1
  test:
2
2
  adapter: 'mysql2_makara'
3
3
  database: 'makara_test'
4
- username: 'root'
4
+ host: <%= ENV["MYSQL_HOST"] %>
5
+ username: root
5
6
  password: ''
6
-
7
+ timeout: 5000
7
8
  connect_timeout: 1
8
9
  read_timeout: 1
9
10
  write_timeout: 2
@@ -1,8 +1,13 @@
1
1
  test:
2
2
  adapter: 'mysql2_makara'
3
3
  database: 'makara_test'
4
- username: 'root'
4
+ host: <%= ENV["MYSQL_HOST"] %>
5
+ username: root
5
6
  password: ''
7
+ timeout: 5000
8
+ connect_timeout: 1
9
+ read_timeout: 1
10
+ write_timeout: 2
6
11
 
7
12
  makara:
8
13
  blacklist_duration: 2
@@ -1,5 +1,4 @@
1
1
  module PoolExtensions
2
-
3
2
  def connections
4
3
  @connections
5
4
  end
@@ -7,8 +6,6 @@ module PoolExtensions
7
6
  def connection_count
8
7
  @connections.length
9
8
  end
10
-
11
9
  end
12
10
 
13
-
14
11
  Makara::Pool.send(:include, PoolExtensions)
@@ -4,6 +4,8 @@ test:
4
4
  username: 'root'
5
5
  password: ''
6
6
 
7
+ timeout: 5000
8
+
7
9
  makara:
8
10
  blacklist_duration: 2
9
11
  master_ttl: 5
@@ -1,8 +1,11 @@
1
+ conn = ActiveRecord::Base.connection
1
2
 
2
- ActiveRecord::Schema.define(:version => 20160518161227) do
3
- execute "create extension if not exists postgis"
3
+ conn.execute "create extension if not exists postgis"
4
4
 
5
- create_table "towns", :force => true do |t|
5
+ if conn.table_exists? "towns"
6
+ conn.execute("TRUNCATE TABLE towns")
7
+ else
8
+ conn.create_table "towns", force: true do |t|
6
9
  t.st_point "location"
7
10
  end
8
11
  end
@@ -1,8 +1,8 @@
1
1
  test:
2
2
  adapter: 'postgresql_makara'
3
3
  database: 'makara_test'
4
- username: 'root'
5
- password: ''
4
+
5
+ timeout: 5000
6
6
 
7
7
  makara:
8
8
  blacklist_duration: 2
@@ -1,7 +1,6 @@
1
1
  module ProxyExtensions
2
+ attr_reader :master_pool, :slave_pool, :id
2
3
 
3
- attr_reader :master_pool, :slave_pool, :master_context, :id
4
-
5
4
  def master_for?(sql)
6
5
  pool_for(sql) == master_pool
7
6
  end
@@ -27,7 +26,6 @@ module ProxyExtensions
27
26
  def sticky=(s)
28
27
  @sticky = s
29
28
  end
30
-
31
29
  end
32
30
 
33
31
  Makara::Proxy.send(:include, ProxyExtensions)
@@ -1,9 +1,9 @@
1
- ActiveRecord::Schema.define(:version => 20130628161227) do
1
+ conn = ActiveRecord::Base.connection
2
2
 
3
- drop_table "users" if table_exists? "users"
4
-
5
- create_table "users" do |t|
6
- t.string "name"
3
+ if conn.table_exists? "users"
4
+ conn.execute("TRUNCATE TABLE users")
5
+ else
6
+ conn.create_table "users" do |t|
7
+ t.string "name"
7
8
  end
8
-
9
9
  end
@@ -0,0 +1,4 @@
1
+ module Test
2
+ class User < ::ActiveRecord::Base
3
+ end
4
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: makara
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.9
4
+ version: 0.5.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mike Nelson
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-08-14 00:00:00.000000000 Z
11
+ date: 2021-06-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -16,14 +16,154 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 3.0.0
19
+ version: 5.2.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: 3.0.0
26
+ version: 5.2.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: rack
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '13.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '13.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '3.9'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '3.9'
69
+ - !ruby/object:Gem::Dependency
70
+ name: timecop
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rubocop
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: 1.9.1
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: 1.9.1
97
+ - !ruby/object:Gem::Dependency
98
+ name: activerecord-postgis-adapter
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: pry-byebug
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: mysql2
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: pg
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: rgeo
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
27
167
  description: Read-write split your DB yo
28
168
  email:
29
169
  - mike@mikeonrails.com
@@ -31,24 +171,23 @@ executables: []
31
171
  extensions: []
32
172
  extra_rdoc_files: []
33
173
  files:
174
+ - ".github/dependabot.yml"
175
+ - ".github/workflows/CI.yml"
176
+ - ".github/workflows/gem-publish-public.yml"
34
177
  - ".gitignore"
35
178
  - ".rspec"
179
+ - ".rubocop.yml"
180
+ - ".rubocop_todo.yml"
36
181
  - ".ruby-gemset"
37
- - ".travis.yml"
38
182
  - CHANGELOG.md
39
183
  - Gemfile
40
184
  - LICENSE.txt
41
185
  - README.md
42
186
  - Rakefile
43
- - gemfiles/ar-head.gemfile
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
- - gemfiles/ar50.gemfile
51
- - gemfiles/ar51.gemfile
187
+ - gemfiles/activerecord_5.2.gemfile
188
+ - gemfiles/activerecord_6.0.gemfile
189
+ - gemfiles/activerecord_6.1.gemfile
190
+ - gemfiles/activerecord_head.gemfile
52
191
  - lib/active_record/connection_adapters/jdbcmysql_makara_adapter.rb
53
192
  - lib/active_record/connection_adapters/jdbcpostgresql_makara_adapter.rb
54
193
  - lib/active_record/connection_adapters/makara_abstract_adapter.rb
@@ -61,14 +200,15 @@ files:
61
200
  - lib/active_record/connection_adapters/postgresql_makara_adapter.rb
62
201
  - lib/makara.rb
63
202
  - lib/makara/cache.rb
64
- - lib/makara/cache/memory_store.rb
65
- - lib/makara/cache/noop_store.rb
66
203
  - lib/makara/config_parser.rb
67
204
  - lib/makara/connection_wrapper.rb
68
205
  - lib/makara/context.rb
206
+ - lib/makara/cookie.rb
69
207
  - lib/makara/error_handler.rb
70
208
  - lib/makara/errors/all_connections_blacklisted.rb
71
209
  - lib/makara/errors/blacklist_connection.rb
210
+ - lib/makara/errors/blacklisted_while_in_transaction.rb
211
+ - lib/makara/errors/invalid_shard.rb
72
212
  - lib/makara/errors/makara_error.rb
73
213
  - lib/makara/errors/no_connections_available.rb
74
214
  - lib/makara/logging/logger.rb
@@ -80,6 +220,7 @@ files:
80
220
  - lib/makara/strategies/abstract.rb
81
221
  - lib/makara/strategies/priority_failover.rb
82
222
  - lib/makara/strategies/round_robin.rb
223
+ - lib/makara/strategies/shard_aware.rb
83
224
  - lib/makara/version.rb
84
225
  - makara.gemspec
85
226
  - spec/active_record/connection_adapters/makara_abstract_adapter_error_handling_spec.rb
@@ -91,12 +232,14 @@ files:
91
232
  - spec/config_parser_spec.rb
92
233
  - spec/connection_wrapper_spec.rb
93
234
  - spec/context_spec.rb
235
+ - spec/cookie_spec.rb
94
236
  - spec/middleware_spec.rb
95
237
  - spec/pool_spec.rb
96
238
  - spec/proxy_spec.rb
97
239
  - spec/spec_helper.rb
98
240
  - spec/strategies/priority_failover_spec.rb
99
241
  - spec/strategies/round_robin_spec.rb
242
+ - spec/strategies/shard_aware_spec.rb
100
243
  - spec/support/deep_dup.rb
101
244
  - spec/support/helpers.rb
102
245
  - spec/support/mock_objects.rb
@@ -108,9 +251,12 @@ files:
108
251
  - spec/support/postgresql_database.yml
109
252
  - spec/support/proxy_extensions.rb
110
253
  - spec/support/schema.rb
111
- homepage: ''
112
- licenses: []
113
- metadata: {}
254
+ - spec/support/user.rb
255
+ homepage: https://github.com/instacart/makara
256
+ licenses:
257
+ - MIT
258
+ metadata:
259
+ source_code_uri: https://github.com/instacart/makara
114
260
  post_install_message:
115
261
  rdoc_options: []
116
262
  require_paths:
@@ -119,15 +265,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
119
265
  requirements:
120
266
  - - ">="
121
267
  - !ruby/object:Gem::Version
122
- version: '0'
268
+ version: 2.5.0
123
269
  required_rubygems_version: !ruby/object:Gem::Requirement
124
270
  requirements:
125
271
  - - ">="
126
272
  - !ruby/object:Gem::Version
127
273
  version: '0'
128
274
  requirements: []
129
- rubyforge_project:
130
- rubygems_version: 2.5.2
275
+ rubygems_version: 3.2.15
131
276
  signing_key:
132
277
  specification_version: 4
133
278
  summary: Read-write split your DB yo
@@ -141,12 +286,14 @@ test_files:
141
286
  - spec/config_parser_spec.rb
142
287
  - spec/connection_wrapper_spec.rb
143
288
  - spec/context_spec.rb
289
+ - spec/cookie_spec.rb
144
290
  - spec/middleware_spec.rb
145
291
  - spec/pool_spec.rb
146
292
  - spec/proxy_spec.rb
147
293
  - spec/spec_helper.rb
148
294
  - spec/strategies/priority_failover_spec.rb
149
295
  - spec/strategies/round_robin_spec.rb
296
+ - spec/strategies/shard_aware_spec.rb
150
297
  - spec/support/deep_dup.rb
151
298
  - spec/support/helpers.rb
152
299
  - spec/support/mock_objects.rb
@@ -158,3 +305,4 @@ test_files:
158
305
  - spec/support/postgresql_database.yml
159
306
  - spec/support/proxy_extensions.rb
160
307
  - spec/support/schema.rb
308
+ - spec/support/user.rb