mfgnik

Untitled

Apr 23rd, 2020
552
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.93 KB | None | 0 0
  1. #include <limits>
  2.  
  3. #include "balancer.h"
  4.  
  5. class Balancer : public IBalancer {
  6. public:
  7.     Balancer(const folly::SocketAddress& address) : lsn_(cactus::ListenTCP(address)) {
  8.     }
  9.  
  10.     void SetBackends(const std::vector<folly::SocketAddress>& peers) {
  11.         for (auto peer : peers) {
  12.             if (peers_.count(peer) == 0) {
  13.                 peers_[peer] = 0;
  14.             }
  15.         }
  16.     }
  17.  
  18.     void Run() {
  19.         for (;;) {
  20.             std::shared_ptr<cactus::IConn> conn = lsn_->Accept();
  21.             g_.Spawn([conn, this] {
  22.                 bool found = false;
  23.                 while (!found && peers_.size()) {
  24.                     auto min_peer = FindPeer();
  25.                     std::unique_ptr<cactus::IConn> peer_conn;
  26.                     cactus::TimeoutGuard timeout_guard(std::chrono::seconds(2));
  27.                     try {
  28.                         peer_conn = cactus::DialTCP(min_peer);
  29.                         timeout_guard.Deactivate();
  30.                     } catch (const cactus::TimeoutException& timeout) {
  31.                         peers_.erase(min_peer);
  32.                         continue;
  33.                     }
  34.                     found = true;
  35.                     ++peers_[min_peer];
  36.                 }
  37.             })
  38.         }
  39.     }
  40.  
  41.     folly::SocketAddress FindPeer() {
  42.         folly::SocketAddress min_peer = peers_.begin()->first;
  43.         size_t min_connections = peers_.begin()->second;
  44.         for (auto [peer, connections] : peers_) {
  45.             if (connections < min_connections) {
  46.                 min_peer = peer;
  47.                 min_connections = connections;
  48.             }
  49.         }
  50.         return min_peer;
  51.     }
  52.  
  53. private:
  54.     std::shared_ptr<cactus::IListener> lsn_;
  55.     std::unordered_map<folly::SocketAddress, size_t> peers_;
  56.     cactus::ServerGroup g_;
  57. };
  58.  
  59.  
  60. std::unique_ptr<IBalancer> CreateBalancer(const folly::SocketAddress& address) {
  61.     return std::make_unique<Balancer>(address);
  62. }
Advertisement
Add Comment
Please, Sign In to add comment