void MemcachedCluster::init() {
REQUIRE(cluster.start());
- Retry cluster_is_listening([this]() {
- return cluster.isListening();
- });
- REQUIRE(cluster_is_listening());
+ while (!cluster.ensureListening()) {
+ cluster.restart();
+ }
+
+ if (auto br = getenv_else("MEMCACHED_BREAK", "0")) {
+ if (*br && *br != '0') {
+ string in;
+
+ cout << "Started servers:\n";
+ for (const auto &server : cluster.getServers()) {
+ cout << server.getPid() << " ";
+ }
+ cout << "\nPress ENTER to continue... " << ::flush;
+ cin.get();
+ }
+ }
REQUIRE(memcached_create(&memc));
+
+ for (const auto &[behavior, value] : to_set) {
+ REQUIRE(MEMCACHED_SUCCESS == memcached_behavior_set(&memc, behavior, value));
+ }
+
for (const auto &server : cluster.getServers()) {
auto target = server.getSocketOrPort();
if (holds_alternative<string>(target)) {
}
MemcachedCluster::~MemcachedCluster() {
- if (memcmp(&memc, &empty_memc, sizeof(memc))) {
+ if (!!memcmp(&memc, &empty_memc, sizeof(memc))) {
memcached_free(&memc);
}
}
init();
}
-MemcachedCluster::MemcachedCluster(Cluster &&cluster_)
+MemcachedCluster::MemcachedCluster(Cluster &&cluster_, behaviors_t to_set_)
: cluster{move(cluster_)}
+, to_set{move(to_set_)}
{
init();
}
-MemcachedCluster::MemcachedCluster(MemcachedCluster &&mc)
+MemcachedCluster::MemcachedCluster(MemcachedCluster &&mc) noexcept
: cluster{Server{}}
{
*this = move(mc);
}
-MemcachedCluster &MemcachedCluster::operator=(MemcachedCluster &&mc) {
+MemcachedCluster &MemcachedCluster::operator=(MemcachedCluster &&mc) noexcept {
cluster = move(mc.cluster);
memcached_clone(&memc, &mc.memc);
- returns = ReturnMatcher{&memc};
+ returns = &memc;
return *this;
}
}}};
}
+MemcachedCluster MemcachedCluster::udp() {
+ return MemcachedCluster{Cluster{Server{
+ MEMCACHED_BINARY,
+ {
+ Server::arg_pair_t{"-U", random_socket_or_port_string},
+ Server::arg_t{"-v"}
+ }
+ }}, {
+ {MEMCACHED_BEHAVIOR_USE_UDP, 1}
+ }};
+}
+
#if LIBMEMCACHED_WITH_SASL_SUPPORT
MemcachedCluster MemcachedCluster::sasl() {
auto mc = MemcachedCluster{Cluster{Server{
Server::arg_pair_t{"-p", random_socket_or_port_string},
Server::arg_t{"-S"}
}
- }}};
- mc.enableBinaryProto();
+ }}, {
+ {MEMCACHED_BEHAVIOR_BINARY_PROTOCOL, 1},
+ }};
REQUIRE(MEMCACHED_SUCCESS == memcached_set_sasl_auth_data(&mc.memc,
"memcached", "memcached"));
return mc;
void MemcachedCluster::enableReplication() {
REQUIRE(MEMCACHED_SUCCESS == memcached_behavior_set(&memc,
- MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS, memcached_server_count(&memc)));
+ MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS, memcached_server_count(&memc) - 1));
}
+void MemcachedCluster::killOneServer() const {
+ const auto &servers = cluster.getServers();
+ const auto &victim = servers[random_num(0UL, servers.size() - 1)];
+ ::kill(victim.getPid(), SIGKILL);
+}