embulk-output-mysql 0.8.4 → 0.8.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5bd951816256b91bd4c8ea18655cb69cce02d800
4
- data.tar.gz: 7f85745159a29910334433785030c998318cefad
3
+ metadata.gz: 8a6b83378d49fc8b2a03de7296e7da18eab89050
4
+ data.tar.gz: 5e0d6bcb0fd421179ba89b6284883b87d7cd0e45
5
5
  SHA512:
6
- metadata.gz: 2defc0817f7e6bf4671131875e51e2c063c1295a4f31b8d1759ba6755888f7a190c448d13e5c1e651f63ba57078fc1b03d73676ffb39a940dcb21878337889b5
7
- data.tar.gz: 67b7e2158febcbb3d8c766d8726ddf8ec1f89a597ec64aa089c6d0511f58859c203ebf6ad5fc15373ea3c63746c020406e054e49a778c4d2a88d7598cd5f753c
6
+ metadata.gz: 6c84ec4e5a7acaa7173a54e0d339d5b38a70cc17d5692cd4a0452c21f186eb6d71c7476a13cbefeb6e03e0f8a60751a9d91bc87f8251fe9c2ee22a895600b65d
7
+ data.tar.gz: edf085322564c9f9592bc014889e145b72d2f28ccac8b5734bc062b9f826427b28e9934ca00a5b5b80f7d82cf8daf6c278e27ca578e486f8a50b388d8c5aedba
@@ -29,6 +29,11 @@ import com.google.common.io.Resources;
29
29
 
30
30
  public class RetryTest
31
31
  {
32
+ private static class Lock
33
+ {
34
+ public boolean enabled = true;
35
+ }
36
+
32
37
  private static final String BASIC_RESOURCE_PATH = "org/embulk/output/mysql/test/expect/retry/";
33
38
 
34
39
  private static ConfigSource loadYamlResource(TestingEmbulk embulk, String fileName)
@@ -151,7 +156,7 @@ public class RetryTest
151
156
  }
152
157
  }
153
158
 
154
- final Object lock = new Object();
159
+ final Lock lock = new Lock();
155
160
 
156
161
  Thread thread = new Thread() {
157
162
  @Override
@@ -164,16 +169,18 @@ public class RetryTest
164
169
  for (int i = 1000000; i < 1260000; i++) {
165
170
  statement.execute("insert into test1 values('B" + i + "', 0)");
166
171
  }
172
+ System.out.println("# Inserted many records.");
167
173
 
168
174
  synchronized (lock) {
169
175
  lock.notify();
176
+ lock.enabled = false;
170
177
  }
171
178
 
172
- System.out.println("##1");
173
-
179
+ System.out.println("# Insert 'A1249000'.");
174
180
  statement.execute("insert into test1 values('A1249010', 0)");
175
181
  Thread.sleep(5000);
176
182
  // deadlock will occur
183
+ System.out.println("# Insert 'A1249010'.");
177
184
  statement.execute("insert into test1 values('A1249000', 0)");
178
185
  conn.rollback();
179
186
  }
@@ -186,7 +193,175 @@ public class RetryTest
186
193
  thread.start();
187
194
 
188
195
  synchronized (lock) {
189
- lock.wait();
196
+ if (lock.enabled) {
197
+ lock.wait();
198
+ }
199
+ }
200
+
201
+ //Path in1 = toPath("test1_flushed_multiple_times.csv");
202
+ TestingEmbulk.RunResult result1 = embulk.runOutput(baseConfig.merge(loadYamlResource(embulk, "test1.yml")), in1);
203
+ assertThat(selectRecords(embulk, "test1"), is(expected1.toString()));
204
+ }
205
+
206
+ @Test
207
+ public void testRetry_MultipleTimes() throws Exception
208
+ {
209
+ Thread thread1 = new Thread() {
210
+ @Override
211
+ public void run() {
212
+ try {
213
+ try (Connection conn = MySQLTests.connect()) {
214
+ conn.setAutoCommit(false);
215
+ try (Statement statement = conn.createStatement()) {
216
+ // make the transaction larger so that embulk-output-mysql transaction will be rolled back at a deadlock.
217
+ for (int i = 100; i < 110; i++) {
218
+ statement.execute("insert into test1 values('B" + i + "', 0)");
219
+ }
220
+
221
+ statement.execute("insert into test1 values('A003', 0)");
222
+ Thread.sleep(3000);
223
+ // deadlock will occur
224
+ statement.execute("insert into test1 values('A002', 0)");
225
+ conn.rollback();
226
+ }
227
+ }
228
+ } catch (Exception e) {
229
+ e.printStackTrace();
230
+ }
231
+ }
232
+ };
233
+ thread1.start();
234
+
235
+ Thread thread2 = new Thread() {
236
+ @Override
237
+ public void run() {
238
+ try {
239
+ try (Connection conn = MySQLTests.connect()) {
240
+ conn.setAutoCommit(false);
241
+ try (Statement statement = conn.createStatement()) {
242
+ // make the transaction larger so that embulk-output-mysql transaction will be rolled back at a deadlock.
243
+ for (int i = 100; i < 110; i++) {
244
+ statement.execute("insert into test1 values('C" + i + "', 0)");
245
+ }
246
+
247
+ statement.execute("insert into test1 values('A004', 0)");
248
+ Thread.sleep(6000);
249
+ // deadlock will occur
250
+ statement.execute("insert into test1 values('A001', 0)");
251
+ conn.rollback();
252
+ }
253
+ }
254
+ } catch (Exception e) {
255
+ e.printStackTrace();
256
+ }
257
+ }
258
+ };
259
+ thread2.start();
260
+
261
+ Path in1 = toPath("test1.csv");
262
+ TestingEmbulk.RunResult result1 = embulk.runOutput(baseConfig.merge(loadYamlResource(embulk, "test1.yml")), in1);
263
+ assertThat(selectRecords(embulk, "test1"), is(readResource("test1_expected.csv")));
264
+ }
265
+
266
+ // records will be partially committed
267
+ @Test
268
+ public void testRetry_Large_MultipleTimes() throws Exception
269
+ {
270
+ Path in1 = embulk.createTempFile("csv");
271
+ StringBuilder expected1 = new StringBuilder();
272
+
273
+ try (BufferedWriter writer = new BufferedWriter(new FileWriter(in1.toFile()))) {
274
+ writer.write("id:string,num:long");
275
+ writer.newLine();
276
+
277
+ for (int i = 1000000; i < 1250000; i++) {
278
+ writer.write("A" + i + "," + i);
279
+ writer.newLine();
280
+
281
+ expected1.append("A" + i + "," + i + "\n");
282
+ }
283
+ }
284
+
285
+ final Lock lock1 = new Lock();
286
+ final Lock lock2 = new Lock();
287
+
288
+ Thread thread1 = new Thread() {
289
+ @Override
290
+ public void run() {
291
+ try {
292
+ try (Connection conn = MySQLTests.connect()) {
293
+ conn.setAutoCommit(false);
294
+ try (Statement statement = conn.createStatement()) {
295
+ // make the transaction larger so that embulk-output-mysql transaction will be rolled back at a deadlock.
296
+ for (int i = 1000000; i < 1260000; i++) {
297
+ statement.execute("insert into test1 values('B" + i + "', 0)");
298
+ }
299
+ System.out.println("# Inserted many records (1).");
300
+
301
+ synchronized (lock1) {
302
+ lock1.notify();
303
+ lock1.enabled = false;
304
+ }
305
+
306
+ System.out.println("# Insert 'A1249010'.");
307
+ statement.execute("insert into test1 values('A1249010', 0)");
308
+ Thread.sleep(5000);
309
+ // deadlock will occur
310
+ System.out.println("# Insert 'A1249000'.");
311
+ statement.execute("insert into test1 values('A1249000', 0)");
312
+ conn.rollback();
313
+ }
314
+ }
315
+ } catch (Exception e) {
316
+ e.printStackTrace();
317
+ }
318
+ }
319
+ };
320
+ thread1.start();
321
+
322
+ Thread thread2 = new Thread() {
323
+ @Override
324
+ public void run() {
325
+ try {
326
+ try (Connection conn = MySQLTests.connect()) {
327
+ conn.setAutoCommit(false);
328
+ try (Statement statement = conn.createStatement()) {
329
+ // make the transaction larger so that embulk-output-mysql transaction will be rolled back at a deadlock.
330
+ for (int i = 1000000; i < 1260000; i++) {
331
+ statement.execute("insert into test1 values('C" + i + "', 0)");
332
+ }
333
+ System.out.println("# Inserted many records (2).");
334
+
335
+ synchronized (lock2) {
336
+ lock2.notify();
337
+ lock2.enabled = false;
338
+ }
339
+
340
+ System.out.println("# Insert 'A1249030'.");
341
+ statement.execute("insert into test1 values('A1249030', 0)");
342
+ Thread.sleep(20000);
343
+ // deadlock will occur
344
+ System.out.println("# Insert 'A1249020'.");
345
+ statement.execute("insert into test1 values('A1249020', 0)");
346
+ conn.rollback();
347
+ }
348
+ }
349
+ } catch (Exception e) {
350
+ e.printStackTrace();
351
+ }
352
+ }
353
+ };
354
+ thread2.start();
355
+
356
+ synchronized (lock1) {
357
+ if (lock1.enabled) {
358
+ lock1.wait();
359
+ }
360
+ }
361
+ synchronized (lock2) {
362
+ if (lock2.enabled) {
363
+ lock2.wait();
364
+ }
190
365
  }
191
366
 
192
367
  //Path in1 = toPath("test1_flushed_multiple_times.csv");
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: embulk-output-mysql
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.4
4
+ version: 0.8.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sadayuki Furuhashi
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-05-08 00:00:00.000000000 Z
11
+ date: 2019-05-10 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Inserts or updates records to a table.
14
14
  email:
@@ -19,8 +19,8 @@ extra_rdoc_files: []
19
19
  files:
20
20
  - README.md
21
21
  - build.gradle
22
- - classpath/embulk-output-jdbc-0.8.4.jar
23
- - classpath/embulk-output-mysql-0.8.4.jar
22
+ - classpath/embulk-output-jdbc-0.8.5.jar
23
+ - classpath/embulk-output-mysql-0.8.5.jar
24
24
  - default_jdbc_driver/mysql-connector-java-5.1.44.jar
25
25
  - lib/embulk/output/mysql.rb
26
26
  - src/main/java/org/embulk/output/MySQLOutputPlugin.java