interconnect.h 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  1. #pragma once
  2. #include "events.h"
  3. #include "event_local.h"
  4. #include <library/cpp/actors/protos/interconnect.pb.h>
  5. #include <util/string/cast.h>
  6. #include <util/string/builder.h>
  7. namespace NActors {
  8. class TNodeLocation {
  9. public:
  10. struct TKeys {
  11. enum E : int {
  12. DataCenter = 10,
  13. Module = 20,
  14. Rack = 30,
  15. Unit = 40,
  16. };
  17. };
  18. struct TLegacyValue {
  19. ui32 DataCenter;
  20. ui32 Room;
  21. ui32 Rack;
  22. ui32 Body;
  23. auto ConvertToTuple() const { return std::make_tuple(DataCenter, Room, Rack, Body); }
  24. int Compare(const TLegacyValue& other) const {
  25. const auto x = ConvertToTuple();
  26. const auto y = other.ConvertToTuple();
  27. if (x < y) {
  28. return -1;
  29. } else if (y < x) {
  30. return 1;
  31. } else {
  32. return 0;
  33. }
  34. }
  35. friend bool operator ==(const TLegacyValue& x, const TLegacyValue& y) { return x.Compare(y) == 0; }
  36. void Serialize(NActorsInterconnect::TNodeLocation *pb) const {
  37. pb->SetDataCenterNum(DataCenter);
  38. pb->SetRoomNum(Room);
  39. pb->SetRackNum(Rack);
  40. pb->SetBodyNum(Body);
  41. }
  42. };
  43. private:
  44. std::optional<TLegacyValue> LegacyValue;
  45. std::vector<std::pair<TKeys::E, TString>> Items;
  46. public:
  47. // generic ctors
  48. TNodeLocation() = default;
  49. TNodeLocation(const TNodeLocation&) = default;
  50. TNodeLocation(TNodeLocation&&) = default;
  51. // protobuf-parser ctor
  52. explicit TNodeLocation(const NActorsInterconnect::TNodeLocation& location);
  53. // serialized protobuf ctor
  54. static constexpr struct TFromSerialized {} FromSerialized {};
  55. TNodeLocation(TFromSerialized, const TString& s);
  56. // parser helper function
  57. static NActorsInterconnect::TNodeLocation ParseLocation(const TString& s);
  58. // assignment operators
  59. TNodeLocation& operator =(const TNodeLocation&) = default;
  60. TNodeLocation& operator =(TNodeLocation&&) = default;
  61. void Serialize(NActorsInterconnect::TNodeLocation *pb) const;
  62. TString GetSerializedLocation() const;
  63. TString GetDataCenterId() const { return ToStringUpTo(TKeys::DataCenter); }
  64. TString GetModuleId() const { return ToStringUpTo(TKeys::Module); }
  65. TString GetRackId() const { return ToStringUpTo(TKeys::Rack); }
  66. TString ToString() const { return ToStringUpTo(TKeys::E(Max<int>())); }
  67. TString ToStringUpTo(TKeys::E upToKey) const;
  68. TLegacyValue GetLegacyValue() const;
  69. const std::vector<std::pair<TKeys::E, TString>>& GetItems() const { return Items; }
  70. bool HasKey(TKeys::E key) const {
  71. auto comp = [](const auto& p, TKeys::E value) { return p.first < value; };
  72. const auto it = std::lower_bound(Items.begin(), Items.end(), key, comp);
  73. return it != Items.end() && it->first == key;
  74. }
  75. int Compare(const TNodeLocation& other) const {
  76. if (LegacyValue || other.LegacyValue) {
  77. return GetLegacyValue().Compare(other.GetLegacyValue());
  78. } else if (Items < other.Items) {
  79. return -1;
  80. } else if (other.Items < Items) {
  81. return 1;
  82. } else {
  83. return 0;
  84. }
  85. }
  86. void InheritLegacyValue(const TNodeLocation& other) {
  87. LegacyValue = other.GetLegacyValue();
  88. }
  89. friend bool operator ==(const TNodeLocation& x, const TNodeLocation& y) { return x.Compare(y) == 0; }
  90. friend bool operator !=(const TNodeLocation& x, const TNodeLocation& y) { return x.Compare(y) != 0; }
  91. friend bool operator < (const TNodeLocation& x, const TNodeLocation& y) { return x.Compare(y) < 0; }
  92. friend bool operator <=(const TNodeLocation& x, const TNodeLocation& y) { return x.Compare(y) <= 0; }
  93. friend bool operator > (const TNodeLocation& x, const TNodeLocation& y) { return x.Compare(y) > 0; }
  94. friend bool operator >=(const TNodeLocation& x, const TNodeLocation& y) { return x.Compare(y) >= 0; }
  95. };
  96. struct TEvInterconnect {
  97. enum EEv {
  98. EvForward = EventSpaceBegin(TEvents::ES_INTERCONNECT),
  99. EvResolveNode, // resolve info about node (internal)
  100. EvNodeAddress, // node info (internal)
  101. EvConnectNode, // request proxy to establish connection (like: we would send something there soon)
  102. EvAcceptIncoming,
  103. EvNodeConnected, // node connected notify
  104. EvNodeDisconnected, // node disconnected notify
  105. EvRegisterNode,
  106. EvRegisterNodeResult,
  107. EvListNodes,
  108. EvNodesInfo,
  109. EvDisconnect,
  110. EvGetNode,
  111. EvNodeInfo,
  112. EvClosePeerSocket,
  113. EvCloseInputSession,
  114. EvPoisonSession,
  115. EvTerminate,
  116. EvEnd
  117. };
  118. enum ESubscribes {
  119. SubConnected,
  120. SubDisconnected,
  121. };
  122. static_assert(EvEnd < EventSpaceEnd(TEvents::ES_INTERCONNECT), "expect EvEnd < EventSpaceEnd(TEvents::ES_INTERCONNECT)");
  123. struct TEvResolveNode;
  124. struct TEvNodeAddress;
  125. struct TEvConnectNode: public TEventBase<TEvConnectNode, EvConnectNode> {
  126. DEFINE_SIMPLE_LOCAL_EVENT(TEvConnectNode, "TEvInterconnect::TEvConnectNode")
  127. };
  128. struct TEvAcceptIncoming;
  129. struct TEvNodeConnected: public TEventLocal<TEvNodeConnected, EvNodeConnected> {
  130. DEFINE_SIMPLE_LOCAL_EVENT(TEvNodeConnected, "TEvInterconnect::TEvNodeConnected")
  131. TEvNodeConnected(ui32 node) noexcept
  132. : NodeId(node)
  133. {
  134. }
  135. const ui32 NodeId;
  136. };
  137. struct TEvNodeDisconnected: public TEventLocal<TEvNodeDisconnected, EvNodeDisconnected> {
  138. DEFINE_SIMPLE_LOCAL_EVENT(TEvNodeDisconnected, "TEvInterconnect::TEvNodeDisconnected")
  139. TEvNodeDisconnected(ui32 node) noexcept
  140. : NodeId(node)
  141. {
  142. }
  143. const ui32 NodeId;
  144. };
  145. struct TEvRegisterNode;
  146. struct TEvRegisterNodeResult;
  147. struct TEvListNodes: public TEventLocal<TEvListNodes, EvListNodes> {
  148. };
  149. struct TNodeInfo {
  150. ui32 NodeId;
  151. TString Address;
  152. TString Host;
  153. TString ResolveHost;
  154. ui16 Port;
  155. TNodeLocation Location;
  156. TNodeInfo() = default;
  157. TNodeInfo(const TNodeInfo&) = default;
  158. TNodeInfo& operator =(const TNodeInfo&) = default;
  159. TNodeInfo(ui32 nodeId,
  160. const TString& address,
  161. const TString& host,
  162. const TString& resolveHost,
  163. ui16 port,
  164. const TNodeLocation& location)
  165. : NodeId(nodeId)
  166. , Address(address)
  167. , Host(host)
  168. , ResolveHost(resolveHost)
  169. , Port(port)
  170. , Location(location)
  171. {
  172. }
  173. operator ui32() const {
  174. return NodeId;
  175. }
  176. };
  177. struct TEvNodesInfo: public TEventLocal<TEvNodesInfo, EvNodesInfo> {
  178. TVector<TNodeInfo> Nodes;
  179. const TNodeInfo* GetNodeInfo(ui32 nodeId) const {
  180. for (const auto& x : Nodes) {
  181. if (x.NodeId == nodeId)
  182. return &x;
  183. }
  184. return nullptr;
  185. }
  186. };
  187. struct TEvDisconnect;
  188. struct TEvGetNode: public TEventLocal<TEvGetNode, EvGetNode> {
  189. ui32 NodeId;
  190. TInstant Deadline;
  191. TEvGetNode(ui32 nodeId, TInstant deadline = TInstant::Max())
  192. : NodeId(nodeId)
  193. , Deadline(deadline)
  194. {
  195. }
  196. };
  197. struct TEvNodeInfo: public TEventLocal<TEvNodeInfo, EvNodeInfo> {
  198. TEvNodeInfo(ui32 nodeId)
  199. : NodeId(nodeId)
  200. {
  201. }
  202. ui32 NodeId;
  203. THolder<TNodeInfo> Node;
  204. };
  205. struct TEvClosePeerSocket : TEventLocal<TEvClosePeerSocket, EvClosePeerSocket> {};
  206. struct TEvCloseInputSession : TEventLocal<TEvCloseInputSession, EvCloseInputSession> {};
  207. struct TEvPoisonSession : TEventLocal<TEvPoisonSession, EvPoisonSession> {};
  208. struct TEvTerminate : TEventLocal<TEvTerminate, EvTerminate> {};
  209. };
  210. }