getScopedLock( $virtualKey ) : false; if ( $scopedLock ) { $updates = self::merge( $bcache, $domain, $virtualKey, $status ); if ( isset( $updates['asOfTime'] ) ) { $age = ( microtime( true ) - $updates['asOfTime'] ); } } return ( $age < 30 ); } public static function merge( BloomCache $bcache, $domain, $virtualKey, array $status ) { $limit = 1000; $dbr = wfGetDB( DB_SLAVE, array(), $domain ); $res = $dbr->select( 'logging', array( 'log_namespace', 'log_title', 'log_id', 'log_timestamp' ), array( 'log_id > ' . $dbr->addQuotes( (int)$status['lastID'] ) ), __METHOD__, array( 'ORDER BY' => 'log_id', 'LIMIT' => $limit ) ); $updates = array(); if ( $res->numRows() > 0 ) { $members = array(); foreach ( $res as $row ) { $members[] = "$virtualKey:{$row->log_namespace}:{$row->log_title}"; } $lastID = $row->log_id; $lastTime = $row->log_timestamp; if ( !$bcache->add( 'shared', $members ) ) { return false; } $updates['lastID'] = $lastID; $updates['asOfTime'] = wfTimestamp( TS_UNIX, $lastTime ); } else { $updates['asOfTime'] = microtime( true ); } $updates['epoch'] = $status['epoch'] ?: microtime( true ); $bcache->setStatus( $virtualKey, $updates ); return $updates; } }