summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDylan William Hardison <dylan@hardison.net>2018-10-09 23:01:35 +0200
committerGitHub <noreply@github.com>2018-10-09 23:01:35 +0200
commit34fd0c3db18f7f5da558d8a8294e7fea61224186 (patch)
treeccdefaa84b6e4933c00a094aacc040e97e8b6f34
parent75dbfe1dc03748957f07eca5ac583bedc6fdba76 (diff)
downloadbugzilla-34fd0c3db18f7f5da558d8a8294e7fea61224186.tar.gz
bugzilla-34fd0c3db18f7f5da558d8a8294e7fea61224186.tar.xz
Bug 1496832 - Add timeouts to prevent feed daemon from becoming unresponsive
-rw-r--r--extensions/PhabBugz/lib/Constants.pm2
-rw-r--r--extensions/PhabBugz/lib/Feed.pm28
2 files changed, 27 insertions, 3 deletions
diff --git a/extensions/PhabBugz/lib/Constants.pm b/extensions/PhabBugz/lib/Constants.pm
index 1692f8fb9..19987de25 100644
--- a/extensions/PhabBugz/lib/Constants.pm
+++ b/extensions/PhabBugz/lib/Constants.pm
@@ -19,6 +19,7 @@ our @EXPORT = qw(
PHAB_FEED_POLL_SECONDS
PHAB_USER_POLL_SECONDS
PHAB_GROUP_POLL_SECONDS
+ PHAB_TIMEOUT
);
use constant PHAB_ATTACHMENT_PATTERN => qr/^phabricator-D(\d+)/;
@@ -27,5 +28,6 @@ use constant PHAB_CONTENT_TYPE => 'text/x-phabricator-request';
use constant PHAB_FEED_POLL_SECONDS => $ENV{PHAB_FEED_POLL} // 5;
use constant PHAB_USER_POLL_SECONDS => $ENV{PHAB_USER_POLL} // 60;
use constant PHAB_GROUP_POLL_SECONDS => $ENV{PHAB_GROUP_POLL} // 300;
+use constant PHAB_TIMEOUT => $ENV{PHAB_TIMEOUT} // 60;
1;
diff --git a/extensions/PhabBugz/lib/Feed.pm b/extensions/PhabBugz/lib/Feed.pm
index d8d4d6921..71e6aa827 100644
--- a/extensions/PhabBugz/lib/Feed.pm
+++ b/extensions/PhabBugz/lib/Feed.pm
@@ -11,6 +11,7 @@ use 5.10.1;
use IO::Async::Timer::Periodic;
use IO::Async::Loop;
+use IO::Async::Signal;
use List::Util qw(first);
use List::MoreUtils qw(any uniq);
use Moo;
@@ -47,6 +48,13 @@ my $Invocant = class_type { class => __PACKAGE__ };
sub start {
my ($self) = @_;
+ my $sig_alarm = IO::Async::Signal->new(
+ name => 'ALRM',
+ on_receipt => sub {
+ FATAL("Timeout reached");
+ exit;
+ },
+ );
# Query for new revisions or changes
my $feed_timer = IO::Async::Timer::Periodic->new(
first_interval => 0,
@@ -55,13 +63,17 @@ sub start {
on_tick => sub {
try {
with_writable_database {
+ alarm(PHAB_TIMEOUT);
$self->feed_query();
};
}
catch {
FATAL($_);
+ }
+ finally {
+ alarm(0);
+ Bugzilla->_cleanup();
};
- Bugzilla->_cleanup();
},
);
@@ -73,13 +85,17 @@ sub start {
on_tick => sub {
try {
with_writable_database {
+ alarm(PHAB_TIMEOUT);
$self->user_query();
};
}
catch {
FATAL($_);
+ }
+ finally {
+ alarm(0);
+ Bugzilla->_cleanup();
};
- Bugzilla->_cleanup();
},
);
@@ -91,13 +107,18 @@ sub start {
on_tick => sub {
try {
with_writable_database {
+ alarm(PHAB_TIMEOUT);
$self->group_query();
};
}
catch {
FATAL($_);
+ }
+ finally {
+ alarm(0);
+ Bugzilla->_cleanup();
};
- Bugzilla->_cleanup();
+
},
);
@@ -105,6 +126,7 @@ sub start {
$loop->add($feed_timer);
$loop->add($user_timer);
$loop->add($group_timer);
+ $loop->add($sig_alarm);
$feed_timer->start;
$user_timer->start;
$group_timer->start;