Bredbandskollen CLI  1.2
Asynchronous network task engine
loadbalancer.h
1 // Copyright (c) 2018 IIS (The Internet Foundation in Sweden)
2 // Written by Göran Andersson <initgoran@gmail.com>
3 
4 #pragma once
5 
6 #include "task.h"
7 #include "socketreceiver.h"
8 #include "workerprocess.h"
9 
17 class LoadBalancer : public Task {
18 public:
19 
20  LoadBalancer(const TaskConfig &tc);
21 
22  ~LoadBalancer() override;
23 
24  SocketConnection *newClient(int fd, const char *, uint16_t,
25  ServerSocket *) override;
26 
27  double start() override;
28 #ifdef USE_GNUTLS
29  bool tlsSetKey(ServerSocket *conn, const std::string &crt_path,
30  const std::string &key_path,
31  const std::string &password) override;
32 #endif
33  void serverRemoved(ServerSocket *s) override;
34  void processFinished(int pid, int wstatus) override;
35 protected:
37  size_t nextWorker() const {
38  return next_worker;
39  }
40 
44  if (++next_worker >= worker_proc.size())
45  next_worker = 0;
46  }
47 
49  void doPass(int fd, size_t wid, ServerSocket *srv);
50 
52  void new_worker(size_t i);
53 
55  void removeWorker(pid_t pid);
56 
58  std::string workerConfig(unsigned int i=0) const {
59  return worker_config + "\nworker_number " + std::to_string(i);
60  }
61 
63  void setMaxRetries(unsigned int n) {
64  max_retries = n;
65  }
66 private:
67 #ifdef USE_GNUTLS
68  std::map<ServerSocket *, unsigned int> portMap;
69 #endif
70  unsigned int max_retries = 100;
71  unsigned int no_channels = 1;
72  std::vector<WorkerProcess *> worker_proc;
73  std::vector<TimePoint> worker_proc_health;
74  size_t next_worker = 0;
75  TaskConfig my_config;
76  std::string worker_config;
77  size_t tot_no_workers;
78 };
Create worker (child) processes, and pass new connections evenly among them.
Definition: loadbalancer.h:17
void doPass(int fd, size_t wid, ServerSocket *srv)
Pass a connection to a worker process.
Definition: loadbalancer.cpp:77
void setMaxRetries(unsigned int n)
Max number of times to restart failed worker processes.
Definition: loadbalancer.h:63
double start() override
Definition: loadbalancer.cpp:39
void removeWorker(pid_t pid)
Remove a worker process.
Definition: loadbalancer.cpp:150
std::string workerConfig(unsigned int i=0) const
Return configuration of a worker process.
Definition: loadbalancer.h:58
void new_worker(size_t i)
Create a new worker process.
Definition: loadbalancer.cpp:118
void serverRemoved(ServerSocket *s) override
Definition: loadbalancer.cpp:63
void processFinished(int pid, int wstatus) override
Will be called to notify when an external process has terminated.
Definition: loadbalancer.cpp:113
void rotateNextWorker()
Definition: loadbalancer.h:43
bool tlsSetKey(ServerSocket *conn, const std::string &crt_path, const std::string &key_path, const std::string &password) override
Use SSL certificate for a listening socket.
Definition: loadbalancer.cpp:28
SocketConnection * newClient(int fd, const char *, uint16_t, ServerSocket *) override
Definition: loadbalancer.cpp:56
size_t nextWorker() const
Return a worker number.
Definition: loadbalancer.h:37
Listen on a single socket for incoming connections.
Definition: serversocket.h:15
This class implements low-level socket connection operations. Inherit from it to implement protocols ...
Definition: socketconnection.h:47
Read configuration from file or string.
Definition: taskconfig.h:44
The purpose of a task is to manage socket connections, and/or to execute timers.
Definition: task.h:39