lhm-teak 3.6.0

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.
Files changed (112) hide show
  1. checksums.yaml +7 -0
  2. data/.github/workflows/test.yml +43 -0
  3. data/.gitignore +12 -0
  4. data/.rubocop.yml +183 -0
  5. data/.travis.yml +21 -0
  6. data/Appraisals +24 -0
  7. data/CHANGELOG.md +254 -0
  8. data/Gemfile +5 -0
  9. data/Gemfile.lock +67 -0
  10. data/LICENSE +27 -0
  11. data/README.md +335 -0
  12. data/Rakefile +33 -0
  13. data/dev.yml +45 -0
  14. data/docker-compose.yml +60 -0
  15. data/gemfiles/activerecord_5.2.gemfile +9 -0
  16. data/gemfiles/activerecord_5.2.gemfile.lock +66 -0
  17. data/gemfiles/activerecord_6.0.gemfile +7 -0
  18. data/gemfiles/activerecord_6.0.gemfile.lock +68 -0
  19. data/gemfiles/activerecord_6.1.gemfile +7 -0
  20. data/gemfiles/activerecord_6.1.gemfile.lock +67 -0
  21. data/gemfiles/activerecord_7.0.0.alpha2.gemfile +7 -0
  22. data/gemfiles/activerecord_7.0.0.alpha2.gemfile.lock +65 -0
  23. data/lhm.gemspec +38 -0
  24. data/lib/lhm/atomic_switcher.rb +46 -0
  25. data/lib/lhm/chunk_finder.rb +62 -0
  26. data/lib/lhm/chunk_insert.rb +61 -0
  27. data/lib/lhm/chunker.rb +95 -0
  28. data/lib/lhm/cleanup/current.rb +71 -0
  29. data/lib/lhm/command.rb +48 -0
  30. data/lib/lhm/connection.rb +108 -0
  31. data/lib/lhm/entangler.rb +112 -0
  32. data/lib/lhm/intersection.rb +51 -0
  33. data/lib/lhm/invoker.rb +100 -0
  34. data/lib/lhm/locked_switcher.rb +76 -0
  35. data/lib/lhm/migration.rb +51 -0
  36. data/lib/lhm/migrator.rb +244 -0
  37. data/lib/lhm/printer.rb +63 -0
  38. data/lib/lhm/proxysql_helper.rb +10 -0
  39. data/lib/lhm/railtie.rb +9 -0
  40. data/lib/lhm/sql_helper.rb +77 -0
  41. data/lib/lhm/sql_retry.rb +180 -0
  42. data/lib/lhm/table.rb +121 -0
  43. data/lib/lhm/table_name.rb +23 -0
  44. data/lib/lhm/test_support.rb +35 -0
  45. data/lib/lhm/throttler/slave_lag.rb +162 -0
  46. data/lib/lhm/throttler/threads_running.rb +53 -0
  47. data/lib/lhm/throttler/time.rb +29 -0
  48. data/lib/lhm/throttler.rb +36 -0
  49. data/lib/lhm/timestamp.rb +11 -0
  50. data/lib/lhm/version.rb +6 -0
  51. data/lib/lhm-shopify.rb +1 -0
  52. data/lib/lhm.rb +156 -0
  53. data/scripts/helpers/wait-for-dbs.sh +21 -0
  54. data/scripts/mysql/reader/create_replication.sql +10 -0
  55. data/scripts/mysql/writer/create_test_db.sql +1 -0
  56. data/scripts/mysql/writer/create_users.sql +6 -0
  57. data/scripts/proxysql/proxysql.cnf +117 -0
  58. data/shipit.rubygems.yml +0 -0
  59. data/spec/.lhm.example +4 -0
  60. data/spec/README.md +58 -0
  61. data/spec/fixtures/bigint_table.ddl +4 -0
  62. data/spec/fixtures/composite_primary_key.ddl +6 -0
  63. data/spec/fixtures/composite_primary_key_dest.ddl +6 -0
  64. data/spec/fixtures/custom_primary_key.ddl +6 -0
  65. data/spec/fixtures/custom_primary_key_dest.ddl +6 -0
  66. data/spec/fixtures/destination.ddl +6 -0
  67. data/spec/fixtures/lines.ddl +7 -0
  68. data/spec/fixtures/origin.ddl +6 -0
  69. data/spec/fixtures/permissions.ddl +5 -0
  70. data/spec/fixtures/small_table.ddl +4 -0
  71. data/spec/fixtures/tracks.ddl +5 -0
  72. data/spec/fixtures/users.ddl +14 -0
  73. data/spec/fixtures/wo_id_int_column.ddl +6 -0
  74. data/spec/integration/atomic_switcher_spec.rb +129 -0
  75. data/spec/integration/chunk_insert_spec.rb +30 -0
  76. data/spec/integration/chunker_spec.rb +269 -0
  77. data/spec/integration/cleanup_spec.rb +147 -0
  78. data/spec/integration/database.yml +25 -0
  79. data/spec/integration/entangler_spec.rb +68 -0
  80. data/spec/integration/integration_helper.rb +252 -0
  81. data/spec/integration/invoker_spec.rb +33 -0
  82. data/spec/integration/lhm_spec.rb +659 -0
  83. data/spec/integration/lock_wait_timeout_spec.rb +30 -0
  84. data/spec/integration/locked_switcher_spec.rb +50 -0
  85. data/spec/integration/proxysql_spec.rb +34 -0
  86. data/spec/integration/sql_retry/db_connection_helper.rb +52 -0
  87. data/spec/integration/sql_retry/lock_wait_spec.rb +127 -0
  88. data/spec/integration/sql_retry/lock_wait_timeout_test_helper.rb +114 -0
  89. data/spec/integration/sql_retry/proxysql_helper.rb +22 -0
  90. data/spec/integration/sql_retry/retry_with_proxysql_spec.rb +109 -0
  91. data/spec/integration/table_spec.rb +83 -0
  92. data/spec/integration/toxiproxy_helper.rb +40 -0
  93. data/spec/test_helper.rb +69 -0
  94. data/spec/unit/atomic_switcher_spec.rb +29 -0
  95. data/spec/unit/chunk_finder_spec.rb +73 -0
  96. data/spec/unit/chunk_insert_spec.rb +67 -0
  97. data/spec/unit/chunker_spec.rb +176 -0
  98. data/spec/unit/connection_spec.rb +111 -0
  99. data/spec/unit/entangler_spec.rb +187 -0
  100. data/spec/unit/intersection_spec.rb +51 -0
  101. data/spec/unit/lhm_spec.rb +46 -0
  102. data/spec/unit/locked_switcher_spec.rb +46 -0
  103. data/spec/unit/migrator_spec.rb +144 -0
  104. data/spec/unit/printer_spec.rb +85 -0
  105. data/spec/unit/sql_helper_spec.rb +28 -0
  106. data/spec/unit/table_name_spec.rb +39 -0
  107. data/spec/unit/table_spec.rb +47 -0
  108. data/spec/unit/throttler/slave_lag_spec.rb +322 -0
  109. data/spec/unit/throttler/threads_running_spec.rb +64 -0
  110. data/spec/unit/throttler_spec.rb +124 -0
  111. data/spec/unit/unit_helper.rb +26 -0
  112. metadata +366 -0
metadata ADDED
@@ -0,0 +1,366 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: lhm-teak
3
+ version: !ruby/object:Gem::Version
4
+ version: 3.6.0
5
+ platform: ruby
6
+ authors:
7
+ - SoundCloud
8
+ - Shopify
9
+ - Rany Keddo
10
+ - Tobias Bielohlawek
11
+ - Tobias Schmidt
12
+ - Teak.io
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+ date: 2023-06-06 00:00:00.000000000 Z
17
+ dependencies:
18
+ - !ruby/object:Gem::Dependency
19
+ name: retriable
20
+ requirement: !ruby/object:Gem::Requirement
21
+ requirements:
22
+ - - ">="
23
+ - !ruby/object:Gem::Version
24
+ version: 3.0.0
25
+ type: :runtime
26
+ prerelease: false
27
+ version_requirements: !ruby/object:Gem::Requirement
28
+ requirements:
29
+ - - ">="
30
+ - !ruby/object:Gem::Version
31
+ version: 3.0.0
32
+ - !ruby/object:Gem::Dependency
33
+ name: activerecord
34
+ requirement: !ruby/object:Gem::Requirement
35
+ requirements:
36
+ - - ">="
37
+ - !ruby/object:Gem::Version
38
+ version: '0'
39
+ type: :development
40
+ prerelease: false
41
+ version_requirements: !ruby/object:Gem::Requirement
42
+ requirements:
43
+ - - ">="
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: minitest
48
+ requirement: !ruby/object:Gem::Requirement
49
+ requirements:
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: '0'
53
+ type: :development
54
+ prerelease: false
55
+ version_requirements: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ version: '0'
60
+ - !ruby/object:Gem::Dependency
61
+ name: mocha
62
+ requirement: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - ">="
65
+ - !ruby/object:Gem::Version
66
+ version: '0'
67
+ type: :development
68
+ prerelease: false
69
+ version_requirements: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - ">="
72
+ - !ruby/object:Gem::Version
73
+ version: '0'
74
+ - !ruby/object:Gem::Dependency
75
+ name: after_do
76
+ requirement: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - ">="
79
+ - !ruby/object:Gem::Version
80
+ version: '0'
81
+ type: :development
82
+ prerelease: false
83
+ version_requirements: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - ">="
86
+ - !ruby/object:Gem::Version
87
+ version: '0'
88
+ - !ruby/object:Gem::Dependency
89
+ name: rake
90
+ requirement: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - ">="
93
+ - !ruby/object:Gem::Version
94
+ version: '0'
95
+ type: :development
96
+ prerelease: false
97
+ version_requirements: !ruby/object:Gem::Requirement
98
+ requirements:
99
+ - - ">="
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ - !ruby/object:Gem::Dependency
103
+ name: mysql2
104
+ requirement: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - ">="
107
+ - !ruby/object:Gem::Version
108
+ version: '0'
109
+ type: :development
110
+ prerelease: false
111
+ version_requirements: !ruby/object:Gem::Requirement
112
+ requirements:
113
+ - - ">="
114
+ - !ruby/object:Gem::Version
115
+ version: '0'
116
+ - !ruby/object:Gem::Dependency
117
+ name: simplecov
118
+ requirement: !ruby/object:Gem::Requirement
119
+ requirements:
120
+ - - ">="
121
+ - !ruby/object:Gem::Version
122
+ version: '0'
123
+ type: :development
124
+ prerelease: false
125
+ version_requirements: !ruby/object:Gem::Requirement
126
+ requirements:
127
+ - - ">="
128
+ - !ruby/object:Gem::Version
129
+ version: '0'
130
+ - !ruby/object:Gem::Dependency
131
+ name: toxiproxy
132
+ requirement: !ruby/object:Gem::Requirement
133
+ requirements:
134
+ - - ">="
135
+ - !ruby/object:Gem::Version
136
+ version: '0'
137
+ type: :development
138
+ prerelease: false
139
+ version_requirements: !ruby/object:Gem::Requirement
140
+ requirements:
141
+ - - ">="
142
+ - !ruby/object:Gem::Version
143
+ version: '0'
144
+ - !ruby/object:Gem::Dependency
145
+ name: appraisal
146
+ requirement: !ruby/object:Gem::Requirement
147
+ requirements:
148
+ - - ">="
149
+ - !ruby/object:Gem::Version
150
+ version: '0'
151
+ type: :development
152
+ prerelease: false
153
+ version_requirements: !ruby/object:Gem::Requirement
154
+ requirements:
155
+ - - ">="
156
+ - !ruby/object:Gem::Version
157
+ version: '0'
158
+ - !ruby/object:Gem::Dependency
159
+ name: byebug
160
+ requirement: !ruby/object:Gem::Requirement
161
+ requirements:
162
+ - - ">="
163
+ - !ruby/object:Gem::Version
164
+ version: '0'
165
+ type: :development
166
+ prerelease: false
167
+ version_requirements: !ruby/object:Gem::Requirement
168
+ requirements:
169
+ - - ">="
170
+ - !ruby/object:Gem::Version
171
+ version: '0'
172
+ description: Migrate large tables without downtime by copying to a temporary table
173
+ in chunks. The old table is not dropped. Instead, it is moved to timestamp_table_name
174
+ for verification.
175
+ email: team@teak.io
176
+ executables: []
177
+ extensions: []
178
+ extra_rdoc_files: []
179
+ files:
180
+ - ".github/workflows/test.yml"
181
+ - ".gitignore"
182
+ - ".rubocop.yml"
183
+ - ".travis.yml"
184
+ - Appraisals
185
+ - CHANGELOG.md
186
+ - Gemfile
187
+ - Gemfile.lock
188
+ - LICENSE
189
+ - README.md
190
+ - Rakefile
191
+ - dev.yml
192
+ - docker-compose.yml
193
+ - gemfiles/activerecord_5.2.gemfile
194
+ - gemfiles/activerecord_5.2.gemfile.lock
195
+ - gemfiles/activerecord_6.0.gemfile
196
+ - gemfiles/activerecord_6.0.gemfile.lock
197
+ - gemfiles/activerecord_6.1.gemfile
198
+ - gemfiles/activerecord_6.1.gemfile.lock
199
+ - gemfiles/activerecord_7.0.0.alpha2.gemfile
200
+ - gemfiles/activerecord_7.0.0.alpha2.gemfile.lock
201
+ - lhm.gemspec
202
+ - lib/lhm-shopify.rb
203
+ - lib/lhm.rb
204
+ - lib/lhm/atomic_switcher.rb
205
+ - lib/lhm/chunk_finder.rb
206
+ - lib/lhm/chunk_insert.rb
207
+ - lib/lhm/chunker.rb
208
+ - lib/lhm/cleanup/current.rb
209
+ - lib/lhm/command.rb
210
+ - lib/lhm/connection.rb
211
+ - lib/lhm/entangler.rb
212
+ - lib/lhm/intersection.rb
213
+ - lib/lhm/invoker.rb
214
+ - lib/lhm/locked_switcher.rb
215
+ - lib/lhm/migration.rb
216
+ - lib/lhm/migrator.rb
217
+ - lib/lhm/printer.rb
218
+ - lib/lhm/proxysql_helper.rb
219
+ - lib/lhm/railtie.rb
220
+ - lib/lhm/sql_helper.rb
221
+ - lib/lhm/sql_retry.rb
222
+ - lib/lhm/table.rb
223
+ - lib/lhm/table_name.rb
224
+ - lib/lhm/test_support.rb
225
+ - lib/lhm/throttler.rb
226
+ - lib/lhm/throttler/slave_lag.rb
227
+ - lib/lhm/throttler/threads_running.rb
228
+ - lib/lhm/throttler/time.rb
229
+ - lib/lhm/timestamp.rb
230
+ - lib/lhm/version.rb
231
+ - scripts/helpers/wait-for-dbs.sh
232
+ - scripts/mysql/reader/create_replication.sql
233
+ - scripts/mysql/writer/create_test_db.sql
234
+ - scripts/mysql/writer/create_users.sql
235
+ - scripts/proxysql/proxysql.cnf
236
+ - shipit.rubygems.yml
237
+ - spec/.lhm.example
238
+ - spec/README.md
239
+ - spec/fixtures/bigint_table.ddl
240
+ - spec/fixtures/composite_primary_key.ddl
241
+ - spec/fixtures/composite_primary_key_dest.ddl
242
+ - spec/fixtures/custom_primary_key.ddl
243
+ - spec/fixtures/custom_primary_key_dest.ddl
244
+ - spec/fixtures/destination.ddl
245
+ - spec/fixtures/lines.ddl
246
+ - spec/fixtures/origin.ddl
247
+ - spec/fixtures/permissions.ddl
248
+ - spec/fixtures/small_table.ddl
249
+ - spec/fixtures/tracks.ddl
250
+ - spec/fixtures/users.ddl
251
+ - spec/fixtures/wo_id_int_column.ddl
252
+ - spec/integration/atomic_switcher_spec.rb
253
+ - spec/integration/chunk_insert_spec.rb
254
+ - spec/integration/chunker_spec.rb
255
+ - spec/integration/cleanup_spec.rb
256
+ - spec/integration/database.yml
257
+ - spec/integration/entangler_spec.rb
258
+ - spec/integration/integration_helper.rb
259
+ - spec/integration/invoker_spec.rb
260
+ - spec/integration/lhm_spec.rb
261
+ - spec/integration/lock_wait_timeout_spec.rb
262
+ - spec/integration/locked_switcher_spec.rb
263
+ - spec/integration/proxysql_spec.rb
264
+ - spec/integration/sql_retry/db_connection_helper.rb
265
+ - spec/integration/sql_retry/lock_wait_spec.rb
266
+ - spec/integration/sql_retry/lock_wait_timeout_test_helper.rb
267
+ - spec/integration/sql_retry/proxysql_helper.rb
268
+ - spec/integration/sql_retry/retry_with_proxysql_spec.rb
269
+ - spec/integration/table_spec.rb
270
+ - spec/integration/toxiproxy_helper.rb
271
+ - spec/test_helper.rb
272
+ - spec/unit/atomic_switcher_spec.rb
273
+ - spec/unit/chunk_finder_spec.rb
274
+ - spec/unit/chunk_insert_spec.rb
275
+ - spec/unit/chunker_spec.rb
276
+ - spec/unit/connection_spec.rb
277
+ - spec/unit/entangler_spec.rb
278
+ - spec/unit/intersection_spec.rb
279
+ - spec/unit/lhm_spec.rb
280
+ - spec/unit/locked_switcher_spec.rb
281
+ - spec/unit/migrator_spec.rb
282
+ - spec/unit/printer_spec.rb
283
+ - spec/unit/sql_helper_spec.rb
284
+ - spec/unit/table_name_spec.rb
285
+ - spec/unit/table_spec.rb
286
+ - spec/unit/throttler/slave_lag_spec.rb
287
+ - spec/unit/throttler/threads_running_spec.rb
288
+ - spec/unit/throttler_spec.rb
289
+ - spec/unit/unit_helper.rb
290
+ homepage: http://github.com/GoCarrot/lhm
291
+ licenses:
292
+ - BSD-3-Clause
293
+ metadata:
294
+ allowed_push_host: https://rubygems.org
295
+ post_install_message:
296
+ rdoc_options: []
297
+ require_paths:
298
+ - lib
299
+ required_ruby_version: !ruby/object:Gem::Requirement
300
+ requirements:
301
+ - - ">="
302
+ - !ruby/object:Gem::Version
303
+ version: 2.3.0
304
+ required_rubygems_version: !ruby/object:Gem::Requirement
305
+ requirements:
306
+ - - ">="
307
+ - !ruby/object:Gem::Version
308
+ version: '0'
309
+ requirements: []
310
+ rubygems_version: 3.1.6
311
+ signing_key:
312
+ specification_version: 4
313
+ summary: online schema changer for mysql
314
+ test_files:
315
+ - spec/README.md
316
+ - spec/fixtures/bigint_table.ddl
317
+ - spec/fixtures/composite_primary_key.ddl
318
+ - spec/fixtures/composite_primary_key_dest.ddl
319
+ - spec/fixtures/custom_primary_key.ddl
320
+ - spec/fixtures/custom_primary_key_dest.ddl
321
+ - spec/fixtures/destination.ddl
322
+ - spec/fixtures/lines.ddl
323
+ - spec/fixtures/origin.ddl
324
+ - spec/fixtures/permissions.ddl
325
+ - spec/fixtures/small_table.ddl
326
+ - spec/fixtures/tracks.ddl
327
+ - spec/fixtures/users.ddl
328
+ - spec/fixtures/wo_id_int_column.ddl
329
+ - spec/integration/atomic_switcher_spec.rb
330
+ - spec/integration/chunk_insert_spec.rb
331
+ - spec/integration/chunker_spec.rb
332
+ - spec/integration/cleanup_spec.rb
333
+ - spec/integration/database.yml
334
+ - spec/integration/entangler_spec.rb
335
+ - spec/integration/integration_helper.rb
336
+ - spec/integration/invoker_spec.rb
337
+ - spec/integration/lhm_spec.rb
338
+ - spec/integration/lock_wait_timeout_spec.rb
339
+ - spec/integration/locked_switcher_spec.rb
340
+ - spec/integration/proxysql_spec.rb
341
+ - spec/integration/sql_retry/db_connection_helper.rb
342
+ - spec/integration/sql_retry/lock_wait_spec.rb
343
+ - spec/integration/sql_retry/lock_wait_timeout_test_helper.rb
344
+ - spec/integration/sql_retry/proxysql_helper.rb
345
+ - spec/integration/sql_retry/retry_with_proxysql_spec.rb
346
+ - spec/integration/table_spec.rb
347
+ - spec/integration/toxiproxy_helper.rb
348
+ - spec/test_helper.rb
349
+ - spec/unit/atomic_switcher_spec.rb
350
+ - spec/unit/chunk_finder_spec.rb
351
+ - spec/unit/chunk_insert_spec.rb
352
+ - spec/unit/chunker_spec.rb
353
+ - spec/unit/connection_spec.rb
354
+ - spec/unit/entangler_spec.rb
355
+ - spec/unit/intersection_spec.rb
356
+ - spec/unit/lhm_spec.rb
357
+ - spec/unit/locked_switcher_spec.rb
358
+ - spec/unit/migrator_spec.rb
359
+ - spec/unit/printer_spec.rb
360
+ - spec/unit/sql_helper_spec.rb
361
+ - spec/unit/table_name_spec.rb
362
+ - spec/unit/table_spec.rb
363
+ - spec/unit/throttler/slave_lag_spec.rb
364
+ - spec/unit/throttler/threads_running_spec.rb
365
+ - spec/unit/throttler_spec.rb
366
+ - spec/unit/unit_helper.rb