Wrap djvu large local copy downloads in pool counter
authorAaron Schulz <aschulz@wikimedia.org>
Fri, 11 Apr 2014 23:05:12 +0000 (16:05 -0700)
committerAaron Schulz <aschulz@wikimedia.org>
Fri, 11 Apr 2014 23:05:12 +0000 (16:05 -0700)
Change-Id: I3cade9d870f7c344434d7cee27506d53345ebdf9

includes/media/DjVu.php

index 1202c9a..4e0f44c 100644 (file)
@@ -177,7 +177,33 @@ class DjVuHandler extends ImageHandler {
                        );
                }
 
-               $srcPath = $image->getLocalRefPath();
+               // Get local copy source for shell scripts
+               // Thumbnail extraction is very inefficient for large files.
+               // Provide a way to pool count limit the number of downloaders.
+               if ( $image->getSize() >= 1e7 ) { // 10MB
+                       $work = new PoolCounterWorkViaCallback( 'GetLocalFileCopy', sha1( $image->getName() ),
+                               array(
+                                       'doWork' => function() use ( $image ) {
+                                               return $image->getLocalRefPath();
+                                       }
+                               )
+                       );
+                       $srcPath = $work->execute();
+               } else {
+                       $srcPath = $image->getLocalRefPath();
+               }
+
+               if ( $srcPath === false ) { // Failed to get local copy
+                       wfDebugLog( 'thumbnail',
+                               sprintf( 'Thumbnail failed on %s: could not get local copy of "%s"',
+                                       wfHostname(), $image->getName() ) );
+
+                       return new MediaTransformError( 'thumbnail_error',
+                               $params['width'], $params['height'],
+                               wfMessage( 'filemissing' )->text()
+                       );
+               }
+
                # Use a subshell (brackets) to aggregate stderr from both pipeline commands
                # before redirecting it to the overall stdout. This works in both Linux and Windows XP.
                $cmd = '(' . wfEscapeShellArg(