Path: blob/master/src/applications/daemon/controller/PhabricatorWorkerTaskDetailController.php
12256 views
<?php12final class PhabricatorWorkerTaskDetailController3extends PhabricatorDaemonController {45public function handleRequest(AphrontRequest $request) {6$viewer = $request->getViewer();7$id = $request->getURIData('id');89$task = id(new PhabricatorWorkerActiveTask())->load($id);10if (!$task) {11$tasks = id(new PhabricatorWorkerArchiveTaskQuery())12->withIDs(array($id))13->execute();14$task = reset($tasks);15}1617$header = new PHUIHeaderView();1819if (!$task) {20$title = pht('Task Does Not Exist');2122$header->setHeader(pht('Task %d Missing', $id));2324$error_view = new PHUIInfoView();25$error_view->setTitle(pht('No Such Task'));26$error_view->appendChild(phutil_tag(27'p',28array(),29pht('This task may have recently been garbage collected.')));30$error_view->setSeverity(PHUIInfoView::SEVERITY_NODATA);3132$content = $error_view;33} else {34$title = pht('Task %d', $task->getID());3536$header->setHeader(37pht(38'Task %d: %s',39$task->getID(),40$task->getTaskClass()));4142$properties = $this->buildPropertyListView($task);4344$object_box = id(new PHUIObjectBoxView())45->setHeaderText($title)46->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)47->addPropertyList($properties);4849$retry_head = id(new PHUIHeaderView())50->setHeader(pht('Retries'));5152$retry_info = $this->buildRetryListView($task);5354$retry_box = id(new PHUIObjectBoxView())55->setHeader($retry_head)56->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)57->addPropertyList($retry_info);5859$content = array(60$object_box,61$retry_box,62);63}6465$header->setHeaderIcon('fa-sort');6667$crumbs = $this->buildApplicationCrumbs();68$crumbs->addTextCrumb($title);69$crumbs->setBorder(true);7071$view = id(new PHUITwoColumnView())72->setHeader($header)73->setFooter($content);7475return $this->newPage()76->setTitle($title)77->setCrumbs($crumbs)78->appendChild($view);79}8081private function buildPropertyListView(PhabricatorWorkerTask $task) {82$viewer = $this->getViewer();8384$view = new PHUIPropertyListView();8586$object_phid = $task->getObjectPHID();87if ($object_phid) {88$handles = $viewer->loadHandles(array($object_phid));89$handle = $handles[$object_phid];90if ($handle->isComplete()) {91$view->addProperty(pht('Object'), $handle->renderLink());92}93}9495if ($task->isArchived()) {96switch ($task->getResult()) {97case PhabricatorWorkerArchiveTask::RESULT_SUCCESS:98$status = pht('Complete');99break;100case PhabricatorWorkerArchiveTask::RESULT_FAILURE:101$status = pht('Failed');102break;103case PhabricatorWorkerArchiveTask::RESULT_CANCELLED:104$status = pht('Cancelled');105break;106default:107throw new Exception(pht('Unknown task status!'));108}109} else {110$status = pht('Queued');111}112113$view->addProperty(114pht('Task Status'),115$status);116117$view->addProperty(118pht('Task Class'),119$task->getTaskClass());120121if ($task->getLeaseExpires()) {122if ($task->getLeaseExpires() > time()) {123$lease_status = pht('Leased');124} else {125$lease_status = pht('Lease Expired');126}127} else {128$lease_status = phutil_tag('em', array(), pht('Not Leased'));129}130131$view->addProperty(132pht('Lease Status'),133$lease_status);134135$view->addProperty(136pht('Lease Owner'),137$task->getLeaseOwner()138? $task->getLeaseOwner()139: phutil_tag('em', array(), pht('None')));140141if ($task->getLeaseExpires() && $task->getLeaseOwner()) {142$expires = ($task->getLeaseExpires() - time());143$expires = phutil_format_relative_time_detailed($expires);144} else {145$expires = phutil_tag('em', array(), pht('None'));146}147148$view->addProperty(149pht('Lease Expires'),150$expires);151152if ($task->isArchived()) {153$duration = pht('%s us', new PhutilNumber($task->getDuration()));154} else {155$duration = phutil_tag('em', array(), pht('Not Completed'));156}157158$view->addProperty(159pht('Duration'),160$duration);161162$data = id(new PhabricatorWorkerTaskData())->load($task->getDataID());163$task->setData($data->getData());164$worker = $task->getWorkerInstance();165$data = $worker->renderForDisplay($viewer);166167if ($data !== null) {168$view->addProperty(pht('Data'), $data);169}170171return $view;172}173174private function buildRetryListView(PhabricatorWorkerTask $task) {175$view = new PHUIPropertyListView();176177$data = id(new PhabricatorWorkerTaskData())->load($task->getDataID());178$task->setData($data->getData());179$worker = $task->getWorkerInstance();180181$view->addProperty(182pht('Failure Count'),183$task->getFailureCount());184185$retry_count = $worker->getMaximumRetryCount();186if ($retry_count === null) {187$max_retries = phutil_tag('em', array(), pht('Retries Forever'));188$retry_count = INF;189} else {190$max_retries = $retry_count;191}192193$view->addProperty(194pht('Maximum Retries'),195$max_retries);196197$projection = clone $task;198$projection->makeEphemeral();199200$next = array();201for ($ii = $task->getFailureCount(); $ii < $retry_count; $ii++) {202$projection->setFailureCount($ii);203$next[] = $worker->getWaitBeforeRetry($projection);204if (count($next) > 10) {205break;206}207}208209if ($next) {210$cumulative = 0;211foreach ($next as $key => $duration) {212if ($duration === null) {213$duration = 60;214}215$cumulative += $duration;216$next[$key] = phutil_format_relative_time($cumulative);217}218if ($ii != $retry_count) {219$next[] = '...';220}221$retries_in = implode(', ', $next);222} else {223$retries_in = pht('No More Retries');224}225226$view->addProperty(227pht('Retries After'),228$retries_in);229230return $view;231}232233}234235236