6 Cluster::Cluster(Server serv
, uint16_t cnt
)
13 for (int i
= 0; i
< count
; ++i
) {
14 cluster
.push_back(proto
);
23 const vector
<Server
> &Cluster::getServers() const {
27 bool Cluster::start() {
30 for (auto &server
: cluster
) {
31 if (!startServer(server
)) {
39 void Cluster::stop(bool graceful
) {
40 for (auto &server
: cluster
) {
45 // no cookies for memcached; TERM is just too slow
46 server
.signal(SIGKILL
);
51 bool Cluster::isStopped() {
52 for (auto &server
: cluster
) {
53 if (server
.getPid() && !server
.tryWait()) {
60 bool Cluster::isListening() {
61 for (auto &server
: cluster
) {
62 Retry server_is_listening
{[&] {
63 if (!server
.isListening()) {
65 auto old_pid
= server
.getPid();
66 if (server
.tryWait()) {
67 cerr
<< "Collected zombie " << server
<< "(old pid=" << old_pid
<< ")\n";
72 if (!server
.isListening()) {
78 if (!server_is_listening()) {
86 bool Cluster::startServer(Server
&server
) {
87 if (server
.start().has_value()) {
88 pids
[server
.getPid()] = &server
;
94 void Cluster::wait() {
97 while (!isStopped()) {
98 if (waitid(P_ALL
, 0, &inf
, WEXITED
| WNOWAIT
)) {
99 perror("Cluster::wait waitid()");
103 auto server
= pids
.find(inf
.si_pid
);
104 if (server
!= pids
.end()) {
105 server
->second
->wait();
110 bool Cluster::restart() {