6 Cluster::Cluster(Server serv
, uint16_t cnt
)
11 count
= stoi(getenv_else("MEMCACHED_CLUSTER", "4"));
16 for (int i
= 0; i
< count
; ++i
) {
17 cluster
.push_back(proto
);
21 Cluster::Cluster(vector
<Server
> servers
)
22 : count
{servers
.size()}
23 , cluster
{move(servers
)}
33 const vector
<Server
> &Cluster::getServers() const {
37 bool Cluster::start() {
40 for (auto &server
: cluster
) {
41 if (!startServer(server
)) {
49 void Cluster::stop() {
50 for (auto &server
: cluster
) {
52 // no cookies for memcached; TERM is just too slow
53 server
.signal(SIGKILL
);
57 bool Cluster::isStopped() {
58 for (auto &server
: cluster
) {
59 if (server
.getPid() && !server
.tryWait()) {
66 bool Cluster::isListening() {
67 for (auto &server
: cluster
) {
68 Retry server_is_listening
{[&] {
69 if (!server
.isListening()) {
71 auto old_pid
= server
.getPid();
72 if (server
.tryWait()) {
73 cerr
<< "Collected zombie " << server
<< "(old pid=" << old_pid
<< ")\n";
78 if (!server
.isListening()) {
84 if (!server_is_listening()) {
92 bool Cluster::startServer(Server
&server
) {
93 if (server
.start().has_value()) {
94 pids
[server
.getPid()] = &server
;
100 void Cluster::wait() {
103 while (!isStopped()) {
104 if (waitid(P_ALL
, 0, &inf
, WEXITED
| WNOWAIT
)) {
105 perror("Cluster::wait waitid()");
109 auto server
= pids
.find(inf
.si_pid
);
110 if (server
!= pids
.end()) {
111 server
->second
->wait();