@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.) hq.recaptime.dev/wiki/Phorge
phorge phabricator
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Allow files to TTL and and be garbage collected

Summary: Added ttl field to files. Gabage collect files with expired ttl

Test Plan: created file with a ttl. Let garbage collector run

Reviewers: epriestley

CC: aran, Korvin

Differential Revision: https://secure.phabricator.com/D4987

authored by

kwadwo and committed by
epriestley
762ace81 204d6481

+70 -5
+3
resources/sql/patches/20130215.phabricatorfileaddttl.sql
··· 1 + ALTER TABLE {$NAMESPACE}_file.file 2 + ADD ttl INT(10) UNSIGNED DEFAULT NULL, 3 + ADD KEY key_ttl (ttl);
+1
src/applications/diffusion/controller/DiffusionBrowseFileController.php
··· 779 779 $data, 780 780 array( 781 781 'name' => basename($path), 782 + 'ttl' => time() + 60 * 60 * 24, 782 783 )); 783 784 } 784 785
+1
src/applications/files/PhabricatorImageTransformer.php
··· 11 11 $image, 12 12 array( 13 13 'name' => 'meme-'.$file->getName(), 14 + 'ttl' => time() + 60 * 60 * 24, 14 15 )); 15 16 } 16 17
+8
src/applications/files/controller/PhabricatorFileInfoController.php
··· 35 35 ->setObjectName('F'.$file->getID()) 36 36 ->setHeader($file->getName()); 37 37 38 + $ttl = $file->getTTL(); 39 + if ($ttl !== null) { 40 + $ttl_tag = id(new PhabricatorTagView()) 41 + ->setType(PhabricatorTagView::TYPE_OBJECT) 42 + ->setName(pht("Temporary")); 43 + $header->addTag($ttl_tag); 44 + } 45 + 38 46 $actions = $this->buildActionView($file); 39 47 $properties = $this->buildPropertyView($file); 40 48
+5 -2
src/applications/files/controller/PhabricatorFileListController.php
··· 89 89 $id = $file->getID(); 90 90 $phid = $file->getPHID(); 91 91 $name = $file->getName(); 92 - 93 92 $file_name = "F{$id} {$name}"; 94 93 $file_uri = $this->getApplicationURI("/info/{$phid}/"); 95 94 96 95 $date_created = phabricator_date($file->getDateCreated(), $user); 97 - 98 96 $author_phid = $file->getAuthorPHID(); 99 97 if ($author_phid) { 100 98 $author_link = $this->getHandle($author_phid)->renderLink(); ··· 109 107 ->setHref($file_uri) 110 108 ->addAttribute($uploaded) 111 109 ->addIcon('none', phabricator_format_bytes($file->getByteSize())); 110 + 111 + $ttl = $file->getTTL(); 112 + if ($ttl !== null) { 113 + $item->addIcon('blame', pht('Temporary')); 114 + } 112 115 113 116 if (isset($highlighted_ids[$id])) { 114 117 $item->setEffect('highlighted');
+17 -3
src/applications/files/storage/PhabricatorFile.php
··· 21 21 protected $storageFormat; 22 22 protected $storageHandle; 23 23 24 + protected $ttl; 25 + 24 26 public function getConfiguration() { 25 27 return array( 26 28 self::CONFIG_AUX_PHID => true, ··· 148 150 149 151 $file_name = idx($params, 'name'); 150 152 $file_name = self::normalizeFileName($file_name); 153 + $file_ttl = idx($params, 'ttl'); 151 154 $authorPHID = idx($params, 'authorPHID'); 152 155 153 156 $new_file = new PhabricatorFile(); ··· 155 158 $new_file->setName($file_name); 156 159 $new_file->setByteSize($copy_of_byteSize); 157 160 $new_file->setAuthorPHID($authorPHID); 161 + $new_file->setTtl($file_ttl); 158 162 159 163 $new_file->setContentHash($hash); 160 164 $new_file->setStorageEngine($copy_of_storage_engine); ··· 223 227 224 228 $file_name = idx($params, 'name'); 225 229 $file_name = self::normalizeFileName($file_name); 230 + $file_ttl = idx($params, 'ttl'); 226 231 227 232 // If for whatever reason, authorPHID isn't passed as a param 228 233 // (always the case with newFromFileDownload()), store a '' ··· 231 236 $file->setName($file_name); 232 237 $file->setByteSize(strlen($data)); 233 238 $file->setAuthorPHID($authorPHID); 239 + $file->setTtl($file_ttl); 234 240 $file->setContentHash(self::hashFileContent($data)); 235 241 236 242 $file->setStorageEngine($engine_identifier); ··· 354 360 } 355 361 356 362 public function delete() { 363 + // delete all records of this file in transformedfile 364 + $trans_files = id(new PhabricatorTransformedFile())->loadAllWhere( 365 + 'TransformedPHID = %s', $this->getPHID()); 366 + 367 + $this->openTransaction(); 368 + foreach ($trans_files as $trans_file) { 369 + $trans_file->delete(); 370 + } 371 + $ret = parent::delete(); 372 + $this->saveTransaction(); 373 + 357 374 // Check to see if other files are using storage 358 375 $other_file = id(new PhabricatorFile())->loadAllWhere( 359 376 'storageEngine = %s AND storageHandle = %s AND ··· 366 383 $engine = $this->instantiateStorageEngine(); 367 384 $engine->deleteFile($this->getStorageHandle()); 368 385 } 369 - 370 - $ret = parent::delete(); 371 - 372 386 return $ret; 373 387 } 374 388
+19
src/applications/files/storage/__tests__/PhabricatorFileTestCase.php
··· 126 126 $this->assertEqual($data, $second_file->loadFileData()); 127 127 } 128 128 129 + public function testReadWriteTtlFiles() { 130 + $engine = new PhabricatorTestStorageEngine(); 131 + 132 + $data = Filesystem::readRandomCharacters(64); 133 + 134 + $ttl = (time() + 60 * 60 * 24); 135 + 136 + $params = array( 137 + 'name' => 'test.dat', 138 + 'ttl' => ($ttl), 139 + 'storageEngines' => array( 140 + $engine, 141 + ), 142 + ); 143 + 144 + $file = PhabricatorFile::newFromFileData($data, $params); 145 + $this->assertEqual($ttl, $file->getTTL()); 146 + } 147 + 129 148 }
+12
src/infrastructure/daemon/PhabricatorGarbageCollectorDaemon.php
··· 17 17 $n_tasks = $this->collectArchivedTasks(); 18 18 $n_cache_ttl = $this->collectGeneralCacheTTL(); 19 19 $n_cache = $this->collectGeneralCaches(); 20 + $n_files = $this->collectExpiredFiles(); 20 21 21 22 $collected = array( 22 23 'Herald Transcript' => $n_herald, ··· 26 27 'Archived Tasks' => $n_tasks, 27 28 'General Cache TTL' => $n_cache_ttl, 28 29 'General Cache Entries' => $n_cache, 30 + 'Temporary Files' => $n_files, 29 31 ); 30 32 $collected = array_filter($collected); 31 33 ··· 206 208 return $conn_w->getAffectedRows(); 207 209 } 208 210 211 + private function collectExpiredFiles() { 212 + $files = id(new PhabricatorFile())->loadAllWhere('ttl < %d LIMIT 100', 213 + time()); 214 + 215 + foreach ($files as $file) { 216 + $file->delete(); 217 + } 218 + 219 + return count($files); 220 + } 209 221 210 222 }
+4
src/infrastructure/storage/patch/PhabricatorBuiltinPatchList.php
··· 1137 1137 'type' => 'sql', 1138 1138 'name' => $this->getPatchPath('20130218.longdaemon.sql'), 1139 1139 ), 1140 + '20130215.phabricatorfileaddttl.sql' => array( 1141 + 'type' => 'sql', 1142 + 'name' => $this->getPatchPath('20130215.phabricatorfileaddttl.sql'), 1143 + ), 1140 1144 ); 1141 1145 } 1142 1146