Merge "Add maintenance script for deleting expired user impact data"
这个提交包含在:
当前提交
c93e96107f
|
@ -0,0 +1,80 @@
|
|||
<?php
|
||||
|
||||
namespace GrowthExperiments\Maintenance;
|
||||
|
||||
use DateTime;
|
||||
use Exception;
|
||||
use GrowthExperiments\GrowthExperimentsServices;
|
||||
use GrowthExperiments\UserImpact\DatabaseUserImpactStore;
|
||||
use Maintenance;
|
||||
use MediaWiki\MediaWikiServices;
|
||||
use Wikimedia\Rdbms\SelectQueryBuilder;
|
||||
use Wikimedia\Timestamp\ConvertibleTimestamp;
|
||||
|
||||
$IP = getenv( 'MW_INSTALL_PATH' );
|
||||
if ( $IP === false ) {
|
||||
$IP = __DIR__ . '/../../..';
|
||||
}
|
||||
require_once "$IP/maintenance/Maintenance.php";
|
||||
|
||||
class DeleteExpiredUserImpactData extends Maintenance {
|
||||
|
||||
public function __construct() {
|
||||
parent::__construct();
|
||||
$this->requireExtension( 'GrowthExperiments' );
|
||||
$this->addDescription( 'Delete unused old data from the growthexperiments_user_impact table.' );
|
||||
$this->addOption( 'expiry', 'A relative timestring fragment passed to DateTime, such as "30days".',
|
||||
false, true );
|
||||
$this->setBatchSize( 100 );
|
||||
}
|
||||
|
||||
/** @inheritDoc */
|
||||
public function execute() {
|
||||
$services = MediaWikiServices::getInstance();
|
||||
$growthServices = GrowthExperimentsServices::wrap( $services );
|
||||
$dbw = $growthServices->getLoadBalancer()->getConnection( DB_PRIMARY );
|
||||
|
||||
$expiry = $this->getOption( 'expiry', '30days' );
|
||||
$expiryTimestamp = $this->getTimestampFromRelativeDate( $expiry );
|
||||
|
||||
$queryBuilder = new SelectQueryBuilder( $dbw );
|
||||
$queryBuilder->table( DatabaseUserImpactStore::TABLE_NAME );
|
||||
$queryBuilder->field( 'geui_user_id' );
|
||||
$queryBuilder->where( 'geui_timestamp < ' . $expiryTimestamp );
|
||||
$queryBuilder->orderBy( 'geui_timestamp', SelectQueryBuilder::SORT_ASC );
|
||||
$queryBuilder->limit( $this->getBatchSize() );
|
||||
|
||||
$deletedCount = 0;
|
||||
$idsToDelete = $queryBuilder->fetchFieldValues();
|
||||
while ( $idsToDelete !== [] ) {
|
||||
$dbw->delete(
|
||||
DatabaseUserImpactStore::TABLE_NAME,
|
||||
[ 'geui_user_id' => $idsToDelete ],
|
||||
__METHOD__
|
||||
);
|
||||
$deletedCount += count( $idsToDelete );
|
||||
$this->output( '.' );
|
||||
$this->waitForReplication();
|
||||
$idsToDelete = $queryBuilder->fetchFieldValues();
|
||||
}
|
||||
$this->output( "\nDeleted $deletedCount rows\n" );
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $relativeDate A relative date string fragment that will be prefixed with a
|
||||
* minus sign and passed to the DateTime constructor
|
||||
* @return string TS_MW formatted timestamp
|
||||
*/
|
||||
private function getTimestampFromRelativeDate( string $relativeDate ): string {
|
||||
try {
|
||||
$timestamp = new ConvertibleTimestamp( new DateTime( 'now - ' . $relativeDate ) );
|
||||
} catch ( Exception $e ) {
|
||||
$this->fatalError( $e->getMessage() );
|
||||
}
|
||||
return $timestamp->getTimestamp( TS_MW );
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
$maintClass = DeleteExpiredUserImpactData::class;
|
||||
require_once RUN_MAINTENANCE_IF_MAIN;
|
|
@ -21,7 +21,9 @@
|
|||
"options": { "length": 16777215, "notnull": true }
|
||||
}
|
||||
],
|
||||
"indexes": [],
|
||||
"indexes": [
|
||||
{ "name": "geui_timestamp_user", "columns": [ "geui_timestamp" ], "unique": false }
|
||||
],
|
||||
"pk": [ "geui_user_id" ]
|
||||
}
|
||||
]
|
||||
|
|
|
@ -6,5 +6,6 @@ CREATE TABLE /*_*/growthexperiments_user_impact (
|
|||
geui_user_id INT UNSIGNED NOT NULL,
|
||||
geui_timestamp BINARY(14) NOT NULL,
|
||||
geui_data MEDIUMBLOB NOT NULL,
|
||||
INDEX geui_timestamp_user (geui_timestamp),
|
||||
PRIMARY KEY(geui_user_id)
|
||||
) /*$wgDBTableOptions*/;
|
||||
|
|
|
@ -8,3 +8,5 @@ CREATE TABLE growthexperiments_user_impact (
|
|||
geui_data TEXT NOT NULL,
|
||||
PRIMARY KEY(geui_user_id)
|
||||
);
|
||||
|
||||
CREATE INDEX geui_timestamp_user ON growthexperiments_user_impact (geui_timestamp);
|
||||
|
|
|
@ -8,3 +8,5 @@ CREATE TABLE /*_*/growthexperiments_user_impact (
|
|||
geui_data BLOB NOT NULL,
|
||||
PRIMARY KEY(geui_user_id)
|
||||
);
|
||||
|
||||
CREATE INDEX geui_timestamp_user ON /*_*/growthexperiments_user_impact (geui_timestamp);
|
||||
|
|
正在加载...
在新工单中引用