Cache-Memcached
view release on metacpan or search on metacpan
lib/Cache/Memcached.pm view on Meta::CPAN
# $Id$
#
# Copyright (c) 2003, 2004 Brad Fitzpatrick <brad@danga.com>
#
# See COPYRIGHT section in pod text below for usage and distribution rights.
#
package Cache::Memcached;
use strict;
use warnings;
no strict 'refs';
use Storable ();
use Socket qw( MSG_NOSIGNAL PF_INET PF_UNIX IPPROTO_TCP SOCK_STREAM );
use IO::Handle ();
use Time::HiRes ();
use String::CRC32;
use Errno qw( EINPROGRESS EWOULDBLOCK EISCONN );
use Cache::Memcached::GetParser;
use Encode ();
use fields qw{
debug no_rehash stats compress_threshold compress_enable stat_callback
readonly select_timeout namespace namespace_len servers active buckets
pref_ip
bucketcount _single_sock _stime
connect_timeout cb_connect_fail
parser_class
buck2sock buck2sock_generation
};
# flag definitions
use constant F_STORABLE => 1;
use constant F_COMPRESS => 2;
# size savings required before saving compressed value
use constant COMPRESS_SAVINGS => 0.20; # percent
use vars qw($VERSION $HAVE_ZLIB $FLAG_NOSIGNAL $HAVE_SOCKET6);
$VERSION = "1.30";
BEGIN {
$HAVE_ZLIB = eval "use Compress::Zlib (); 1;";
$HAVE_SOCKET6 = eval "use Socket6 qw(AF_INET6 PF_INET6); 1;";
}
my $HAVE_XS = eval "use Cache::Memcached::GetParserXS; 1;";
$HAVE_XS = 0 if $ENV{NO_XS};
my $parser_class = $HAVE_XS ? "Cache::Memcached::GetParserXS" : "Cache::Memcached::GetParser";
if ($ENV{XS_DEBUG}) {
print "using parser: $parser_class\n";
}
$FLAG_NOSIGNAL = 0;
eval { $FLAG_NOSIGNAL = MSG_NOSIGNAL; };
my %host_dead; # host -> unixtime marked dead until
my %cache_sock; # host -> socket
my $socket_cache_generation = 1; # Set to 1 here because below the buck2sock_generation is set to 0, keep them in order.
my $PROTO_TCP;
our $SOCK_TIMEOUT = 2.6; # default timeout in seconds
sub new {
my Cache::Memcached $self = shift;
$self = fields::new( $self ) unless ref $self;
my $args = (@_ == 1) ? shift : { @_ }; # hashref-ify args
$self->{'buck2sock'}= [];
$self->{'buck2sock_generation'} = 0;
$self->set_servers($args->{'servers'});
$self->{'debug'} = $args->{'debug'} || 0;
$self->{'no_rehash'} = $args->{'no_rehash'};
$self->{'stats'} = {};
$self->{'pref_ip'} = $args->{'pref_ip'} || {};
$self->{'compress_threshold'} = $args->{'compress_threshold'};
$self->{'compress_enable'} = 1;
$self->{'stat_callback'} = $args->{'stat_callback'} || undef;
$self->{'readonly'} = $args->{'readonly'};
$self->{'parser_class'} = $args->{'parser_class'} || $parser_class;
# TODO: undocumented
$self->{'connect_timeout'} = $args->{'connect_timeout'} || 0.25;
$self->{'select_timeout'} = $args->{'select_timeout'} || 1.0;
$self->{namespace} = $args->{namespace} || '';
$self->{namespace_len} = length $self->{namespace};
return $self;
}
sub set_pref_ip {
my Cache::Memcached $self = shift;
$self->{'pref_ip'} = shift;
}
( run in 0.576 second using v1.01-cache-2.11-cpan-39bf76dae61 )