[ Index ]

PHP Cross Reference of Phabricator

title

Body

[close]

/src/applications/daemon/controller/ -> PhabricatorWorkerTaskDetailController.php (source)

   1  <?php
   2  
   3  final class PhabricatorWorkerTaskDetailController
   4    extends PhabricatorDaemonController {
   5  
   6    private $id;
   7  
   8    public function willProcessRequest(array $data) {
   9      $this->id = $data['id'];
  10    }
  11  
  12    public function processRequest() {
  13      $request = $this->getRequest();
  14      $user = $request->getUser();
  15  
  16      $task = id(new PhabricatorWorkerActiveTask())->load($this->id);
  17      if (!$task) {
  18        $task = id(new PhabricatorWorkerArchiveTask())->load($this->id);
  19      }
  20  
  21      if (!$task) {
  22        $title = pht('Task Does Not Exist');
  23  
  24        $error_view = new AphrontErrorView();
  25        $error_view->setTitle(pht('No Such Task'));
  26        $error_view->appendChild(phutil_tag(
  27          'p',
  28          array(),
  29          pht('This task may have recently been garbage collected.')));
  30        $error_view->setSeverity(AphrontErrorView::SEVERITY_NODATA);
  31  
  32        $content = $error_view;
  33      } else {
  34        $title = pht('Task %d', $task->getID());
  35  
  36        $header = id(new PHUIHeaderView())
  37          ->setHeader(pht('Task %d (%s)',
  38            $task->getID(),
  39            $task->getTaskClass()));
  40  
  41        $actions = $this->buildActionListView($task);
  42        $properties = $this->buildPropertyListView($task, $actions);
  43  
  44        $object_box = id(new PHUIObjectBoxView())
  45          ->setHeader($header)
  46          ->addPropertyList($properties);
  47  
  48  
  49        $retry_head = id(new PHUIHeaderView())
  50          ->setHeader(pht('Retries'));
  51  
  52        $retry_info = $this->buildRetryListView($task);
  53  
  54        $retry_box = id(new PHUIObjectBoxView())
  55          ->setHeader($retry_head)
  56          ->addPropertyList($retry_info);
  57  
  58        $content = array(
  59          $object_box,
  60          $retry_box,
  61        );
  62      }
  63  
  64      $crumbs = $this->buildApplicationCrumbs();
  65      $crumbs->addTextCrumb($title);
  66  
  67      return $this->buildApplicationPage(
  68        array(
  69          $crumbs,
  70          $content,
  71        ),
  72        array(
  73          'title' => $title,
  74        ));
  75    }
  76  
  77    private function buildActionListView(PhabricatorWorkerTask $task) {
  78      $request = $this->getRequest();
  79      $user = $request->getUser();
  80      $id = $task->getID();
  81  
  82      $view = id(new PhabricatorActionListView())
  83        ->setUser($user)
  84        ->setObjectURI($request->getRequestURI());
  85  
  86      if ($task->isArchived()) {
  87        $result_success = PhabricatorWorkerArchiveTask::RESULT_SUCCESS;
  88        $can_retry = ($task->getResult() != $result_success);
  89  
  90        $view->addAction(
  91          id(new PhabricatorActionView())
  92            ->setName(pht('Retry Task'))
  93            ->setHref($this->getApplicationURI('/task/'.$id.'/retry/'))
  94            ->setIcon('fa-refresh')
  95            ->setWorkflow(true)
  96            ->setDisabled(!$can_retry));
  97      } else {
  98        $view->addAction(
  99          id(new PhabricatorActionView())
 100            ->setName(pht('Cancel Task'))
 101            ->setHref($this->getApplicationURI('/task/'.$id.'/cancel/'))
 102            ->setIcon('fa-times')
 103            ->setWorkflow(true));
 104      }
 105  
 106      $can_release = (!$task->isArchived()) &&
 107                     ($task->getLeaseOwner());
 108  
 109      $view->addAction(
 110        id(new PhabricatorActionView())
 111          ->setName(pht('Free Lease'))
 112          ->setHref($this->getApplicationURI('/task/'.$id.'/release/'))
 113          ->setIcon('fa-unlock')
 114          ->setWorkflow(true)
 115          ->setDisabled(!$can_release));
 116  
 117      return $view;
 118    }
 119  
 120    private function buildPropertyListView(
 121      PhabricatorWorkerTask $task,
 122      PhabricatorActionListView $actions) {
 123  
 124      $viewer = $this->getRequest()->getUser();
 125  
 126      $view = new PHUIPropertyListView();
 127      $view->setActionList($actions);
 128  
 129      if ($task->isArchived()) {
 130        switch ($task->getResult()) {
 131          case PhabricatorWorkerArchiveTask::RESULT_SUCCESS:
 132            $status = pht('Complete');
 133            break;
 134          case PhabricatorWorkerArchiveTask::RESULT_FAILURE:
 135            $status = pht('Failed');
 136            break;
 137          case PhabricatorWorkerArchiveTask::RESULT_CANCELLED:
 138            $status = pht('Cancelled');
 139            break;
 140          default:
 141            throw new Exception('Unknown task status!');
 142        }
 143      } else {
 144        $status = pht('Queued');
 145      }
 146  
 147      $view->addProperty(
 148        pht('Task Status'),
 149        $status);
 150  
 151      $view->addProperty(
 152        pht('Task Class'),
 153        $task->getTaskClass());
 154  
 155      if ($task->getLeaseExpires()) {
 156        if ($task->getLeaseExpires() > time()) {
 157          $lease_status = pht('Leased');
 158        } else {
 159          $lease_status = pht('Lease Expired');
 160        }
 161      } else {
 162        $lease_status = phutil_tag('em', array(), pht('Not Leased'));
 163      }
 164  
 165      $view->addProperty(
 166        pht('Lease Status'),
 167        $lease_status);
 168  
 169      $view->addProperty(
 170        pht('Lease Owner'),
 171        $task->getLeaseOwner()
 172          ? $task->getLeaseOwner()
 173          : phutil_tag('em', array(), pht('None')));
 174  
 175      if ($task->getLeaseExpires() && $task->getLeaseOwner()) {
 176        $expires = ($task->getLeaseExpires() - time());
 177        $expires = phutil_format_relative_time_detailed($expires);
 178      } else {
 179        $expires = phutil_tag('em', array(), pht('None'));
 180      }
 181  
 182      $view->addProperty(
 183        pht('Lease Expires'),
 184        $expires);
 185  
 186      if ($task->isArchived()) {
 187        $duration = number_format($task->getDuration()).' us';
 188      } else {
 189        $duration = phutil_tag('em', array(), pht('Not Completed'));
 190      }
 191  
 192      $view->addProperty(
 193        pht('Duration'),
 194        $duration);
 195  
 196      $data = id(new PhabricatorWorkerTaskData())->load($task->getDataID());
 197      $task->setData($data->getData());
 198      $worker = $task->getWorkerInstance();
 199      $data = $worker->renderForDisplay($viewer);
 200  
 201      $view->addProperty(
 202        pht('Data'),
 203        $data);
 204  
 205      return $view;
 206    }
 207  
 208    private function buildRetryListView(PhabricatorWorkerTask $task) {
 209      $view = new PHUIPropertyListView();
 210  
 211      $data = id(new PhabricatorWorkerTaskData())->load($task->getDataID());
 212      $task->setData($data->getData());
 213      $worker = $task->getWorkerInstance();
 214  
 215      $view->addProperty(
 216        pht('Failure Count'),
 217        $task->getFailureCount());
 218  
 219      $retry_count = $worker->getMaximumRetryCount();
 220      if ($retry_count === null) {
 221        $max_retries = phutil_tag('em', array(), pht('Retries Forever'));
 222        $retry_count = INF;
 223      } else {
 224        $max_retries = $retry_count;
 225      }
 226  
 227      $view->addProperty(
 228        pht('Maximum Retries'),
 229        $max_retries);
 230  
 231      $projection = clone $task;
 232      $projection->makeEphemeral();
 233  
 234      $next = array();
 235      for ($ii = $task->getFailureCount(); $ii < $retry_count; $ii++) {
 236        $projection->setFailureCount($ii);
 237        $next[] = $worker->getWaitBeforeRetry($projection);
 238        if (count($next) > 10) {
 239          break;
 240        }
 241      }
 242  
 243      if ($next) {
 244        $cumulative = 0;
 245        foreach ($next as $key => $duration) {
 246          if ($duration === null) {
 247            $duration = 60;
 248          }
 249          $cumulative += $duration;
 250          $next[$key] = phutil_format_relative_time($cumulative);
 251        }
 252        if ($ii != $retry_count) {
 253          $next[] = '...';
 254        }
 255        $retries_in = implode(', ', $next);
 256      } else {
 257        $retries_in = pht('No More Retries');
 258      }
 259  
 260      $view->addProperty(
 261        pht('Retries After'),
 262        $retries_in);
 263  
 264      return $view;
 265    }
 266  
 267  }


Generated: Sun Nov 30 09:20:46 2014 Cross-referenced by PHPXref 0.7.1