addOption( 'cache', 'Bloom cache store name', true, true ); $this->addOption( 'filter', 'Bloom filter name', true, true ); $this->addOption( 'domain', 'Bloom filter domain', true, true ); $this->addOption( 'delay', 'Sleep delay between batches (us)', false, true ); $this->mDescription = "Populate the specified bloom filter"; } public function execute() { $type = $this->getOption( 'filter' ); $domain = $this->getOption( 'domain' ); $bcache = BloomCache::get( $this->getOption( 'cache' ) ); $delay = $this->getOption( 'delay', 1e5 ); if ( !method_exists( "BloomFilter{$type}", 'merge' ) ) { $this->error( "No \"BloomFilter{$type}::merge\" method found.", 1 ); } $virtualKey = "$domain:$type"; $status = $bcache->getStatus( $virtualKey ); if ( $status == false ) { $this->error( "Could not query virtual bloom filter '$virtualKey'.", 1 ); } $startTime = microtime( true ); $this->output( "Current timestamp is '$startTime'.\n" ); $this->output( "Current filter timestamp is '{$status['asOfTime']}'.\n" ); do { $status = call_user_func_array( array( "BloomFilter{$type}", 'merge' ), array( $bcache, $domain, $virtualKey, $status ) ); if ( $status == false ) { $this->error( "Could not query virtual bloom filter '$virtualKey'.", 1 ); } $this->output( "Filter updated to timestamp '{$status['asOfTime']}'.\n" ); usleep( $delay ); } while ( $status['asOfTime'] && $status['asOfTime'] < $startTime ); $this->output( "Done, filter $type of domain $domain reached time '$startTime'.\n" ); } } $maintClass = "PopulateBloomFilter"; require_once RUN_MAINTENANCE_IF_MAIN;