ResultSet::TaskRetries: add get_seconds_to_next_retry

[?]
Aug 26, 2021, 4:38 PM
GMOI3OFSVRVF6ZOOXTIJ55MLLTWCN2GQUBXJZF2AVNN453USLWBAC

Dependencies

  • [2] ASPD4MDN Passwords: check in constant time
  • [*] D5QIOJGP * Move everything up one directory.

Change contents

  • file addition: ResultSet (d--r------)
    [4.477]
  • file addition: TaskRetries.pm (----------)
    [0.1]
    package Hydra::Schema::ResultSet::TaskRetries;
    use strict;
    use warnings;
    use utf8;
    use base 'DBIx::Class::ResultSet';
    use List::Util qw(max);
    =head2 get_seconds_to_next_retry
    Query the database to identify how soon the next retryable task is due
    for being attempted again.
    If there are no tasks to be reattempted it returns undef.
    If a task's scheduled retry has passed, it returns 0.
    Otherwise, returns the number of seconds from now to look for work.
    =cut
    sub get_seconds_to_next_retry {
    my ($self) = @_;
    my $next_retry = $self->search(
    {}, # any task
    {
    order_by => {
    -asc => 'retry_at'
    },
    rows => 1,
    }
    )->get_column('retry_at')->first;
    if (defined($next_retry)) {
    return max(0, $next_retry - time());
    } else {
    return undef;
    }
    }
    1;
  • file addition: ResultSet (d--r------)
    [2.895]
  • file addition: TaskRetries.t (----------)
    [0.926]
    use strict;
    use warnings;
    use Setup;
    my %ctx = test_init();
    require Hydra::Schema;
    require Hydra::Model::DB;
    use Test2::V0;
    my $db = Hydra::Model::DB->new;
    hydra_setup($db);
    my $taskretries = $db->resultset('TaskRetries');
    subtest "get_seconds_to_next_retry" => sub {
    subtest "Without any records in the database" => sub {
    is($taskretries->get_seconds_to_next_retry(), undef, "Without any records our next retry moment is forever away.");
    };
    subtest "With only tasks whose retry timestamps are in the future" => sub {
    $taskretries->create({
    channel => "bogus",
    pluginname => "bogus",
    payload => "bogus",
    attempts => 1,
    retry_at => time() + 100,
    });
    is($taskretries->get_seconds_to_next_retry(), within(100, 2), "We should retry in roughly 100 seconds");
    };
    subtest "With tasks whose retry timestamp are in the past" => sub {
    $taskretries->create({
    channel => "bogus",
    pluginname => "bogus",
    payload => "bogus",
    attempts => 1,
    retry_at => time() - 100,
    });
    is($taskretries->get_seconds_to_next_retry(), 0, "We should retry immediately");
    }
    };
    done_testing;