1 #include "MemcachedCluster.hpp"
4 const memcached_st
MemcachedCluster::empty_memc
{};
6 void MemcachedCluster::init() {
7 REQUIRE(cluster
.start());
9 while (!cluster
.ensureListening()) {
13 if (auto br
= getenv_else("MEMCACHED_BREAK", "0")) {
14 if (*br
&& *br
!= '0') {
17 cout
<< "Started servers:\n";
18 for (const auto &server
: cluster
.getServers()) {
19 cout
<< server
.getPid() << " ";
21 cout
<< "\nPress ENTER to continue... " << ::flush
;
26 REQUIRE(memcached_create(&memc
));
28 for (const auto &[behavior
, value
] : to_set
) {
29 REQUIRE(MEMCACHED_SUCCESS
== memcached_behavior_set(&memc
, behavior
, value
));
32 for (const auto &server
: cluster
.getServers()) {
33 auto target
= server
.getSocketOrPort();
34 if (holds_alternative
<string
>(target
)) {
35 REQUIRE(MEMCACHED_SUCCESS
== memcached_server_add_unix_socket(&memc
, get
<string
>(target
).c_str()));
37 REQUIRE(MEMCACHED_SUCCESS
== memcached_server_add(&memc
, "localhost", get
<int>(target
)));
43 MemcachedCluster::~MemcachedCluster() {
44 if (!!memcmp(&memc
, &empty_memc
, sizeof(memc
))) {
45 memcached_free(&memc
);
49 void MemcachedCluster::flush() {
50 REQUIRE(MEMCACHED_SUCCESS
== memcached_flush(&memc
, 0));
53 MemcachedCluster::MemcachedCluster()
56 {random_socket_or_port_arg()}
62 MemcachedCluster::MemcachedCluster(Cluster
&&cluster_
, behaviors_t to_set_
)
63 : cluster
{move(cluster_
)}
64 , to_set
{move(to_set_
)}
69 MemcachedCluster::MemcachedCluster(MemcachedCluster
&&mc
) noexcept
75 MemcachedCluster
&MemcachedCluster::operator=(MemcachedCluster
&&mc
) noexcept
{
76 cluster
= move(mc
.cluster
);
77 memcached_clone(&memc
, &mc
.memc
);
82 MemcachedCluster
MemcachedCluster::mixed() {
83 return MemcachedCluster
{};
86 MemcachedCluster
MemcachedCluster::network() {
87 return MemcachedCluster
{Cluster
{Server
{
89 {"-p", random_socket_or_port_string
}
93 MemcachedCluster
MemcachedCluster::socket() {
94 return MemcachedCluster
{Cluster
{Server
{
96 {"-s", random_socket_or_port_string
}
100 MemcachedCluster
MemcachedCluster::udp() {
101 return MemcachedCluster
{Cluster
{Server
{
104 Server::arg_pair_t
{"-U", random_socket_or_port_string
},
108 {MEMCACHED_BEHAVIOR_USE_UDP
, 1}
112 #if LIBMEMCACHED_WITH_SASL_SUPPORT
113 MemcachedCluster
MemcachedCluster::sasl() {
114 auto mc
= MemcachedCluster
{Cluster
{Server
{
117 Server::arg_pair_t
{"-p", random_socket_or_port_string
},
121 {MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
, 1},
123 REQUIRE(MEMCACHED_SUCCESS
== memcached_set_sasl_auth_data(&mc
.memc
,
124 "memcached", "memcached"));
129 void MemcachedCluster::enableBinaryProto(bool enable
) {
130 REQUIRE(MEMCACHED_SUCCESS
== memcached_behavior_set(&memc
,
131 MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
, enable
));
134 void MemcachedCluster::enableBuffering(bool enable
) {
135 REQUIRE(MEMCACHED_SUCCESS
== memcached_behavior_set(&memc
,
136 MEMCACHED_BEHAVIOR_BUFFER_REQUESTS
, enable
));
139 void MemcachedCluster::enableReplication() {
140 REQUIRE(MEMCACHED_SUCCESS
== memcached_behavior_set(&memc
,
141 MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS
, memcached_server_count(&memc
) - 1));
144 void MemcachedCluster::killOneServer() const {
145 const auto &servers
= cluster
.getServers();
146 const auto &victim
= servers
[random_num((size_t)0, servers
.size() - 1)];
147 ::kill(victim
.getPid(), SIGKILL
);