90 lines
3.2 KiB
PHP
90 lines
3.2 KiB
PHP
# We need to wait until the plugin becomes responsive.
|
|
# We achieve that by using memcached command "stats"
|
|
# which returns an hash containing many fields, among them
|
|
# "hosts", but only if the plugin is up and running.
|
|
#
|
|
# Example of usage:
|
|
# INSTALL PLUGIN daemon_memcached SONAME 'libmemcached.so';
|
|
# # host and port on which the memcached should operate
|
|
# # ususally host is 127.0.0.1 and
|
|
# # port is in -master.opt file as --loose-daemon_memcached_option
|
|
# --let $memcached_address=127.0.0.1:11227
|
|
# # each attempt consists of reconnecting and trying to do 'stats'
|
|
# # which may take up to 20 seconds, but actually takes more like 1s
|
|
# # because determining that local port is closed or that server is
|
|
# # not responding as it should is quick, and we do 1s sleep in between.
|
|
# --let $memcached_check_attempts=20
|
|
# # Either you expect 'success' or 'error'
|
|
# --let $memcached_expect=success
|
|
# --source ../include/check_daemon_memcached.inc
|
|
#
|
|
# ..or even better use:
|
|
# --let $memcached_address=127.0.0.1:11227
|
|
# --source ../include/load_daemon_memcached_expecting_success.inc
|
|
# ..or..
|
|
# --let $memcached_address=127.0.0.1:11227
|
|
# --source ../include/load_daemon_memcached_expecting_error.inc
|
|
|
|
if(!$memcached_address){
|
|
--die You need to specify $memcached_address variable
|
|
}
|
|
--let $memcached_expect_is_valid=0
|
|
if($memcached_expect=="error"){
|
|
--let $memcached_expect_is_valid=1
|
|
}
|
|
if($memcached_expect=="success"){
|
|
--let $memcached_expect_is_valid=1
|
|
}
|
|
if(!$memcached_expect_is_valid){
|
|
--die You need to specify $memcached_expect either 'success' or 'error'
|
|
}
|
|
if(!$memcached_check_attempts){
|
|
--die You need to specify a non-zero number of $memcached_check_attempts
|
|
}
|
|
# For some reason the ENV variable can not be named the same
|
|
# as the regular variable even if case of letters is different,
|
|
# hance we use ENV_ prefix.
|
|
--let ENV_MEMCACHED_ADDRESS= $memcached_address
|
|
--let ENV_MEMCACHED_CHECK_ATTEMPTS= $memcached_check_attempts
|
|
--let ENV_MEMCACHED_EXPECT= $memcached_expect
|
|
|
|
perl;
|
|
use DBI;
|
|
use Cache::Memcached;
|
|
my $memd = new Cache::Memcached {
|
|
'servers' => [ $ENV{'ENV_MEMCACHED_ADDRESS'} ],
|
|
'connect_timeout' => 20,
|
|
'select_timeout' => 20
|
|
};
|
|
my $max_wait = $ENV{'ENV_MEMCACHED_CHECK_ATTEMPTS'};
|
|
my $wait_sec = $max_wait;
|
|
my $success = 0;
|
|
while (1) {
|
|
# The undocumented ->forget_dead_hosts() clears a global %host_dead
|
|
# which is crucial, as otherwise failed attempts of ->stats()
|
|
# combined with later attempt to reconnect, will mark the
|
|
# server as dead for 20+rand(10) seconds.
|
|
# By the way there is no connection between all occurences of
|
|
# number 20 in this file.
|
|
$memd->forget_dead_hosts();
|
|
my $hash = $memd->stats();
|
|
if(exists $hash->{'hosts'}){
|
|
$success = 1;
|
|
last;
|
|
}
|
|
if ($wait_sec-->0) {
|
|
# Sleep 1 second and try again
|
|
sleep 1;
|
|
} else {
|
|
last;
|
|
}
|
|
}
|
|
$memd->disconnect_all();
|
|
if (($ENV{'ENV_MEMCACHED_EXPECT'} eq 'success') && !$success) {
|
|
die "Waited for " . $max_wait . " sec. but " . $ENV{'ENV_MEMCACHED_ADDRESS'} . " did not respond with stats\n";
|
|
}
|
|
if (($ENV{'ENV_MEMCACHED_EXPECT'} eq 'error') && $success) {
|
|
die "The memcached plugin at " . $ENV{'ENV_MEMCACHED_ADDRESS'} . " was supposed to fail, but it works";
|
|
}
|
|
EOF
|