diff --git a/resources/sql/autopatches/20180223.log.02.chunkformat.sql b/resources/sql/autopatches/20180223.log.02.chunkformat.sql new file mode 100644 --- /dev/null +++ b/resources/sql/autopatches/20180223.log.02.chunkformat.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_harbormaster.harbormaster_buildlog + ADD chunkFormat VARCHAR(32) NOT NULL COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20180223.log.03.chunkdefault.sql b/resources/sql/autopatches/20180223.log.03.chunkdefault.sql new file mode 100644 --- /dev/null +++ b/resources/sql/autopatches/20180223.log.03.chunkdefault.sql @@ -0,0 +1,2 @@ +UPDATE {$NAMESPACE}_harbormaster.harbormaster_buildlog + SET chunkFormat = 'text' WHERE chunkFormat = ''; diff --git a/src/applications/harbormaster/storage/build/HarbormasterBuildLog.php b/src/applications/harbormaster/storage/build/HarbormasterBuildLog.php --- a/src/applications/harbormaster/storage/build/HarbormasterBuildLog.php +++ b/src/applications/harbormaster/storage/build/HarbormasterBuildLog.php @@ -13,6 +13,7 @@ protected $live; protected $filePHID; protected $byteLength; + protected $chunkFormat; private $buildTarget = self::ATTACHABLE; private $rope; @@ -44,7 +45,8 @@ ->setBuildTargetPHID($build_target->getPHID()) ->setDuration(null) ->setLive(1) - ->setByteLength(0); + ->setByteLength(0) + ->setChunkFormat(HarbormasterBuildLogChunk::CHUNK_ENCODING_TEXT); } public function scheduleRebuild($force) { @@ -73,6 +75,7 @@ 'live' => 'bool', 'filePHID' => 'phid?', 'byteLength' => 'uint64', + 'chunkFormat' => 'text32', ), self::CONFIG_KEY_SCHEMA => array( 'key_buildtarget' => array( @@ -105,6 +108,11 @@ ->setPageSize(8); } + public function newDataIterator() { + return $this->newChunkIterator() + ->setAsString(true); + } + private function loadLastChunkInfo() { $chunk_table = new HarbormasterBuildLogChunk(); $conn_w = $chunk_table->establishConnection('w'); @@ -188,6 +196,10 @@ $this->writeEncodedChunk($rope, $byte_limit, $mode); } + $this + ->setChunkFormat($mode) + ->save(); + $this->saveTransaction(); } diff --git a/src/applications/harbormaster/worker/HarbormasterLogWorker.php b/src/applications/harbormaster/worker/HarbormasterLogWorker.php --- a/src/applications/harbormaster/worker/HarbormasterLogWorker.php +++ b/src/applications/harbormaster/worker/HarbormasterLogWorker.php @@ -58,20 +58,23 @@ $is_force = idx($data, 'force'); if (!$log->getByteLength() || $is_force) { - $iterator = $log->newChunkIterator() - ->setAsString(true); + $iterator = $log->newDataIterator(); $byte_length = 0; foreach ($iterator as $block) { $byte_length += strlen($block); } + $log ->setByteLength($byte_length) ->save(); } - if ($log->canCompressLog()) { - $log->compressLog(); + $format_text = HarbormasterBuildLogChunk::CHUNK_ENCODING_TEXT; + if (($log->getChunkFormat() === $format_text) || $is_force) { + if ($log->canCompressLog()) { + $log->compressLog(); + } } if ($is_force) { @@ -79,8 +82,7 @@ } if (!$log->getFilePHID()) { - $iterator = $log->newChunkIterator() - ->setAsString(true); + $iterator = $log->newDataIterator(); $source = id(new PhabricatorIteratorFileUploadSource()) ->setName('harbormaster-log-'.$log->getID().'.log')