embulk 0.8.1 → 0.8.2
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 +4 -4
- data/README.md +1 -1
- data/build.gradle +1 -1
- data/embulk-core/src/main/java/org/embulk/exec/LocalExecutorPlugin.java +33 -11
- data/embulk-core/src/main/java/org/embulk/jruby/JRubyScriptingModule.java +15 -1
- data/embulk-core/src/main/java/org/embulk/spi/util/dynamic/JsonColumnSetter.java +1 -10
- data/embulk-core/src/test/java/org/embulk/spi/PageTestUtils.java +3 -1
- data/embulk-docs/src/release.rst +1 -0
- data/embulk-docs/src/release/release-0.8.2.rst +19 -0
- data/lib/embulk/command/embulk_example.rb +2 -2
- data/lib/embulk/command/embulk_run.rb +12 -2
- data/lib/embulk/runner.rb +11 -3
- data/lib/embulk/version.rb +1 -1
- metadata +5 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e49862e13c81831477cfed94aea2db310b8bc51c
|
4
|
+
data.tar.gz: 9b59130a3b0ceca8d4980a7c32e979d84f7b5ab1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e8d58a7659d4445c83534859d5cf8043099877b03e1544be8f531b6a644ebfd116de970ac38d92558310ed19991aa476e1a4f96a829382a0692ac57b506b1fb1
|
7
|
+
data.tar.gz: 52e734f97666ea28f4a3f6564f7f74001d35f85e59a0b4cf3c6f9aa3c77902ac06438184b13ee44b906ecd5760b01361f799d967167617d2a7c19f1020ce7cb2
|
data/README.md
CHANGED
data/build.gradle
CHANGED
@@ -60,7 +60,7 @@ public class LocalExecutorPlugin
|
|
60
60
|
Logger log = Exec.getLogger(LocalExecutorPlugin.class);
|
61
61
|
int maxThreads = config.get(Integer.class, "max_threads", defaultMaxThreads);
|
62
62
|
int minThreads = config.get(Integer.class, "min_output_tasks", defaultMinThreads);
|
63
|
-
if (inputTaskCount < minThreads) {
|
63
|
+
if (inputTaskCount > 0 && inputTaskCount < minThreads) {
|
64
64
|
int scatterCount = (minThreads + inputTaskCount - 1) / inputTaskCount;
|
65
65
|
log.info("Using local thread executor with max_threads={} / output tasks {} = input tasks {} * {}",
|
66
66
|
maxThreads, inputTaskCount * scatterCount, inputTaskCount, scatterCount);
|
@@ -320,33 +320,55 @@ public class LocalExecutorPlugin
|
|
320
320
|
{
|
321
321
|
private final PageOutput output;
|
322
322
|
private final Future<Throwable> future;
|
323
|
-
private
|
324
|
-
private Page queued;
|
323
|
+
private volatile int addWaiting;
|
324
|
+
private volatile Page queued;
|
325
325
|
|
326
326
|
public OutputWorker(PageOutput output, ExecutorService executor)
|
327
327
|
{
|
328
328
|
this.output = output;
|
329
|
-
this.
|
329
|
+
this.addWaiting = 0;
|
330
330
|
this.future = executor.submit(this);
|
331
331
|
}
|
332
332
|
|
333
|
-
public synchronized void
|
333
|
+
public synchronized void done()
|
334
334
|
throws InterruptedException
|
335
335
|
{
|
336
336
|
while (true) {
|
337
|
-
if (queued == null) {
|
338
|
-
queued =
|
337
|
+
if (queued == null && addWaiting == 0) {
|
338
|
+
queued = DONE_PAGE;
|
339
339
|
notifyAll();
|
340
340
|
return;
|
341
341
|
}
|
342
342
|
else if (queued == DONE_PAGE) {
|
343
|
-
page.release();
|
344
343
|
return;
|
345
344
|
}
|
346
345
|
wait();
|
347
346
|
}
|
348
347
|
}
|
349
348
|
|
349
|
+
public synchronized void add(Page page)
|
350
|
+
throws InterruptedException
|
351
|
+
{
|
352
|
+
addWaiting++;
|
353
|
+
try {
|
354
|
+
while (true) {
|
355
|
+
if (queued == null) {
|
356
|
+
queued = page;
|
357
|
+
notifyAll();
|
358
|
+
return;
|
359
|
+
}
|
360
|
+
else if (queued == DONE_PAGE) {
|
361
|
+
page.release();
|
362
|
+
return;
|
363
|
+
}
|
364
|
+
wait();
|
365
|
+
}
|
366
|
+
}
|
367
|
+
finally {
|
368
|
+
addWaiting--;
|
369
|
+
}
|
370
|
+
}
|
371
|
+
|
350
372
|
public Throwable join()
|
351
373
|
throws InterruptedException
|
352
374
|
{
|
@@ -470,8 +492,8 @@ public class LocalExecutorPlugin
|
|
470
492
|
{
|
471
493
|
completeWorkers();
|
472
494
|
for (int i = 0; i < scatterCount; i++) {
|
473
|
-
if (
|
474
|
-
|
495
|
+
if (filtereds[i] != null) {
|
496
|
+
filtereds[i].finish();
|
475
497
|
}
|
476
498
|
}
|
477
499
|
}
|
@@ -517,7 +539,7 @@ public class LocalExecutorPlugin
|
|
517
539
|
OutputWorker worker = outputWorkers[i];
|
518
540
|
if (worker != null) {
|
519
541
|
try {
|
520
|
-
worker.
|
542
|
+
worker.done();
|
521
543
|
}
|
522
544
|
catch (InterruptedException ex) {
|
523
545
|
throw Throwables.propagate(ex);
|
@@ -14,7 +14,6 @@ import com.google.inject.Injector;
|
|
14
14
|
import com.google.inject.Key;
|
15
15
|
import com.google.inject.spi.Dependency;
|
16
16
|
import com.google.inject.spi.ProviderWithDependencies;
|
17
|
-
import org.jruby.CompatVersion;
|
18
17
|
import org.jruby.embed.LocalContextScope;
|
19
18
|
import org.jruby.embed.ScriptingContainer;
|
20
19
|
import org.embulk.plugin.PluginSource;
|
@@ -44,6 +43,7 @@ public class JRubyScriptingModule
|
|
44
43
|
{
|
45
44
|
private final Injector injector;
|
46
45
|
private final boolean useGlobalRubyRuntime;
|
46
|
+
private final String gemHome;
|
47
47
|
|
48
48
|
@Inject
|
49
49
|
public ScriptingContainerProvider(Injector injector, @ForSystemConfig ConfigSource systemConfig)
|
@@ -54,6 +54,8 @@ public class JRubyScriptingModule
|
|
54
54
|
// instantiated in this JVM.
|
55
55
|
this.useGlobalRubyRuntime = systemConfig.get(boolean.class, "use_global_ruby_runtime", false);
|
56
56
|
|
57
|
+
this.gemHome = systemConfig.get(String.class, "gem_home", null);
|
58
|
+
|
57
59
|
// TODO get jruby-home from systemConfig to call jruby.container.setHomeDirectory
|
58
60
|
// TODO get jruby-load-paths from systemConfig to call jruby.container.setLoadPaths
|
59
61
|
}
|
@@ -75,6 +77,18 @@ public class JRubyScriptingModule
|
|
75
77
|
// }
|
76
78
|
// jruby.setLoadPaths(loadPaths);
|
77
79
|
|
80
|
+
if (gemHome != null) {
|
81
|
+
// Overwrites GEM_HOME and GEM_PATH. GEM_PATH becomes same with GEM_HOME. Therefore
|
82
|
+
// with this code, there're no ways to set extra GEM_PATHs in addition to GEM_HOME.
|
83
|
+
// Here doesn't modify ENV['GEM_HOME'] so that a JVM process can create multiple
|
84
|
+
// JRubyScriptingModule instances. However, because Gem loads ENV['GEM_HOME'] when
|
85
|
+
// Gem.clear_paths is called, applications may use unexpected GEM_HOME if clear_path
|
86
|
+
// is used.
|
87
|
+
jruby.callMethod(
|
88
|
+
jruby.runScriptlet("Gem"),
|
89
|
+
"use_paths", gemHome, gemHome);
|
90
|
+
}
|
91
|
+
|
78
92
|
// load embulk.rb
|
79
93
|
jruby.runScriptlet("require 'embulk'");
|
80
94
|
|
@@ -4,8 +4,6 @@ import org.embulk.spi.Column;
|
|
4
4
|
import org.embulk.spi.PageBuilder;
|
5
5
|
import org.embulk.spi.time.Timestamp;
|
6
6
|
import org.embulk.spi.time.TimestampFormatter;
|
7
|
-
import org.embulk.spi.json.JsonParser;
|
8
|
-
import org.embulk.spi.json.JsonParseException;
|
9
7
|
import org.msgpack.value.Value;
|
10
8
|
import org.msgpack.value.ValueFactory;
|
11
9
|
|
@@ -13,7 +11,6 @@ public class JsonColumnSetter
|
|
13
11
|
extends AbstractDynamicColumnSetter
|
14
12
|
{
|
15
13
|
private final TimestampFormatter timestampFormatter;
|
16
|
-
private final JsonParser jsonParser;
|
17
14
|
|
18
15
|
public JsonColumnSetter(PageBuilder pageBuilder, Column column,
|
19
16
|
DefaultValueSetter defaultValue,
|
@@ -21,7 +18,6 @@ public class JsonColumnSetter
|
|
21
18
|
{
|
22
19
|
super(pageBuilder, column, defaultValue);
|
23
20
|
this.timestampFormatter = timestampFormatter;
|
24
|
-
this.jsonParser = new JsonParser();
|
25
21
|
}
|
26
22
|
|
27
23
|
@Override
|
@@ -51,12 +47,7 @@ public class JsonColumnSetter
|
|
51
47
|
@Override
|
52
48
|
public void set(String v)
|
53
49
|
{
|
54
|
-
|
55
|
-
pageBuilder.setJson(column, jsonParser.parse(v));
|
56
|
-
}
|
57
|
-
catch (JsonParseException ex) {
|
58
|
-
defaultValue.setTimestamp(pageBuilder, column);
|
59
|
-
}
|
50
|
+
pageBuilder.setJson(column, ValueFactory.newString(v));
|
60
51
|
}
|
61
52
|
|
62
53
|
@Override
|
@@ -11,7 +11,7 @@ import org.embulk.spi.Schema;
|
|
11
11
|
import org.embulk.spi.SchemaConfig;
|
12
12
|
import org.embulk.spi.ColumnVisitor;
|
13
13
|
import org.embulk.spi.type.Type;
|
14
|
-
|
14
|
+
import org.msgpack.value.Value;
|
15
15
|
import com.google.common.collect.ImmutableList;
|
16
16
|
|
17
17
|
public class PageTestUtils
|
@@ -42,6 +42,8 @@ public class PageTestUtils
|
|
42
42
|
builder.setString(column, (String) value);
|
43
43
|
} else if (value instanceof Timestamp) {
|
44
44
|
builder.setTimestamp(column, (Timestamp) value);
|
45
|
+
} else if (value instanceof Value) {
|
46
|
+
builder.setJson(column, (Value) value);
|
45
47
|
} else {
|
46
48
|
throw new IllegalStateException(
|
47
49
|
"Unsupported type in test utils: "
|
data/embulk-docs/src/release.rst
CHANGED
@@ -0,0 +1,19 @@
|
|
1
|
+
Release 0.8.2
|
2
|
+
==================================
|
3
|
+
|
4
|
+
General Changes
|
5
|
+
------------------
|
6
|
+
|
7
|
+
* Fixed race condition around transaction completion when page scattering is enabled.
|
8
|
+
* Fixed unexpected error that happens when number of input tasks is 0 and page scattering is enabled.
|
9
|
+
* Fixed preview output when a json column is included.
|
10
|
+
|
11
|
+
CLI
|
12
|
+
------------------
|
13
|
+
|
14
|
+
* ``-c, --config-diff`` option replaces ``-o, --output`` option.
|
15
|
+
|
16
|
+
|
17
|
+
Release Date
|
18
|
+
------------------
|
19
|
+
2016-01-31
|
@@ -18,8 +18,8 @@ id,account,time,purchase,comment
|
|
18
18
|
EOF
|
19
19
|
end
|
20
20
|
|
21
|
-
puts " Creating #{path}/
|
22
|
-
File.open(File.join(path, '
|
21
|
+
puts " Creating #{path}/seed.yml"
|
22
|
+
File.open(File.join(path, 'seed.yml'), 'w') do |f|
|
23
23
|
f.write <<EOF
|
24
24
|
in:
|
25
25
|
type: file
|
@@ -78,9 +78,19 @@ module Embulk
|
|
78
78
|
op.on('-r', '--resume-state PATH', 'Path to a file to write or read resume state') do |path|
|
79
79
|
options[:resume_state_path] = path
|
80
80
|
end
|
81
|
-
op.on('-o', '--output PATH', '
|
81
|
+
op.on('-o', '--output PATH', '(deprecated)') do |path|
|
82
|
+
STDERR.puts "#{Time.now.strftime("%Y-%m-%d %H:%M:%S.%3N %z")}: Run with -o option is deprecated. Please use -c option instead. For example,"
|
83
|
+
STDERR.puts "#{Time.now.strftime("%Y-%m-%d %H:%M:%S.%3N %z")}: "
|
84
|
+
STDERR.puts "#{Time.now.strftime("%Y-%m-%d %H:%M:%S.%3N %z")}: $ embulk run config.yml -c diff.yml"
|
85
|
+
STDERR.puts "#{Time.now.strftime("%Y-%m-%d %H:%M:%S.%3N %z")}: "
|
86
|
+
STDERR.puts "#{Time.now.strftime("%Y-%m-%d %H:%M:%S.%3N %z")}: This -c option stores only diff of the next configuration."
|
87
|
+
STDERR.puts "#{Time.now.strftime("%Y-%m-%d %H:%M:%S.%3N %z")}: The diff will be merged to the original config.yml file."
|
88
|
+
STDERR.puts "#{Time.now.strftime("%Y-%m-%d %H:%M:%S.%3N %z")}: "
|
82
89
|
options[:next_config_output_path] = path
|
83
90
|
end
|
91
|
+
op.on('-c', '--config-diff PATH', 'Path to a file to read & write the next configuration diff') do |path|
|
92
|
+
options[:next_config_diff_path] = path
|
93
|
+
end
|
84
94
|
plugin_load_ops.call
|
85
95
|
java_embed_ops.call
|
86
96
|
args = 1..1
|
@@ -227,7 +237,7 @@ examples:
|
|
227
237
|
puts ""
|
228
238
|
puts "Run following subcommands to try embulk:"
|
229
239
|
puts ""
|
230
|
-
puts " 1. embulk guess #{File.join(path, '
|
240
|
+
puts " 1. embulk guess #{File.join(path, 'seed.yml')} -o config.yml"
|
231
241
|
puts " 2. embulk preview config.yml"
|
232
242
|
puts " 3. embulk run config.yml"
|
233
243
|
puts ""
|
data/lib/embulk/runner.rb
CHANGED
@@ -53,12 +53,19 @@ module Embulk
|
|
53
53
|
|
54
54
|
def run(config, options={})
|
55
55
|
configSource = read_config(config, options)
|
56
|
-
|
56
|
+
config_diff_path = options[:next_config_diff_path]
|
57
|
+
output_path = options[:next_config_output_path] # deprecated
|
57
58
|
resume_state_path = options[:resume_state_path]
|
58
59
|
|
59
|
-
check_file_writable(output_path)
|
60
|
+
check_file_writable(output_path) # deprecated
|
61
|
+
check_file_writable(config_diff_path)
|
60
62
|
check_file_writable(resume_state_path)
|
61
63
|
|
64
|
+
if config_diff_path
|
65
|
+
lastConfigDiff = read_config(config_diff_path, options)
|
66
|
+
configSource = configSource.merge(lastConfigDiff)
|
67
|
+
end
|
68
|
+
|
62
69
|
if resume_state_path
|
63
70
|
begin
|
64
71
|
resumeConfig = read_yaml_config_file(resume_state_path)
|
@@ -100,7 +107,8 @@ module Embulk
|
|
100
107
|
Embulk.logger.info("Committed.")
|
101
108
|
Embulk.logger.info("Next config diff: #{configDiff.toString}")
|
102
109
|
|
103
|
-
write_config(
|
110
|
+
write_config(config_diff_path, configDiff)
|
111
|
+
write_config(output_path, configSource.merge(configDiff)) # deprecated
|
104
112
|
end
|
105
113
|
|
106
114
|
#def resume_state(config, options={})
|
data/lib/embulk/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: embulk
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.8.
|
4
|
+
version: 0.8.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sadayuki Furuhashi
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-01
|
11
|
+
date: 2016-02-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: jruby-jars
|
@@ -107,8 +107,8 @@ files:
|
|
107
107
|
- classpath/bval-jsr303-0.5.jar
|
108
108
|
- classpath/commons-beanutils-core-1.8.3.jar
|
109
109
|
- classpath/commons-lang3-3.1.jar
|
110
|
-
- classpath/embulk-core-0.8.
|
111
|
-
- classpath/embulk-standards-0.8.
|
110
|
+
- classpath/embulk-core-0.8.2.jar
|
111
|
+
- classpath/embulk-standards-0.8.2.jar
|
112
112
|
- classpath/guava-18.0.jar
|
113
113
|
- classpath/guice-4.0.jar
|
114
114
|
- classpath/guice-bootstrap-0.1.1.jar
|
@@ -419,6 +419,7 @@ files:
|
|
419
419
|
- embulk-docs/src/release/release-0.7.9.rst
|
420
420
|
- embulk-docs/src/release/release-0.8.0.rst
|
421
421
|
- embulk-docs/src/release/release-0.8.1.rst
|
422
|
+
- embulk-docs/src/release/release-0.8.2.rst
|
422
423
|
- embulk-standards/build.gradle
|
423
424
|
- embulk-standards/src/main/java/org/embulk/standards/CsvFormatterPlugin.java
|
424
425
|
- embulk-standards/src/main/java/org/embulk/standards/CsvParserPlugin.java
|