aboutsummaryrefslogtreecommitdiffstats
path: root/library/cpp
diff options
context:
space:
mode:
authoralexvru <alexvru@ydb.tech>2023-06-21 15:11:58 +0300
committeralexvru <alexvru@ydb.tech>2023-06-21 15:11:58 +0300
commit3b8cc738ba23f82329a97e26fca83f99db624fd7 (patch)
tree7d620bbd4a871384d19b4208ecfc4e537946f633 /library/cpp
parenta8c31fc101e11d24504ea74d1de8369216b14dca (diff)
downloadydb-3b8cc738ba23f82329a97e26fca83f99db624fd7.tar.gz
Fix CloseOnIdle peer termination
Diffstat (limited to 'library/cpp')
-rw-r--r--library/cpp/actors/interconnect/interconnect_tcp_session.cpp10
-rw-r--r--library/cpp/actors/interconnect/types.h2
2 files changed, 11 insertions, 1 deletions
diff --git a/library/cpp/actors/interconnect/interconnect_tcp_session.cpp b/library/cpp/actors/interconnect/interconnect_tcp_session.cpp
index df972d21a0f..fd6793cb043 100644
--- a/library/cpp/actors/interconnect/interconnect_tcp_session.cpp
+++ b/library/cpp/actors/interconnect/interconnect_tcp_session.cpp
@@ -463,6 +463,10 @@ namespace NActors {
void TInterconnectSessionTCP::OnDisconnect(TEvSocketDisconnect::TPtr& ev) {
if (ev->Sender == ReceiverId) {
+ if (ev->Get()->Reason == TDisconnectReason::EndOfStream() && !NumEventsInQueue && OutputCounter == LastConfirmed) {
+ return Terminate(ev->Get()->Reason);
+ }
+
const bool wasConnected(Socket);
LOG_INFO_IC_SESSION("ICS07", "socket disconnect %" PRIi64 " reason# %s", Socket ? i64(*Socket) : -1, ev->Get()->Reason.ToString().data());
ReceiverId = TActorId(); // reset receiver actor id as we have no more receiver yet
@@ -700,7 +704,11 @@ namespace NActors {
: err ? err
: Sprintf("socket: %s", strerror(-r));
LOG_NOTICE_NET(Proxy->PeerNodeId, "%s", message.data());
- ReestablishConnectionWithHandshake(r == 0 ? TDisconnectReason::EndOfStream() : TDisconnectReason::FromErrno(-r));
+ if (r == 0 && !NumEventsInQueue && LastConfirmed == OutputCounter) {
+ Terminate(TDisconnectReason::EndOfStream());
+ } else {
+ ReestablishConnectionWithHandshake(r == 0 ? TDisconnectReason::EndOfStream() : TDisconnectReason::FromErrno(-r));
+ }
return 0; // error indicator
} else {
return -1; // temporary error
diff --git a/library/cpp/actors/interconnect/types.h b/library/cpp/actors/interconnect/types.h
index 0c36564efdd..7628fbd9686 100644
--- a/library/cpp/actors/interconnect/types.h
+++ b/library/cpp/actors/interconnect/types.h
@@ -41,6 +41,8 @@ namespace NActors {
return Text;
}
+ friend bool operator ==(const TDisconnectReason& x, const TDisconnectReason& y) { return x.Text == y.Text; }
+
static TVector<const char*> Reasons;
};