Make WAN cache config use $wgEventRelayerConfig

This makes the channels more explicit and defined in a less
ad-hoc way. Systems like Kafka would prefer explicit channel
definitions anyway, so the channel prefix just obscures things.

Change-Id: I5631eb1b1382083396a0f08904d9273cc92601e8
This commit is contained in:
Aaron Schulz 2016-04-22 12:52:06 -07:00
parent 5350257ecf
commit 09a0a5e4f6
5 changed files with 35 additions and 39 deletions

View file

@ -2223,27 +2223,24 @@ $wgMainWANCache = false;
*
* The format is an associative array where the key is a cache identifier, and
* the value is an associative array of parameters. The "cacheId" parameter is
* a cache identifier from $wgObjectCaches. The "relayerConfig" parameter is an
* array used to construct an EventRelayer object. The "pool" parameter is a
* string that is used as a PubSub channel prefix. The "loggroup" parameter
* controls where log events are sent.
* a cache identifier from $wgObjectCaches. The "channels" parameter is a map of
* actions ('purge') to PubSub channels defined in $wgEventRelayerConfig.
* The "loggroup" parameter controls where log events are sent.
*
* @since 1.26
*/
$wgWANObjectCaches = [
CACHE_NONE => [
'class' => 'WANObjectCache',
'cacheId' => CACHE_NONE,
'pool' => 'mediawiki-main-none',
'relayerConfig' => [ 'class' => 'EventRelayerNull' ]
'class' => 'WANObjectCache',
'cacheId' => CACHE_NONE,
'channels' => []
]
/* Example of a simple single data-center cache:
'memcached-php' => array(
'class' => 'WANObjectCache',
'cacheId' => 'memcached-php',
'pool' => 'mediawiki-main-memcached',
'relayerConfig' => array( 'class' => 'EventRelayerNull' )
)
'memcached-php' => [
'class' => 'WANObjectCache',
'cacheId' => 'memcached-php',
'channels' => [ 'purge' => 'wancache-main-memcached-purge' ]
]
*/
];

View file

@ -618,10 +618,9 @@ if ( $wgMainWANCache === false ) {
// Sites using multiple datacenters can configure a relayer.
$wgMainWANCache = 'mediawiki-main-default';
$wgWANObjectCaches[$wgMainWANCache] = [
'class' => 'WANObjectCache',
'cacheId' => $wgMainCacheType,
'pool' => 'mediawiki-main-default',
'relayerConfig' => [ 'class' => 'EventRelayerNull' ]
'class' => 'WANObjectCache',
'cacheId' => $wgMainCacheType,
'channels' => [ 'purge' => 'wancache-main-default-purge' ]
];
}

View file

@ -54,10 +54,6 @@ abstract class EventRelayer implements LoggerAwareInterface {
return $this->doNotify( $channel, $events );
}
/**
* Set logger instance.
* @param LoggerInterface $logger
*/
public function setLogger( LoggerInterface $logger ) {
$this->logger = $logger;
}

View file

@ -69,10 +69,10 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
protected $cache;
/** @var HashBagOStuff Script instance PHP cache */
protected $procCache;
/** @var string Cache pool name */
protected $pool;
/** @var string Purge channel name */
protected $purgeChannel;
/** @var EventRelayer Bus that handles purge broadcasts */
protected $relayer;
protected $purgeRelayer;
/** @var LoggerInterface */
protected $logger;
@ -134,25 +134,27 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
const MAX_PC_KEYS = 1000; // max keys to keep in process cache
const DEFAULT_PURGE_CHANNEL = 'wancache-purge';
/**
* @param array $params
* - cache : BagOStuff object
* - pool : pool name
* - relayer : EventRelayer object
* - logger : LoggerInterface object
* - cache : BagOStuff object for a persistent cache
* - channels : Map of (action => channel string). Actions include "purge".
* - relayers : Map of (action => EventRelayer object). Actions include "purge".
* - logger : LoggerInterface object
*/
public function __construct( array $params ) {
$this->cache = $params['cache'];
$this->pool = $params['pool'];
$this->relayer = $params['relayer'];
$this->procCache = new HashBagOStuff( [ 'maxKeys' => self::MAX_PC_KEYS ] );
$this->purgeChannel = isset( $params['channels']['purge'] )
? $params['channels']['purge']
: self::DEFAULT_PURGE_CHANNEL;
$this->purgeRelayer = isset( $params['relayers']['purge'] )
? $params['relayers']['purge']
: new EventRelayerNull( [] );
$this->setLogger( isset( $params['logger'] ) ? $params['logger'] : new NullLogger() );
}
/**
* Set logger instance.
* @param LoggerInterface $logger
*/
public function setLogger( LoggerInterface $logger ) {
$this->logger = $logger;
}
@ -950,7 +952,7 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
'sbt' => true, // substitute $UNIXTIME$ with actual microtime
] );
$ok = $this->relayer->notify( "{$this->pool}:purge", $event );
$ok = $this->purgeRelayer->notify( $this->purgeChannel, $event );
if ( !$ok ) {
$this->lastRelayError = self::ERR_RELAY;
}
@ -970,7 +972,7 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
'key' => $key,
] );
$ok = $this->relayer->notify( "{$this->pool}:purge", $event );
$ok = $this->purgeRelayer->notify( $this->purgeChannel, $event );
if ( !$ok ) {
$this->lastRelayError = self::ERR_RELAY;
}

View file

@ -298,8 +298,10 @@ class ObjectCache {
}
$params = $wgWANObjectCaches[$id];
$class = $params['relayerConfig']['class'];
$params['relayer'] = new $class( $params['relayerConfig'] );
foreach ( $params['channels'] as $action => $channel ) {
$params['relayers'][$action] = EventRelayerGroup::singleton()->getRelayer( $channel );
$params['channels'][$action] = $channel;
}
$params['cache'] = self::newFromId( $params['cacheId'] );
if ( isset( $params['loggroup'] ) ) {
$params['logger'] = LoggerFactory::getInstance( $params['loggroup'] );