blob: 0e3f46ea56dbb9bceeb298ee6eabe83da8917454 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
|
<?php
declare( strict_types = 1 );
namespace MediaWiki\Extension\Translate\Synchronization;
use JobQueueGroup;
use Maintenance;
use MediaWiki\Extension\Translate\Services;
use MediaWiki\Logger\LoggerFactory;
use MediaWiki\MediaWikiServices;
use MessageIndexRebuildJob;
/**
* @author Abijeet Patro
* @license GPL-2.0-or-later
* @since 2020.06
*/
class CompleteExternalTranslationMaintenanceScript extends Maintenance {
public function __construct() {
parent::__construct();
$this->addDescription(
'Check and run MessageIndexRebuild and MessageGroupStats update once ' .
'MessageUpdateJobs are done. Intended to be run periodically'
);
$this->requireExtension( 'Translate' );
}
public function execute() {
$config = MediaWikiServices::getInstance()->getMainConfig();
if ( !$config->get( 'TranslateGroupSynchronizationCache' ) ) {
$this->fatalError( 'GroupSynchronizationCache is not enabled' );
}
$logger = LoggerFactory::getInstance( 'Translate.GroupSynchronization' );
$groupSyncCache = Services::getInstance()->getGroupSynchronizationCache();
$groupsInSync = $groupSyncCache->getGroupsInSync();
if ( !$groupsInSync ) {
$logger->info( 'All message groups are in sync' );
return;
}
$logger->info( 'Group synchronization is in progress' );
$groupsInProgress = [];
foreach ( $groupsInSync as $groupId ) {
$groupResponse = $groupSyncCache->getSynchronizationStatus( $groupId );
if ( $groupResponse->isDone() ) {
$groupSyncCache->endSync( $groupId );
continue;
}
if ( $groupResponse->hasTimedOut() ) {
$remainingMessages = $groupResponse->getRemainingMessages();
$logger->warning(
'MessageUpdateJobs timed out for group - {groupId}; ' .
'Messages - {messages}; ' .
'Jobs remaining - {jobRemaining}',
[
'groupId' => $groupId ,
'jobRemaining' => count( $remainingMessages ),
'messages' => implode( ', ', array_keys( $remainingMessages ) )
]
);
$count = count( $remainingMessages );
wfLogWarning( "MessageUpdateJob timed out for group $groupId with $count message(s) remaining" );
$groupSyncCache->forceEndSync( $groupId );
$groupSyncCache->addGroupErrors( $groupResponse );
} else {
$groupsInProgress[] = $groupId;
}
}
if ( !$groupsInProgress ) {
// No groups in progress.
$logger->info( 'All message groups are now in sync.' );
JobQueueGroup::singleton()->push( MessageIndexRebuildJob::newJob() );
}
$logger->info(
"Script completed successfully. " .
"{inProgressGroupCount} group synchronization(s) is/are in progress",
[
'inProgressGroupCount' => count( $groupsInProgress )
]
);
}
}
|