From d1e8a6df68473f0ea5453ff9bab1c6c5a0b92a38 Mon Sep 17 00:00:00 2001 From: longqiang02 Date: Fri, 22 Sep 2023 17:44:34 +0800 Subject: [PATCH 1/5] Release ByteBuf when handle onData failed --- .../serial/SerializingExecutor.java | 13 +++++-- .../protocol/tri/stream/AbstractStream.java | 2 +- .../tri/stream/TripleClientStream.java | 34 ++++++++++--------- .../tri/stream/TripleServerStream.java | 3 +- 4 files changed, 31 insertions(+), 21 deletions(-) diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/threadpool/serial/SerializingExecutor.java b/dubbo-common/src/main/java/org/apache/dubbo/common/threadpool/serial/SerializingExecutor.java index 5769c1296a2..10c5aac54e2 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/common/threadpool/serial/SerializingExecutor.java +++ b/dubbo-common/src/main/java/org/apache/dubbo/common/threadpool/serial/SerializingExecutor.java @@ -60,11 +60,15 @@ public SerializingExecutor(Executor executor) { */ @Override public void execute(Runnable r) { + execute(r, null); + } + + public void execute(Runnable r, Runnable cleanIfFailed) { runQueue.add(r); - schedule(r); + schedule(r, cleanIfFailed); } - private void schedule(Runnable removable) { + private void schedule(Runnable removable, Runnable cleanIfFailed) { if (atomicBoolean.compareAndSet(false, true)) { boolean success = false; try { @@ -86,6 +90,9 @@ private void schedule(Runnable removable) { // to execute don't succeed and accidentally run a previous runnable. runQueue.remove(removable); } + if (cleanIfFailed != null) { + cleanIfFailed.run(); + } atomicBoolean.set(false); } } @@ -111,7 +118,7 @@ public void run() { } if (!runQueue.isEmpty()) { // we didn't enqueue anything but someone else did. - schedule(null); + schedule(null, null); } } } diff --git a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/stream/AbstractStream.java b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/stream/AbstractStream.java index e85620703cc..46b166cf8f0 100644 --- a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/stream/AbstractStream.java +++ b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/stream/AbstractStream.java @@ -28,7 +28,7 @@ */ public abstract class AbstractStream implements Stream { - protected Executor executor; + protected SerializingExecutor executor; protected final FrameworkModel frameworkModel; diff --git a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/stream/TripleClientStream.java b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/stream/TripleClientStream.java index 99f993566d8..ebc60f3572b 100644 --- a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/stream/TripleClientStream.java +++ b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/stream/TripleClientStream.java @@ -449,23 +449,25 @@ public void onHeader(Http2Headers headers, boolean endStream) { @Override public void onData(ByteBuf data, boolean endStream) { - executor.execute(() -> { - if (transportError != null) { - transportError.appendDescription( - "Data:" + data.toString(StandardCharsets.UTF_8)); - ReferenceCountUtil.release(data); - if (transportError.description.length() > 512 || endStream) { - handleH2TransportError(transportError); - } - return; - } - if (!headerReceived) { - handleH2TransportError(TriRpcStatus.INTERNAL.withDescription( - "headers not received before payload")); - return; + executor.execute(() -> doOnData(data, endStream), () -> ReferenceCountUtil.release(data)); + } + + private void doOnData(ByteBuf data, boolean endStream) { + if (transportError != null) { + transportError.appendDescription( + "Data:" + data.toString(StandardCharsets.UTF_8)); + ReferenceCountUtil.release(data); + if (transportError.description.length() > 512 || endStream) { + handleH2TransportError(transportError); } - deframer.deframe(data); - }); + return; + } + if (!headerReceived) { + handleH2TransportError(TriRpcStatus.INTERNAL.withDescription( + "headers not received before payload")); + return; + } + deframer.deframe(data); } @Override diff --git a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/stream/TripleServerStream.java b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/stream/TripleServerStream.java index be9bfc4951f..5ce6daf67c0 100644 --- a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/stream/TripleServerStream.java +++ b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/stream/TripleServerStream.java @@ -17,6 +17,7 @@ package org.apache.dubbo.rpc.protocol.tri.stream; +import io.netty.util.ReferenceCountUtil; import org.apache.dubbo.common.URL; import org.apache.dubbo.common.constants.CommonConstants; import org.apache.dubbo.common.logger.Logger; @@ -431,7 +432,7 @@ private void processHeader(Http2Headers headers, boolean endStream) { @Override public void onData(ByteBuf data, boolean endStream) { - executor.execute(() -> doOnData(data, endStream)); + executor.execute(() -> doOnData(data, endStream), () -> ReferenceCountUtil.release(data)); } private void doOnData(ByteBuf data, boolean endStream) { From 4ae0bbe9f7078115ca31e887895d1ed77481d685 Mon Sep 17 00:00:00 2001 From: longqiang02 Date: Tue, 26 Sep 2023 16:43:01 +0800 Subject: [PATCH 2/5] Runnable with clean function --- .../threadpool/serial/CloseableRunnable.java | 26 +++++++++++++++++++ .../serial/SerializingExecutor.java | 14 ++++------ .../protocol/tri/stream/AbstractStream.java | 2 +- .../tri/stream/TripleClientStream.java | 13 +++++++++- .../tri/stream/TripleServerStream.java | 13 +++++++++- 5 files changed, 56 insertions(+), 12 deletions(-) create mode 100644 dubbo-common/src/main/java/org/apache/dubbo/common/threadpool/serial/CloseableRunnable.java diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/threadpool/serial/CloseableRunnable.java b/dubbo-common/src/main/java/org/apache/dubbo/common/threadpool/serial/CloseableRunnable.java new file mode 100644 index 00000000000..cf5a484b5a5 --- /dev/null +++ b/dubbo-common/src/main/java/org/apache/dubbo/common/threadpool/serial/CloseableRunnable.java @@ -0,0 +1,26 @@ +/* + * Copyright 2014 The gRPC Authors + * + * Licensed 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.dubbo.common.threadpool.serial; + +/** + * Runnable with clean function + */ +public interface CloseableRunnable extends Runnable { + + void close(); + +} diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/threadpool/serial/SerializingExecutor.java b/dubbo-common/src/main/java/org/apache/dubbo/common/threadpool/serial/SerializingExecutor.java index 10c5aac54e2..c35dc56dbee 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/common/threadpool/serial/SerializingExecutor.java +++ b/dubbo-common/src/main/java/org/apache/dubbo/common/threadpool/serial/SerializingExecutor.java @@ -60,15 +60,11 @@ public SerializingExecutor(Executor executor) { */ @Override public void execute(Runnable r) { - execute(r, null); - } - - public void execute(Runnable r, Runnable cleanIfFailed) { runQueue.add(r); - schedule(r, cleanIfFailed); + schedule(r); } - private void schedule(Runnable removable, Runnable cleanIfFailed) { + private void schedule(Runnable removable) { if (atomicBoolean.compareAndSet(false, true)) { boolean success = false; try { @@ -90,8 +86,8 @@ private void schedule(Runnable removable, Runnable cleanIfFailed) { // to execute don't succeed and accidentally run a previous runnable. runQueue.remove(removable); } - if (cleanIfFailed != null) { - cleanIfFailed.run(); + if (removable instanceof CloseableRunnable) { + ((CloseableRunnable) removable).close(); } atomicBoolean.set(false); } @@ -118,7 +114,7 @@ public void run() { } if (!runQueue.isEmpty()) { // we didn't enqueue anything but someone else did. - schedule(null, null); + schedule(null); } } } diff --git a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/stream/AbstractStream.java b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/stream/AbstractStream.java index 46b166cf8f0..e85620703cc 100644 --- a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/stream/AbstractStream.java +++ b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/stream/AbstractStream.java @@ -28,7 +28,7 @@ */ public abstract class AbstractStream implements Stream { - protected SerializingExecutor executor; + protected Executor executor; protected final FrameworkModel frameworkModel; diff --git a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/stream/TripleClientStream.java b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/stream/TripleClientStream.java index ebc60f3572b..6a1d21d6651 100644 --- a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/stream/TripleClientStream.java +++ b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/stream/TripleClientStream.java @@ -20,6 +20,7 @@ import org.apache.dubbo.common.constants.CommonConstants; import org.apache.dubbo.common.logger.ErrorTypeAwareLogger; import org.apache.dubbo.common.logger.LoggerFactory; +import org.apache.dubbo.common.threadpool.serial.CloseableRunnable; import org.apache.dubbo.rpc.TriRpcStatus; import org.apache.dubbo.rpc.model.FrameworkModel; import org.apache.dubbo.rpc.protocol.tri.ClassLoadUtil; @@ -449,7 +450,17 @@ public void onHeader(Http2Headers headers, boolean endStream) { @Override public void onData(ByteBuf data, boolean endStream) { - executor.execute(() -> doOnData(data, endStream), () -> ReferenceCountUtil.release(data)); + executor.execute(new CloseableRunnable() { + @Override + public void close() { + ReferenceCountUtil.release(data); + } + + @Override + public void run() { + doOnData(data, endStream); + } + }); } private void doOnData(ByteBuf data, boolean endStream) { diff --git a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/stream/TripleServerStream.java b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/stream/TripleServerStream.java index 5ce6daf67c0..ead28c40416 100644 --- a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/stream/TripleServerStream.java +++ b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/stream/TripleServerStream.java @@ -22,6 +22,7 @@ import org.apache.dubbo.common.constants.CommonConstants; import org.apache.dubbo.common.logger.Logger; import org.apache.dubbo.common.logger.LoggerFactory; +import org.apache.dubbo.common.threadpool.serial.CloseableRunnable; import org.apache.dubbo.common.utils.StringUtils; import org.apache.dubbo.rpc.HeaderFilter; import org.apache.dubbo.rpc.Invoker; @@ -432,7 +433,17 @@ private void processHeader(Http2Headers headers, boolean endStream) { @Override public void onData(ByteBuf data, boolean endStream) { - executor.execute(() -> doOnData(data, endStream), () -> ReferenceCountUtil.release(data)); + executor.execute(new CloseableRunnable() { + @Override + public void close() { + ReferenceCountUtil.release(data); + } + + @Override + public void run() { + doOnData(data, endStream); + } + }); } private void doOnData(ByteBuf data, boolean endStream) { From bde8a979e33b7095ed468081b49f229687859811 Mon Sep 17 00:00:00 2001 From: longqiang02 Date: Tue, 26 Sep 2023 16:48:07 +0800 Subject: [PATCH 3/5] Fix license --- .../common/threadpool/serial/CloseableRunnable.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/threadpool/serial/CloseableRunnable.java b/dubbo-common/src/main/java/org/apache/dubbo/common/threadpool/serial/CloseableRunnable.java index cf5a484b5a5..834a64e4669 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/common/threadpool/serial/CloseableRunnable.java +++ b/dubbo-common/src/main/java/org/apache/dubbo/common/threadpool/serial/CloseableRunnable.java @@ -1,9 +1,10 @@ /* - * Copyright 2014 The gRPC Authors - * - * Licensed 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 + * 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 * From cfdc9868e7a0233e3b456974d998e80da70f61aa Mon Sep 17 00:00:00 2001 From: longqiang02 Date: Mon, 9 Oct 2023 19:50:57 +0800 Subject: [PATCH 4/5] Release ByteBuf in onData method, and refactor some sonar issue. --- .../threadpool/serial/CloseableRunnable.java | 27 ------------ .../serial/SerializingExecutor.java | 3 -- .../tri/stream/TripleClientStream.java | 25 +++++------ .../tri/stream/TripleServerStream.java | 42 +++++++++---------- 4 files changed, 29 insertions(+), 68 deletions(-) delete mode 100644 dubbo-common/src/main/java/org/apache/dubbo/common/threadpool/serial/CloseableRunnable.java diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/threadpool/serial/CloseableRunnable.java b/dubbo-common/src/main/java/org/apache/dubbo/common/threadpool/serial/CloseableRunnable.java deleted file mode 100644 index 834a64e4669..00000000000 --- a/dubbo-common/src/main/java/org/apache/dubbo/common/threadpool/serial/CloseableRunnable.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * 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.dubbo.common.threadpool.serial; - -/** - * Runnable with clean function - */ -public interface CloseableRunnable extends Runnable { - - void close(); - -} diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/threadpool/serial/SerializingExecutor.java b/dubbo-common/src/main/java/org/apache/dubbo/common/threadpool/serial/SerializingExecutor.java index c35dc56dbee..5769c1296a2 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/common/threadpool/serial/SerializingExecutor.java +++ b/dubbo-common/src/main/java/org/apache/dubbo/common/threadpool/serial/SerializingExecutor.java @@ -86,9 +86,6 @@ private void schedule(Runnable removable) { // to execute don't succeed and accidentally run a previous runnable. runQueue.remove(removable); } - if (removable instanceof CloseableRunnable) { - ((CloseableRunnable) removable).close(); - } atomicBoolean.set(false); } } diff --git a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/stream/TripleClientStream.java b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/stream/TripleClientStream.java index 6a1d21d6651..da7ddc45439 100644 --- a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/stream/TripleClientStream.java +++ b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/stream/TripleClientStream.java @@ -20,7 +20,6 @@ import org.apache.dubbo.common.constants.CommonConstants; import org.apache.dubbo.common.logger.ErrorTypeAwareLogger; import org.apache.dubbo.common.logger.LoggerFactory; -import org.apache.dubbo.common.threadpool.serial.CloseableRunnable; import org.apache.dubbo.rpc.TriRpcStatus; import org.apache.dubbo.rpc.model.FrameworkModel; import org.apache.dubbo.rpc.protocol.tri.ClassLoadUtil; @@ -238,9 +237,7 @@ void handleH2TransportError(TriRpcStatus status) { void finishProcess(TriRpcStatus status, Http2Headers trailers, boolean isReturnTriException) { final Map reserved = filterReservedHeaders(trailers); - final Map attachments = headersToMap(trailers, () -> { - return reserved.get(TripleHeaderEnum.TRI_HEADER_CONVERT.getHeader()); - }); + final Map attachments = headersToMap(trailers, () -> reserved.get(TripleHeaderEnum.TRI_HEADER_CONVERT.getHeader())); final TriRpcStatus detailStatus; final TriRpcStatus statusFromTrailers = getStatusFromTrailers(reserved); if (statusFromTrailers != null) { @@ -450,17 +447,15 @@ public void onHeader(Http2Headers headers, boolean endStream) { @Override public void onData(ByteBuf data, boolean endStream) { - executor.execute(new CloseableRunnable() { - @Override - public void close() { - ReferenceCountUtil.release(data); - } - - @Override - public void run() { - doOnData(data, endStream); - } - }); + try { + executor.execute(() -> doOnData(data, endStream)); + } catch (Throwable t) { + // Tasks will be rejected when the thread pool is closed or full, + // ByteBuf needs to be released to avoid out of heap memory leakage. + // For example, ThreadLessExecutor will be shutdown when request timeout {@link AsyncRpcResult} + ReferenceCountUtil.release(data); + LOGGER.error(PROTOCOL_FAILED_RESPONSE, "", "", "submit onData task failed", t); + } } private void doOnData(ByteBuf data, boolean endStream) { diff --git a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/stream/TripleServerStream.java b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/stream/TripleServerStream.java index ead28c40416..f7fd2f3b994 100644 --- a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/stream/TripleServerStream.java +++ b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/stream/TripleServerStream.java @@ -20,9 +20,8 @@ import io.netty.util.ReferenceCountUtil; import org.apache.dubbo.common.URL; import org.apache.dubbo.common.constants.CommonConstants; -import org.apache.dubbo.common.logger.Logger; +import org.apache.dubbo.common.logger.ErrorTypeAwareLogger; import org.apache.dubbo.common.logger.LoggerFactory; -import org.apache.dubbo.common.threadpool.serial.CloseableRunnable; import org.apache.dubbo.common.utils.StringUtils; import org.apache.dubbo.rpc.HeaderFilter; import org.apache.dubbo.rpc.Invoker; @@ -71,10 +70,12 @@ import java.util.concurrent.Executor; import static io.netty.handler.codec.http.HttpResponseStatus.OK; +import static org.apache.dubbo.common.constants.LoggerCodeConstants.PROTOCOL_FAILED_REQUEST; +import static org.apache.dubbo.common.constants.LoggerCodeConstants.PROTOCOL_FAILED_RESPONSE; public class TripleServerStream extends AbstractStream implements ServerStream { - private static final Logger LOGGER = LoggerFactory.getLogger(TripleServerStream.class); + private static final ErrorTypeAwareLogger LOGGER = LoggerFactory.getErrorTypeAwareLogger(TripleServerStream.class); public final ServerTransportObserver transportObserver = new ServerTransportObserver(); private final TripleWriteQueue writeQueue; private final PathResolver pathResolver; @@ -410,11 +411,10 @@ private void processHeader(Http2Headers headers, boolean endStream) { } } - Map requestMetadata = headersToMap(headers, () -> { - return Optional.ofNullable(headers.get(TripleHeaderEnum.TRI_HEADER_CONVERT.getHeader())) - .map(CharSequence::toString) - .orElse(null); - }); + Map requestMetadata = headersToMap(headers, () -> + Optional.ofNullable(headers.get(TripleHeaderEnum.TRI_HEADER_CONVERT.getHeader())) + .map(CharSequence::toString) + .orElse(null)); boolean hasStub = pathResolver.hasNativeStub(path); if (hasStub) { listener = new StubAbstractServerCall(invoker, TripleServerStream.this, @@ -433,17 +433,15 @@ private void processHeader(Http2Headers headers, boolean endStream) { @Override public void onData(ByteBuf data, boolean endStream) { - executor.execute(new CloseableRunnable() { - @Override - public void close() { - ReferenceCountUtil.release(data); - } - - @Override - public void run() { - doOnData(data, endStream); - } - }); + try { + executor.execute(() -> doOnData(data, endStream)); + } catch (Throwable t) { + // Tasks will be rejected when the thread pool is closed or full, + // ByteBuf needs to be released to avoid out of heap memory leakage. + // For example, ThreadLessExecutor will be shutdown when request timeout {@link AsyncRpcResult} + ReferenceCountUtil.release(data); + LOGGER.error(PROTOCOL_FAILED_REQUEST, "", "", "submit onData task failed", t); + } } private void doOnData(ByteBuf data, boolean endStream) { @@ -466,10 +464,8 @@ public void cancelByRemote(long errorCode) { if (listener == null) { return; } - executor.execute(() -> { - listener.onCancelByRemote(TriRpcStatus.CANCELLED - .withDescription("Canceled by client ,errorCode=" + errorCode)); - }); + executor.execute(() -> listener.onCancelByRemote(TriRpcStatus.CANCELLED + .withDescription("Canceled by client ,errorCode=" + errorCode))); } } From eb7a1d31f0490d939bc7428069ffbaa75d51c0ac Mon Sep 17 00:00:00 2001 From: longqiang02 Date: Mon, 9 Oct 2023 19:53:39 +0800 Subject: [PATCH 5/5] Remove unused dependency --- .../apache/dubbo/rpc/protocol/tri/stream/TripleServerStream.java | 1 - 1 file changed, 1 deletion(-) diff --git a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/stream/TripleServerStream.java b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/stream/TripleServerStream.java index f7fd2f3b994..88e5cd0b3d0 100644 --- a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/stream/TripleServerStream.java +++ b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/stream/TripleServerStream.java @@ -71,7 +71,6 @@ import static io.netty.handler.codec.http.HttpResponseStatus.OK; import static org.apache.dubbo.common.constants.LoggerCodeConstants.PROTOCOL_FAILED_REQUEST; -import static org.apache.dubbo.common.constants.LoggerCodeConstants.PROTOCOL_FAILED_RESPONSE; public class TripleServerStream extends AbstractStream implements ServerStream {