[ Index ]

PHP Cross Reference of MediaWiki-1.24.0

title

Body

[close]

/includes/cache/bloom/ -> BloomFilters.php (source)

   1  <?php
   2  /**
   3   * This program is free software; you can redistribute it and/or modify
   4   * it under the terms of the GNU General Public License as published by
   5   * the Free Software Foundation; either version 2 of the License, or
   6   * (at your option) any later version.
   7   *
   8   * This program is distributed in the hope that it will be useful,
   9   * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11   * GNU General Public License for more details.
  12   *
  13   * You should have received a copy of the GNU General Public License along
  14   * with this program; if not, write to the Free Software Foundation, Inc.,
  15   * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  16   * http://www.gnu.org/copyleft/gpl.html
  17   *
  18   * @file
  19   * @author Aaron Schulz
  20   */
  21  
  22  /**
  23   * @since 1.24
  24   */
  25  class BloomFilterTitleHasLogs {
  26  	public static function mergeAndCheck(
  27          BloomCache $bcache, $domain, $virtualKey, array $status
  28      ) {
  29          $age = microtime( true ) - $status['asOfTime']; // seconds
  30          $scopedLock = ( mt_rand( 1, (int)pow( 3, max( 0, 5 - $age ) ) ) == 1 )
  31              ? $bcache->getScopedLock( $virtualKey )
  32              : false;
  33  
  34          if ( $scopedLock ) {
  35              $updates = self::merge( $bcache, $domain, $virtualKey, $status );
  36              if ( isset( $updates['asOfTime'] ) ) {
  37                  $age = ( microtime( true ) - $updates['asOfTime'] );
  38              }
  39          }
  40  
  41          return ( $age < 30 );
  42      }
  43  
  44  	public static function merge(
  45          BloomCache $bcache, $domain, $virtualKey, array $status
  46      ) {
  47          $limit = 1000;
  48          $dbr = wfGetDB( DB_SLAVE, array(), $domain );
  49          $res = $dbr->select( 'logging',
  50              array( 'log_namespace', 'log_title', 'log_id', 'log_timestamp' ),
  51              array( 'log_id > ' . $dbr->addQuotes( (int)$status['lastID'] ) ),
  52              __METHOD__,
  53              array( 'ORDER BY' => 'log_id', 'LIMIT' => $limit )
  54          );
  55  
  56          $updates = array();
  57          if ( $res->numRows() > 0 ) {
  58              $members = array();
  59              foreach ( $res as $row ) {
  60                  $members[] = "$virtualKey:{$row->log_namespace}:{$row->log_title}";
  61              }
  62              $lastID = $row->log_id;
  63              $lastTime = $row->log_timestamp;
  64              if ( !$bcache->add( 'shared', $members ) ) {
  65                  return false;
  66              }
  67              $updates['lastID'] = $lastID;
  68              $updates['asOfTime'] = wfTimestamp( TS_UNIX, $lastTime );
  69          } else {
  70              $updates['asOfTime'] = microtime( true );
  71          }
  72  
  73          $updates['epoch'] = $status['epoch'] ?: microtime( true );
  74  
  75          $bcache->setStatus( $virtualKey, $updates );
  76  
  77          return $updates;
  78      }
  79  }


Generated: Fri Nov 28 14:03:12 2014 Cross-referenced by PHPXref 0.7.1