| 1 | package Memd; |
|---|
| 2 | |
|---|
| 3 | use warnings; |
|---|
| 4 | use strict; |
|---|
| 5 | |
|---|
| 6 | |
|---|
| 7 | use Cache::Memcached::Fast; |
|---|
| 8 | use Storable; |
|---|
| 9 | #use IO::Compress::Gzip; |
|---|
| 10 | #use IO::Uncompress::Gunzip; |
|---|
| 11 | |
|---|
| 12 | our (@addr, %params, $memd, $version_str, $version_num, $error); |
|---|
| 13 | |
|---|
| 14 | |
|---|
| 15 | BEGIN { |
|---|
| 16 | # Use differently spelled host addresses to enable Ketama to hash |
|---|
| 17 | # names differently. Note that not all hosts resolve 127.x.y.z |
|---|
| 18 | # other than 127.0.0.1. |
|---|
| 19 | @addr = ( |
|---|
| 20 | { address => 'localhost:11211', weight => 1.5 }, |
|---|
| 21 | '127.0.0.1:11211', |
|---|
| 22 | # { address => '127.0.0.2:11211' }, |
|---|
| 23 | # [ '127.0.0.3:11211', 2 ] |
|---|
| 24 | ); |
|---|
| 25 | |
|---|
| 26 | %params = ( |
|---|
| 27 | servers => [ @addr ], |
|---|
| 28 | namespace => "Cache::Memcached::Fast/$$/", |
|---|
| 29 | connect_timeout => 5, |
|---|
| 30 | io_timeout => 5, |
|---|
| 31 | close_on_error => 0, |
|---|
| 32 | compress_threshold => 1000, |
|---|
| 33 | # compress_methods => [ \&IO::Compress::Gzip::gzip, |
|---|
| 34 | # \&IO::Uncompress::Gunzip::gunzip ], |
|---|
| 35 | max_failures => 3, |
|---|
| 36 | failure_timeout => 2, |
|---|
| 37 | ketama_points => 150, |
|---|
| 38 | nowait => 1, |
|---|
| 39 | serialize_methods => [ \&Storable::freeze, \&Storable::thaw ], |
|---|
| 40 | utf8 => ($^V ge v5.8.1 ? 1 : 0), |
|---|
| 41 | ); |
|---|
| 42 | |
|---|
| 43 | $memd = Cache::Memcached::Fast->new(\%params); |
|---|
| 44 | |
|---|
| 45 | # Test what server version we have. server_versions() is |
|---|
| 46 | # currently undocumented. We know that all servers are the same, |
|---|
| 47 | # so test only the first version. |
|---|
| 48 | my $version = $memd->server_versions; |
|---|
| 49 | if (keys %$version == @addr) { |
|---|
| 50 | $version_num = 2 ** 31; |
|---|
| 51 | while (my ($s, $v) = each %$version) { |
|---|
| 52 | if ($v =~ /(\d+)\.(\d+)\.(\d+)/) { |
|---|
| 53 | my $n = $1 * 10000 + $2 * 100 + $3; |
|---|
| 54 | if ($n < $version_num) { |
|---|
| 55 | $version_str = $v; |
|---|
| 56 | $version_num = $n; |
|---|
| 57 | } |
|---|
| 58 | } else { |
|---|
| 59 | $error = "Can't parse version of $s: $v"; |
|---|
| 60 | undef $memd; |
|---|
| 61 | last; |
|---|
| 62 | } |
|---|
| 63 | } |
|---|
| 64 | } else { |
|---|
| 65 | my @servers = map { |
|---|
| 66 | if (ref($_) eq 'HASH') { |
|---|
| 67 | $_->{address}; |
|---|
| 68 | } elsif (ref($_) eq 'ARRAY') { |
|---|
| 69 | $_->[0]; |
|---|
| 70 | } else { |
|---|
| 71 | $_; |
|---|
| 72 | } |
|---|
| 73 | } @addr; |
|---|
| 74 | |
|---|
| 75 | $error = "No server is running at " |
|---|
| 76 | . join(', ', grep { not exists $version->{$_} } @servers); |
|---|
| 77 | undef $memd; |
|---|
| 78 | } |
|---|
| 79 | } |
|---|
| 80 | |
|---|
| 81 | |
|---|
| 82 | 1; |
|---|