mirror of
https://we.phorge.it/source/phorge.git
synced 2024-11-19 13:22:42 +01:00
Begin standardizing garbage collectors
Summary: Ref T9494. Improve support infrastructure for garbage collectors. Test Plan: - Ran `bin/phd debug trigger`, saw collectors execute. {F857852} Reviewers: chad Reviewed By: chad Maniphest Tasks: T9494 Differential Revision: https://secure.phabricator.com/D14218
This commit is contained in:
parent
e431ab2189
commit
878a493301
27 changed files with 364 additions and 15 deletions
|
@ -1829,6 +1829,7 @@ phutil_register_library_map(array(
|
|||
'PhabricatorConfigAllController' => 'applications/config/controller/PhabricatorConfigAllController.php',
|
||||
'PhabricatorConfigApplication' => 'applications/config/application/PhabricatorConfigApplication.php',
|
||||
'PhabricatorConfigCacheController' => 'applications/config/controller/PhabricatorConfigCacheController.php',
|
||||
'PhabricatorConfigCollectorsModule' => 'applications/config/module/PhabricatorConfigCollectorsModule.php',
|
||||
'PhabricatorConfigColumnSchema' => 'applications/config/schema/PhabricatorConfigColumnSchema.php',
|
||||
'PhabricatorConfigConfigPHIDType' => 'applications/config/phid/PhabricatorConfigConfigPHIDType.php',
|
||||
'PhabricatorConfigController' => 'applications/config/controller/PhabricatorConfigController.php',
|
||||
|
@ -5761,6 +5762,7 @@ phutil_register_library_map(array(
|
|||
'PhabricatorConfigAllController' => 'PhabricatorConfigController',
|
||||
'PhabricatorConfigApplication' => 'PhabricatorApplication',
|
||||
'PhabricatorConfigCacheController' => 'PhabricatorConfigController',
|
||||
'PhabricatorConfigCollectorsModule' => 'PhabricatorConfigModule',
|
||||
'PhabricatorConfigColumnSchema' => 'PhabricatorConfigStorageSchema',
|
||||
'PhabricatorConfigConfigPHIDType' => 'PhabricatorPHIDType',
|
||||
'PhabricatorConfigController' => 'PhabricatorController',
|
||||
|
|
|
@ -3,6 +3,16 @@
|
|||
final class PhabricatorAuthSessionGarbageCollector
|
||||
extends PhabricatorGarbageCollector {
|
||||
|
||||
const COLLECTORCONST = 'auth.sessions';
|
||||
|
||||
public function getCollectorName() {
|
||||
return pht('Auth Sessions');
|
||||
}
|
||||
|
||||
public function hasAutomaticPolicy() {
|
||||
return true;
|
||||
}
|
||||
|
||||
public function collectGarbage() {
|
||||
$session_table = new PhabricatorAuthSession();
|
||||
$conn_w = $session_table->establishConnection('w');
|
||||
|
|
|
@ -3,6 +3,16 @@
|
|||
final class PhabricatorAuthTemporaryTokenGarbageCollector
|
||||
extends PhabricatorGarbageCollector {
|
||||
|
||||
const COLLECTORCONST = 'auth.tokens';
|
||||
|
||||
public function getCollectorName() {
|
||||
return pht('Auth Tokens');
|
||||
}
|
||||
|
||||
public function hasAutomaticPolicy() {
|
||||
return true;
|
||||
}
|
||||
|
||||
public function collectGarbage() {
|
||||
$session_table = new PhabricatorAuthTemporaryToken();
|
||||
$conn_w = $session_table->establishConnection('w');
|
||||
|
|
|
@ -3,6 +3,16 @@
|
|||
final class PhabricatorCacheGeneralGarbageCollector
|
||||
extends PhabricatorGarbageCollector {
|
||||
|
||||
const COLLECTORCONST = 'cache.general';
|
||||
|
||||
public function getCollectorName() {
|
||||
return pht('General Cache');
|
||||
}
|
||||
|
||||
public function getDefaultRetentionPolicy() {
|
||||
return phutil_units('30 days in seconds');
|
||||
}
|
||||
|
||||
public function collectGarbage() {
|
||||
$key = 'gcdaemon.ttl.general-cache';
|
||||
$ttl = PhabricatorEnv::getEnvConfig($key);
|
||||
|
|
|
@ -3,6 +3,16 @@
|
|||
final class PhabricatorCacheMarkupGarbageCollector
|
||||
extends PhabricatorGarbageCollector {
|
||||
|
||||
const COLLECTORCONST = 'cache.markup';
|
||||
|
||||
public function getCollectorName() {
|
||||
return pht('Markup Cache');
|
||||
}
|
||||
|
||||
public function getDefaultRetentionPolicy() {
|
||||
return phutil_units('30 days in seconds');
|
||||
}
|
||||
|
||||
public function collectGarbage() {
|
||||
$key = 'gcdaemon.ttl.markup-cache';
|
||||
$ttl = PhabricatorEnv::getEnvConfig($key);
|
||||
|
|
|
@ -3,6 +3,16 @@
|
|||
final class PhabricatorCacheTTLGarbageCollector
|
||||
extends PhabricatorGarbageCollector {
|
||||
|
||||
const COLLECTORCONST = 'cache.general.ttl';
|
||||
|
||||
public function getCollectorName() {
|
||||
return pht('General Cache (TTL)');
|
||||
}
|
||||
|
||||
public function hasAutomaticPolicy() {
|
||||
return true;
|
||||
}
|
||||
|
||||
public function collectGarbage() {
|
||||
$cache = new PhabricatorKeyValueDatabaseCache();
|
||||
$conn_w = $cache->establishConnection('w');
|
||||
|
|
|
@ -3,6 +3,16 @@
|
|||
final class ConduitConnectionGarbageCollector
|
||||
extends PhabricatorGarbageCollector {
|
||||
|
||||
const COLLECTORCONST = 'conduit.connections';
|
||||
|
||||
public function getCollectorName() {
|
||||
return pht('Conduit Connections');
|
||||
}
|
||||
|
||||
public function getDefaultRetentionPolicy() {
|
||||
return phutil_units('180 days in seconds');
|
||||
}
|
||||
|
||||
public function collectGarbage() {
|
||||
$key = 'gcdaemon.ttl.conduit-logs';
|
||||
$ttl = PhabricatorEnv::getEnvConfig($key);
|
||||
|
|
|
@ -3,6 +3,16 @@
|
|||
final class ConduitLogGarbageCollector
|
||||
extends PhabricatorGarbageCollector {
|
||||
|
||||
const COLLECTORCONST = 'conduit.logs';
|
||||
|
||||
public function getCollectorName() {
|
||||
return pht('Conduit Logs');
|
||||
}
|
||||
|
||||
public function getDefaultRetentionPolicy() {
|
||||
return phutil_units('180 days in seconds');
|
||||
}
|
||||
|
||||
public function collectGarbage() {
|
||||
$key = 'gcdaemon.ttl.conduit-logs';
|
||||
$ttl = PhabricatorEnv::getEnvConfig($key);
|
||||
|
|
|
@ -3,6 +3,16 @@
|
|||
final class ConduitTokenGarbageCollector
|
||||
extends PhabricatorGarbageCollector {
|
||||
|
||||
const COLLECTORCONST = 'conduit.tokens';
|
||||
|
||||
public function getCollectorName() {
|
||||
return pht('Conduit Tokens');
|
||||
}
|
||||
|
||||
public function hasAutomaticPolicy() {
|
||||
return true;
|
||||
}
|
||||
|
||||
public function collectGarbage() {
|
||||
$table = new PhabricatorConduitToken();
|
||||
$conn_w = $table->establishConnection('w');
|
||||
|
|
|
@ -0,0 +1,61 @@
|
|||
<?php
|
||||
|
||||
final class PhabricatorConfigCollectorsModule extends PhabricatorConfigModule {
|
||||
|
||||
public function getModuleKey() {
|
||||
return 'collectors';
|
||||
}
|
||||
|
||||
public function getModuleName() {
|
||||
return pht('Garbage Collectors');
|
||||
}
|
||||
|
||||
public function renderModuleStatus(AphrontRequest $request) {
|
||||
$viewer = $request->getViewer();
|
||||
|
||||
$collectors = PhabricatorGarbageCollector::getAllCollectors();
|
||||
$collectors = msort($collectors, 'getCollectorConstant');
|
||||
|
||||
$rows = array();
|
||||
foreach ($collectors as $key => $collector) {
|
||||
if ($collector->hasAutomaticPolicy()) {
|
||||
$policy_view = phutil_tag('em', array(), pht('Automatic'));
|
||||
} else {
|
||||
$policy = $collector->getDefaultRetentionPolicy();
|
||||
if ($policy === null) {
|
||||
$policy_view = pht('Indefinite');
|
||||
} else {
|
||||
$days = ceil($policy / phutil_units('1 day in seconds'));
|
||||
$policy_view = pht(
|
||||
'%s Day(s)',
|
||||
new PhutilNumber($days));
|
||||
}
|
||||
}
|
||||
|
||||
$rows[] = array(
|
||||
$collector->getCollectorConstant(),
|
||||
$collector->getCollectorName(),
|
||||
$policy_view,
|
||||
);
|
||||
}
|
||||
|
||||
$table = id(new AphrontTableView($rows))
|
||||
->setHeaders(
|
||||
array(
|
||||
pht('Constant'),
|
||||
pht('Name'),
|
||||
pht('Retention Policy'),
|
||||
))
|
||||
->setColumnClasses(
|
||||
array(
|
||||
null,
|
||||
'pri wide',
|
||||
null,
|
||||
));
|
||||
|
||||
return id(new PHUIObjectBoxView())
|
||||
->setHeaderText(pht('Garbage Collectors'))
|
||||
->setTable($table);
|
||||
}
|
||||
|
||||
}
|
|
@ -3,6 +3,16 @@
|
|||
final class PhabricatorDaemonLogEventGarbageCollector
|
||||
extends PhabricatorGarbageCollector {
|
||||
|
||||
const COLLECTORCONST = 'daemon.processes';
|
||||
|
||||
public function getCollectorName() {
|
||||
return pht('Daemon Processes');
|
||||
}
|
||||
|
||||
public function getDefaultRetentionPolicy() {
|
||||
return phutil_units('7 days in seconds');
|
||||
}
|
||||
|
||||
public function collectGarbage() {
|
||||
$ttl = PhabricatorEnv::getEnvConfig('gcdaemon.ttl.daemon-logs');
|
||||
if ($ttl <= 0) {
|
||||
|
|
|
@ -3,6 +3,16 @@
|
|||
final class PhabricatorDaemonLogGarbageCollector
|
||||
extends PhabricatorGarbageCollector {
|
||||
|
||||
const COLLECTORCONST = 'daemon.logs';
|
||||
|
||||
public function getCollectorName() {
|
||||
return pht('Daemon Logs');
|
||||
}
|
||||
|
||||
public function getDefaultRetentionPolicy() {
|
||||
return phutil_units('7 days in seconds');
|
||||
}
|
||||
|
||||
public function collectGarbage() {
|
||||
$ttl = PhabricatorEnv::getEnvConfig('gcdaemon.ttl.daemon-logs');
|
||||
if ($ttl <= 0) {
|
||||
|
|
|
@ -3,6 +3,16 @@
|
|||
final class PhabricatorDaemonTaskGarbageCollector
|
||||
extends PhabricatorGarbageCollector {
|
||||
|
||||
const COLLECTORCONST = 'worker.tasks';
|
||||
|
||||
public function getCollectorName() {
|
||||
return pht('Archived Tasks');
|
||||
}
|
||||
|
||||
public function getDefaultRetentionPolicy() {
|
||||
return phutil_units('14 days in seconds');
|
||||
}
|
||||
|
||||
public function collectGarbage() {
|
||||
$key = 'gcdaemon.ttl.task-archive';
|
||||
$ttl = PhabricatorEnv::getEnvConfig($key);
|
||||
|
|
|
@ -3,6 +3,16 @@
|
|||
final class DifferentialParseCacheGarbageCollector
|
||||
extends PhabricatorGarbageCollector {
|
||||
|
||||
const COLLECTORCONST = 'differential.parse';
|
||||
|
||||
public function getCollectorName() {
|
||||
return pht('Differential Parse Cache');
|
||||
}
|
||||
|
||||
public function getDefaultRetentionPolicy() {
|
||||
return phutil_units('14 days in seconds');
|
||||
}
|
||||
|
||||
public function collectGarbage() {
|
||||
$key = 'gcdaemon.ttl.differential-parse-cache';
|
||||
$ttl = PhabricatorEnv::getEnvConfig($key);
|
||||
|
|
|
@ -3,6 +3,16 @@
|
|||
final class DrydockLogGarbageCollector
|
||||
extends PhabricatorGarbageCollector {
|
||||
|
||||
const COLLECTORCONST = 'drydock.logs';
|
||||
|
||||
public function getCollectorName() {
|
||||
return pht('Drydock Logs');
|
||||
}
|
||||
|
||||
public function getDefaultRetentionPolicy() {
|
||||
return phutil_units('30 days in seconds');
|
||||
}
|
||||
|
||||
public function collectGarbage() {
|
||||
$log_table = new DrydockLog();
|
||||
$conn_w = $log_table->establishConnection('w');
|
||||
|
|
|
@ -3,6 +3,16 @@
|
|||
final class PhabricatorFileTemporaryGarbageCollector
|
||||
extends PhabricatorGarbageCollector {
|
||||
|
||||
const COLLECTORCONST = 'files.ttl';
|
||||
|
||||
public function getCollectorName() {
|
||||
return pht('Files (TTL)');
|
||||
}
|
||||
|
||||
public function hasAutomaticPolicy() {
|
||||
return true;
|
||||
}
|
||||
|
||||
public function collectGarbage() {
|
||||
$files = id(new PhabricatorFile())->loadAllWhere(
|
||||
'ttl < %d LIMIT 100',
|
||||
|
|
|
@ -3,6 +3,16 @@
|
|||
final class HeraldTranscriptGarbageCollector
|
||||
extends PhabricatorGarbageCollector {
|
||||
|
||||
const COLLECTORCONST = 'herald.transcripts';
|
||||
|
||||
public function getCollectorName() {
|
||||
return pht('Herald Transcripts');
|
||||
}
|
||||
|
||||
public function getDefaultRetentionPolicy() {
|
||||
return phutil_units('30 days in seconds');
|
||||
}
|
||||
|
||||
public function collectGarbage() {
|
||||
$ttl = PhabricatorEnv::getEnvConfig('gcdaemon.ttl.herald-transcripts');
|
||||
if ($ttl <= 0) {
|
||||
|
|
|
@ -3,6 +3,16 @@
|
|||
final class MetaMTAMailReceivedGarbageCollector
|
||||
extends PhabricatorGarbageCollector {
|
||||
|
||||
const COLLECTORCONST = 'metamta.received';
|
||||
|
||||
public function getCollectorName() {
|
||||
return pht('Mail (Received)');
|
||||
}
|
||||
|
||||
public function getDefaultRetentionPolicy() {
|
||||
return phutil_units('90 days in seconds');
|
||||
}
|
||||
|
||||
public function collectGarbage() {
|
||||
$ttl = phutil_units('90 days in seconds');
|
||||
|
||||
|
|
|
@ -3,6 +3,16 @@
|
|||
final class MetaMTAMailSentGarbageCollector
|
||||
extends PhabricatorGarbageCollector {
|
||||
|
||||
const COLLECTORCONST = 'metamta.sent';
|
||||
|
||||
public function getCollectorName() {
|
||||
return pht('Mail (Sent)');
|
||||
}
|
||||
|
||||
public function getDefaultRetentionPolicy() {
|
||||
return phutil_units('90 days in seconds');
|
||||
}
|
||||
|
||||
public function collectGarbage() {
|
||||
$ttl = phutil_units('90 days in seconds');
|
||||
|
||||
|
|
|
@ -3,6 +3,16 @@
|
|||
final class MultimeterEventGarbageCollector
|
||||
extends PhabricatorGarbageCollector {
|
||||
|
||||
const COLLECTORCONST = 'multimeter.events';
|
||||
|
||||
public function getCollectorName() {
|
||||
return pht('Multimeter Events');
|
||||
}
|
||||
|
||||
public function getDefaultRetentionPolicy() {
|
||||
return phutil_units('90 days in seconds');
|
||||
}
|
||||
|
||||
public function collectGarbage() {
|
||||
$ttl = phutil_units('90 days in seconds');
|
||||
|
||||
|
|
|
@ -3,6 +3,16 @@
|
|||
final class FeedStoryNotificationGarbageCollector
|
||||
extends PhabricatorGarbageCollector {
|
||||
|
||||
const COLLECTORCONST = 'feed.notifications';
|
||||
|
||||
public function getCollectorName() {
|
||||
return pht('Notifications');
|
||||
}
|
||||
|
||||
public function getDefaultRetentionPolicy() {
|
||||
return phutil_units('90 days in seconds');
|
||||
}
|
||||
|
||||
public function collectGarbage() {
|
||||
$ttl = 90 * 24 * 60 * 60;
|
||||
|
||||
|
|
|
@ -3,6 +3,16 @@
|
|||
final class PeopleUserLogGarbageCollector
|
||||
extends PhabricatorGarbageCollector {
|
||||
|
||||
const COLLECTORCONST = 'user.logs';
|
||||
|
||||
public function getCollectorName() {
|
||||
return pht('User Activity Logs');
|
||||
}
|
||||
|
||||
public function getDefaultRetentionPolicy() {
|
||||
return phutil_units('180 days in seconds');
|
||||
}
|
||||
|
||||
public function collectGarbage() {
|
||||
$ttl = phutil_units('180 days in seconds');
|
||||
|
||||
|
|
|
@ -3,6 +3,16 @@
|
|||
final class PhabricatorSystemActionGarbageCollector
|
||||
extends PhabricatorGarbageCollector {
|
||||
|
||||
const COLLECTORCONST = 'system.actions';
|
||||
|
||||
public function getCollectorName() {
|
||||
return pht('Rate Limiting Actions');
|
||||
}
|
||||
|
||||
public function getDefaultRetentionPolicy() {
|
||||
return phutil_units('3 days in seconds');
|
||||
}
|
||||
|
||||
public function collectGarbage() {
|
||||
$ttl = phutil_units('3 days in seconds');
|
||||
|
||||
|
|
|
@ -3,6 +3,16 @@
|
|||
final class PhabricatorSystemDestructionGarbageCollector
|
||||
extends PhabricatorGarbageCollector {
|
||||
|
||||
const COLLECTORCONST = 'system.destruction.logs';
|
||||
|
||||
public function getCollectorName() {
|
||||
return pht('Destruction Logs');
|
||||
}
|
||||
|
||||
public function getDefaultRetentionPolicy() {
|
||||
return phutil_units('90 days in seconds');
|
||||
}
|
||||
|
||||
public function collectGarbage() {
|
||||
$ttl = phutil_units('90 days in seconds');
|
||||
|
||||
|
|
|
@ -1,12 +1,85 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* @task info Getting Collector Information
|
||||
* @task collect Collecting Garbage
|
||||
*/
|
||||
abstract class PhabricatorGarbageCollector extends Phobject {
|
||||
|
||||
|
||||
/* -( Getting Collector Information )-------------------------------------- */
|
||||
|
||||
|
||||
/**
|
||||
* Get a human readable name for what this collector cleans up, like
|
||||
* "User Activity Logs".
|
||||
*
|
||||
* @return string Human-readable collector name.
|
||||
* @task info
|
||||
*/
|
||||
abstract public function getCollectorName();
|
||||
|
||||
|
||||
/**
|
||||
* Specify that the collector has an automatic retention policy and
|
||||
* is not configurable.
|
||||
*
|
||||
* @return bool True if the collector has an automatic retention policy.
|
||||
* @task info
|
||||
*/
|
||||
public function hasAutomaticPolicy() {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the default retention policy for this collector.
|
||||
*
|
||||
* Return the age (in seconds) when resources start getting collected, or
|
||||
* `null` to retain resources indefinitely.
|
||||
*
|
||||
* @return int|null Lifetime, or `null` for indefinite retention.
|
||||
* @task info
|
||||
*/
|
||||
public function getDefaultRetentionPolicy() {
|
||||
throw new PhutilMethodNotImplementedException();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get a unique string constant identifying this collector.
|
||||
*
|
||||
* @return string Collector constant.
|
||||
* @task info
|
||||
*/
|
||||
final public function getCollectorConstant() {
|
||||
return $this->getPhobjectClassConstant('COLLECTORCONST', 64);
|
||||
}
|
||||
|
||||
|
||||
/* -( Collecting Garbage )------------------------------------------------- */
|
||||
|
||||
|
||||
/**
|
||||
* Collect garbage from whatever source this GC handles.
|
||||
*
|
||||
* @return bool True if there is more garbage to collect.
|
||||
* @task collect
|
||||
*/
|
||||
abstract public function collectGarbage();
|
||||
|
||||
|
||||
/**
|
||||
* Load all of the available garbage collectors.
|
||||
*
|
||||
* @return list<PhabricatorGarbageCollector> Garbage collectors.
|
||||
* @task collect
|
||||
*/
|
||||
final public static function getAllCollectors() {
|
||||
return id(new PhutilClassMapQuery())
|
||||
->setAncestorClass(__CLASS__)
|
||||
->setUniqueMethod('getCollectorConstant')
|
||||
->execute();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -348,7 +348,9 @@ final class PhabricatorTriggerDaemon
|
|||
$next = $this->nextCollection;
|
||||
if ($next && (PhabricatorTime::getNow() >= $next)) {
|
||||
$this->nextCollection = null;
|
||||
$this->garbageCollectors = $this->loadGarbageCollectors();
|
||||
|
||||
$all_collectors = PhabricatorGarbageCollector::getAllCollectors();
|
||||
$this->garbageCollectors = $all_collectors;
|
||||
}
|
||||
|
||||
// If we're in a collection cycle, continue collection.
|
||||
|
@ -377,18 +379,4 @@ final class PhabricatorTriggerDaemon
|
|||
return false;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Load all of the available garbage collectors.
|
||||
*
|
||||
* @return list<PhabricatorGarbageCollector> Garbage collectors.
|
||||
* @task garbage
|
||||
*/
|
||||
private function loadGarbageCollectors() {
|
||||
return id(new PhutilClassMapQuery())
|
||||
->setAncestorClass('PhabricatorGarbageCollector')
|
||||
->execute();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -1388,6 +1388,11 @@ final class PhabricatorUSEnglishTranslation
|
|||
'Mail sent in the last %s days.',
|
||||
),
|
||||
|
||||
'%s Day(s)' => array(
|
||||
'%s Day',
|
||||
'%s Days',
|
||||
),
|
||||
|
||||
);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue