Merge "Add maintenance script for deleting expired user impact data"

这个提交包含在:
jenkins-bot 2022-09-28 12:37:27 +00:00 提交者 Gerrit Code Review
当前提交 c93e96107f
共有 5 个文件被更改,包括 88 次插入1 次删除

查看文件

@ -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);