? "{$domain->getDatabase()}-{$domain->getTablePrefix()}"
: $domain->getDatabase();
}
+
+ /**
+ * @param DatabaseDomain|string $domain
+ * @return bool Whether $domain has the same DB/prefix as the current wiki
+ * @since 1.33
+ */
+ public static function isCurrentWikiDbDomain( $domain ) {
+ $domain = DatabaseDomain::newFromId( $domain );
+ $curDomain = self::getCurrentWikiDbDomain();
+
+ if ( !in_array( $curDomain->getSchema(), [ null, 'mediawiki' ], true ) ) {
+ // Include the schema if it is set and is not the default placeholder.
+ // This means a site admin may have specifically taylored the schemas.
+ // Domain IDs might use the form <DB>-<project>-<language>, meaning that
+ // the schema portion must be accounted for to disambiguate wikis.
+ return $curDomain->equals( $domain );
+ }
+
+ return (
+ $curDomain->getDatabase() === $domain->getDatabase() &&
+ $curDomain->getTablePrefix() === $domain->getTablePrefix()
+ );
+ }
+
+ /**
+ * @return DatabaseDomain Database domain of the current wiki
+ * @since 1.33
+ */
+ public static function getCurrentWikiDbDomain() {
+ global $wgDBname, $wgDBmwschema, $wgDBprefix;
+ // Avoid invoking LBFactory to avoid any chance of recursion
+ return new DatabaseDomain( $wgDBname, $wgDBmwschema, (string)$wgDBprefix );
+ }
}
/** @var ProcessCacheLRU */
protected $cache;
- /** @var string Wiki ID */
- protected $wiki;
+ /** @var string Wiki DB domain ID */
+ protected $domain;
/** @var string|bool Read only rationale (or false if r/w) */
protected $readOnlyReason;
/** @var bool Whether the wiki is not recognized in configuration */
const CACHE_VERSION = 1; // integer; cache version
/**
- * @param string $wiki Wiki ID
+ * @param string $domain Wiki DB domain ID
* @param string|bool $readOnlyReason Read-only reason or false
*/
- protected function __construct( $wiki, $readOnlyReason ) {
- $this->wiki = $wiki;
+ protected function __construct( $domain, $readOnlyReason ) {
+ $this->domain = $domain;
$this->readOnlyReason = $readOnlyReason;
$this->cache = new ProcessCacheLRU( 10 );
}
/**
- * @param bool|string $wiki Wiki ID
+ * @param bool|string $domain Wiki domain ID
* @return JobQueueGroup
*/
- public static function singleton( $wiki = false ) {
+ public static function singleton( $domain = false ) {
global $wgLocalDatabases;
- $wiki = ( $wiki === false ) ? wfWikiID() : $wiki;
+ if ( $domain === false ) {
+ $domain = WikiMap::getCurrentWikiDbDomain()->getId();
+ }
- if ( !isset( self::$instances[$wiki] ) ) {
- self::$instances[$wiki] = new self( $wiki, wfConfiguredReadOnlyReason() );
+ if ( !isset( self::$instances[$domain] ) ) {
+ self::$instances[$domain] = new self( $domain, wfConfiguredReadOnlyReason() );
// Make sure jobs are not getting pushed to bogus wikis. This can confuse
// the job runner system into spawning endless RPC requests that fail (T171371).
- if ( $wiki !== wfWikiID() && !in_array( $wiki, $wgLocalDatabases ) ) {
- self::$instances[$wiki]->invalidWiki = true;
+ $wikiId = WikiMap::getWikiIdFromDomain( $domain );
+ if (
+ !WikiMap::isCurrentWikiDbDomain( $domain ) &&
+ !in_array( $wikiId, $wgLocalDatabases )
+ ) {
+ self::$instances[$domain]->invalidWiki = true;
}
}
- return self::$instances[$wiki];
+ return self::$instances[$domain];
}
/**
public function get( $type ) {
global $wgJobTypeConf;
- $conf = [ 'wiki' => $this->wiki, 'type' => $type ];
+ $conf = [ 'wiki' => $this->domain, 'type' => $type ];
if ( isset( $wgJobTypeConf[$type] ) ) {
$conf = $conf + $wgJobTypeConf[$type];
} else {
if ( $this->invalidWiki ) {
// Do not enqueue job that cannot be run (T171371)
- $e = new LogicException( "Domain '{$this->wiki}' is not recognized." );
+ $e = new LogicException( "Domain '{$this->domain}' is not recognized." );
MWExceptionHandler::logException( $e );
return;
}
$cache = ObjectCache::getLocalClusterInstance();
$cache->set(
- $cache->makeGlobalKey( 'jobqueue', $this->wiki, 'hasjobs', self::TYPE_ANY ),
+ $cache->makeGlobalKey( 'jobqueue', $this->domain, 'hasjobs', self::TYPE_ANY ),
'true',
15
);
if ( array_diff( array_keys( $jobsByType ), $wgJobTypesExcludedFromDefaultQueue ) ) {
$cache->set(
- $cache->makeGlobalKey( 'jobqueue', $this->wiki, 'hasjobs', self::TYPE_DEFAULT ),
+ $cache->makeGlobalKey( 'jobqueue', $this->domain, 'hasjobs', self::TYPE_DEFAULT ),
'true',
15
);
public function lazyPush( $jobs ) {
if ( $this->invalidWiki ) {
// Do not enqueue job that cannot be run (T171371)
- throw new LogicException( "Domain '{$this->wiki}' is not recognized." );
+ throw new LogicException( "Domain '{$this->domain}' is not recognized." );
}
if ( PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg' ) {
*/
public function queuesHaveJobs( $type = self::TYPE_ANY ) {
$cache = ObjectCache::getLocalClusterInstance();
- $key = $cache->makeGlobalKey( 'jobqueue', $this->wiki, 'hasjobs', $type );
+ $key = $cache->makeGlobalKey( 'jobqueue', $this->domain, 'hasjobs', $type );
$value = $cache->get( $key );
if ( $value === false ) {
$this->coalescedQueues = [];
foreach ( $wgJobTypeConf as $type => $conf ) {
$queue = JobQueue::factory(
- [ 'wiki' => $this->wiki, 'type' => 'null' ] + $conf );
+ [ 'wiki' => $this->domain, 'type' => 'null' ] + $conf );
$loc = $queue->getCoalesceLocationInternal();
if ( !isset( $this->coalescedQueues[$loc] ) ) {
$this->coalescedQueues[$loc]['queue'] = $queue;
*/
private function getCachedConfigVar( $name ) {
// @TODO: cleanup this whole method with a proper config system
- if ( $this->wiki === wfWikiID() ) {
+ if ( WikiMap::isCurrentWikiDbDomain( $this->domain ) ) {
return $GLOBALS[$name]; // common case
} else {
- $wiki = $this->wiki;
+ $wiki = WikiMap::getWikiIdFromDomain( $this->domain );
$cache = ObjectCache::getMainWANInstance();
$value = $cache->getWithSetCallback(
- $cache->makeGlobalKey( 'jobqueue', 'configvalue', $wiki, $name ),
+ $cache->makeGlobalKey( 'jobqueue', 'configvalue', $this->domain, $name ),
$cache::TTL_DAY + mt_rand( 0, $cache::TTL_DAY ),
function () use ( $wiki, $name ) {
global $wgConf;
-
+ // @TODO: use the full domain ID here
return [ 'v' => $wgConf->getConfig( $wiki, $name ) ];
},
[ 'pcTTL' => WANObjectCache::TTL_PROC_LONG ]
);
-
return $value['v'];
}
}