Skip to content

Commit a766a3a

Browse files
shangm2NikhilCollooru
authored andcommitted
Revert "Assign event loop to tasks and run methods from a task in the same event loop"
This reverts commit b511e7a.
1 parent d6ce440 commit a766a3a

File tree

7 files changed

+575
-577
lines changed

7 files changed

+575
-577
lines changed

pom.xml

-6
Original file line numberDiff line numberDiff line change
@@ -248,12 +248,6 @@
248248
<scope>runtime</scope>
249249
</dependency>
250250

251-
<dependency>
252-
<groupId>io.netty</groupId>
253-
<artifactId>netty-transport</artifactId>
254-
<version>${dep.netty.version}</version>
255-
</dependency>
256-
257251
<dependency>
258252
<groupId>com.facebook.presto</groupId>
259253
<artifactId>presto-testing-docker</artifactId>

presto-main/pom.xml

-5
Original file line numberDiff line numberDiff line change
@@ -511,11 +511,6 @@
511511
<optional>true</optional>
512512
</dependency>
513513

514-
<dependency>
515-
<groupId>io.netty</groupId>
516-
<artifactId>netty-transport</artifactId>
517-
</dependency>
518-
519514
<dependency>
520515
<groupId>com.squareup.okhttp3</groupId>
521516
<artifactId>mockwebserver</artifactId>

presto-main/src/main/java/com/facebook/presto/server/remotetask/ContinuousTaskStatusFetcher.java

+60-57
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
*/
1414
package com.facebook.presto.server.remotetask;
1515

16+
import com.facebook.airlift.concurrent.SetThreadName;
1617
import com.facebook.airlift.http.client.HttpClient;
1718
import com.facebook.airlift.http.client.Request;
1819
import com.facebook.airlift.http.client.ResponseHandler;
@@ -37,9 +38,13 @@
3738
import com.google.common.util.concurrent.Futures;
3839
import com.google.common.util.concurrent.ListenableFuture;
3940
import io.airlift.units.Duration;
40-
import io.netty.channel.EventLoop;
4141

42+
import javax.annotation.concurrent.GuardedBy;
43+
44+
import java.util.concurrent.Executor;
45+
import java.util.concurrent.ScheduledExecutorService;
4246
import java.util.concurrent.atomic.AtomicBoolean;
47+
import java.util.concurrent.atomic.AtomicLong;
4348
import java.util.function.Consumer;
4449

4550
import static com.facebook.airlift.http.client.HttpUriBuilder.uriBuilderFrom;
@@ -55,7 +60,6 @@
5560
import static com.facebook.presto.spi.StandardErrorCode.REMOTE_TASK_ERROR;
5661
import static com.facebook.presto.spi.StandardErrorCode.REMOTE_TASK_MISMATCH;
5762
import static com.facebook.presto.util.Failures.REMOTE_TASK_MISMATCH_ERROR;
58-
import static com.google.common.base.Verify.verify;
5963
import static io.airlift.units.Duration.nanosSince;
6064
import static java.lang.String.format;
6165
import static java.util.Objects.requireNonNull;
@@ -71,16 +75,20 @@ class ContinuousTaskStatusFetcher
7175
private final Codec<TaskStatus> taskStatusCodec;
7276

7377
private final Duration refreshMaxWait;
74-
private final EventLoop taskEventLoop;
78+
private final Executor executor;
7579
private final HttpClient httpClient;
7680
private final RequestErrorTracker errorTracker;
7781
private final RemoteTaskStats stats;
7882
private final boolean binaryTransportEnabled;
7983
private final boolean thriftTransportEnabled;
8084
private final Protocol thriftProtocol;
81-
private long currentRequestStartNanos;
85+
86+
private final AtomicLong currentRequestStartNanos = new AtomicLong();
87+
88+
@GuardedBy("this")
8289
private boolean running;
8390

91+
@GuardedBy("this")
8492
private ListenableFuture<BaseResponse<TaskStatus>> future;
8593

8694
public ContinuousTaskStatusFetcher(
@@ -89,9 +97,10 @@ public ContinuousTaskStatusFetcher(
8997
TaskStatus initialTaskStatus,
9098
Duration refreshMaxWait,
9199
Codec<TaskStatus> taskStatusCodec,
92-
EventLoop taskEventLoop,
100+
Executor executor,
93101
HttpClient httpClient,
94102
Duration maxErrorDuration,
103+
ScheduledExecutorService errorScheduledExecutor,
95104
RemoteTaskStats stats,
96105
boolean binaryTransportEnabled,
97106
boolean thriftTransportEnabled,
@@ -101,25 +110,23 @@ public ContinuousTaskStatusFetcher(
101110

102111
this.taskId = requireNonNull(taskId, "taskId is null");
103112
this.onFail = requireNonNull(onFail, "onFail is null");
104-
this.taskStatus = new StateMachine<>("task-" + taskId, taskEventLoop, initialTaskStatus);
113+
this.taskStatus = new StateMachine<>("task-" + taskId, executor, initialTaskStatus);
105114

106115
this.refreshMaxWait = requireNonNull(refreshMaxWait, "refreshMaxWait is null");
107116
this.taskStatusCodec = requireNonNull(taskStatusCodec, "taskStatusCodec is null");
108117

109-
this.taskEventLoop = requireNonNull(taskEventLoop, "taskEventLoop is null");
118+
this.executor = requireNonNull(executor, "executor is null");
110119
this.httpClient = requireNonNull(httpClient, "httpClient is null");
111120

112-
this.errorTracker = taskRequestErrorTracker(taskId, initialTaskStatus.getSelf(), maxErrorDuration, taskEventLoop, "getting task status");
121+
this.errorTracker = taskRequestErrorTracker(taskId, initialTaskStatus.getSelf(), maxErrorDuration, errorScheduledExecutor, "getting task status");
113122
this.stats = requireNonNull(stats, "stats is null");
114123
this.binaryTransportEnabled = binaryTransportEnabled;
115124
this.thriftTransportEnabled = thriftTransportEnabled;
116125
this.thriftProtocol = requireNonNull(thriftProtocol, "thriftProtocol is null");
117126
}
118127

119-
public void start()
128+
public synchronized void start()
120129
{
121-
verify(taskEventLoop.inEventLoop());
122-
123130
if (running) {
124131
// already running
125132
return;
@@ -128,10 +135,8 @@ public void start()
128135
scheduleNextRequest();
129136
}
130137

131-
public void stop()
138+
public synchronized void stop()
132139
{
133-
verify(taskEventLoop.inEventLoop());
134-
135140
running = false;
136141
if (future != null) {
137142
// do not terminate if the request is already running to avoid closing pooled connections
@@ -140,10 +145,8 @@ public void stop()
140145
}
141146
}
142147

143-
private void scheduleNextRequest()
148+
private synchronized void scheduleNextRequest()
144149
{
145-
verify(taskEventLoop.inEventLoop());
146-
147150
// stopped or done?
148151
TaskStatus taskStatus = getTaskStatus();
149152
if (!running || taskStatus.getState().isDone()) {
@@ -160,7 +163,7 @@ private void scheduleNextRequest()
160163
// if throttled due to error, asynchronously wait for timeout and try again
161164
ListenableFuture<?> errorRateLimit = errorTracker.acquireRequestPermit();
162165
if (!errorRateLimit.isDone()) {
163-
errorRateLimit.addListener(this::scheduleNextRequest, taskEventLoop);
166+
errorRateLimit.addListener(this::scheduleNextRequest, executor);
164167
return;
165168
}
166169

@@ -186,7 +189,7 @@ else if (binaryTransportEnabled) {
186189

187190
errorTracker.startRequest();
188191
future = httpClient.executeAsync(request, responseHandler);
189-
currentRequestStartNanos = System.nanoTime();
192+
currentRequestStartNanos.set(System.nanoTime());
190193
FutureCallback callback;
191194
if (thriftTransportEnabled) {
192195
callback = new ThriftHttpResponseHandler(this, request.getUri(), stats.getHttpResponseStats(), REMOTE_TASK_ERROR);
@@ -198,7 +201,7 @@ else if (binaryTransportEnabled) {
198201
Futures.addCallback(
199202
future,
200203
callback,
201-
taskEventLoop);
204+
executor);
202205
}
203206

204207
TaskStatus getTaskStatus()
@@ -209,62 +212,59 @@ TaskStatus getTaskStatus()
209212
@Override
210213
public void success(TaskStatus value)
211214
{
212-
verify(taskEventLoop.inEventLoop());
213-
214-
updateStats(currentRequestStartNanos);
215-
try {
216-
updateTaskStatus(value);
217-
errorTracker.requestSucceeded();
218-
}
219-
finally {
220-
scheduleNextRequest();
215+
try (SetThreadName ignored = new SetThreadName("ContinuousTaskStatusFetcher-%s", taskId)) {
216+
updateStats(currentRequestStartNanos.get());
217+
try {
218+
updateTaskStatus(value);
219+
errorTracker.requestSucceeded();
220+
}
221+
finally {
222+
scheduleNextRequest();
223+
}
221224
}
222225
}
223226

224227
@Override
225228
public void failed(Throwable cause)
226229
{
227-
verify(taskEventLoop.inEventLoop());
228-
229-
updateStats(currentRequestStartNanos);
230-
try {
231-
// if task not already done, record error
232-
TaskStatus taskStatus = getTaskStatus();
233-
if (!taskStatus.getState().isDone()) {
234-
errorTracker.requestFailed(cause);
230+
try (SetThreadName ignored = new SetThreadName("ContinuousTaskStatusFetcher-%s", taskId)) {
231+
updateStats(currentRequestStartNanos.get());
232+
try {
233+
// if task not already done, record error
234+
TaskStatus taskStatus = getTaskStatus();
235+
if (!taskStatus.getState().isDone()) {
236+
errorTracker.requestFailed(cause);
237+
}
238+
}
239+
catch (Error e) {
240+
onFail.accept(e);
241+
throw e;
242+
}
243+
catch (RuntimeException e) {
244+
onFail.accept(e);
245+
}
246+
finally {
247+
scheduleNextRequest();
235248
}
236-
}
237-
catch (Error e) {
238-
onFail.accept(e);
239-
throw e;
240-
}
241-
catch (RuntimeException e) {
242-
onFail.accept(e);
243-
}
244-
finally {
245-
scheduleNextRequest();
246249
}
247250
}
248251

249252
@Override
250253
public void fatal(Throwable cause)
251254
{
252-
verify(taskEventLoop.inEventLoop());
253-
254-
updateStats(currentRequestStartNanos);
255-
onFail.accept(cause);
255+
try (SetThreadName ignored = new SetThreadName("ContinuousTaskStatusFetcher-%s", taskId)) {
256+
updateStats(currentRequestStartNanos.get());
257+
onFail.accept(cause);
258+
}
256259
}
257260

258261
void updateTaskStatus(TaskStatus newValue)
259262
{
260-
verify(taskEventLoop.inEventLoop());
261-
262263
// change to new value if old value is not changed and new value has a newer version
263264
AtomicBoolean taskMismatch = new AtomicBoolean();
264265
taskStatus.setIf(newValue, oldValue -> {
265266
// did the task instance id change
266-
boolean isEmpty = (oldValue.getTaskInstanceIdLeastSignificantBits() == 0 && oldValue.getTaskInstanceIdMostSignificantBits() == 0)
267-
|| (newValue.getTaskInstanceIdLeastSignificantBits() == 0 && newValue.getTaskInstanceIdMostSignificantBits() == 0);
267+
boolean isEmpty = oldValue.getTaskInstanceIdLeastSignificantBits() == 0 && oldValue.getTaskInstanceIdMostSignificantBits() == 0;
268268
if (!isEmpty &&
269269
!(oldValue.getTaskInstanceIdLeastSignificantBits() == newValue.getTaskInstanceIdLeastSignificantBits() &&
270270
oldValue.getTaskInstanceIdMostSignificantBits() == newValue.getTaskInstanceIdMostSignificantBits())) {
@@ -291,6 +291,11 @@ void updateTaskStatus(TaskStatus newValue)
291291
}
292292
}
293293

294+
public synchronized boolean isRunning()
295+
{
296+
return running;
297+
}
298+
294299
/**
295300
* Listener is always notified asynchronously using a dedicated notification thread pool so, care should
296301
* be taken to avoid leaking {@code this} when adding a listener in a constructor. Additionally, it is
@@ -303,8 +308,6 @@ public void addStateChangeListener(StateMachine.StateChangeListener<TaskStatus>
303308

304309
private void updateStats(long currentRequestStartNanos)
305310
{
306-
verify(taskEventLoop.inEventLoop());
307-
308311
stats.statusRoundTripMillis(nanosSince(currentRequestStartNanos).toMillis());
309312
}
310313
}

0 commit comments

Comments
 (0)