f94e86ca80d276534ff6164ec4ac274fa98ecb99
[m6w6/libmemcached] / test / lib / MemcachedCluster.cpp
1 #include "MemcachedCluster.hpp"
2 #include "Retry.hpp"
3
4 const memcached_st MemcachedCluster::empty_memc{};
5
6 void MemcachedCluster::init() {
7 REQUIRE(cluster.start());
8
9 Retry cluster_is_listening([this]() {
10 return cluster.isListening();
11 });
12 while (!cluster_is_listening()) {
13 cluster.stop();
14 cluster.wait();
15 cluster.start();
16 }
17
18 if (auto br = getenv_else("MEMCACHED_BREAK", "0")) {
19 if (*br && *br != '0') {
20 string in;
21
22 cout << "Started servers:\n";
23 for (const auto &server : cluster.getServers()) {
24 cout << server.getPid() << " ";
25 }
26 cout << "\nPress ENTER to continue... " << ::flush;
27 cin.get();
28 }
29 }
30
31 REQUIRE(memcached_create(&memc));
32
33 for (const auto &[behavior, value] : to_set) {
34 REQUIRE(MEMCACHED_SUCCESS == memcached_behavior_set(&memc, behavior, value));
35 }
36
37 for (const auto &server : cluster.getServers()) {
38 auto target = server.getSocketOrPort();
39 if (holds_alternative<string>(target)) {
40 REQUIRE(MEMCACHED_SUCCESS == memcached_server_add_unix_socket(&memc, get<string>(target).c_str()));
41 } else {
42 REQUIRE(MEMCACHED_SUCCESS == memcached_server_add(&memc, "localhost", get<int>(target)));
43 }
44 }
45
46 }
47
48 MemcachedCluster::~MemcachedCluster() {
49 if (!!memcmp(&memc, &empty_memc, sizeof(memc))) {
50 memcached_free(&memc);
51 }
52 }
53
54 void MemcachedCluster::flush() {
55 REQUIRE(MEMCACHED_SUCCESS == memcached_flush(&memc, 0));
56 }
57
58 MemcachedCluster::MemcachedCluster()
59 : cluster{Server{
60 MEMCACHED_BINARY,
61 {random_socket_or_port_arg()}
62 }}
63 {
64 init();
65 }
66
67 MemcachedCluster::MemcachedCluster(Cluster &&cluster_, behaviors_t to_set_)
68 : cluster{move(cluster_)}
69 , to_set{move(to_set_)}
70 {
71 init();
72 }
73
74 MemcachedCluster::MemcachedCluster(MemcachedCluster &&mc) noexcept
75 : cluster{Server{}}
76 {
77 *this = move(mc);
78 }
79
80 MemcachedCluster &MemcachedCluster::operator=(MemcachedCluster &&mc) noexcept {
81 cluster = move(mc.cluster);
82 memcached_clone(&memc, &mc.memc);
83 returns = ReturnMatcher{&memc};
84 return *this;
85 }
86
87 MemcachedCluster MemcachedCluster::mixed() {
88 return MemcachedCluster{};
89 }
90
91 MemcachedCluster MemcachedCluster::network() {
92 return MemcachedCluster{Cluster{Server{
93 MEMCACHED_BINARY,
94 {"-p", random_socket_or_port_string}
95 }}};
96 }
97
98 MemcachedCluster MemcachedCluster::socket() {
99 return MemcachedCluster{Cluster{Server{
100 MEMCACHED_BINARY,
101 {"-s", random_socket_or_port_string}
102 }}};
103 }
104
105 MemcachedCluster MemcachedCluster::udp() {
106 return MemcachedCluster{Cluster{Server{
107 MEMCACHED_BINARY,
108 {
109 Server::arg_pair_t{"-U", random_socket_or_port_string},
110 Server::arg_t{"-v"}
111 }
112 }}, {
113 {MEMCACHED_BEHAVIOR_USE_UDP, 1}
114 }};
115 }
116
117 #if LIBMEMCACHED_WITH_SASL_SUPPORT
118 MemcachedCluster MemcachedCluster::sasl() {
119 auto mc = MemcachedCluster{Cluster{Server{
120 MEMCACHED_BINARY,
121 {
122 Server::arg_pair_t{"-p", random_socket_or_port_string},
123 Server::arg_t{"-S"}
124 }
125 }}, {
126 {MEMCACHED_BEHAVIOR_BINARY_PROTOCOL, 1},
127 }};
128 REQUIRE(MEMCACHED_SUCCESS == memcached_set_sasl_auth_data(&mc.memc,
129 "memcached", "memcached"));
130 return mc;
131 }
132 #endif
133
134 void MemcachedCluster::enableBinaryProto(bool enable) {
135 REQUIRE(MEMCACHED_SUCCESS == memcached_behavior_set(&memc,
136 MEMCACHED_BEHAVIOR_BINARY_PROTOCOL, enable));
137 }
138
139 void MemcachedCluster::enableBuffering(bool enable) {
140 REQUIRE(MEMCACHED_SUCCESS == memcached_behavior_set(&memc,
141 MEMCACHED_BEHAVIOR_BUFFER_REQUESTS, enable));
142 }
143
144 void MemcachedCluster::enableReplication() {
145 REQUIRE(MEMCACHED_SUCCESS == memcached_behavior_set(&memc,
146 MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS, memcached_server_count(&memc) - 1));
147 }
148
149 void MemcachedCluster::killOneServer() const {
150 const auto &servers = cluster.getServers();
151 const auto &victim = servers[random_num(0UL, servers.size() - 1)];
152 ::kill(victim.getPid(), SIGKILL);
153 }