forked from lix-project/hydra
ResultSet::TaskRetries: teach about saving tasks
This commit is contained in:
parent
147fa4d029
commit
d0b0fc21b3
|
@ -5,6 +5,7 @@ use warnings;
|
||||||
use utf8;
|
use utf8;
|
||||||
use base 'DBIx::Class::ResultSet';
|
use base 'DBIx::Class::ResultSet';
|
||||||
use List::Util qw(max);
|
use List::Util qw(max);
|
||||||
|
use Hydra::Math qw(exponential_backoff);
|
||||||
|
|
||||||
=head2 get_seconds_to_next_retry
|
=head2 get_seconds_to_next_retry
|
||||||
|
|
||||||
|
@ -38,4 +39,32 @@ sub get_seconds_to_next_retry {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
=head2 save_task
|
||||||
|
|
||||||
|
Save a failing L<Hydra::Task> in the database, with a retry scheduled
|
||||||
|
for a few seconds away.
|
||||||
|
|
||||||
|
Arguments:
|
||||||
|
|
||||||
|
=over 1
|
||||||
|
|
||||||
|
=item C<$task>
|
||||||
|
|
||||||
|
L<Hydra::Task> The failing task to retry.
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=cut
|
||||||
|
sub save_task {
|
||||||
|
my ($self, $task) = @_;
|
||||||
|
|
||||||
|
return $self->create({
|
||||||
|
channel => $task->{"event"}->{"channel_name"},
|
||||||
|
pluginname => $task->{"plugin_name"},
|
||||||
|
payload => $task->{"event"}->{"payload"},
|
||||||
|
attempts => 1,
|
||||||
|
retry_at => time() + exponential_backoff(1),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|
|
@ -4,6 +4,8 @@ use Setup;
|
||||||
|
|
||||||
my %ctx = test_init();
|
my %ctx = test_init();
|
||||||
|
|
||||||
|
use Hydra::Event;
|
||||||
|
use Hydra::Task;
|
||||||
require Hydra::Schema;
|
require Hydra::Schema;
|
||||||
require Hydra::Model::DB;
|
require Hydra::Model::DB;
|
||||||
|
|
||||||
|
@ -42,4 +44,20 @@ subtest "get_seconds_to_next_retry" => sub {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
subtest "save_task" => sub {
|
||||||
|
my $event = Hydra::Event->new_event("build_started", "1");
|
||||||
|
my $task = Hydra::Task->new(
|
||||||
|
$event,
|
||||||
|
"FooPluginName",
|
||||||
|
);
|
||||||
|
|
||||||
|
my $retry = $taskretries->save_task($task);
|
||||||
|
|
||||||
|
is($retry->channel, "build_started", "Channel name should match");
|
||||||
|
is($retry->pluginname, "FooPluginName", "Plugin name should match");
|
||||||
|
is($retry->payload, "1", "Payload should match");
|
||||||
|
is($retry->attempts, 1, "We've had one attempt");
|
||||||
|
is($retry->retry_at, within(time() + 1, 2), "The retry at should be approximately one second away");
|
||||||
|
};
|
||||||
|
|
||||||
done_testing;
|
done_testing;
|
||||||
|
|
Loading…
Reference in a new issue