Reduced memory usage a bit for copyFileBackend.php with --missingonly.
authorAaron Schulz <aschulz@wikimedia.org>
Wed, 1 May 2013 01:42:03 +0000 (18:42 -0700)
committerAaron Schulz <aschulz@wikimedia.org>
Wed, 1 May 2013 01:42:03 +0000 (18:42 -0700)
Change-Id: Iae650b5c3a5f99c5b2e31e29c276957ea6b8bb50

maintenance/copyFileBackend.php

index f2c4ac5..fe422b3 100644 (file)
@@ -79,24 +79,28 @@ class CopyFileBackend extends Maintenance {
 
                        // Do a listing comparison if specified
                        if ( $this->hasOption( 'missingonly' ) ) {
-                               $relFilesSrc = array();
-                               $relFilesDst = array();
-                               foreach ( $srcPathsRel as $srcPathRel ) {
-                                       $relFilesSrc[] = $srcPathRel;
-                               }
                                $dstPathsRel = $dst->getFileList( array(
                                        'dir' => $dst->getRootStoragePath() . "/$backendRel" ) );
                                if ( $dstPathsRel === null ) {
                                        $this->error( "Could not list files in $container.", 1 ); // die
                                }
+                               // Get the list of destination files
+                               $relFilesDstSha1 = array();
                                foreach ( $dstPathsRel as $dstPathRel ) {
-                                       $relFilesDst[] = $dstPathRel;
+                                       $relFilesDstSha1[sha1( $dstPathRel )] = 1;
+                               }
+                               unset( $dstPathsRel ); // free
+                               // Get the list of missing files
+                               $missingPathsRel = array();
+                               foreach ( $srcPathsRel as $srcPathRel ) {
+                                       if ( !isset( $relFilesDstSha1[sha1( $srcPathRel )] ) ) {
+                                               $missingPathsRel[] = $srcPathRel;
+                                       }
                                }
+                               unset( $srcPathsRel ); // free
                                // Only copy the missing files over in the next loop
-                               $srcPathsRel = array_diff( $relFilesSrc, $relFilesDst );
+                               $srcPathsRel = $missingPathsRel;
                                $this->output( count( $srcPathsRel ) . " file(s) need to be copied.\n" );
-                               unset( $relFilesSrc );
-                               unset( $relFilesDst );
                        }
 
                        $batchPaths = array();