AnyEvent-Redis-Federated

 view release on metacpan or  search on metacpan

Changes  view on Meta::CPAN

Revision history for Perl extension AnyEvent::Redis::Federated.

0.08  Tue Nov 27 12:00:41 2012
	- Doc cleanup.

0.07  Thu Sep 13 12:00:41 2012
	- Fixed retry logic, memory leak in poll(), and introduce node groups.

0.06  Tue Aug 7 10:00:41 2012
	- AnyEvent timer replaced with alarm since timers work in
  	surprising ways

0.05  Tue Jul 31 10:06:41 2012
	- more Makefile.PL fixes

0.04  Mon Jul 30 11:06:41 2012
	- Makefile.PL fixes

0.03  Mon Jul 30 10:06:41 2012
	- fix tests to start redis-server if found

lib/AnyEvent/Redis/Federated.pm  view on Meta::CPAN

		$self->{server_status}{"$server:retries"}++;
		$self->{server_status}{"$server:down_since"} = time();
		$self->{server_status}{"$server:retry_interval"} ||= $self->{base_retry_interval};
	}

	if ($self->{server_status}{"$server:retry_pending"}) {
		warn "retry already pending for $server, skipping\n" if $self->{debug};
		return 1;
	}

	# ok, schedule the timer to re-check. this should NOT be a
	# recurring timer, otherwise we end up with a bunch of pending
	# retries since the "interval" is likely shorter than TCP timeout.
	# eventually this will error out, in which case we'll try it again
	# by calling markServerDown() after clearying retry_pending, or
	# it'll work and we're good to go.
	my $t;
	my $r;
	$t = AnyEvent->timer(
		after => $delay,
		cb => sub {
			warn "timer callback triggered for $server" if $self->{debug};
			my ($host, $port) = split /:/, $server;
			print "attempting reconnect to $server\n" if $self->{debug};
			$r = AnyEvent::Redis->new(
				host => $host,
				port => $port,
				on_error => sub {
					warn @_ unless $self->{quiet};
					$self->{server_status}{"$server:retry_pending"} = 0;
					$self->markServerDown($server); # schedule another try
				}
			);

			$r->ping(sub{
				my $val = shift; # should be 'PONG'
				if ($val ne 'PONG') {
					warn "retry ping got $val instead of PONG" if $self->{debug};
				}
				$self->{conn}->{$server} = $r;
				$self->{server_status}{"$server:retry_pending"} = 0;
				$self->markServerUp($server);
				undef $t; # we need to keep a ref to the timer here so it runs at all
			 });
		}
	);
	warn "scheduled health check of $server in $delay secs\n" if $self->{debug};
	$self->{server_status}{"$server:retry_pending"} = 1;
	return 1;
}

our $AUTOLOAD;

lib/AnyEvent/Redis/Federated.pm  view on Meta::CPAN

			# check the state of requests, marking remaining as cancelled
			while (my ($rid, $state) = each %{$self->{request_state}}) {
				if ($self->{request_state}->{$rid}) {
					print "found pending request to cancel: $rid\n" if $self->{debug};
					$self->{request_state}->{$rid} = 0;
					$self->{cv}->end;
					undef $w;
				}
			}
		});
		print "scheduling alarm timer in poll() for $timeout\n" if $self->{debug};
		alarm($timeout);
	}

	$self->{cv}->recv;
	$self->{cv} = undef;
	alarm(0);
	undef $w;
}

sub scheduleCall {



( run in 1.013 second using v1.01-cache-2.11-cpan-49f99fa48dc )