This is an automated email from the ASF dual-hosted git repository.
zhouky pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-celeborn.git
The following commit(s) were added to refs/heads/main by this push:
new 57f775a7 [CELEBORN-273] Move push data timeout checker into
TransportResponseHandler to keep callback status consistence (#1208)
57f775a7 is described below
commit 57f775a7e9db42d530fbe72e7ae4b0ac601725af
Author: Angerszhuuuu <[email protected]>
AuthorDate: Thu Feb 16 18:27:37 2023 +0800
[CELEBORN-273] Move push data timeout checker into TransportResponseHandler
to keep callback status consistence (#1208)
---
.../apache/celeborn/client/ShuffleClientImpl.java | 33 +++---
.../celeborn/client/ShuffleClientImplSuiteJ.java | 7 +-
.../celeborn/client/ShuffleClientSuiteJ.java | 5 +-
.../celeborn/common/network/TransportContext.java | 2 +-
.../common/network/client/TransportClient.java | 25 +++--
.../network/client/TransportResponseHandler.java | 76 +++++++++++---
.../common/network/util/TransportConf.java | 4 +
.../common/write/InFlightRequestTracker.java | 116 +++++----------------
.../celeborn/common/write/PushRequestInfo.java | 37 +++++++
.../apache/celeborn/common/write/PushState.java | 58 ++---------
.../org/apache/celeborn/common/CelebornConf.scala | 3 +-
.../network/TransportResponseHandlerSuiteJ.java | 48 +++++++--
.../celeborn/tests/spark/PushDataTimeoutTest.scala | 1 +
.../celeborn/tests/spark/SparkTestBase.scala | 2 +-
.../service/deploy/worker/PushDataHandler.scala | 34 +-----
15 files changed, 220 insertions(+), 231 deletions(-)
diff --git
a/client/src/main/java/org/apache/celeborn/client/ShuffleClientImpl.java
b/client/src/main/java/org/apache/celeborn/client/ShuffleClientImpl.java
index 78fd1aa9..d0dc3428 100644
--- a/client/src/main/java/org/apache/celeborn/client/ShuffleClientImpl.java
+++ b/client/src/main/java/org/apache/celeborn/client/ShuffleClientImpl.java
@@ -34,7 +34,6 @@ import com.google.common.util.concurrent.Uninterruptibles;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.CompositeByteBuf;
import io.netty.buffer.Unpooled;
-import io.netty.channel.ChannelFuture;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -202,8 +201,7 @@ public class ShuffleClientImpl extends ShuffleClient {
PushData newPushData =
new PushData(MASTER_MODE, shuffleKey, newLoc.getUniqueId(),
newBuffer);
- ChannelFuture future = client.pushData(newPushData, callback);
- pushState.pushStarted(batchId, future, callback,
loc.hostAndPushPort(), pushDataTimeout);
+ client.pushData(newPushData, pushDataTimeout, callback);
} else {
throw new RuntimeException(
"Mock push data submit retry failed. remainReviveTimes = " +
remainReviveTimes + ".");
@@ -682,7 +680,7 @@ public class ShuffleClientImpl extends ShuffleClient {
attemptId,
nextBatchId);
splitPartition(shuffleId, partitionId, applicationId, loc);
- pushState.onSuccess(nextBatchId, loc.hostAndPushPort());
+ pushState.onSuccess(loc.hostAndPushPort());
callback.onSuccess(response);
} else if (reason == StatusCode.HARD_SPLIT.getValue()) {
logger.debug(
@@ -710,7 +708,7 @@ public class ShuffleClientImpl extends ShuffleClient {
mapId,
attemptId,
nextBatchId);
- pushState.onCongestControl(nextBatchId,
loc.hostAndPushPort());
+ pushState.onCongestControl(loc.hostAndPushPort());
callback.onSuccess(response);
} else if (reason ==
StatusCode.PUSH_DATA_SUCCESS_SLAVE_CONGESTED.getValue()) {
logger.debug(
@@ -718,15 +716,15 @@ public class ShuffleClientImpl extends ShuffleClient {
mapId,
attemptId,
nextBatchId);
- pushState.onCongestControl(nextBatchId,
loc.hostAndPushPort());
+ pushState.onCongestControl(loc.hostAndPushPort());
callback.onSuccess(response);
} else {
response.rewind();
- pushState.onSuccess(nextBatchId, loc.hostAndPushPort());
+ pushState.onSuccess(loc.hostAndPushPort());
callback.onSuccess(response);
}
} else {
- pushState.onSuccess(nextBatchId, loc.hostAndPushPort());
+ pushState.onSuccess(loc.hostAndPushPort());
callback.onSuccess(response);
}
}
@@ -794,9 +792,7 @@ public class ShuffleClientImpl extends ShuffleClient {
if (!testRetryRevive) {
TransportClient client =
dataClientFactory.createClient(loc.getHost(), loc.getPushPort(),
partitionId);
- ChannelFuture future = client.pushData(pushData, wrappedCallback);
- pushState.pushStarted(
- nextBatchId, future, wrappedCallback, loc.hostAndPushPort(),
pushDataTimeout);
+ client.pushData(pushData, pushDataTimeout, wrappedCallback);
} else {
wrappedCallback.onFailure(
new Exception(
@@ -1067,7 +1063,7 @@ public class ShuffleClientImpl extends ShuffleClient {
mapId,
attemptId,
Arrays.toString(batchIds));
- pushState.onCongestControl(groupedBatchId, hostPort);
+ pushState.onCongestControl(hostPort);
callback.onSuccess(response);
} else if (reason ==
StatusCode.PUSH_DATA_SUCCESS_SLAVE_CONGESTED.getValue()) {
logger.debug(
@@ -1075,17 +1071,17 @@ public class ShuffleClientImpl extends ShuffleClient {
mapId,
attemptId,
Arrays.toString(batchIds));
- pushState.onCongestControl(groupedBatchId, hostPort);
+ pushState.onCongestControl(hostPort);
callback.onSuccess(response);
} else {
// Should not happen in current architecture.
response.rewind();
logger.error("Push merged data should not receive this
response");
- pushState.onSuccess(groupedBatchId, hostPort);
+ pushState.onSuccess(hostPort);
callback.onSuccess(response);
}
} else {
- pushState.onSuccess(groupedBatchId, hostPort);
+ pushState.onSuccess(hostPort);
callback.onSuccess(response);
}
}
@@ -1141,8 +1137,7 @@ public class ShuffleClientImpl extends ShuffleClient {
try {
if (!testRetryRevive || remainReviveTimes < 1) {
TransportClient client = dataClientFactory.createClient(host, port);
- ChannelFuture future = client.pushMergedData(mergedData,
wrappedCallback);
- pushState.pushStarted(groupedBatchId, future, wrappedCallback,
hostPort, pushDataTimeout);
+ client.pushMergedData(mergedData, pushDataTimeout, wrappedCallback);
} else {
wrappedCallback.onFailure(
new Exception(
@@ -1514,9 +1509,7 @@ public class ShuffleClientImpl extends ShuffleClient {
// do push data
try {
TransportClient client = createClientWaitingInFlightRequest(location,
mapKey, pushState);
- ChannelFuture future = client.pushData(pushData, callback);
- pushState.pushStarted(
- nextBatchId, future, callback, location.hostAndPushPort(),
pushDataTimeout);
+ client.pushData(pushData, pushDataTimeout, callback);
} catch (Exception e) {
logger.warn("PushData byteBuf failed", e);
callback.onFailure(
diff --git
a/client/src/test/java/org/apache/celeborn/client/ShuffleClientImplSuiteJ.java
b/client/src/test/java/org/apache/celeborn/client/ShuffleClientImplSuiteJ.java
index ae368d2f..33b0c2af 100644
---
a/client/src/test/java/org/apache/celeborn/client/ShuffleClientImplSuiteJ.java
+++
b/client/src/test/java/org/apache/celeborn/client/ShuffleClientImplSuiteJ.java
@@ -18,6 +18,7 @@
package org.apache.celeborn.client;
import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyLong;
import static org.mockito.Mockito.when;
import java.io.IOException;
@@ -56,7 +57,7 @@ public class ShuffleClientImplSuiteJ extends
ShuffleClientBaseSuiteJ {
@Test
public void testPushDataByteBufSuccess() throws IOException {
ByteBuf byteBuf = createByteBuf();
- when(client.pushData(any(), any()))
+ when(client.pushData(any(), anyLong(), any()))
.thenAnswer(
t -> {
RpcResponseCallback rpcResponseCallback =
@@ -82,7 +83,7 @@ public class ShuffleClientImplSuiteJ extends
ShuffleClientBaseSuiteJ {
@Test
public void testPushDataByteBufHardSplit() throws IOException {
ByteBuf byteBuf = Unpooled.wrappedBuffer(TEST_BUF1);
- when(client.pushData(any(), any()))
+ when(client.pushData(any(), anyLong(), any()))
.thenAnswer(
t -> {
RpcResponseCallback rpcResponseCallback =
@@ -107,7 +108,7 @@ public class ShuffleClientImplSuiteJ extends
ShuffleClientBaseSuiteJ {
@Test
public void testPushDataByteBufFail() throws IOException {
ByteBuf byteBuf = Unpooled.wrappedBuffer(TEST_BUF1);
- when(client.pushData(any(), any()))
+ when(client.pushData(any(), anyLong(), any()))
.thenAnswer(
t -> {
RpcResponseCallback rpcResponseCallback =
diff --git
a/client/src/test/java/org/apache/celeborn/client/ShuffleClientSuiteJ.java
b/client/src/test/java/org/apache/celeborn/client/ShuffleClientSuiteJ.java
index bb5f5aa4..24af088b 100644
--- a/client/src/test/java/org/apache/celeborn/client/ShuffleClientSuiteJ.java
+++ b/client/src/test/java/org/apache/celeborn/client/ShuffleClientSuiteJ.java
@@ -18,6 +18,7 @@
package org.apache.celeborn.client;
import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyLong;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@@ -312,12 +313,12 @@ public class ShuffleClientSuiteJ {
}
};
- when(client.pushData(any(), any())).thenAnswer(t -> mockedFuture);
+ when(client.pushData(any(), anyLong(), any())).thenAnswer(t ->
mockedFuture);
when(clientFactory.createClient(
masterLocation.getHost(), masterLocation.getPushPort(),
TEST_REDUCRE_ID))
.thenAnswer(t -> client);
- when(client.pushMergedData(any(), any())).thenAnswer(t -> mockedFuture);
+ when(client.pushMergedData(any(), anyLong(), any())).thenAnswer(t ->
mockedFuture);
when(clientFactory.createClient(masterLocation.getHost(),
masterLocation.getPushPort()))
.thenAnswer(t -> client);
diff --git
a/common/src/main/java/org/apache/celeborn/common/network/TransportContext.java
b/common/src/main/java/org/apache/celeborn/common/network/TransportContext.java
index a4fd5035..69268de8 100644
---
a/common/src/main/java/org/apache/celeborn/common/network/TransportContext.java
+++
b/common/src/main/java/org/apache/celeborn/common/network/TransportContext.java
@@ -115,7 +115,7 @@ public class TransportContext {
private TransportChannelHandler createChannelHandler(
Channel channel, BaseMessageHandler msgHandler) {
- TransportResponseHandler responseHandler = new
TransportResponseHandler(channel);
+ TransportResponseHandler responseHandler = new
TransportResponseHandler(conf, channel);
TransportClient client = new TransportClient(channel, responseHandler);
TransportRequestHandler requestHandler =
new TransportRequestHandler(channel, client, msgHandler);
diff --git
a/common/src/main/java/org/apache/celeborn/common/network/client/TransportClient.java
b/common/src/main/java/org/apache/celeborn/common/network/client/TransportClient.java
index 10304a5e..5631518b 100644
---
a/common/src/main/java/org/apache/celeborn/common/network/client/TransportClient.java
+++
b/common/src/main/java/org/apache/celeborn/common/network/client/TransportClient.java
@@ -38,6 +38,7 @@ import org.slf4j.LoggerFactory;
import org.apache.celeborn.common.network.buffer.NioManagedBuffer;
import org.apache.celeborn.common.network.protocol.*;
import org.apache.celeborn.common.network.util.NettyUtils;
+import org.apache.celeborn.common.write.PushRequestInfo;
/**
* Client for fetching consecutive chunks of a pre-negotiated stream. This API
is intended to allow
@@ -156,32 +157,40 @@ public class TransportClient implements Closeable {
return requestId;
}
- public ChannelFuture pushData(PushData pushData, RpcResponseCallback
callback) {
+ public ChannelFuture pushData(
+ PushData pushData, long pushDataTimeout, RpcResponseCallback callback) {
if (logger.isTraceEnabled()) {
logger.trace("Pushing data to {}", NettyUtils.getRemoteAddress(channel));
}
long requestId = requestId();
- handler.addPushRequest(requestId, callback);
-
+ long dueTime = System.currentTimeMillis() + pushDataTimeout;
+ PushRequestInfo info = new PushRequestInfo(dueTime, callback);
+ handler.addPushRequest(requestId, info);
pushData.requestId = requestId;
PushChannelListener listener = new PushChannelListener(requestId,
callback);
- return channel.writeAndFlush(pushData).addListener(listener);
+ ChannelFuture channelFuture =
channel.writeAndFlush(pushData).addListener(listener);
+ info.setChannelFuture(channelFuture);
+ return channelFuture;
}
- public ChannelFuture pushMergedData(PushMergedData pushMergedData,
RpcResponseCallback callback) {
+ public ChannelFuture pushMergedData(
+ PushMergedData pushMergedData, long pushDataTimeout, RpcResponseCallback
callback) {
if (logger.isTraceEnabled()) {
logger.trace("Pushing merged data to {}",
NettyUtils.getRemoteAddress(channel));
}
long requestId = requestId();
- handler.addPushRequest(requestId, callback);
-
+ long dueTime = System.currentTimeMillis() + pushDataTimeout;
+ PushRequestInfo info = new PushRequestInfo(dueTime, callback);
+ handler.addPushRequest(requestId, info);
pushMergedData.requestId = requestId;
PushChannelListener listener = new PushChannelListener(requestId,
callback);
- return channel.writeAndFlush(pushMergedData).addListener(listener);
+ ChannelFuture channelFuture =
channel.writeAndFlush(pushMergedData).addListener(listener);
+ info.setChannelFuture(channelFuture);
+ return channelFuture;
}
/**
diff --git
a/common/src/main/java/org/apache/celeborn/common/network/client/TransportResponseHandler.java
b/common/src/main/java/org/apache/celeborn/common/network/client/TransportResponseHandler.java
index 07d56a49..337b8487 100644
---
a/common/src/main/java/org/apache/celeborn/common/network/client/TransportResponseHandler.java
+++
b/common/src/main/java/org/apache/celeborn/common/network/client/TransportResponseHandler.java
@@ -18,8 +18,11 @@
package org.apache.celeborn.common.network.client;
import java.io.IOException;
+import java.util.Iterator;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicLong;
import io.netty.channel.Channel;
@@ -29,6 +32,11 @@ import org.slf4j.LoggerFactory;
import org.apache.celeborn.common.network.protocol.*;
import org.apache.celeborn.common.network.server.MessageHandler;
import org.apache.celeborn.common.network.util.NettyUtils;
+import org.apache.celeborn.common.network.util.TransportConf;
+import org.apache.celeborn.common.protocol.TransportModuleConstants;
+import org.apache.celeborn.common.protocol.message.StatusCode;
+import org.apache.celeborn.common.util.ThreadUtils;
+import org.apache.celeborn.common.write.PushRequestInfo;
/**
* Handler that processes server responses, in response to requests issued
from a
@@ -39,22 +47,62 @@ import org.apache.celeborn.common.network.util.NettyUtils;
public class TransportResponseHandler extends MessageHandler<ResponseMessage> {
private static final Logger logger =
LoggerFactory.getLogger(TransportResponseHandler.class);
+ private final TransportConf conf;
private final Channel channel;
private final Map<StreamChunkSlice, ChunkReceivedCallback>
outstandingFetches;
private final Map<Long, RpcResponseCallback> outstandingRpcs;
- private final Map<Long, RpcResponseCallback> outstandingPushes;
+ private final ConcurrentHashMap<Long, PushRequestInfo> outstandingPushes;
/** Records the time (in system nanoseconds) that the last fetch or RPC
request was sent. */
private final AtomicLong timeOfLastRequestNs;
- public TransportResponseHandler(Channel channel) {
+ private final ScheduledExecutorService pushTimeoutChecker;
+ private final long pushTimeoutCheckerInterval;
+
+ public TransportResponseHandler(TransportConf conf, Channel channel) {
+ this.conf = conf;
this.channel = channel;
this.outstandingFetches = new ConcurrentHashMap<>();
this.outstandingRpcs = new ConcurrentHashMap<>();
this.outstandingPushes = new ConcurrentHashMap<>();
this.timeOfLastRequestNs = new AtomicLong(0);
+ pushTimeoutCheckerInterval = conf.pushDataTimeoutCheckIntervalMs();
+ pushTimeoutChecker =
+
ThreadUtils.newDaemonSingleThreadScheduledExecutor("push-timeout-checker-" +
this);
+ pushTimeoutChecker.scheduleAtFixedRate(
+ () -> failExpiredPushRequest(),
+ pushTimeoutCheckerInterval,
+ pushTimeoutCheckerInterval,
+ TimeUnit.MILLISECONDS);
+ }
+
+ public void failExpiredPushRequest() {
+ long currentTime = System.currentTimeMillis();
+ Iterator<Map.Entry<Long, PushRequestInfo>> iter =
outstandingPushes.entrySet().iterator();
+ while (iter.hasNext()) {
+ Map.Entry<Long, PushRequestInfo> entry = iter.next();
+ if (entry.getValue().dueTime <= currentTime) {
+ PushRequestInfo info = outstandingPushes.remove(entry.getKey());
+ if (info != null) {
+ if (info.channelFuture != null) {
+ info.channelFuture.cancel(true);
+ }
+ // When module name equals to DATA_MODULE, mean shuffle client push
data, else means
+ // do data replication.
+ if
(TransportModuleConstants.DATA_MODULE.equals(conf.getModuleName())) {
+ info.callback.onFailure(
+ new
IOException(StatusCode.PUSH_DATA_TIMEOUT_MASTER.getMessage()));
+ } else if
(TransportModuleConstants.PUSH_MODULE.equals(conf.getModuleName())) {
+ info.callback.onFailure(
+ new
IOException(StatusCode.PUSH_DATA_TIMEOUT_SLAVE.getMessage()));
+ }
+ info.channelFuture = null;
+ info.callback = null;
+ }
+ }
+ }
}
public void addFetchRequest(StreamChunkSlice streamChunkSlice,
ChunkReceivedCallback callback) {
@@ -81,12 +129,12 @@ public class TransportResponseHandler extends
MessageHandler<ResponseMessage> {
outstandingRpcs.remove(requestId);
}
- public void addPushRequest(long requestId, RpcResponseCallback callback) {
+ public void addPushRequest(long requestId, PushRequestInfo info) {
updateTimeOfLastRequest();
if (outstandingPushes.containsKey(requestId)) {
logger.warn("[addPushRequest] requestId {} already exists!", requestId);
}
- outstandingPushes.put(requestId, callback);
+ outstandingPushes.put(requestId, info);
}
public void removePushRequest(long requestId) {
@@ -112,9 +160,9 @@ public class TransportResponseHandler extends
MessageHandler<ResponseMessage> {
logger.warn("RpcResponseCallback.onFailure throws exception", e);
}
}
- for (Map.Entry<Long, RpcResponseCallback> entry :
outstandingPushes.entrySet()) {
+ for (Map.Entry<Long, PushRequestInfo> entry :
outstandingPushes.entrySet()) {
try {
- entry.getValue().onFailure(cause);
+ entry.getValue().callback.onFailure(cause);
} catch (Exception e) {
logger.warn("RpcResponseCallback.onFailure throws exception", e);
}
@@ -186,9 +234,9 @@ public class TransportResponseHandler extends
MessageHandler<ResponseMessage> {
}
} else if (message instanceof RpcResponse) {
RpcResponse resp = (RpcResponse) message;
- RpcResponseCallback listener = outstandingPushes.remove(resp.requestId);
- if (listener == null) {
- listener = outstandingRpcs.remove(resp.requestId);
+ PushRequestInfo info = outstandingPushes.remove(resp.requestId);
+ if (info == null) {
+ RpcResponseCallback listener = outstandingRpcs.remove(resp.requestId);
if (listener == null) {
logger.warn(
"Ignoring response for RPC {} from {} ({} bytes) since it is not
outstanding",
@@ -205,16 +253,16 @@ public class TransportResponseHandler extends
MessageHandler<ResponseMessage> {
}
} else {
try {
- listener.onSuccess(resp.body().nioByteBuffer());
+ info.callback.onSuccess(resp.body().nioByteBuffer());
} finally {
resp.body().release();
}
}
} else if (message instanceof RpcFailure) {
RpcFailure resp = (RpcFailure) message;
- RpcResponseCallback listener = outstandingPushes.remove(resp.requestId);
- if (listener == null) {
- listener = outstandingRpcs.remove(resp.requestId);
+ PushRequestInfo info = outstandingPushes.remove(resp.requestId);
+ if (info == null) {
+ RpcResponseCallback listener = outstandingRpcs.remove(resp.requestId);
if (listener == null) {
logger.warn(
"Ignoring response for RPC {} from {} ({}) since it is not
outstanding",
@@ -225,7 +273,7 @@ public class TransportResponseHandler extends
MessageHandler<ResponseMessage> {
listener.onFailure(new RuntimeException(resp.errorString));
}
} else {
- listener.onFailure(new RuntimeException(resp.errorString));
+ info.callback.onFailure(new RuntimeException(resp.errorString));
}
} else {
throw new IllegalStateException("Unknown response type: " +
message.type());
diff --git
a/common/src/main/java/org/apache/celeborn/common/network/util/TransportConf.java
b/common/src/main/java/org/apache/celeborn/common/network/util/TransportConf.java
index 7590df81..29d40f2a 100644
---
a/common/src/main/java/org/apache/celeborn/common/network/util/TransportConf.java
+++
b/common/src/main/java/org/apache/celeborn/common/network/util/TransportConf.java
@@ -144,4 +144,8 @@ public class TransportConf {
public String decoderMode() {
return conf.networkIoDecoderMode(module);
}
+
+ public long pushDataTimeoutCheckIntervalMs() {
+ return conf.pushTimeoutCheckInterval();
+ }
}
diff --git
a/common/src/main/java/org/apache/celeborn/common/write/InFlightRequestTracker.java
b/common/src/main/java/org/apache/celeborn/common/write/InFlightRequestTracker.java
index 336bba9c..c8c4d845 100644
---
a/common/src/main/java/org/apache/celeborn/common/write/InFlightRequestTracker.java
+++
b/common/src/main/java/org/apache/celeborn/common/write/InFlightRequestTracker.java
@@ -18,18 +18,15 @@
package org.apache.celeborn.common.write;
import java.io.IOException;
-import java.util.Map;
import java.util.Optional;
+import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;
-import io.netty.channel.ChannelFuture;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.celeborn.common.CelebornConf;
-import org.apache.celeborn.common.network.client.RpcResponseCallback;
-import org.apache.celeborn.common.protocol.message.StatusCode;
/*
* This class is for track in flight request and limit request.
@@ -43,8 +40,8 @@ public class InFlightRequestTracker {
private final PushStrategy pushStrategy;
private final AtomicInteger batchId = new AtomicInteger();
- private final ConcurrentHashMap<String, ConcurrentHashMap<Integer,
BatchInfo>>
- inflightBatchesPerAddress = new ConcurrentHashMap<>();
+ private final ConcurrentHashMap<String, Set<Integer>>
inflightBatchesPerAddress =
+ new ConcurrentHashMap<>();
public InFlightRequestTracker(CelebornConf conf, PushState pushState) {
this.waitInflightTimeoutMs = conf.pushLimitInFlightTimeoutMs();
@@ -54,34 +51,31 @@ public class InFlightRequestTracker {
}
public void addBatch(int batchId, String hostAndPushPort) {
- ConcurrentHashMap<Integer, BatchInfo> batchIdSetPerPair =
- inflightBatchesPerAddress.computeIfAbsent(hostAndPushPort, id -> new
ConcurrentHashMap<>());
- batchIdSetPerPair.computeIfAbsent(batchId, id -> new BatchInfo());
+ Set<Integer> batchIdSetPerPair =
+ inflightBatchesPerAddress.computeIfAbsent(
+ hostAndPushPort, id -> ConcurrentHashMap.newKeySet());
+ batchIdSetPerPair.add(batchId);
}
- public void onSuccess(int batchId, String hostAndPushPort) {
- pushStrategy.onSuccess(hostAndPushPort);
+ public void removeBatch(int batchId, String hostAndPushPort) {
+ Set<Integer> batchIdSet = inflightBatchesPerAddress.get(hostAndPushPort);
+ batchIdSet.remove(batchId);
+ if (batchIdSet.size() == 0) {
+ inflightBatchesPerAddress.remove(hostAndPushPort);
+ }
}
- public void onCongestControl(int batchId, String hostAndPushPort) {
- pushStrategy.onCongestControl(hostAndPushPort);
+ public void onSuccess(String hostAndPushPort) {
+ pushStrategy.onSuccess(hostAndPushPort);
}
- public void removeBatch(int batchId, String hostAndPushPort) {
- ConcurrentHashMap<Integer, BatchInfo> batchIdMap =
- inflightBatchesPerAddress.get(hostAndPushPort);
- BatchInfo info = batchIdMap.remove(batchId);
- if (info != null && info.channelFuture != null) {
- info.channelFuture.cancel(true);
- }
- if (batchIdMap.size() == 0) {
- inflightBatchesPerAddress.remove(hostAndPushPort);
- }
+ public void onCongestControl(String hostAndPushPort) {
+ pushStrategy.onCongestControl(hostAndPushPort);
}
- public ConcurrentHashMap<Integer, BatchInfo>
getBatchIdSetByAddressPair(String hostAndPort) {
+ public Set<Integer> getBatchIdSetByAddressPair(String hostAndPort) {
return inflightBatchesPerAddress.computeIfAbsent(
- hostAndPort, pair -> new ConcurrentHashMap<>());
+ hostAndPort, pair -> ConcurrentHashMap.newKeySet());
}
public boolean limitMaxInFlight(String hostAndPushPort) throws IOException {
@@ -92,17 +86,16 @@ public class InFlightRequestTracker {
pushStrategy.limitPushSpeed(pushState, hostAndPushPort);
int currentMaxReqsInFlight =
pushStrategy.getCurrentMaxReqsInFlight(hostAndPushPort);
- ConcurrentHashMap<Integer, BatchInfo> batchIdMap =
getBatchIdSetByAddressPair(hostAndPushPort);
+ Set batchIdSet = getBatchIdSetByAddressPair(hostAndPushPort);
long times = waitInflightTimeoutMs / delta;
try {
while (times > 0) {
- if (batchIdMap.size() <= currentMaxReqsInFlight) {
+ if (batchIdSet.size() <= currentMaxReqsInFlight) {
break;
}
if (pushState.exception.get() != null) {
throw pushState.exception.get();
}
- failExpiredBatch(true);
Thread.sleep(delta);
times--;
}
@@ -117,7 +110,7 @@ public class InFlightRequestTracker {
+ "for hostAndPushPort {}, "
+ "which exceeds the current limit {}.",
waitInflightTimeoutMs,
- batchIdMap.size(),
+ batchIdSet.size(),
hostAndPushPort,
currentMaxReqsInFlight);
}
@@ -139,7 +132,7 @@ public class InFlightRequestTracker {
try {
while (times > 0) {
Optional<Integer> inFlightSizeOptional =
-
inflightBatchesPerAddress.values().stream().map(Map::size).reduce(Integer::sum);
+
inflightBatchesPerAddress.values().stream().map(Set::size).reduce(Integer::sum);
inFlightSize = inFlightSizeOptional.orElse(0);
if (inFlightSize == 0) {
break;
@@ -147,7 +140,6 @@ public class InFlightRequestTracker {
if (pushState.exception.get() != null) {
throw pushState.exception.get();
}
- failExpiredBatch(true);
Thread.sleep(delta);
times--;
}
@@ -174,76 +166,18 @@ public class InFlightRequestTracker {
throw pushState.exception.get();
}
- ConcurrentHashMap<Integer, BatchInfo> batchIdMap =
getBatchIdSetByAddressPair(hostAndPushPort);
- return batchIdMap.size() > maxInFlight;
+ Set<Integer> batchIdSet = getBatchIdSetByAddressPair(hostAndPushPort);
+ return batchIdSet.size() > maxInFlight;
}
protected int nextBatchId() {
return batchId.incrementAndGet();
}
- /**
- * Trigger expired push request.
- *
- * @param isMaster When true means push data, when false means replicate
data.
- */
- public synchronized void failExpiredBatch(boolean isMaster) {
- long currentTime = System.currentTimeMillis();
- inflightBatchesPerAddress
- .values()
- .forEach(
- batchIdMap ->
- batchIdMap
- .values()
- .forEach(
- info -> {
- // Compatible with older versions of client
- if (info.pushDataTimeout > 0) {
- if (info.pushTime != -1
- && (currentTime - info.pushTime >
info.pushDataTimeout)) {
- if (info.callback != null) {
- info.channelFuture.cancel(true);
- if (isMaster) {
- info.callback.onFailure(
- new IOException(
-
StatusCode.PUSH_DATA_TIMEOUT_MASTER.getMessage()));
- } else {
- info.callback.onFailure(
- new IOException(
-
StatusCode.PUSH_DATA_TIMEOUT_SLAVE.getMessage()));
- }
- info.channelFuture = null;
- info.callback = null;
- }
- }
- }
- }));
- }
-
public void cleanup() {
if (!inflightBatchesPerAddress.isEmpty()) {
- logger.debug("Cancel all {} futures.", inflightBatchesPerAddress.size());
- inflightBatchesPerAddress
- .values()
- .forEach(
- batchIdMap ->
- batchIdMap
- .values()
- .forEach(
- info -> {
- if (info.channelFuture != null) {
- info.channelFuture.cancel(true);
- }
- }));
inflightBatchesPerAddress.clear();
}
pushStrategy.clear();
}
-
- static class BatchInfo {
- ChannelFuture channelFuture;
- long pushTime = -1;
- long pushDataTimeout;
- RpcResponseCallback callback;
- }
}
diff --git
a/common/src/main/java/org/apache/celeborn/common/write/PushRequestInfo.java
b/common/src/main/java/org/apache/celeborn/common/write/PushRequestInfo.java
new file mode 100644
index 00000000..691b4335
--- /dev/null
+++ b/common/src/main/java/org/apache/celeborn/common/write/PushRequestInfo.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.celeborn.common.write;
+
+import io.netty.channel.ChannelFuture;
+
+import org.apache.celeborn.common.network.client.RpcResponseCallback;
+
+public class PushRequestInfo {
+ public ChannelFuture channelFuture;
+ public long dueTime;
+ public RpcResponseCallback callback;
+
+ public PushRequestInfo(long dueTime, RpcResponseCallback callback) {
+ this.dueTime = dueTime;
+ this.callback = callback;
+ }
+
+ public void setChannelFuture(ChannelFuture future) {
+ this.channelFuture = future;
+ }
+}
diff --git
a/common/src/main/java/org/apache/celeborn/common/write/PushState.java
b/common/src/main/java/org/apache/celeborn/common/write/PushState.java
index dd342f2c..550989ca 100644
--- a/common/src/main/java/org/apache/celeborn/common/write/PushState.java
+++ b/common/src/main/java/org/apache/celeborn/common/write/PushState.java
@@ -19,52 +19,20 @@ package org.apache.celeborn.common.write;
import java.io.IOException;
import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicReference;
-import io.netty.channel.ChannelFuture;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
import org.apache.celeborn.common.CelebornConf;
-import org.apache.celeborn.common.network.client.RpcResponseCallback;
import org.apache.celeborn.common.protocol.PartitionLocation;
-import org.apache.celeborn.common.util.ThreadUtils;
public class PushState {
- private static final Logger logger =
LoggerFactory.getLogger(PushState.class);
private final int pushBufferMaxSize;
public AtomicReference<IOException> exception = new AtomicReference<>();
private final InFlightRequestTracker inFlightRequestTracker;
- private ScheduledExecutorService pushTimeoutChecker;
- private long pushTimeoutCheckerInterval;
public PushState(CelebornConf conf) {
pushBufferMaxSize = conf.pushBufferMaxSize();
inFlightRequestTracker = new InFlightRequestTracker(conf, this);
- pushTimeoutCheckerInterval = conf.pushTimeoutCheckInterval();
- }
-
- public void pushStarted(
- int batchId,
- ChannelFuture future,
- RpcResponseCallback callback,
- String hostAndPort,
- long pushDataTimeout) {
- InFlightRequestTracker.BatchInfo info =
-
inFlightRequestTracker.getBatchIdSetByAddressPair(hostAndPort).get(batchId);
- // In rare cases info could be null. For example, a speculative task has
one thread pushing,
- // and other thread retry-pushing. At time 1 thread 1 find StageEnded,
then it cleans up
- // PushState, at the same time thread 2 pushes data and calles pushStarted,
- // at this time info will be null
- if (info != null) {
- info.pushTime = System.currentTimeMillis();
- info.pushDataTimeout = pushDataTimeout;
- info.channelFuture = future;
- info.callback = callback;
- }
}
public void cleanup() {
@@ -101,16 +69,16 @@ public class PushState {
inFlightRequestTracker.addBatch(batchId, hostAndPushPort);
}
- public void onSuccess(int batchId, String hostAndPushPort) {
- inFlightRequestTracker.onSuccess(batchId, hostAndPushPort);
+ public void removeBatch(int batchId, String hostAndPushPort) {
+ inFlightRequestTracker.removeBatch(batchId, hostAndPushPort);
}
- public void onCongestControl(int batchId, String hostAndPushPort) {
- inFlightRequestTracker.onCongestControl(batchId, hostAndPushPort);
+ public void onSuccess(String hostAndPushPort) {
+ inFlightRequestTracker.onSuccess(hostAndPushPort);
}
- public void removeBatch(int batchId, String hostAndPushPort) {
- inFlightRequestTracker.removeBatch(batchId, hostAndPushPort);
+ public void onCongestControl(String hostAndPushPort) {
+ inFlightRequestTracker.onCongestControl(hostAndPushPort);
}
public boolean limitMaxInFlight(String hostAndPushPort) throws IOException {
@@ -124,18 +92,4 @@ public class PushState {
public boolean reachLimit(String hostAndPushPort, int maxInFlight) throws
IOException {
return inFlightRequestTracker.reachLimit(hostAndPushPort, maxInFlight);
}
-
- public void startChecker(boolean isMaster) {
- pushTimeoutChecker =
ThreadUtils.newDaemonSingleThreadScheduledExecutor("push-timeout-checker");
- pushTimeoutChecker.scheduleAtFixedRate(
- new Runnable() {
- @Override
- public void run() {
- inFlightRequestTracker.failExpiredBatch(isMaster);
- }
- },
- pushTimeoutCheckerInterval,
- pushTimeoutCheckerInterval,
- TimeUnit.MILLISECONDS);
- }
}
diff --git
a/common/src/main/scala/org/apache/celeborn/common/CelebornConf.scala
b/common/src/main/scala/org/apache/celeborn/common/CelebornConf.scala
index 5a4c24de..64c4d102 100644
--- a/common/src/main/scala/org/apache/celeborn/common/CelebornConf.scala
+++ b/common/src/main/scala/org/apache/celeborn/common/CelebornConf.scala
@@ -1325,7 +1325,7 @@ object CelebornConf extends Logging {
.doc("Interval for checking push data timeout.")
.version("0.3.0")
.timeConf(TimeUnit.MILLISECONDS)
- .createWithDefaultString("60s")
+ .createWithDefaultString("30s")
val FETCH_TIMEOUT: ConfigEntry[Long] =
buildConf("celeborn.fetch.timeout")
@@ -2196,6 +2196,7 @@ object CelebornConf extends Logging {
.version("0.2.0")
.doc(s"Timeout for a task to push data rpc message. This value should
better be more than twice of `${PUSH_TIMEOUT_CHECK_INTERVAL.key}`")
.timeConf(TimeUnit.MILLISECONDS)
+ .checkValue(_ > 0, "celeborn.push.data.timeout must be positive!")
.createWithDefaultString("120s")
val TEST_PUSH_MASTER_DATA_TIMEOUT: ConfigEntry[Boolean] =
diff --git
a/common/src/test/java/org/apache/celeborn/common/network/TransportResponseHandlerSuiteJ.java
b/common/src/test/java/org/apache/celeborn/common/network/TransportResponseHandlerSuiteJ.java
index b4ae735d..c71411c3 100644
---
a/common/src/test/java/org/apache/celeborn/common/network/TransportResponseHandlerSuiteJ.java
+++
b/common/src/test/java/org/apache/celeborn/common/network/TransportResponseHandlerSuiteJ.java
@@ -22,21 +22,29 @@ import static org.mockito.Mockito.*;
import java.nio.ByteBuffer;
+import io.netty.channel.ChannelFuture;
import io.netty.channel.local.LocalChannel;
import org.junit.Test;
+import org.apache.celeborn.common.CelebornConf;
import org.apache.celeborn.common.network.buffer.NioManagedBuffer;
import org.apache.celeborn.common.network.client.ChunkReceivedCallback;
import org.apache.celeborn.common.network.client.RpcResponseCallback;
import org.apache.celeborn.common.network.client.TransportResponseHandler;
import org.apache.celeborn.common.network.protocol.*;
+import org.apache.celeborn.common.protocol.TransportModuleConstants;
+import org.apache.celeborn.common.util.Utils;
+import org.apache.celeborn.common.write.PushRequestInfo;
public class TransportResponseHandlerSuiteJ {
@Test
public void handleSuccessfulFetch() throws Exception {
StreamChunkSlice streamChunkSlice = new StreamChunkSlice(1, 0);
- TransportResponseHandler handler = new TransportResponseHandler(new
LocalChannel());
+ TransportResponseHandler handler =
+ new TransportResponseHandler(
+ Utils.fromCelebornConf(new CelebornConf(),
TransportModuleConstants.FETCH_MODULE, 8),
+ new LocalChannel());
ChunkReceivedCallback callback = mock(ChunkReceivedCallback.class);
handler.addFetchRequest(streamChunkSlice, callback);
assertEquals(1, handler.numOutstandingRequests());
@@ -49,7 +57,10 @@ public class TransportResponseHandlerSuiteJ {
@Test
public void handleFailedFetch() throws Exception {
StreamChunkSlice streamChunkSlice = new StreamChunkSlice(1, 0);
- TransportResponseHandler handler = new TransportResponseHandler(new
LocalChannel());
+ TransportResponseHandler handler =
+ new TransportResponseHandler(
+ Utils.fromCelebornConf(new CelebornConf(),
TransportModuleConstants.FETCH_MODULE, 8),
+ new LocalChannel());
ChunkReceivedCallback callback = mock(ChunkReceivedCallback.class);
handler.addFetchRequest(streamChunkSlice, callback);
assertEquals(1, handler.numOutstandingRequests());
@@ -61,7 +72,10 @@ public class TransportResponseHandlerSuiteJ {
@Test
public void clearAllOutstandingRequests() throws Exception {
- TransportResponseHandler handler = new TransportResponseHandler(new
LocalChannel());
+ TransportResponseHandler handler =
+ new TransportResponseHandler(
+ Utils.fromCelebornConf(new CelebornConf(),
TransportModuleConstants.DATA_MODULE, 8),
+ new LocalChannel());
ChunkReceivedCallback callback = mock(ChunkReceivedCallback.class);
handler.addFetchRequest(new StreamChunkSlice(1, 0), callback);
handler.addFetchRequest(new StreamChunkSlice(1, 1), callback);
@@ -80,7 +94,10 @@ public class TransportResponseHandlerSuiteJ {
@Test
public void handleSuccessfulRPC() throws Exception {
- TransportResponseHandler handler = new TransportResponseHandler(new
LocalChannel());
+ TransportResponseHandler handler =
+ new TransportResponseHandler(
+ Utils.fromCelebornConf(new CelebornConf(),
TransportModuleConstants.RPC_MODULE, 8),
+ new LocalChannel());
RpcResponseCallback callback = mock(RpcResponseCallback.class);
handler.addRpcRequest(12345, callback);
assertEquals(1, handler.numOutstandingRequests());
@@ -97,7 +114,10 @@ public class TransportResponseHandlerSuiteJ {
@Test
public void handleFailedRPC() throws Exception {
- TransportResponseHandler handler = new TransportResponseHandler(new
LocalChannel());
+ TransportResponseHandler handler =
+ new TransportResponseHandler(
+ Utils.fromCelebornConf(new CelebornConf(),
TransportModuleConstants.RPC_MODULE, 8),
+ new LocalChannel());
RpcResponseCallback callback = mock(RpcResponseCallback.class);
handler.addRpcRequest(12345, callback);
assertEquals(1, handler.numOutstandingRequests());
@@ -112,9 +132,14 @@ public class TransportResponseHandlerSuiteJ {
@Test
public void handleSuccessfulPush() throws Exception {
- TransportResponseHandler handler = new TransportResponseHandler(new
LocalChannel());
+ TransportResponseHandler handler =
+ new TransportResponseHandler(
+ Utils.fromCelebornConf(new CelebornConf(),
TransportModuleConstants.DATA_MODULE, 8),
+ new LocalChannel());
RpcResponseCallback callback = mock(RpcResponseCallback.class);
- handler.addPushRequest(12345, callback);
+ PushRequestInfo info = new PushRequestInfo(System.currentTimeMillis() +
30000, callback);
+ info.setChannelFuture(mock(ChannelFuture.class));
+ handler.addPushRequest(12345, info);
assertEquals(1, handler.numOutstandingRequests());
// This response should be ignored.
@@ -129,9 +154,14 @@ public class TransportResponseHandlerSuiteJ {
@Test
public void handleFailedPush() throws Exception {
- TransportResponseHandler handler = new TransportResponseHandler(new
LocalChannel());
+ TransportResponseHandler handler =
+ new TransportResponseHandler(
+ Utils.fromCelebornConf(new CelebornConf(),
TransportModuleConstants.DATA_MODULE, 8),
+ new LocalChannel());
RpcResponseCallback callback = mock(RpcResponseCallback.class);
- handler.addPushRequest(12345, callback);
+ PushRequestInfo info = new PushRequestInfo(System.currentTimeMillis() +
30000L, callback);
+ info.setChannelFuture(mock(ChannelFuture.class));
+ handler.addPushRequest(12345, info);
assertEquals(1, handler.numOutstandingRequests());
handler.handle(new RpcFailure(54321, "uh-oh!")); // should be ignored
diff --git
a/tests/spark-it/src/test/scala/org/apache/celeborn/tests/spark/PushDataTimeoutTest.scala
b/tests/spark-it/src/test/scala/org/apache/celeborn/tests/spark/PushDataTimeoutTest.scala
index 66700ff4..7238f501 100644
---
a/tests/spark-it/src/test/scala/org/apache/celeborn/tests/spark/PushDataTimeoutTest.scala
+++
b/tests/spark-it/src/test/scala/org/apache/celeborn/tests/spark/PushDataTimeoutTest.scala
@@ -49,6 +49,7 @@ class PushDataTimeoutTest extends AnyFunSuite
Seq("false", "true").foreach { enabled =>
val sparkConf = new
SparkConf().setAppName("rss-demo").setMaster("local[4]")
.set("spark.celeborn.push.data.timeout", "5s")
+ .set("spark.celeborn.push.timeoutCheck.interval", "2s")
.set("spark.celeborn.push.replicate.enabled", enabled)
.set("spark.celeborn.client.blacklistSlave.enabled", "false")
val sparkSession = SparkSession.builder().config(sparkConf).getOrCreate()
diff --git
a/tests/spark-it/src/test/scala/org/apache/celeborn/tests/spark/SparkTestBase.scala
b/tests/spark-it/src/test/scala/org/apache/celeborn/tests/spark/SparkTestBase.scala
index 481a2769..08dd18fa 100644
---
a/tests/spark-it/src/test/scala/org/apache/celeborn/tests/spark/SparkTestBase.scala
+++
b/tests/spark-it/src/test/scala/org/apache/celeborn/tests/spark/SparkTestBase.scala
@@ -36,7 +36,7 @@ trait SparkTestBase extends AnyFunSuite
override def beforeAll(): Unit = {
logInfo("test initialized , setup rss mini cluster")
- setUpMiniCluster()
+ setUpMiniCluster(workerNum = 5)
}
override def afterAll(): Unit = {
diff --git
a/worker/src/main/scala/org/apache/celeborn/service/deploy/worker/PushDataHandler.scala
b/worker/src/main/scala/org/apache/celeborn/service/deploy/worker/PushDataHandler.scala
index 74937abd..24e19bd8 100644
---
a/worker/src/main/scala/org/apache/celeborn/service/deploy/worker/PushDataHandler.scala
+++
b/worker/src/main/scala/org/apache/celeborn/service/deploy/worker/PushDataHandler.scala
@@ -38,7 +38,6 @@ import
org.apache.celeborn.common.protocol.{PartitionLocation, PartitionSplitMod
import org.apache.celeborn.common.protocol.message.StatusCode
import org.apache.celeborn.common.unsafe.Platform
import org.apache.celeborn.common.util.PackedPartitionId
-import org.apache.celeborn.common.write.PushState
import
org.apache.celeborn.service.deploy.worker.congestcontrol.CongestionController
import org.apache.celeborn.service.deploy.worker.storage.{FileWriter,
HdfsFlusher, LocalFlusher, MapPartitionFileWriter, StorageManager}
@@ -62,7 +61,6 @@ class PushDataHandler extends BaseMessageHandler with Logging
{
var conf: CelebornConf = _
@volatile var pushMasterDataTimeoutTested = false
@volatile var pushSlaveDataTimeoutTested = false
- var pushState: PushState = _
def init(worker: Worker): Unit = {
workerSource = worker.workerSource
@@ -81,8 +79,6 @@ class PushDataHandler extends BaseMessageHandler with Logging
{
storageManager = worker.storageManager
shutdown = worker.shutdown
conf = worker.conf
- pushState = new PushState(conf)
- pushState.startChecker(false)
logInfo(s"diskReserveSize $diskReserveSize")
}
@@ -171,7 +167,6 @@ class PushDataHandler extends BaseMessageHandler with
Logging {
// Fetch real batchId from body will add more cost and no meaning for
replicate.
val doReplicate = location != null && location.getPeer != null && isMaster
- val batchId = if (doReplicate) pushState.nextBatchId() else -1
val softSplit = new AtomicBoolean(false)
if (location == null) {
@@ -272,13 +267,10 @@ class PushDataHandler extends BaseMessageHandler with
Logging {
s"${StatusCode.PUSH_DATA_CREATE_CONNECTION_FAIL_SLAVE.getMessage}! Peer
$peerWorker unavailable for $location!"))
return
}
- pushState.addBatch(batchId, location.getPeer.hostAndPushPort())
// Handle the response from replica
val wrappedCallback = new RpcResponseCallback() {
override def onSuccess(response: ByteBuffer): Unit = {
- // Only master data will push data to slave
- pushState.removeBatch(batchId,
location.getPeer.hostAndPushPort())
if (response.remaining() > 0) {
val resp = ByteBuffer.allocate(response.remaining())
resp.put(response)
@@ -313,7 +305,6 @@ class PushDataHandler extends BaseMessageHandler with
Logging {
override def onFailure(e: Throwable): Unit = {
logError(s"[handlePushData.onFailure] partitionLocation:
$location", e)
workerSource.incCounter(WorkerSource.PushDataFailCount)
- pushState.removeBatch(batchId,
location.getPeer.hostAndPushPort())
// Throw by slave peer worker
if
(e.getMessage.startsWith(StatusCode.PUSH_DATA_FAIL_SLAVE.getMessage)) {
callbackWithTimer.onFailure(e)
@@ -337,17 +328,10 @@ class PushDataHandler extends BaseMessageHandler with
Logging {
shuffleKey,
pushData.partitionUniqueId,
pushData.body)
- val channelFuture = client.pushData(newPushData, wrappedCallback)
- pushState.pushStarted(
- batchId,
- channelFuture,
- wrappedCallback,
- location.getPeer.hostAndPushPort(),
- shufflePushDataTimeout.get(shuffleKey))
+ client.pushData(newPushData,
shufflePushDataTimeout.get(shuffleKey), wrappedCallback)
} catch {
case e: Exception =>
pushData.body().release()
- pushState.removeBatch(batchId,
location.getPeer.hostAndPushPort())
unavailablePeers.put(peerWorker, System.currentTimeMillis())
workerSource.incCounter(WorkerSource.PushDataFailCount)
callbackWithTimer.onFailure(
@@ -453,7 +437,6 @@ class PushDataHandler extends BaseMessageHandler with
Logging {
// Fetch real batchId from body will add more cost and no meaning for
replicate.
val doReplicate = locations.head != null && locations.head.getPeer != null
&& isMaster
- val batchId = if (doReplicate) pushState.nextBatchId() else -1
// find FileWriters responsible for the data
locations.foreach { loc =>
@@ -544,13 +527,11 @@ class PushDataHandler extends BaseMessageHandler with
Logging {
s"${StatusCode.PUSH_DATA_CREATE_CONNECTION_FAIL_SLAVE.getMessage}! Peer
$peerWorker unavailable for $location!"))
return
}
- pushState.addBatch(batchId, location.getPeer.hostAndPushPort())
// Handle the response from replica
val wrappedCallback = new RpcResponseCallback() {
override def onSuccess(response: ByteBuffer): Unit = {
// Only master data enable replication will push data to slave
- pushState.removeBatch(batchId,
locations.head.getPeer.hostAndPushPort())
if (response.remaining() > 0) {
val resp = ByteBuffer.allocate(response.remaining())
resp.put(response)
@@ -577,7 +558,6 @@ class PushDataHandler extends BaseMessageHandler with
Logging {
override def onFailure(e: Throwable): Unit = {
workerSource.incCounter(WorkerSource.PushDataFailCount)
- pushState.removeBatch(batchId,
locations.head.getPeer.hostAndPushPort())
// Throw by slave peer worker
if
(e.getMessage.startsWith(StatusCode.PUSH_DATA_FAIL_SLAVE.getMessage)) {
callbackWithTimer.onFailure(e)
@@ -605,19 +585,15 @@ class PushDataHandler extends BaseMessageHandler with
Logging {
pushMergedData.partitionUniqueIds,
batchOffsets,
pushMergedData.body)
- val channelFuture = client.pushMergedData(newPushMergedData,
wrappedCallback)
- pushState.pushStarted(
- batchId,
- channelFuture,
- wrappedCallback,
- location.getPeer.hostAndPushPort(),
- shufflePushDataTimeout.get(shuffleKey))
+ client.pushMergedData(
+ newPushMergedData,
+ shufflePushDataTimeout.get(shuffleKey),
+ wrappedCallback)
} catch {
case e: Exception =>
pushMergedData.body().release()
unavailablePeers.put(peerWorker, System.currentTimeMillis())
workerSource.incCounter(WorkerSource.PushDataFailCount)
- pushState.removeBatch(batchId,
location.getPeer.hostAndPushPort())
callbackWithTimer.onFailure(
new Exception(
s"${StatusCode.PUSH_DATA_CREATE_CONNECTION_FAIL_SLAVE.getMessage}! Create
connection to peer $peerWorker failed for $location",