Added --all option and other features to purgeList.php
authorTim Starling <tstarling@wikimedia.org>
Mon, 7 Jan 2013 04:00:37 +0000 (15:00 +1100)
committerTim Starling <tstarling@wikimedia.org>
Wed, 13 Feb 2013 04:49:16 +0000 (15:49 +1100)
Added --all, --delay and --verbose options to purgeList.php. Rewrote the
implementation of the --namespace feature. For bug 43466.

Change-Id: I560bffb7b7d765e408687522580ccee22dffd1e2

maintenance/purgeList.php

index 850d032..1c261b1 100644 (file)
@@ -34,12 +34,17 @@ class PurgeList extends Maintenance {
                $this->mDescription = "Send purge requests for listed pages to squid";
                $this->addOption( 'purge', 'Whether to update page_touched.', false, false );
                $this->addOption( 'namespace', 'Namespace number', false, true );
+               $this->addOption( 'all', 'Purge all pages', false, false );
+               $this->addOption( 'delay', 'Number of seconds to delay between each purge', false, true );
+               $this->addOption( 'verbose', 'Show more output', false, false, 'v' );
                $this->setBatchSize( 100 );
        }
 
        public function execute() {
-               if( $this->hasOption( 'namespace' ) ) {
-                       $this->purgeNamespace();
+               if ( $this->hasOption( 'all' ) ) {
+                       $this->purgeNamespace( false );
+               } elseif ( $this->hasOption( 'namespace' ) ) {
+                       $this->purgeNamespace( intval( $this->getOption( 'namespace') ) );
                } else {
                        $this->purgeList();
                }
@@ -69,56 +74,41 @@ class PurgeList extends Maintenance {
                                }
                        }
                }
+               $this->output( "Purging " . count( $urls ). " urls\n" );
                $this->sendPurgeRequest( $urls );
        }
 
-       /** Purge a namespace given by --namespace */
-       private function purgeNamespace() {
+       /** Purge a namespace or all pages */
+       private function purgeNamespace( $namespace = false ) {
                $dbr = wfGetDB( DB_SLAVE );
-               $ns = $dbr->addQuotes( $this->getOption( 'namespace') );
-
-               $result = $dbr->select(
-                       array( 'page' ),
-                       array( 'page_namespace', 'page_title' ),
-                       array( "page_namespace = $ns" ),
-                       __METHOD__,
-                       array( 'ORDER BY' => 'page_id' )
-               );
-
-               $start   = 0;
-               $end = $result->numRows();
-               $this->output( "Will purge $end pages from namespace $ns\n" );
-
-               # Do remaining chunk
-               $end += $this->mBatchSize - 1;
-               $blockStart = $start;
-               $blockEnd = $start + $this->mBatchSize - 1;
-
-               while( $blockEnd <= $end ) {
-                       # Select pages we will purge:
-                       $result = $dbr->select(
-                               array( 'page' ),
-                               array( 'page_namespace', 'page_title' ),
-                               array( "page_namespace = $ns" ),
+               $startId = 0;
+               if ( $namespace === false ) {
+                       $conds = array();
+               } else {
+                       $conds = array( 'page_namespace' => $namespace );
+               }
+               while ( true ) {
+                       $res = $dbr->select( 'page', 
+                               array( 'page_id', 'page_namespace', 'page_title' ),
+                               $conds + array( 'page_id > ' . $dbr->addQuotes( $startId ) ),
                                __METHOD__,
-                               array( # conditions
-                                       'ORDER BY' => 'page_id',
-                                       'LIMIT'    => $this->mBatchSize,
-                                       'OFFSET'   => $blockStart,
+                               array(
+                                       'LIMIT' => $this->mBatchSize,
+                                       'ORDER BY' => 'page_id'
+
                                )
                        );
-                       # Initialize/reset URLs to be purged
+                       if ( !$res->numRows() ) {
+                               break;
+                       }
                        $urls = array();
-                       foreach( $result as $row ) {
+                       foreach ( $res as $row ) {
                                $title = Title::makeTitle( $row->page_namespace, $row->page_title );
                                $url = $title->getInternalUrl();
                                $urls[] = $url;
+                               $startId = $row->page_id;
                        }
-
                        $this->sendPurgeRequest( $urls );
-
-                       $blockStart += $this->mBatchSize;
-                       $blockEnd   += $this->mBatchSize;
                }
        }
 
@@ -127,9 +117,23 @@ class PurgeList extends Maintenance {
         * @param $urls array List of URLS to purge from squids
         */
        private function sendPurgeRequest( $urls ) {
-               $this->output( "Purging " . count( $urls ). " urls\n" );
-               $u = new SquidUpdate( $urls );
-               $u->doUpdate();
+               if ( $this->hasOption( 'delay' ) ) {
+                       $delay = floatval( $this->getOption( 'delay' ) );
+                       foreach ( $urls as $url ) {
+                               if ( $this->hasOption( 'verbose' ) ) {
+                                       $this->output( $url . "\n" );
+                               }
+                               $u = new SquidUpdate( array( $url ) );
+                               $u->doUpdate();
+                               usleep( $delay * 1e6 );
+                       }
+               } else {
+                       if ( $this->hasOption( 'verbose' ) ) {
+                               $this->output( implode( "\n", $urls ) . "\n"  );
+                       }
+                       $u = new SquidUpdate( $urls );
+                       $u->doUpdate();
+               }
        }
 
 }