interconnect_nameserver_base.h 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. #include "interconnect.h"
  2. #include "interconnect_impl.h"
  3. #include "interconnect_address.h"
  4. #include "events_local.h"
  5. #include <library/cpp/actors/core/hfunc.h>
  6. #include <library/cpp/actors/memory_log/memlog.h>
  7. namespace NActors {
  8. template<typename TDerived>
  9. class TInterconnectNameserverBase : public TActor<TDerived> {
  10. protected:
  11. const TMap<ui32, TTableNameserverSetup::TNodeInfo>& NodeTable;
  12. TInterconnectNameserverBase(void (TDerived::*func)(TAutoPtr<IEventHandle>& ev, const TActorContext& ctx)
  13. , const TMap<ui32, TTableNameserverSetup::TNodeInfo>& nodeTable)
  14. : TActor<TDerived>(func)
  15. , NodeTable(nodeTable)
  16. {
  17. }
  18. public:
  19. void HandleMissedNodeId(TEvInterconnect::TEvResolveNode::TPtr& ev,
  20. const TActorContext& ctx,
  21. const TInstant&) {
  22. auto reply = new TEvLocalNodeInfo;
  23. reply->NodeId = ev->Get()->Record.GetNodeId();
  24. ctx.Send(ev->Sender, reply);
  25. }
  26. void Handle(TEvInterconnect::TEvResolveNode::TPtr& ev,
  27. const TActorContext& ctx) {
  28. const TEvInterconnect::TEvResolveNode* request = ev->Get();
  29. auto& record = request->Record;
  30. const ui32 nodeId = record.GetNodeId();
  31. const TInstant deadline = record.HasDeadline() ? TInstant::FromValue(record.GetDeadline()) : TInstant::Max();
  32. auto it = NodeTable.find(nodeId);
  33. if (it == NodeTable.end()) {
  34. static_cast<TDerived*>(this)->HandleMissedNodeId(ev, ctx, deadline);
  35. } else {
  36. IActor::RegisterWithSameMailbox(
  37. CreateResolveActor(nodeId, it->second, ev->Sender, this->SelfId(), deadline));
  38. }
  39. }
  40. void Handle(TEvResolveAddress::TPtr& ev,
  41. const TActorContext&) {
  42. const TEvResolveAddress* request = ev->Get();
  43. IActor::RegisterWithSameMailbox(
  44. CreateResolveActor(request->Address, request->Port, ev->Sender, this->SelfId(), TInstant::Max()));
  45. }
  46. void Handle(TEvInterconnect::TEvListNodes::TPtr& ev,
  47. const TActorContext& ctx) {
  48. THolder<TEvInterconnect::TEvNodesInfo>
  49. reply(new TEvInterconnect::TEvNodesInfo());
  50. reply->Nodes.reserve(NodeTable.size());
  51. for (const auto& pr : NodeTable) {
  52. reply->Nodes.emplace_back(pr.first,
  53. pr.second.Address, pr.second.Host, pr.second.ResolveHost,
  54. pr.second.Port, pr.second.Location);
  55. }
  56. ctx.Send(ev->Sender, reply.Release());
  57. }
  58. void Handle(TEvInterconnect::TEvGetNode::TPtr& ev,
  59. const TActorContext& ctx) {
  60. ui32 nodeId = ev->Get()->NodeId;
  61. THolder<TEvInterconnect::TEvNodeInfo>
  62. reply(new TEvInterconnect::TEvNodeInfo(nodeId));
  63. auto it = NodeTable.find(nodeId);
  64. if (it != NodeTable.end()) {
  65. reply->Node = MakeHolder<TEvInterconnect::TNodeInfo>(it->first, it->second.Address,
  66. it->second.Host, it->second.ResolveHost,
  67. it->second.Port, it->second.Location);
  68. }
  69. ctx.Send(ev->Sender, reply.Release());
  70. }
  71. };
  72. }