lhm-shopify 3.4.2 → 3.5.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (68) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/test.yml +24 -15
  3. data/.gitignore +1 -6
  4. data/Appraisals +24 -0
  5. data/CHANGELOG.md +15 -0
  6. data/Gemfile.lock +66 -0
  7. data/README.md +53 -4
  8. data/Rakefile +10 -0
  9. data/dev.yml +28 -6
  10. data/docker-compose.yml +58 -0
  11. data/gemfiles/activerecord_5.2.gemfile +9 -0
  12. data/gemfiles/activerecord_5.2.gemfile.lock +65 -0
  13. data/gemfiles/activerecord_6.0.gemfile +7 -0
  14. data/gemfiles/activerecord_6.0.gemfile.lock +67 -0
  15. data/gemfiles/activerecord_6.1.gemfile +7 -0
  16. data/gemfiles/activerecord_6.1.gemfile.lock +66 -0
  17. data/gemfiles/activerecord_7.0.0.alpha2.gemfile +7 -0
  18. data/gemfiles/activerecord_7.0.0.alpha2.gemfile.lock +64 -0
  19. data/lhm.gemspec +7 -3
  20. data/lib/lhm/atomic_switcher.rb +4 -11
  21. data/lib/lhm/chunk_insert.rb +4 -10
  22. data/lib/lhm/chunker.rb +7 -8
  23. data/lib/lhm/cleanup/current.rb +3 -10
  24. data/lib/lhm/connection.rb +109 -0
  25. data/lib/lhm/entangler.rb +4 -12
  26. data/lib/lhm/invoker.rb +3 -3
  27. data/lib/lhm/proxysql_helper.rb +10 -0
  28. data/lib/lhm/sql_retry.rb +132 -9
  29. data/lib/lhm/throttler/slave_lag.rb +19 -2
  30. data/lib/lhm/version.rb +1 -1
  31. data/lib/lhm.rb +25 -9
  32. data/scripts/helpers/wait-for-dbs.sh +21 -0
  33. data/scripts/mysql/reader/create_replication.sql +10 -0
  34. data/scripts/mysql/writer/create_test_db.sql +1 -0
  35. data/scripts/mysql/writer/create_users.sql +6 -0
  36. data/scripts/proxysql/proxysql.cnf +117 -0
  37. data/spec/integration/atomic_switcher_spec.rb +38 -13
  38. data/spec/integration/chunk_insert_spec.rb +2 -1
  39. data/spec/integration/chunker_spec.rb +1 -1
  40. data/spec/integration/database.yml +25 -0
  41. data/spec/integration/entangler_spec.rb +3 -1
  42. data/spec/integration/integration_helper.rb +24 -9
  43. data/spec/integration/lhm_spec.rb +75 -0
  44. data/spec/integration/proxysql_spec.rb +34 -0
  45. data/spec/integration/sql_retry/db_connection_helper.rb +52 -0
  46. data/spec/integration/sql_retry/lock_wait_spec.rb +8 -6
  47. data/spec/integration/sql_retry/lock_wait_timeout_test_helper.rb +17 -4
  48. data/spec/integration/sql_retry/proxysql_helper.rb +22 -0
  49. data/spec/integration/sql_retry/retry_with_proxysql_spec.rb +108 -0
  50. data/spec/integration/toxiproxy_helper.rb +40 -0
  51. data/spec/test_helper.rb +21 -0
  52. data/spec/unit/chunk_insert_spec.rb +7 -2
  53. data/spec/unit/chunker_spec.rb +46 -42
  54. data/spec/unit/connection_spec.rb +86 -0
  55. data/spec/unit/entangler_spec.rb +51 -10
  56. data/spec/unit/lhm_spec.rb +17 -0
  57. data/spec/unit/throttler/slave_lag_spec.rb +13 -8
  58. metadata +85 -14
  59. data/bin/.gitkeep +0 -0
  60. data/dbdeployer/config.json +0 -32
  61. data/dbdeployer/install.sh +0 -64
  62. data/gemfiles/ar-2.3_mysql.gemfile +0 -6
  63. data/gemfiles/ar-3.2_mysql.gemfile +0 -5
  64. data/gemfiles/ar-3.2_mysql2.gemfile +0 -5
  65. data/gemfiles/ar-4.0_mysql2.gemfile +0 -5
  66. data/gemfiles/ar-4.1_mysql2.gemfile +0 -5
  67. data/gemfiles/ar-4.2_mysql2.gemfile +0 -5
  68. data/gemfiles/ar-5.0_mysql2.gemfile +0 -5
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lhm-shopify
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.4.2
4
+ version: 3.5.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - SoundCloud
@@ -12,7 +12,7 @@ authors:
12
12
  autorequire:
13
13
  bindir: bin
14
14
  cert_chain: []
15
- date: 2021-09-28 00:00:00.000000000 Z
15
+ date: 2021-12-08 00:00:00.000000000 Z
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
18
18
  name: retriable
@@ -28,6 +28,20 @@ dependencies:
28
28
  - - ">="
29
29
  - !ruby/object:Gem::Version
30
30
  version: 3.0.0
31
+ - !ruby/object:Gem::Dependency
32
+ name: activerecord
33
+ requirement: !ruby/object:Gem::Requirement
34
+ requirements:
35
+ - - ">="
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ requirements:
42
+ - - ">="
43
+ - !ruby/object:Gem::Version
44
+ version: '0'
31
45
  - !ruby/object:Gem::Dependency
32
46
  name: minitest
33
47
  requirement: !ruby/object:Gem::Requirement
@@ -57,7 +71,7 @@ dependencies:
57
71
  - !ruby/object:Gem::Version
58
72
  version: '0'
59
73
  - !ruby/object:Gem::Dependency
60
- name: rake
74
+ name: after_do
61
75
  requirement: !ruby/object:Gem::Requirement
62
76
  requirements:
63
77
  - - ">="
@@ -71,7 +85,7 @@ dependencies:
71
85
  - !ruby/object:Gem::Version
72
86
  version: '0'
73
87
  - !ruby/object:Gem::Dependency
74
- name: activerecord
88
+ name: rake
75
89
  requirement: !ruby/object:Gem::Requirement
76
90
  requirements:
77
91
  - - ">="
@@ -112,6 +126,48 @@ dependencies:
112
126
  - - ">="
113
127
  - !ruby/object:Gem::Version
114
128
  version: '0'
129
+ - !ruby/object:Gem::Dependency
130
+ name: toxiproxy
131
+ requirement: !ruby/object:Gem::Requirement
132
+ requirements:
133
+ - - ">="
134
+ - !ruby/object:Gem::Version
135
+ version: '0'
136
+ type: :development
137
+ prerelease: false
138
+ version_requirements: !ruby/object:Gem::Requirement
139
+ requirements:
140
+ - - ">="
141
+ - !ruby/object:Gem::Version
142
+ version: '0'
143
+ - !ruby/object:Gem::Dependency
144
+ name: appraisal
145
+ requirement: !ruby/object:Gem::Requirement
146
+ requirements:
147
+ - - ">="
148
+ - !ruby/object:Gem::Version
149
+ version: '0'
150
+ type: :development
151
+ prerelease: false
152
+ version_requirements: !ruby/object:Gem::Requirement
153
+ requirements:
154
+ - - ">="
155
+ - !ruby/object:Gem::Version
156
+ version: '0'
157
+ - !ruby/object:Gem::Dependency
158
+ name: byebug
159
+ requirement: !ruby/object:Gem::Requirement
160
+ requirements:
161
+ - - ">="
162
+ - !ruby/object:Gem::Version
163
+ version: '0'
164
+ type: :development
165
+ prerelease: false
166
+ version_requirements: !ruby/object:Gem::Requirement
167
+ requirements:
168
+ - - ">="
169
+ - !ruby/object:Gem::Version
170
+ version: '0'
115
171
  description: Migrate large tables without downtime by copying to a temporary table
116
172
  in chunks. The old table is not dropped. Instead, it is moved to timestamp_table_name
117
173
  for verification.
@@ -124,22 +180,23 @@ files:
124
180
  - ".gitignore"
125
181
  - ".rubocop.yml"
126
182
  - ".travis.yml"
183
+ - Appraisals
127
184
  - CHANGELOG.md
128
185
  - Gemfile
186
+ - Gemfile.lock
129
187
  - LICENSE
130
188
  - README.md
131
189
  - Rakefile
132
- - bin/.gitkeep
133
- - dbdeployer/config.json
134
- - dbdeployer/install.sh
135
190
  - dev.yml
136
- - gemfiles/ar-2.3_mysql.gemfile
137
- - gemfiles/ar-3.2_mysql.gemfile
138
- - gemfiles/ar-3.2_mysql2.gemfile
139
- - gemfiles/ar-4.0_mysql2.gemfile
140
- - gemfiles/ar-4.1_mysql2.gemfile
141
- - gemfiles/ar-4.2_mysql2.gemfile
142
- - gemfiles/ar-5.0_mysql2.gemfile
191
+ - docker-compose.yml
192
+ - gemfiles/activerecord_5.2.gemfile
193
+ - gemfiles/activerecord_5.2.gemfile.lock
194
+ - gemfiles/activerecord_6.0.gemfile
195
+ - gemfiles/activerecord_6.0.gemfile.lock
196
+ - gemfiles/activerecord_6.1.gemfile
197
+ - gemfiles/activerecord_6.1.gemfile.lock
198
+ - gemfiles/activerecord_7.0.0.alpha2.gemfile
199
+ - gemfiles/activerecord_7.0.0.alpha2.gemfile.lock
143
200
  - lhm.gemspec
144
201
  - lib/lhm-shopify.rb
145
202
  - lib/lhm.rb
@@ -149,6 +206,7 @@ files:
149
206
  - lib/lhm/chunker.rb
150
207
  - lib/lhm/cleanup/current.rb
151
208
  - lib/lhm/command.rb
209
+ - lib/lhm/connection.rb
152
210
  - lib/lhm/entangler.rb
153
211
  - lib/lhm/intersection.rb
154
212
  - lib/lhm/invoker.rb
@@ -156,6 +214,7 @@ files:
156
214
  - lib/lhm/migration.rb
157
215
  - lib/lhm/migrator.rb
158
216
  - lib/lhm/printer.rb
217
+ - lib/lhm/proxysql_helper.rb
159
218
  - lib/lhm/railtie.rb
160
219
  - lib/lhm/sql_helper.rb
161
220
  - lib/lhm/sql_retry.rb
@@ -168,6 +227,11 @@ files:
168
227
  - lib/lhm/throttler/time.rb
169
228
  - lib/lhm/timestamp.rb
170
229
  - lib/lhm/version.rb
230
+ - scripts/helpers/wait-for-dbs.sh
231
+ - scripts/mysql/reader/create_replication.sql
232
+ - scripts/mysql/writer/create_test_db.sql
233
+ - scripts/mysql/writer/create_users.sql
234
+ - scripts/proxysql/proxysql.cnf
171
235
  - shipit.rubygems.yml
172
236
  - spec/.lhm.example
173
237
  - spec/README.md
@@ -188,20 +252,27 @@ files:
188
252
  - spec/integration/chunk_insert_spec.rb
189
253
  - spec/integration/chunker_spec.rb
190
254
  - spec/integration/cleanup_spec.rb
255
+ - spec/integration/database.yml
191
256
  - spec/integration/entangler_spec.rb
192
257
  - spec/integration/integration_helper.rb
193
258
  - spec/integration/invoker_spec.rb
194
259
  - spec/integration/lhm_spec.rb
195
260
  - spec/integration/lock_wait_timeout_spec.rb
196
261
  - spec/integration/locked_switcher_spec.rb
262
+ - spec/integration/proxysql_spec.rb
263
+ - spec/integration/sql_retry/db_connection_helper.rb
197
264
  - spec/integration/sql_retry/lock_wait_spec.rb
198
265
  - spec/integration/sql_retry/lock_wait_timeout_test_helper.rb
266
+ - spec/integration/sql_retry/proxysql_helper.rb
267
+ - spec/integration/sql_retry/retry_with_proxysql_spec.rb
199
268
  - spec/integration/table_spec.rb
269
+ - spec/integration/toxiproxy_helper.rb
200
270
  - spec/test_helper.rb
201
271
  - spec/unit/atomic_switcher_spec.rb
202
272
  - spec/unit/chunk_finder_spec.rb
203
273
  - spec/unit/chunk_insert_spec.rb
204
274
  - spec/unit/chunker_spec.rb
275
+ - spec/unit/connection_spec.rb
205
276
  - spec/unit/entangler_spec.rb
206
277
  - spec/unit/intersection_spec.rb
207
278
  - spec/unit/lhm_spec.rb
data/bin/.gitkeep DELETED
File without changes
@@ -1,32 +0,0 @@
1
- {
2
- "version": "1.8.0",
3
- "sandbox-home": "./dbdeployer/sandboxes",
4
- "sandbox-binary": "./dbdeployer/binaries",
5
- "use-sandbox-catalog": true,
6
- "master-slave-base-port": 11000,
7
- "group-replication-base-port": 12000,
8
- "group-replication-sp-base-port": 13000,
9
- "fan-in-replication-base-port": 14000,
10
- "all-masters-replication-base-port": 15000,
11
- "multiple-base-port": 16000,
12
- "group-port-delta": 125,
13
- "mysqlx-port-delta": 10000,
14
- "master-name": "master",
15
- "master-abbr": "m",
16
- "node-prefix": "node",
17
- "slave-prefix": "slave",
18
- "slave-abbr": "s",
19
- "sandbox-prefix": "msb_",
20
- "master-slave-prefix": "rsandbox_",
21
- "group-prefix": "group_msb_",
22
- "group-sp-prefix": "group_sp_msb_",
23
- "multiple-prefix": "multi_msb_",
24
- "fan-in-prefix": "fan_in_msb_",
25
- "all-masters-prefix": "all_masters_msb_",
26
- "reserved-ports": [
27
- 1186,
28
- 3306,
29
- 33060
30
- ],
31
- "timestamp": "Mon Jul 16 17:36:55 AST 2018"
32
- }
@@ -1,64 +0,0 @@
1
- set -e
2
- mkdir -p ./dbdeployer/sandboxes
3
- mkdir -p ./dbdeployer/binaries
4
-
5
- if [ -z "$(uname | grep Darwin)" ]; then
6
- OS=linux
7
- set -x
8
- else
9
- OS=osx
10
- fi
11
-
12
- echo "Checking if dbdeployer is installed"
13
- if ! [ -x "$(command -v ./bin/dbdeployer)" ]; then
14
- echo "Not installed...starting install"
15
- VERSION=1.56.0
16
- origin=https://github.com/datacharmer/dbdeployer/releases/download/v$VERSION
17
- filename=dbdeployer-$VERSION.$OS
18
- wget -q $origin/$filename.tar.gz
19
- tar -xzf $filename.tar.gz
20
- chmod +x $filename
21
- sudo mv $filename ./bin/dbdeployer
22
- rm $filename.tar.gz
23
- else
24
- echo "Installation found!"
25
- fi
26
-
27
-
28
- echo "Checking if mysql 5.7.22 is available for dbdeployer"
29
- if [ -z "$(./bin/dbdeployer --config ./dbdeployer/config.json --sandbox-binary "./dbdeployer/binaries" available | grep 5.7.22)" ]; then
30
- echo "Not found..."
31
-
32
- if [ "$OS" = "linux" ]; then
33
- MYSQL_FILE=mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz
34
- else
35
- MYSQL_FILE=mysql-5.7.22-macos10.13-x86_64.tar.gz
36
- fi
37
-
38
- if [ ! -f $MYSQL_FILE ]; then
39
- echo "Downloading $MYSQL_FILE...(this may take a while)"
40
- wget -q "https://dev.mysql.com/get/Downloads/MySQL-5.7/$MYSQL_FILE"
41
- fi
42
-
43
- echo "Setting up..."
44
- ./bin/dbdeployer unpack $MYSQL_FILE --verbosity 0 --config ./dbdeployer/config.json --sandbox-binary "./dbdeployer/binaries"
45
- rm $MYSQL_FILE
46
- else
47
- echo "mysql 5.7.22 found!"
48
- fi
49
-
50
- echo "Forcing new replication setup..."
51
- ./bin/dbdeployer deploy replication 5.7.22 --nodes 2 --force --config ./dbdeployer/config.json --sandbox-binary "./dbdeployer/binaries" --sandbox-home "./dbdeployer/sandboxes"
52
- ./bin/dbdeployer global status --config ./dbdeployer/config.json --sandbox-binary "./dbdeployer/binaries" --sandbox-home "./dbdeployer/sandboxes"
53
-
54
- echo "Setting up database.yml"
55
- DATABASE_YML=spec/integration/database.yml
56
- echo "master:" > $DATABASE_YML
57
- cat ./dbdeployer/sandboxes/rsandbox_5_7_22/master/my.sandbox.cnf | grep -A 4 client | tail -n 4 | sed -e 's/ * = /: /' -e 's/^/ /' >> $DATABASE_YML
58
-
59
- echo "slave:" >> $DATABASE_YML
60
- cat ./dbdeployer/sandboxes/rsandbox_5_7_22/node1/my.sandbox.cnf | grep -A 4 client | tail -n 4 | sed -e 's/ * = /: /' -e 's/^/ /' >> $DATABASE_YML
61
-
62
- cat $DATABASE_YML
63
-
64
- echo "You are ready to run the integration test suite..."
@@ -1,6 +0,0 @@
1
- source "https://rubygems.org"
2
-
3
- gem "mysql", "~> 2.8.1"
4
- gem "activerecord", "~> 2.3.18"
5
- gem "iconv", "~> 1.0.4"
6
- gemspec :path=>"../"
@@ -1,5 +0,0 @@
1
- source "https://rubygems.org"
2
-
3
- gem "mysql", "~> 2.8.1"
4
- gem "activerecord", "~> 3.2.2"
5
- gemspec :path=>"../"
@@ -1,5 +0,0 @@
1
- source "https://rubygems.org"
2
-
3
- gem "mysql2", "~> 0.3.11"
4
- gem "activerecord", "~> 3.2.2"
5
- gemspec :path=>"../"
@@ -1,5 +0,0 @@
1
- source "https://rubygems.org"
2
-
3
- gem "mysql2", "~> 0.3.17"
4
- gem "activerecord", "~> 4.0.13"
5
- gemspec :path=>"../"
@@ -1,5 +0,0 @@
1
- source "https://rubygems.org"
2
-
3
- gem "mysql2", "~> 0.3.17"
4
- gem "activerecord", "~> 4.1.9"
5
- gemspec :path=>"../"
@@ -1,5 +0,0 @@
1
- source "https://rubygems.org"
2
-
3
- gem "mysql2", "~> 0.3.17"
4
- gem "activerecord", "~> 4.2.0"
5
- gemspec :path=>"../"
@@ -1,5 +0,0 @@
1
- source "https://rubygems.org"
2
-
3
- gem "mysql2", "~> 0.4.5"
4
- gem "activerecord", "~> 5.0.2"
5
- gemspec :path=>"../"