blob: a155ff9e621d72d86c054f0e6acccdafec4b5320 (
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
|
<?php
/**
* Contains class with job for rebuilding message index.
*
* @file
* @author Niklas Laxström
* @copyright Copyright © 2011-2013, Niklas Laxström
* @license GPL-2.0-or-later
*/
use MediaWiki\Extension\Translate\Jobs\GenericTranslateJob;
/**
* Job for rebuilding message index.
*
* @ingroup JobQueue
*/
class MessageIndexRebuildJob extends GenericTranslateJob {
/** @return self */
public static function newJob() {
$timestamp = microtime( true );
$job = new self( Title::newMainPage(), [ 'timestamp' => $timestamp ] );
return $job;
}
/**
* @param Title $title
* @param array $params
*/
public function __construct( $title, $params = [] ) {
parent::__construct( __CLASS__, $title, $params );
$this->removeDuplicates = true;
}
public function run() {
// Make sure we have latest version of message groups from global cache.
// This should be pretty fast, just a few cache fetches with some post processing.
MessageGroups::singleton()->clearProcessCache();
// BC for existing jobs which may not have this parameter set
$timestamp = $this->getParams()['timestamp'] ?? microtime( true );
try {
MessageIndex::singleton()->rebuild( $timestamp );
} catch ( MessageIndexException $e ) {
// Currently there is just one type of exception: lock wait time exceeded.
// Assuming no bugs, this is a transient issue and retry will solve it.
$this->logWarning( $e->getMessage() );
// Try again later. See ::allowRetries
return false;
}
return true;
}
/** @inheritDoc */
public function allowRetries() {
// This is the default, but added for explicitness and clarity
return true;
}
/** @inheritDoc */
public function getDeduplicationInfo() {
$info = parent::getDeduplicationInfo();
// The timestamp is different for every job, so ignore it. The worst that can
// happen is that the front cache is not cleared until a future job is created.
// There is a check in MessageIndex to spawn a new job if timestamp is smaller
// than expected.
//
// Ideally we would take the latest timestamp, but it seems that the job queue
// just prevents insertion of duplicate jobs instead.
unset( $info['params']['timestamp'] );
return $info;
}
/**
* Usually this job is fast enough to be executed immediately,
* in which case having it go through jobqueue only causes problems
* in installations with errant job queue processing.
*/
public function insertIntoJobQueue() {
global $wgTranslateDelayedMessageIndexRebuild;
if ( $wgTranslateDelayedMessageIndexRebuild ) {
JobQueueGroup::singleton()->push( $this );
} else {
$this->run();
}
}
}
|