Merge "mediawiki.api: Do not cache errors in getToken()"
[lhc/web/wiklou.git] / includes / filebackend / FileOpBatch.php
index 32b65ba..56d7000 100644 (file)
@@ -55,13 +55,12 @@ class FileOpBatch {
         * @return Status
         */
        public static function attempt( array $performOps, array $opts, FileJournal $journal ) {
-               wfProfileIn( __METHOD__ );
+               $section = new ProfileSection( __METHOD__ );
                $status = Status::newGood();
 
                $n = count( $performOps );
                if ( $n > self::MAX_BATCH_SIZE ) {
                        $status->fatal( 'backend-fail-batchsize', $n, self::MAX_BATCH_SIZE );
-                       wfProfileOut( __METHOD__ );
 
                        return $status;
                }
@@ -108,8 +107,6 @@ class FileOpBatch {
                                $status->success[$index] = false;
                                ++$status->failCount;
                                if ( !$ignoreErrors ) {
-                                       wfProfileOut( __METHOD__ );
-
                                        return $status; // abort
                                }
                        }
@@ -123,8 +120,6 @@ class FileOpBatch {
                if ( count( $entries ) ) {
                        $subStatus = $journal->logChangeBatch( $entries, $batchId );
                        if ( !$subStatus->isOK() ) {
-                               wfProfileOut( __METHOD__ );
-
                                return $subStatus; // abort
                        }
                }
@@ -136,8 +131,6 @@ class FileOpBatch {
                // Attempt each operation (in parallel if allowed and possible)...
                self::runParallelBatches( $pPerformOps, $status );
 
-               wfProfileOut( __METHOD__ );
-
                return $status;
        }
 
@@ -149,9 +142,8 @@ class FileOpBatch {
         * within any given sub-batch do not depend on each other.
         * This will abort remaining ops on failure.
         *
-        * @param array $pPerformOps
+        * @param array $pPerformOps Batches of file ops (batches use original indexes)
         * @param Status $status
-        * @return bool Success
         */
        protected static function runParallelBatches( array $pPerformOps, Status $status ) {
                $aborted = false; // set to true on unexpected errors
@@ -160,6 +152,8 @@ class FileOpBatch {
                                // We can't continue (even with $ignoreErrors) as $predicates is wrong.
                                // Log the remaining ops as failed for recovery...
                                foreach ( $performOpsBatch as $i => $fileOp ) {
+                                       $status->success[$i] = false;
+                                       ++$status->failCount;
                                        $performOpsBatch[$i]->logFailure( 'attempt_aborted' );
                                }
                                continue;
@@ -172,12 +166,8 @@ class FileOpBatch {
                        // If attemptAsync() returns a Status, it was either due to an error
                        // or the backend does not support async ops and did it synchronously.
                        foreach ( $performOpsBatch as $i => $fileOp ) {
-                               if ( !$fileOp->failed() ) { // failed => already has Status
-                                       // If the batch is just one operation, it's faster to avoid
-                                       // pipelining as that can involve creating new TCP connections.
-                                       $subStatus = ( count( $performOpsBatch ) > 1 )
-                                               ? $fileOp->attemptAsync()
-                                               : $fileOp->attempt();
+                               if ( !isset( $status->success[$i] ) ) { // didn't already fail in precheck()
+                                       $subStatus = $fileOp->attemptAsync();
                                        if ( $subStatus->value instanceof FileBackendStoreOpHandle ) {
                                                $opHandles[$i] = $subStatus->value; // deferred
                                        } else {
@@ -189,7 +179,7 @@ class FileOpBatch {
                        $statuses = $statuses + $backend->executeOpHandlesInternal( $opHandles );
                        // Marshall and merge all the responses (blocking)...
                        foreach ( $performOpsBatch as $i => $fileOp ) {
-                               if ( !$fileOp->failed() ) { // failed => already has Status
+                               if ( !isset( $status->success[$i] ) ) { // didn't already fail in precheck()
                                        $subStatus = $statuses[$i];
                                        $status->merge( $subStatus );
                                        if ( $subStatus->isOK() ) {
@@ -203,7 +193,5 @@ class FileOpBatch {
                                }
                        }
                }
-
-               return $status;
        }
 }