6 Cluster::Cluster(Server serv
, uint16_t cnt
)
11 count
= thread::hardware_concurrency()/2 ?: 4;
21 const vector
<Server
> &Cluster::getServers() const {
25 void Cluster::reset() {
28 for (int i
= 0; i
< count
; ++i
) {
29 cluster
.push_back(proto
);
33 bool Cluster::start() {
36 for (auto &server
: cluster
) {
37 if (!startServer(server
)) {
45 void Cluster::stop() {
46 for (auto &server
: cluster
) {
47 // no cookies for memcached; TERM is just too slow
48 server
.signal(SIGKILL
);
52 bool Cluster::isStopped() {
53 for (auto &server
: cluster
) {
54 if (server
.getPid() && !server
.tryWait()) {
61 bool Cluster::isListening() {
62 for (auto &server
: cluster
) {
63 Retry server_is_listening
{[&] {
64 if (!server
.isListening()) {
66 auto old_pid
= server
.getPid();
67 if (server
.tryWait()) {
68 cerr
<< "zombie collected (old pid=" << old_pid
<< "): " << server
<< "\n";
73 if (!server
.isListening()) {
79 if (!server_is_listening()) {
87 bool Cluster::startServer(Server
&server
) {
88 auto pid
= server
.start();
89 if (pid
.has_value()) {
96 void Cluster::wait() {
99 while (!isStopped()) {
100 if (waitid(P_ALL
, 0, &inf
, WEXITED
| WNOWAIT
)) {
101 perror("Cluster::wait waitid()");
105 auto server
= pids
.find(inf
.si_pid
);
106 if (server
!= pids
.end()) {
107 server
->second
->wait();