MediaWiki  master
WANCacheReapUpdate.php
Go to the documentation of this file.
1 <?php
2 
7 
28  private $db;
30  private $logger;
31 
36  public function __construct( IDatabase $db, LoggerInterface $logger ) {
37  $this->db = $db;
38  $this->logger = $logger;
39  }
40 
41  function doUpdate() {
42  $reaper = new WANObjectCacheReaper(
43  MediaWikiServices::getInstance()->getMainWANObjectCache(),
45  [ $this, 'getTitleChangeEvents' ],
46  [ $this, 'getEventAffectedKeys' ],
47  [
48  'channel' => 'table:recentchanges:' . $this->db->getDomainID(),
49  'logger' => $this->logger
50  ]
51  );
52 
53  $reaper->invoke( 100 );
54  }
55 
65  public function getTitleChangeEvents( $start, $id, $end, $limit ) {
66  $db = $this->db;
67  $encStart = $db->addQuotes( $db->timestamp( $start ) );
68  $encEnd = $db->addQuotes( $db->timestamp( $end ) );
69  $id = (int)$id; // cast NULL => 0 since rc_id is an integer
70 
71  $res = $db->select(
72  'recentchanges',
73  [ 'rc_namespace', 'rc_title', 'rc_timestamp', 'rc_id' ],
74  [
75  $db->makeList( [
76  "rc_timestamp > $encStart",
77  "rc_timestamp = $encStart AND rc_id > " . $db->addQuotes( $id )
78  ], LIST_OR ),
79  "rc_timestamp < $encEnd"
80  ],
81  __METHOD__,
82  [ 'ORDER BY' => 'rc_timestamp ASC, rc_id ASC', 'LIMIT' => $limit ]
83  );
84 
85  $events = [];
86  foreach ( $res as $row ) {
87  $events[] = [
88  'id' => (int)$row->rc_id,
89  'pos' => (int)wfTimestamp( TS_UNIX, $row->rc_timestamp ),
90  'item' => new TitleValue( (int)$row->rc_namespace, $row->rc_title )
91  ];
92  }
93 
94  return $events;
95  }
96 
107  $entities = [];
108 
109  // You can't create a WikiPage for special pages (-1) or other virtual
110  // namespaces, but special pages do appear in RC sometimes, e.g. for logs
111  // of AbuseFilter filter changes.
112  if ( $t->getNamespace() >= 0 ) {
113  $entities[] = WikiPage::factory( Title::newFromLinkTarget( $t ) );
114  }
115 
116  if ( $t->inNamespace( NS_FILE ) ) {
117  $entities[] = MediaWikiServices::getInstance()->getRepoGroup()->getLocalRepo()
118  ->newFile( $t->getText() );
119  }
120  if ( $t->inNamespace( NS_USER ) ) {
121  $entities[] = User::newFromName( $t->getText(), false );
122  }
123 
124  $keys = [];
125  foreach ( $entities as $entity ) {
126  if ( $entity ) {
127  $keys = array_merge( $keys, $entity->getMutableCacheKeys( $cache ) );
128  }
129  }
130  if ( $keys ) {
131  $this->logger->debug( __CLASS__ . ': got key(s) ' . implode( ', ', $keys ) );
132  }
133 
134  return $keys;
135  }
136 }
static factory(Title $title)
Create a WikiPage object of the appropriate class for the given title.
Definition: WikiPage.php:142
invoke( $n=100)
Check and reap stale keys based on a chunk of events.
inNamespace( $ns)
Convenience function to test if it is in the namespace.
Represents a page (or page fragment) title within MediaWiki.
Definition: TitleValue.php:36
static getLocalClusterInstance()
Get the main cluster-local cache object.
getNamespace()
Get the namespace index.
timestamp( $ts=0)
Convert a timestamp in one of the formats accepted by ConvertibleTimestamp to the format used for ins...
wfTimestamp( $outputtype=TS_UNIX, $ts=0)
Get a timestamp string in one of various formats.
Class for fixing stale WANObjectCache keys using a purge event source.
doUpdate()
Perform the actual work.
Class for scanning through chronological, log-structured data or change logs and locally purging cach...
$cache
Definition: mcc.php:33
getTitleChangeEvents( $start, $id, $end, $limit)
const NS_FILE
Definition: Defines.php:66
__construct(IDatabase $db, LoggerInterface $logger)
const LIST_OR
Definition: Defines.php:42
static newFromLinkTarget(LinkTarget $linkTarget, $forceClone='')
Returns a Title given a LinkTarget.
Definition: Title.php:268
LoggerInterface $logger
Basic database interface for live and lazy-loaded relation database handles.
Definition: IDatabase.php:38
makeList( $a, $mode=self::LIST_COMMA)
Makes an encoded list of strings from an array.
select( $table, $vars, $conds='', $fname=__METHOD__, $options=[], $join_conds=[])
Execute a SELECT query constructed using the various parameters provided.
getText()
Returns the link in text form, without namespace prefix or fragment.
getEventAffectedKeys(WANObjectCache $cache, LinkTarget $t)
Gets a list of important cache keys associated with a title.
static newFromName( $name, $validate='valid')
Static factory method for creation from username.
Definition: User.php:515
addQuotes( $s)
Escape and quote a raw value string for use in a SQL query.