1 #include "MemcachedCluster.hpp"
4 const memcached_st
MemcachedCluster::empty_memc
{};
6 void MemcachedCluster::init() {
7 REQUIRE(cluster
.start());
9 Retry
cluster_is_listening([this]() {
10 return cluster
.isListening();
12 while (!cluster_is_listening()) {
18 if (auto br
= getenv_else("MEMCACHED_BREAK", "0")) {
19 if (*br
&& *br
!= '0') {
22 cout
<< "Started servers:\n";
23 for (const auto &server
: cluster
.getServers()) {
24 cout
<< server
.getPid() << " ";
26 cout
<< "\nPress ENTER to continue... " << ::flush
;
31 REQUIRE(memcached_create(&memc
));
33 for (const auto &[behavior
, value
] : to_set
) {
34 REQUIRE(MEMCACHED_SUCCESS
== memcached_behavior_set(&memc
, behavior
, value
));
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()));
42 REQUIRE(MEMCACHED_SUCCESS
== memcached_server_add(&memc
, "localhost", get
<int>(target
)));
48 MemcachedCluster::~MemcachedCluster() {
49 if (memcmp(&memc
, &empty_memc
, sizeof(memc
))) {
50 memcached_free(&memc
);
54 void MemcachedCluster::flush() {
55 REQUIRE(MEMCACHED_SUCCESS
== memcached_flush(&memc
, 0));
58 MemcachedCluster::MemcachedCluster()
61 {random_socket_or_port_arg()}
67 MemcachedCluster::MemcachedCluster(Cluster
&&cluster_
, behaviors_t to_set_
)
68 : cluster
{move(cluster_
)}
69 , to_set
{move(to_set_
)}
74 MemcachedCluster::MemcachedCluster(MemcachedCluster
&&mc
)
80 MemcachedCluster
&MemcachedCluster::operator=(MemcachedCluster
&&mc
) {
81 cluster
= move(mc
.cluster
);
82 memcached_clone(&memc
, &mc
.memc
);
83 returns
= ReturnMatcher
{&memc
};
87 MemcachedCluster
MemcachedCluster::mixed() {
88 return MemcachedCluster
{};
91 MemcachedCluster
MemcachedCluster::network() {
92 return MemcachedCluster
{Cluster
{Server
{
94 {"-p", random_socket_or_port_string
}
98 MemcachedCluster
MemcachedCluster::socket() {
99 return MemcachedCluster
{Cluster
{Server
{
101 {"-s", random_socket_or_port_string
}
105 MemcachedCluster
MemcachedCluster::udp() {
106 return MemcachedCluster
{Cluster
{Server
{
109 Server::arg_pair_t
{"-U", random_socket_or_port_string
},
113 {MEMCACHED_BEHAVIOR_USE_UDP
, 1}
117 #if LIBMEMCACHED_WITH_SASL_SUPPORT
118 MemcachedCluster
MemcachedCluster::sasl() {
119 auto mc
= MemcachedCluster
{Cluster
{Server
{
122 Server::arg_pair_t
{"-p", random_socket_or_port_string
},
126 {MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
, 1},
128 REQUIRE(MEMCACHED_SUCCESS
== memcached_set_sasl_auth_data(&mc
.memc
,
129 "memcached", "memcached"));
134 void MemcachedCluster::enableBinaryProto(bool enable
) {
135 REQUIRE(MEMCACHED_SUCCESS
== memcached_behavior_set(&memc
,
136 MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
, enable
));
139 void MemcachedCluster::enableBuffering(bool enable
) {
140 REQUIRE(MEMCACHED_SUCCESS
== memcached_behavior_set(&memc
,
141 MEMCACHED_BEHAVIOR_BUFFER_REQUESTS
, enable
));
144 void MemcachedCluster::enableReplication() {
145 REQUIRE(MEMCACHED_SUCCESS
== memcached_behavior_set(&memc
,
146 MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS
, memcached_server_count(&memc
) - 1));
149 void MemcachedCluster::killOneServer() {
150 const auto &servers
= cluster
.getServers();
151 const auto &victim
= servers
[random_num(0UL, servers
.size() - 1)];
152 ::kill(victim
.getPid(), SIGKILL
);