diff options
author | alexvru <alexvru@ydb.tech> | 2023-06-21 15:11:58 +0300 |
---|---|---|
committer | alexvru <alexvru@ydb.tech> | 2023-06-21 15:11:58 +0300 |
commit | 3b8cc738ba23f82329a97e26fca83f99db624fd7 (patch) | |
tree | 7d620bbd4a871384d19b4208ecfc4e537946f633 /library/cpp | |
parent | a8c31fc101e11d24504ea74d1de8369216b14dca (diff) | |
download | ydb-3b8cc738ba23f82329a97e26fca83f99db624fd7.tar.gz |
Fix CloseOnIdle peer termination
Diffstat (limited to 'library/cpp')
-rw-r--r-- | library/cpp/actors/interconnect/interconnect_tcp_session.cpp | 10 | ||||
-rw-r--r-- | library/cpp/actors/interconnect/types.h | 2 |
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; }; |