- $dbw->onTransactionIdle( function() use ( $dbw, $days, $window ) {
- $factory = wfGetLBFactory();
- $ticket = $factory->getEmptyTransactionTicket( __METHOD__ );
- // Avoid disconnect/ping() cycle that makes locks fall off
- $dbw->setSessionOptions( [ 'connTimeout' => 900 ] );
-
- $lockKey = wfWikiID() . '-activeusers';
- if ( !$dbw->lock( $lockKey, __METHOD__, 1 ) ) {
- return; // exclusive update (avoids duplicate entries)
- }
-
- $nowUnix = time();
- // Get the last-updated timestamp for the cache
- $cTime = $dbw->selectField( 'querycache_info',
- 'qci_timestamp',
- [ 'qci_type' => 'activeusers' ]
- );
- $cTimeUnix = $cTime ? wfTimestamp( TS_UNIX, $cTime ) : 1;
-
- // Pick the date range to fetch from. This is normally from the last
- // update to till the present time, but has a limited window for sanity.
- // If the window is limited, multiple runs are need to fully populate it.
- $sTimestamp = max( $cTimeUnix, $nowUnix - $days * 86400 );
- $eTimestamp = min( $sTimestamp + $window, $nowUnix );
-
- // Get all the users active since the last update
- $res = $dbw->select(
- [ 'recentchanges' ],
- [ 'rc_user_text', 'lastedittime' => 'MAX(rc_timestamp)' ],
- [
- 'rc_user > 0', // actual accounts
- 'rc_type != ' . $dbw->addQuotes( RC_EXTERNAL ), // no wikidata
- 'rc_log_type IS NULL OR rc_log_type != ' . $dbw->addQuotes( 'newusers' ),
- 'rc_timestamp >= ' . $dbw->addQuotes( $dbw->timestamp( $sTimestamp ) ),
- 'rc_timestamp <= ' . $dbw->addQuotes( $dbw->timestamp( $eTimestamp ) )
- ],
- __METHOD__,
- [
- 'GROUP BY' => [ 'rc_user_text' ],
- 'ORDER BY' => 'NULL' // avoid filesort
- ]
- );
- $names = [];
- foreach ( $res as $row ) {
- $names[$row->rc_user_text] = $row->lastedittime;
- }
-
- // Rotate out users that have not edited in too long (according to old data set)
- $dbw->delete( 'querycachetwo',
- [
- 'qcc_type' => 'activeusers',
- 'qcc_value < ' . $dbw->addQuotes( $nowUnix - $days * 86400 ) // TS_UNIX
- ],
- __METHOD__
- );
+ $dbw->onTransactionIdle(
+ function () use ( $dbw, $days, $window ) {
+ $factory = MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
+ $ticket = $factory->getEmptyTransactionTicket( __METHOD__ );
+ // Avoid disconnect/ping() cycle that makes locks fall off
+ $dbw->setSessionOptions( [ 'connTimeout' => 900 ] );
+
+ $lockKey = wfWikiID() . '-activeusers';
+ if ( !$dbw->lock( $lockKey, __METHOD__, 1 ) ) {
+ return; // exclusive update (avoids duplicate entries)
+ }