Merge "Avoid full RC table scans in ChangeTags::updateTags()"
[lhc/web/wiklou.git] / includes / filerepo / file / File.php
index eb50a12..3677a14 100644 (file)
@@ -421,7 +421,13 @@ abstract class File implements IDBAccessObject {
        public function getLocalRefPath() {
                $this->assertRepoDefined();
                if ( !isset( $this->fsFile ) ) {
+                       $starttime = microtime( true );
                        $this->fsFile = $this->repo->getLocalReference( $this->getPath() );
+
+                       $statTiming = microtime( true ) - $starttime;
+                       RequestContext::getMain()->getStats()->timing(
+                               'media.thumbnail.generate.fetchoriginal', 1000 * $statTiming );
+
                        if ( !$this->fsFile ) {
                                $this->fsFile = false; // null => false; cache negative hits
                        }
@@ -1092,7 +1098,9 @@ abstract class File implements IDBAccessObject {
         * @return bool|MediaTransformOutput
         */
        public function generateAndSaveThumb( $tmpFile, $transformParams, $flags ) {
-               global $wgUseSquid, $wgIgnoreImageErrors;
+               global $wgIgnoreImageErrors;
+
+               $stats = RequestContext::getMain()->getStats();
 
                $handler = $this->getHandler();
 
@@ -1109,10 +1117,15 @@ abstract class File implements IDBAccessObject {
                        $this->generateBucketsIfNeeded( $normalisedParams, $flags );
                }
 
+               $starttime = microtime( true );
+
                // Actually render the thumbnail...
                $thumb = $handler->doTransform( $this, $tmpThumbPath, $thumbUrl, $transformParams );
                $tmpFile->bind( $thumb ); // keep alive with $thumb
 
+               $statTiming = microtime( true ) - $starttime;
+               $stats->timing( 'media.thumbnail.generate.transform', 1000 * $statTiming );
+
                if ( !$thumb ) { // bad params?
                        $thumb = false;
                } elseif ( $thumb->isError() ) { // transform error
@@ -1123,6 +1136,9 @@ abstract class File implements IDBAccessObject {
                        }
                } elseif ( $this->repo && $thumb->hasFile() && !$thumb->fileIsSource() ) {
                        // Copy the thumbnail from the file system into storage...
+
+                       $starttime = microtime( true );
+
                        $disposition = $this->getThumbDisposition( $thumbName );
                        $status = $this->repo->quickImport( $tmpThumbPath, $thumbPath, $disposition );
                        if ( $status->isOK() ) {
@@ -1130,19 +1146,14 @@ abstract class File implements IDBAccessObject {
                        } else {
                                $thumb = $this->transformErrorOutput( $thumbPath, $thumbUrl, $transformParams, $flags );
                        }
+
+                       $statTiming = microtime( true ) - $starttime;
+                       $stats->timing( 'media.thumbnail.generate.store', 1000 * $statTiming );
+
                        // Give extensions a chance to do something with this thumbnail...
                        Hooks::run( 'FileTransformed', array( $this, $thumb, $tmpThumbPath, $thumbPath ) );
                }
 
-               // Purge. Useful in the event of Core -> Squid connection failure or squid
-               // purge collisions from elsewhere during failure. Don't keep triggering for
-               // "thumbs" which have the main image URL though (bug 13776)
-               if ( $wgUseSquid ) {
-                       if ( !$thumb || $thumb->isError() || $thumb->getUrl() != $this->getURL() ) {
-                               SquidUpdate::purge( array( $thumbUrl ) );
-                       }
-               }
-
                return $thumb;
        }
 
@@ -1167,13 +1178,13 @@ abstract class File implements IDBAccessObject {
                        return false;
                }
 
+               $starttime = microtime( true );
+
                $params['physicalWidth'] = $bucket;
                $params['width'] = $bucket;
 
                $params = $this->getHandler()->sanitizeParamsForBucketing( $params );
 
-               $bucketName = $this->getBucketThumbName( $bucket );
-
                $tmpFile = $this->makeTransformTmpFile( $bucketPath );
 
                if ( !$tmpFile ) {
@@ -1182,6 +1193,8 @@ abstract class File implements IDBAccessObject {
 
                $thumb = $this->generateAndSaveThumb( $tmpFile, $params, $flags );
 
+               $buckettime = microtime( true ) - $starttime;
+
                if ( !$thumb || $thumb->isError() ) {
                        return false;
                }
@@ -1191,6 +1204,9 @@ abstract class File implements IDBAccessObject {
                // this object exists
                $tmpFile->bind( $this );
 
+               RequestContext::getMain()->getStats()->timing(
+                       'media.thumbnail.generate.bucket', 1000 * $buckettime );
+
                return true;
        }
 
@@ -2231,4 +2247,13 @@ abstract class File implements IDBAccessObject {
                $handler = $this->getHandler();
                return $handler ? $handler->isExpensiveToThumbnail( $this ) : false;
        }
+
+       /**
+        * Whether the thumbnails created on the same server as this code is running.
+        * @since 1.25
+        * @return bool
+        */
+       public function isTransformedLocally() {
+               return true;
+       }
 }