mirror of
https://we.phorge.it/source/phorge.git
synced 2024-12-23 14:00:56 +01:00
Move Harbormaster log compression to the worker task queue
Summary: Depends on D19130. Ref T13088. Currently, when a build log is closed we compress it in the same process. Separate this out into a dedicated worker since the plan is to do a lot more work during finalization, none of which needs to happen inline during builds (or, particuarly, inline during a Conduit call for API writes in the future). Test Plan: Ran `bin/harbormaster write-log --trace`, saw compression run inline. Subscribers: PHID-OPKG-gm6ozazyms6q6i22gyam Maniphest Tasks: T13088 Differential Revision: https://secure.phabricator.com/D19131
This commit is contained in:
parent
cd4c4dc2ff
commit
32c6b649dd
4 changed files with 71 additions and 7 deletions
|
@ -1306,6 +1306,7 @@ phutil_register_library_map(array(
|
|||
'HarbormasterLeaseWorkingCopyBuildStepImplementation' => 'applications/harbormaster/step/HarbormasterLeaseWorkingCopyBuildStepImplementation.php',
|
||||
'HarbormasterLintMessagesController' => 'applications/harbormaster/controller/HarbormasterLintMessagesController.php',
|
||||
'HarbormasterLintPropertyView' => 'applications/harbormaster/view/HarbormasterLintPropertyView.php',
|
||||
'HarbormasterLogWorker' => 'applications/harbormaster/worker/HarbormasterLogWorker.php',
|
||||
'HarbormasterManagementArchiveLogsWorkflow' => 'applications/harbormaster/management/HarbormasterManagementArchiveLogsWorkflow.php',
|
||||
'HarbormasterManagementBuildWorkflow' => 'applications/harbormaster/management/HarbormasterManagementBuildWorkflow.php',
|
||||
'HarbormasterManagementRestartWorkflow' => 'applications/harbormaster/management/HarbormasterManagementRestartWorkflow.php',
|
||||
|
@ -6610,6 +6611,7 @@ phutil_register_library_map(array(
|
|||
'HarbormasterLeaseWorkingCopyBuildStepImplementation' => 'HarbormasterBuildStepImplementation',
|
||||
'HarbormasterLintMessagesController' => 'HarbormasterController',
|
||||
'HarbormasterLintPropertyView' => 'AphrontView',
|
||||
'HarbormasterLogWorker' => 'HarbormasterWorker',
|
||||
'HarbormasterManagementArchiveLogsWorkflow' => 'HarbormasterManagementWorkflow',
|
||||
'HarbormasterManagementBuildWorkflow' => 'HarbormasterManagementWorkflow',
|
||||
'HarbormasterManagementRestartWorkflow' => 'HarbormasterManagementWorkflow',
|
||||
|
|
|
@ -39,7 +39,6 @@ final class HarbormasterManagementWriteLogWorkflow
|
|||
$target_id));
|
||||
}
|
||||
|
||||
|
||||
$log = HarbormasterBuildLog::initializeNewBuildLog($target);
|
||||
$log->openBuildLog();
|
||||
|
||||
|
@ -50,6 +49,12 @@ final class HarbormasterManagementWriteLogWorkflow
|
|||
$content = file_get_contents('php://stdin');
|
||||
$log->append($content);
|
||||
|
||||
echo tsprintf(
|
||||
"%s\n",
|
||||
pht('Write completed. Closing log...'));
|
||||
|
||||
PhabricatorWorker::setRunAllTasksInProcess(true);
|
||||
|
||||
$log->closeBuildLog();
|
||||
|
||||
echo tsprintf(
|
||||
|
|
|
@ -52,17 +52,24 @@ final class HarbormasterBuildLog
|
|||
throw new Exception(pht('This build log is not open!'));
|
||||
}
|
||||
|
||||
if ($this->canCompressLog()) {
|
||||
$this->compressLog();
|
||||
}
|
||||
|
||||
$start = $this->getDateCreated();
|
||||
$now = PhabricatorTime::getNow();
|
||||
|
||||
return $this
|
||||
$this
|
||||
->setDuration($now - $start)
|
||||
->setLive(0)
|
||||
->save();
|
||||
|
||||
PhabricatorWorker::scheduleTask(
|
||||
'HarbormasterLogWorker',
|
||||
array(
|
||||
'logPHID' => $this->getPHID(),
|
||||
),
|
||||
array(
|
||||
'objectPHID' => $this->getPHID(),
|
||||
));
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
|
||||
|
@ -201,7 +208,7 @@ final class HarbormasterBuildLog
|
|||
return implode('', $full_text);
|
||||
}
|
||||
|
||||
private function canCompressLog() {
|
||||
public function canCompressLog() {
|
||||
return function_exists('gzdeflate');
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,50 @@
|
|||
<?php
|
||||
|
||||
final class HarbormasterLogWorker extends HarbormasterWorker {
|
||||
|
||||
protected function doWork() {
|
||||
$viewer = $this->getViewer();
|
||||
|
||||
$data = $this->getTaskData();
|
||||
$log_phid = idx($data, 'logPHID');
|
||||
|
||||
$log = id(new HarbormasterBuildLogQuery())
|
||||
->setViewer($viewer)
|
||||
->withPHIDs(array($log_phid))
|
||||
->executeOne();
|
||||
if (!$log) {
|
||||
throw new PhabricatorWorkerPermanentFailureException(
|
||||
pht('Invalid build log PHID "%s".', $log_phid));
|
||||
}
|
||||
|
||||
$phid_key = PhabricatorHash::digestToLength($log_phid, 14);
|
||||
$lock_key = "build.log({$phid_key})";
|
||||
$lock = PhabricatorGlobalLock::newLock($lock_key);
|
||||
|
||||
try {
|
||||
$lock->lock();
|
||||
} catch (PhutilLockException $ex) {
|
||||
throw new PhabricatorWorkerYieldException(15);
|
||||
}
|
||||
|
||||
$caught = null;
|
||||
try {
|
||||
$this->finalizeBuildLog($log);
|
||||
} catch (Exception $ex) {
|
||||
$caught = $ex;
|
||||
}
|
||||
|
||||
$lock->unlock();
|
||||
|
||||
if ($caught) {
|
||||
throw $caught;
|
||||
}
|
||||
}
|
||||
|
||||
private function finalizeBuildLog(HarbormasterBuildLog $log) {
|
||||
if ($log->canCompressLog()) {
|
||||
$log->compressLog();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in a new issue