embulk-filter-copy 0.0.2 → 0.1.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +6 -1
- data/README.md +5 -1
- data/build.gradle +6 -5
- data/example/config.yml +1 -0
- data/example/data.tsv +5 -5
- data/gradle/wrapper/gradle-wrapper.jar +0 -0
- data/gradle/wrapper/gradle-wrapper.properties +1 -2
- data/gradlew +13 -10
- data/src/main/java/org/embulk/filter/copy/CopyFilterPlugin.java +26 -37
- data/src/main/java/org/embulk/filter/copy/forward/{ForwardBaseTask.java → ForwardParentTask.java} +1 -1
- data/src/main/java/org/embulk/filter/copy/forward/InForwardEventReader.java +67 -62
- data/src/main/java/org/embulk/filter/copy/forward/InForwardService.java +102 -35
- data/src/main/java/org/embulk/filter/copy/forward/OutForwardEventBuilder.java +66 -54
- data/src/main/java/org/embulk/filter/copy/forward/OutForwardService.java +2 -2
- data/src/main/java/org/embulk/filter/copy/plugin/InternalForwardInputPlugin.java +11 -13
- data/src/main/java/org/embulk/filter/copy/runner/AsyncEmbulkRunnerService.java +32 -0
- data/src/main/java/org/embulk/filter/copy/runner/EmbulkRunner.java +124 -0
- data/src/main/java/org/embulk/filter/copy/spi/DataBuilder.java +41 -0
- data/src/main/java/org/embulk/filter/copy/spi/DataReader.java +41 -0
- data/src/main/java/org/embulk/filter/copy/spi/ElapsedTime.java +81 -0
- data/src/main/java/org/embulk/filter/copy/spi/PageBuilder.java +16 -0
- data/src/main/java/org/embulk/filter/copy/spi/PageReader.java +13 -0
- data/src/main/java/org/embulk/filter/copy/{util → spi}/StandardColumnVisitor.java +6 -6
- data/src/test/java/org/embulk/filter/copy/TestCopyFilterPlugin.java +0 -11
- metadata +24 -16
- data/src/main/java/org/embulk/filter/copy/executor/EmbulkExecutor.java +0 -105
- data/src/main/java/org/embulk/filter/copy/executor/LocalThreadExecutor.java +0 -96
- data/src/main/java/org/embulk/filter/copy/forward/InForwardVisitor.java +0 -63
- data/src/main/java/org/embulk/filter/copy/forward/OutForwardVisitor.java +0 -63
- data/src/main/java/org/embulk/filter/copy/util/ElapsedTime.java +0 -165
@@ -1,24 +1,25 @@
|
|
1
1
|
package org.embulk.filter.copy.forward;
|
2
2
|
|
3
3
|
import com.google.common.base.Optional;
|
4
|
+
import com.google.common.util.concurrent.AbstractExecutionThreadService;
|
4
5
|
import influent.EventStream;
|
5
6
|
import influent.Tag;
|
6
7
|
import influent.forward.ForwardCallback;
|
7
8
|
import influent.forward.ForwardServer;
|
8
9
|
import org.embulk.config.Config;
|
9
10
|
import org.embulk.config.ConfigDefault;
|
10
|
-
import org.embulk.
|
11
|
+
import org.embulk.spi.DataException;
|
11
12
|
import org.embulk.spi.Exec;
|
12
13
|
import org.slf4j.Logger;
|
14
|
+
import org.embulk.filter.copy.spi.ElapsedTime;
|
13
15
|
|
14
16
|
import java.util.concurrent.CompletableFuture;
|
15
|
-
import java.util.concurrent.
|
16
|
-
import java.util.concurrent.ExecutorService;
|
17
|
-
import java.util.concurrent.Executors;
|
17
|
+
import java.util.concurrent.ExecutionException;
|
18
18
|
import java.util.concurrent.atomic.AtomicBoolean;
|
19
19
|
import java.util.function.Consumer;
|
20
20
|
|
21
21
|
public class InForwardService
|
22
|
+
extends AbstractExecutionThreadService
|
22
23
|
{
|
23
24
|
private final static Logger logger = Exec.getLogger(InForwardService.class);
|
24
25
|
|
@@ -55,7 +56,7 @@ public class InForwardService
|
|
55
56
|
}
|
56
57
|
|
57
58
|
public interface Task
|
58
|
-
extends
|
59
|
+
extends ForwardParentTask
|
59
60
|
{
|
60
61
|
@Config("in_forward")
|
61
62
|
@ConfigDefault("{}")
|
@@ -94,30 +95,19 @@ public class InForwardService
|
|
94
95
|
return new Builder();
|
95
96
|
}
|
96
97
|
|
97
|
-
// TODO: configure?
|
98
|
-
private static final String THREAD_NAME = "in_forward";
|
99
|
-
private static final int NUM_THREADS = 1;
|
100
|
-
|
101
98
|
private final Task task;
|
102
99
|
private final ForwardServer server;
|
103
|
-
private final ExecutorService callbackThread;
|
104
100
|
private final AtomicBoolean shouldShutdown = new AtomicBoolean(false);
|
105
101
|
|
106
102
|
private InForwardService(Task task, Consumer<EventStream> eventConsumer)
|
107
103
|
{
|
108
104
|
this.task = task;
|
109
|
-
this.
|
110
|
-
NUM_THREADS,
|
111
|
-
r -> new Thread(r, THREAD_NAME));
|
112
|
-
this.server = buildServer(task.getInForwardTask(), eventConsumer, callbackThread);
|
105
|
+
this.server = buildServer(task.getInForwardTask(), eventConsumer);
|
113
106
|
}
|
114
107
|
|
115
|
-
private ForwardServer buildServer(InForwardTask t, Consumer<EventStream> eventConsumer
|
108
|
+
private ForwardServer buildServer(InForwardTask t, Consumer<EventStream> eventConsumer)
|
116
109
|
{
|
117
|
-
ForwardServer.Builder builder = new ForwardServer.Builder(
|
118
|
-
ForwardCallback.ofSyncConsumer(
|
119
|
-
wrapEventConsumer(eventConsumer),
|
120
|
-
callbackThread));
|
110
|
+
ForwardServer.Builder builder = new ForwardServer.Builder(wrapEventConsumer(eventConsumer));
|
121
111
|
|
122
112
|
builder.localAddress(t.getPort());
|
123
113
|
|
@@ -139,25 +129,27 @@ public class InForwardService
|
|
139
129
|
if (t.getTcpNoDelayEnabled().isPresent()) {
|
140
130
|
builder.tcpNoDelayEnabled(t.getTcpNoDelayEnabled().get());
|
141
131
|
}
|
132
|
+
// TODO: builder.workerPoolSize(1);
|
142
133
|
|
143
134
|
return builder.build();
|
144
135
|
}
|
145
136
|
|
146
|
-
private
|
137
|
+
private ForwardCallback wrapEventConsumer(Consumer<EventStream> eventConsumer)
|
147
138
|
{
|
148
|
-
return
|
139
|
+
return ForwardCallback.of(es ->
|
149
140
|
{
|
150
|
-
if (isShutdownTag(
|
151
|
-
logger.info("Receive shutdown tag: {}",
|
141
|
+
if (isShutdownTag(es.getTag())) {
|
142
|
+
logger.info("Receive shutdown tag: {}", es.getTag());
|
152
143
|
shouldShutdown.set(true);
|
153
144
|
}
|
154
|
-
else if (isMessageTag(
|
155
|
-
eventConsumer.accept(
|
145
|
+
else if (isMessageTag(es.getTag())) {
|
146
|
+
eventConsumer.accept(es);
|
156
147
|
}
|
157
148
|
else {
|
158
|
-
throw new
|
149
|
+
throw new DataException(String.format("Unknown Tag received: %s", es.getTag().getName()));
|
159
150
|
}
|
160
|
-
|
151
|
+
return CompletableFuture.completedFuture(null);
|
152
|
+
});
|
161
153
|
}
|
162
154
|
|
163
155
|
private boolean isShutdownTag(Tag tag)
|
@@ -170,18 +162,93 @@ public class InForwardService
|
|
170
162
|
return tag.getName().contentEquals(task.getMessageTag());
|
171
163
|
}
|
172
164
|
|
173
|
-
|
165
|
+
@Override
|
166
|
+
protected void startUp()
|
167
|
+
throws Exception
|
174
168
|
{
|
175
169
|
server.start();
|
176
|
-
ElapsedTime.debugUntil(shouldShutdown::get, logger, "in_forward server", 1000L);
|
177
|
-
shutdown();
|
178
170
|
}
|
179
171
|
|
180
|
-
|
172
|
+
@Override
|
173
|
+
protected void shutDown()
|
174
|
+
throws Exception
|
181
175
|
{
|
182
|
-
ElapsedTime.
|
183
|
-
|
184
|
-
|
185
|
-
|
176
|
+
ElapsedTime.measureWithPolling(new ElapsedTime.Pollable<Void>() {
|
177
|
+
private CompletableFuture<Void> future;
|
178
|
+
|
179
|
+
@Override
|
180
|
+
public boolean poll()
|
181
|
+
{
|
182
|
+
return future.isCancelled() || future.isCompletedExceptionally() || future.isDone();
|
183
|
+
}
|
184
|
+
|
185
|
+
@Override
|
186
|
+
public Void getResult()
|
187
|
+
{
|
188
|
+
try {
|
189
|
+
return future.get();
|
190
|
+
}
|
191
|
+
catch (InterruptedException | ExecutionException e) {
|
192
|
+
logger.warn("InForwardService: Server Shutdown is failed.", e);
|
193
|
+
return null;
|
194
|
+
}
|
195
|
+
}
|
196
|
+
|
197
|
+
@Override
|
198
|
+
public void onStart()
|
199
|
+
{
|
200
|
+
logger.info("InForwardService: Server Shutdown Start.");
|
201
|
+
this.future = server.shutdown();
|
202
|
+
}
|
203
|
+
|
204
|
+
@Override
|
205
|
+
public void onWaiting(long elapsedMillis)
|
206
|
+
{
|
207
|
+
logger.info("InForwardService: Server Shutdown Running. (Elapsed: {} ms)", elapsedMillis);
|
208
|
+
}
|
209
|
+
|
210
|
+
@Override
|
211
|
+
public void onFinished(long elapsedMillis)
|
212
|
+
{
|
213
|
+
logger.info("InForwardService: Server Shutdown Finish. (Elapsed: {} ms)", elapsedMillis);
|
214
|
+
}
|
215
|
+
});
|
216
|
+
}
|
217
|
+
|
218
|
+
@Override
|
219
|
+
protected void run()
|
220
|
+
throws Exception
|
221
|
+
{
|
222
|
+
ElapsedTime.measureWithPolling(new ElapsedTime.Pollable<Void>() {
|
223
|
+
@Override
|
224
|
+
public boolean poll()
|
225
|
+
{
|
226
|
+
return shouldShutdown.get();
|
227
|
+
}
|
228
|
+
|
229
|
+
@Override
|
230
|
+
public Void getResult()
|
231
|
+
{
|
232
|
+
return null;
|
233
|
+
}
|
234
|
+
|
235
|
+
@Override
|
236
|
+
public void onStart()
|
237
|
+
{
|
238
|
+
logger.info("InForwardService: Server Start.");
|
239
|
+
}
|
240
|
+
|
241
|
+
@Override
|
242
|
+
public void onWaiting(long elapsedMillis)
|
243
|
+
{
|
244
|
+
logger.info("InForwardService: Server Running. (Elapsed: {} ms)", elapsedMillis);
|
245
|
+
}
|
246
|
+
|
247
|
+
@Override
|
248
|
+
public void onFinished(long elapsedMillis)
|
249
|
+
{
|
250
|
+
logger.info("InForwardService: Server Shutdown. (Elapsed: {} ms)", elapsedMillis);
|
251
|
+
}
|
252
|
+
});
|
186
253
|
}
|
187
254
|
}
|
@@ -1,135 +1,147 @@
|
|
1
1
|
package org.embulk.filter.copy.forward;
|
2
2
|
|
3
|
+
import com.google.common.collect.Lists;
|
3
4
|
import com.google.common.collect.Maps;
|
4
5
|
import org.embulk.spi.Column;
|
5
6
|
import org.embulk.spi.Schema;
|
6
7
|
import org.embulk.spi.time.Timestamp;
|
7
|
-
import org.embulk.spi.time.TimestampFormatter;
|
8
8
|
import org.msgpack.value.Value;
|
9
|
+
import org.embulk.filter.copy.spi.DataBuilder;
|
9
10
|
|
11
|
+
import java.util.List;
|
10
12
|
import java.util.Map;
|
11
13
|
|
12
14
|
public class OutForwardEventBuilder
|
15
|
+
implements DataBuilder
|
13
16
|
{
|
17
|
+
private final static String VALUES_KEY = "values";
|
18
|
+
|
14
19
|
private final Schema schema;
|
15
|
-
private final
|
20
|
+
private final OutForwardService outForward;
|
16
21
|
|
17
|
-
private
|
22
|
+
private List<Object> values;
|
18
23
|
|
19
24
|
public OutForwardEventBuilder(
|
20
25
|
Schema schema,
|
21
|
-
|
26
|
+
OutForwardService outForward)
|
22
27
|
{
|
23
|
-
|
24
28
|
this.schema = schema;
|
25
|
-
this.
|
29
|
+
this.outForward = outForward;
|
26
30
|
|
27
31
|
setNewMessage();
|
28
32
|
}
|
29
33
|
|
30
34
|
private void setNewMessage()
|
31
35
|
{
|
32
|
-
this.
|
33
|
-
}
|
34
|
-
|
35
|
-
public void emitMessage(OutForwardService outForward)
|
36
|
-
{
|
37
|
-
outForward.emit(message);
|
38
|
-
setNewMessage();
|
36
|
+
this.values = Lists.newArrayListWithCapacity(schema.getColumnCount());
|
39
37
|
}
|
40
38
|
|
39
|
+
@Override
|
41
40
|
public Schema getSchema()
|
42
41
|
{
|
43
42
|
return schema;
|
44
43
|
}
|
45
44
|
|
46
|
-
|
47
|
-
|
48
|
-
return getSchema().getColumn(columnIndex);
|
49
|
-
}
|
50
|
-
|
51
|
-
private void setValue(String columnName, Object value)
|
52
|
-
{
|
53
|
-
message.put(columnName, value);
|
54
|
-
}
|
55
|
-
|
56
|
-
private void setValue(Column column, Object value)
|
45
|
+
@Override
|
46
|
+
public void addRecord()
|
57
47
|
{
|
58
|
-
|
48
|
+
Map<String, Object> message = Maps.newHashMap();
|
49
|
+
message.put(VALUES_KEY, values);
|
50
|
+
outForward.emit(message);
|
51
|
+
setNewMessage();
|
59
52
|
}
|
60
53
|
|
61
|
-
|
54
|
+
private void setValue(int columnIndex, Object v)
|
62
55
|
{
|
63
|
-
|
56
|
+
values.add(columnIndex, v);
|
64
57
|
}
|
65
58
|
|
59
|
+
@Override
|
66
60
|
public void setNull(Column column)
|
67
61
|
{
|
68
|
-
|
62
|
+
setNull(column.getIndex());
|
69
63
|
}
|
70
64
|
|
71
|
-
|
65
|
+
@Override
|
66
|
+
public void setNull(int columnIndex)
|
72
67
|
{
|
73
|
-
|
68
|
+
setValue(columnIndex, null);
|
74
69
|
}
|
75
70
|
|
76
|
-
|
71
|
+
@Override
|
72
|
+
public void setBoolean(Column column, boolean v)
|
77
73
|
{
|
78
|
-
|
74
|
+
setBoolean(column.getIndex(), v);
|
79
75
|
}
|
80
76
|
|
81
|
-
|
77
|
+
@Override
|
78
|
+
public void setBoolean(int columnIndex, boolean v)
|
82
79
|
{
|
83
|
-
|
80
|
+
setValue(columnIndex, v);
|
84
81
|
}
|
85
82
|
|
86
|
-
|
83
|
+
@Override
|
84
|
+
public void setString(Column column, String v)
|
87
85
|
{
|
88
|
-
|
86
|
+
setString(column.getIndex(), v);
|
89
87
|
}
|
90
88
|
|
91
|
-
|
89
|
+
@Override
|
90
|
+
public void setString(int columnIndex, String v)
|
92
91
|
{
|
93
|
-
|
92
|
+
setValue(columnIndex, v);
|
94
93
|
}
|
95
94
|
|
96
|
-
|
95
|
+
@Override
|
96
|
+
public void setLong(Column column, long v)
|
97
97
|
{
|
98
|
-
|
98
|
+
setLong(column.getIndex(), v);
|
99
99
|
}
|
100
100
|
|
101
|
-
|
101
|
+
@Override
|
102
|
+
public void setLong(int columnIndex, long v)
|
102
103
|
{
|
103
|
-
|
104
|
+
setValue(columnIndex, v);
|
104
105
|
}
|
105
106
|
|
106
|
-
|
107
|
+
@Override
|
108
|
+
public void setDouble(Column column, double v)
|
107
109
|
{
|
108
|
-
|
110
|
+
setDouble(column.getIndex(), v);
|
109
111
|
}
|
110
112
|
|
111
|
-
|
113
|
+
@Override
|
114
|
+
public void setDouble(int columnIndex, double v)
|
112
115
|
{
|
113
|
-
|
116
|
+
setValue(columnIndex, v);
|
114
117
|
}
|
115
118
|
|
116
|
-
|
119
|
+
@Override
|
120
|
+
public void setTimestamp(Column column, Timestamp v)
|
117
121
|
{
|
118
|
-
|
122
|
+
|
123
|
+
setTimestamp(column.getIndex(), v);
|
119
124
|
}
|
120
125
|
|
121
|
-
|
126
|
+
@Override
|
127
|
+
public void setTimestamp(int columnIndex, Timestamp v)
|
122
128
|
{
|
123
|
-
|
129
|
+
// TODO: confirm correct value is stored
|
130
|
+
long epochSecond = v.getEpochSecond();
|
131
|
+
long nanoAdjustment = v.getNano();
|
132
|
+
setValue(columnIndex, new long[]{epochSecond, nanoAdjustment});
|
124
133
|
}
|
125
134
|
|
126
|
-
|
135
|
+
@Override
|
136
|
+
public void setJson(Column column, Value v)
|
127
137
|
{
|
128
|
-
|
138
|
+
setJson(column.getIndex(), v);
|
129
139
|
}
|
130
140
|
|
131
|
-
|
141
|
+
@Override
|
142
|
+
public void setJson(int columnIndex, Value v)
|
132
143
|
{
|
133
|
-
|
144
|
+
// TODO: confirm correct value is stored
|
145
|
+
setValue(columnIndex, v.toJson());
|
134
146
|
}
|
135
147
|
}
|
@@ -64,7 +64,7 @@ public class OutForwardService
|
|
64
64
|
}
|
65
65
|
|
66
66
|
public interface Task
|
67
|
-
extends
|
67
|
+
extends ForwardParentTask
|
68
68
|
{
|
69
69
|
@Config("out_forward")
|
70
70
|
@ConfigDefault("{}")
|
@@ -73,7 +73,7 @@ public class OutForwardService
|
|
73
73
|
|
74
74
|
public static void sendShutdownMessage(Task task)
|
75
75
|
{
|
76
|
-
logger.info("
|
76
|
+
logger.info("OutForwardService: Send a Shutdown Message.");
|
77
77
|
OutForwardService outForward = new OutForwardService(task);
|
78
78
|
outForward.emit(task.getShutdownTag(), Maps.newHashMap());
|
79
79
|
outForward.finish();
|
@@ -9,11 +9,12 @@ import org.embulk.config.TaskReport;
|
|
9
9
|
import org.embulk.config.TaskSource;
|
10
10
|
import org.embulk.filter.copy.forward.InForwardEventReader;
|
11
11
|
import org.embulk.filter.copy.forward.InForwardService;
|
12
|
-
import org.embulk.filter.copy.
|
12
|
+
import org.embulk.filter.copy.spi.PageBuilder;
|
13
|
+
import org.embulk.filter.copy.spi.StandardColumnVisitor;
|
13
14
|
import org.embulk.spi.BufferAllocator;
|
15
|
+
import org.embulk.spi.ColumnVisitor;
|
14
16
|
import org.embulk.spi.Exec;
|
15
17
|
import org.embulk.spi.InputPlugin;
|
16
|
-
import org.embulk.spi.PageBuilder;
|
17
18
|
import org.embulk.spi.PageOutput;
|
18
19
|
import org.embulk.spi.Schema;
|
19
20
|
import org.embulk.spi.SchemaConfig;
|
@@ -74,28 +75,25 @@ public class InternalForwardInputPlugin
|
|
74
75
|
PluginTask task = taskSource.loadTask(PluginTask.class);
|
75
76
|
|
76
77
|
try (PageBuilder pageBuilder = new PageBuilder(task.getBufferAllocator(), schema, output)) {
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
InForwardEventReader eventReader = new InForwardEventReader(schema, timestampParser);
|
82
|
-
InForwardVisitor inForwardVisitor = new InForwardVisitor(eventReader, pageBuilder);
|
83
|
-
|
84
|
-
InForwardService.builder()
|
78
|
+
InForwardEventReader eventReader = new InForwardEventReader(schema);
|
79
|
+
ColumnVisitor inForwardVisitor = new StandardColumnVisitor(eventReader, pageBuilder);
|
80
|
+
|
81
|
+
InForwardService inForwardService = InForwardService.builder()
|
85
82
|
.task(task)
|
86
83
|
.forEachEventCallback(
|
87
84
|
event ->
|
88
85
|
{
|
89
86
|
// TODO: here is not thread-safe
|
90
87
|
eventReader.setEvent(event);
|
91
|
-
while (eventReader.
|
88
|
+
while (eventReader.nextRecord()) {
|
92
89
|
schema.visitColumns(inForwardVisitor);
|
93
90
|
pageBuilder.addRecord();
|
94
91
|
}
|
95
92
|
}
|
96
93
|
)
|
97
|
-
.build()
|
98
|
-
|
94
|
+
.build();
|
95
|
+
|
96
|
+
inForwardService.startAsync().awaitTerminated();
|
99
97
|
|
100
98
|
pageBuilder.finish();
|
101
99
|
}
|