[ Index ] |
PHP Cross Reference of Phabricator |
[Summary view] [Print] [Text view]
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 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Sun Nov 30 09:20:46 2014 | Cross-referenced by PHPXref 0.7.1 |