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:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8a6b83378d49fc8b2a03de7296e7da18eab89050
|
4
|
+
data.tar.gz: 5e0d6bcb0fd421179ba89b6284883b87d7cd0e45
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6c84ec4e5a7acaa7173a54e0d339d5b38a70cc17d5692cd4a0452c21f186eb6d71c7476a13cbefeb6e03e0f8a60751a9d91bc87f8251fe9c2ee22a895600b65d
|
7
|
+
data.tar.gz: edf085322564c9f9592bc014889e145b72d2f28ccac8b5734bc062b9f826427b28e9934ca00a5b5b80f7d82cf8daf6c278e27ca578e486f8a50b388d8c5aedba
|
Binary file
|
Binary file
|
@@ -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
|
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("
|
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.
|
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
|
+
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-
|
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.
|
23
|
-
- classpath/embulk-output-mysql-0.8.
|
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
|