Page MenuHomePhabricator

D11429.diff
No OneTemporary

D11429.diff

diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php
--- a/src/__phutil_library_map__.php
+++ b/src/__phutil_library_map__.php
@@ -2362,6 +2362,7 @@
'PhabricatorSSHWorkflow' => 'infrastructure/ssh/PhabricatorSSHWorkflow.php',
'PhabricatorSavedQuery' => 'applications/search/storage/PhabricatorSavedQuery.php',
'PhabricatorSavedQueryQuery' => 'applications/search/query/PhabricatorSavedQueryQuery.php',
+ 'PhabricatorScheduleTaskTriggerAction' => 'infrastructure/daemon/workers/action/PhabricatorScheduleTaskTriggerAction.php',
'PhabricatorScopedEnv' => 'infrastructure/env/PhabricatorScopedEnv.php',
'PhabricatorSearchAbstractDocument' => 'applications/search/index/PhabricatorSearchAbstractDocument.php',
'PhabricatorSearchApplication' => 'applications/search/application/PhabricatorSearchApplication.php',
@@ -5643,6 +5644,7 @@
'PhabricatorPolicyInterface',
),
'PhabricatorSavedQueryQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
+ 'PhabricatorScheduleTaskTriggerAction' => 'PhabricatorTriggerAction',
'PhabricatorSearchApplication' => 'PhabricatorApplication',
'PhabricatorSearchApplicationSearchEngine' => 'PhabricatorApplicationSearchEngine',
'PhabricatorSearchAttachController' => 'PhabricatorSearchBaseController',
diff --git a/src/infrastructure/daemon/workers/action/PhabricatorScheduleTaskTriggerAction.php b/src/infrastructure/daemon/workers/action/PhabricatorScheduleTaskTriggerAction.php
new file mode 100644
--- /dev/null
+++ b/src/infrastructure/daemon/workers/action/PhabricatorScheduleTaskTriggerAction.php
@@ -0,0 +1,45 @@
+<?php
+
+/**
+ * Trigger action which queues a task.
+ *
+ * Most triggers should take this action: triggers need to execute as quickly
+ * as possible, and should generally queue tasks instead of doing any real
+ * work.
+ *
+ * In some cases, triggers could execute more quickly by examining the
+ * scheduled action time and comparing it to the current time, then exiting
+ * early if the trigger is executing too far away from real time (for example,
+ * it might not make sense to send a meeting reminder after a meeting already
+ * happened).
+ *
+ * However, in most cases the task needs to have this logic anyway (because
+ * there may be another arbitrarily long delay between when this code executes
+ * and when the task executes), and the cost of queueing a task is very small,
+ * and situations where triggers are executing far away from real time should
+ * be rare (major downtime or serious problems with the pipeline).
+ *
+ * The properties of this action map to the parameters of
+ * @{method:PhabricatorWorker::scheduleTask}.
+ */
+final class PhabricatorScheduleTaskTriggerAction
+ extends PhabricatorTriggerAction {
+
+ public function validateProperties(array $properties) {
+ PhutilTypeSpec::checkMap(
+ $properties,
+ array(
+ 'class' => 'string',
+ 'data' => 'map<string, wild>',
+ 'options' => 'map<string, wild>',
+ ));
+ }
+
+ public function execute($last_epoch, $this_epoch) {
+ PhabricatorWorker::scheduleTask(
+ $this->getProperty('class'),
+ $this->getProperty('data'),
+ $this->getProperty('options'));
+ }
+
+}
diff --git a/src/infrastructure/daemon/workers/action/PhabricatorTriggerAction.php b/src/infrastructure/daemon/workers/action/PhabricatorTriggerAction.php
--- a/src/infrastructure/daemon/workers/action/PhabricatorTriggerAction.php
+++ b/src/infrastructure/daemon/workers/action/PhabricatorTriggerAction.php
@@ -2,6 +2,10 @@
/**
* A trigger action reacts to a scheduled event.
+ *
+ * Almost all events should use a @{class:PhabricatorScheduleTaskTriggerAction}.
+ * Avoid introducing new actions without strong justification. See that class
+ * for discussion of concerns.
*/
abstract class PhabricatorTriggerAction extends Phobject {
@@ -41,6 +45,9 @@
* performing processing directly, triggers can execute more involved actions
* without blocking other triggers.
*
+ * Almost all events should use @{class:PhabricatorScheduleTaskTriggerAction}
+ * to do this, ensuring that they execute quickly.
+ *
* An action may trigger a long time after it is scheduled. For example,
* a meeting reminder may be scheduled at 9:45 AM, but the action may not
* execute until later (for example, because the server was down for

File Metadata

Mime Type
text/plain
Expires
Sat, Sep 21, 10:38 AM (22 h, 3 m)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
6625407
Default Alt Text
D11429.diff (4 KB)

Event Timeline