6 Cluster::Cluster(Server serv
, uint16_t cnt
)
11 count
= stoi(getenv_else("MEMCACHED_CLUSTER", "4"));
24 const vector
<Server
> &Cluster::getServers() const {
28 void Cluster::reset() {
31 for (int i
= 0; i
< count
; ++i
) {
32 cluster
.push_back(proto
);
36 bool Cluster::start() {
39 for (auto &server
: cluster
) {
40 if (!startServer(server
)) {
48 void Cluster::stop() {
49 for (auto &server
: cluster
) {
51 // no cookies for memcached; TERM is just too slow
52 server
.signal(SIGKILL
);
56 bool Cluster::isStopped() {
57 for (auto &server
: cluster
) {
58 if (server
.getPid() && !server
.tryWait()) {
65 bool Cluster::isListening() {
66 for (auto &server
: cluster
) {
67 Retry server_is_listening
{[&] {
68 if (!server
.isListening()) {
70 auto old_pid
= server
.getPid();
71 if (server
.tryWait()) {
72 cerr
<< "Collected zombie " << server
<< "(old pid=" << old_pid
<< ")\n";
77 if (!server
.isListening()) {
83 if (!server_is_listening()) {
91 bool Cluster::startServer(Server
&server
) {
92 if (server
.start().has_value()) {
93 pids
[server
.getPid()] = &server
;
99 void Cluster::wait() {
102 while (!isStopped()) {
103 if (waitid(P_ALL
, 0, &inf
, WEXITED
| WNOWAIT
)) {
104 perror("Cluster::wait waitid()");
108 auto server
= pids
.find(inf
.si_pid
);
109 if (server
!= pids
.end()) {
110 server
->second
->wait();