From: Aaron Schulz Date: Thu, 1 Oct 2015 23:19:05 +0000 (-0700) Subject: Apply $wgReadOnly to all file backends X-Git-Tag: 1.31.0-rc.0~9581 X-Git-Url: http://git.heureux-cyclage.org/?a=commitdiff_plain;h=8a3816529a313d9ca11972b2c485d826545e1736;p=lhc%2Fweb%2Fwiklou.git Apply $wgReadOnly to all file backends * Also added a wfConfiguredReadOnly() method to avoid DB_SLAVE connections Change-Id: I9e7ec95c4b2f763505166d2345d27abaef6257a3 --- diff --git a/includes/GlobalFunctions.php b/includes/GlobalFunctions.php index 6fbc11d0d8..496992bd11 100644 --- a/includes/GlobalFunctions.php +++ b/includes/GlobalFunctions.php @@ -1342,33 +1342,57 @@ function wfReadOnly() { } /** - * Get the value of $wgReadOnly or the contents of $wgReadOnlyFile. + * Check if the site is in read-only mode and return the message if so + * + * This checks wfConfiguredReadOnlyReason() and the main load balancer + * for slave lag. This may result in DB_SLAVE connection being made. * * @return string|bool String when in read-only mode; false otherwise */ function wfReadOnlyReason() { - global $wgReadOnly, $wgReadOnlyFile; + $readOnly = wfConfiguredReadOnlyReason(); + if ( $readOnly !== false ) { + return $readOnly; + } - if ( $wgReadOnly === null ) { - // Set $wgReadOnly for faster access next time - if ( is_file( $wgReadOnlyFile ) && filesize( $wgReadOnlyFile ) > 0 ) { - $wgReadOnly = file_get_contents( $wgReadOnlyFile ); - } else { - $wgReadOnly = false; - } + static $autoReadOnly = null; + if ( $autoReadOnly === null ) { // Callers use this method to be aware that data presented to a user // may be very stale and thus allowing submissions can be problematic. try { - if ( $wgReadOnly === false && wfGetLB()->getLaggedSlaveMode() ) { - $wgReadOnly = 'The database has been automatically locked ' . + if ( wfGetLB()->getLaggedSlaveMode() ) { + $autoReadOnly = 'The database has been automatically locked ' . 'while the slave database servers catch up to the master'; + } else { + $autoReadOnly = false; } } catch ( DBConnectionError $e ) { - $wgReadOnly = 'The database has been automatically locked ' . + $autoReadOnly = 'The database has been automatically locked ' . 'until the slave database servers become available'; } } + return $autoReadOnly; +} + +/** + * Get the value of $wgReadOnly or the contents of $wgReadOnlyFile. + * + * @return string|bool String when in read-only mode; false otherwise + * @since 1.27 + */ +function wfConfiguredReadOnlyReason() { + global $wgReadOnly, $wgReadOnlyFile; + + if ( $wgReadOnly === null ) { + // Set $wgReadOnly for faster access next time + if ( is_file( $wgReadOnlyFile ) && filesize( $wgReadOnlyFile ) > 0 ) { + $wgReadOnly = file_get_contents( $wgReadOnlyFile ); + } else { + $wgReadOnly = false; + } + } + return $wgReadOnly; } diff --git a/includes/filebackend/FileBackendGroup.php b/includes/filebackend/FileBackendGroup.php index 9bb1582568..59b2fd60c0 100644 --- a/includes/filebackend/FileBackendGroup.php +++ b/includes/filebackend/FileBackendGroup.php @@ -63,9 +63,6 @@ class FileBackendGroup { protected function initFromGlobals() { global $wgLocalFileRepo, $wgForeignFileRepos, $wgFileBackends; - // Register explicitly defined backends - $this->register( $wgFileBackends ); - $autoBackends = array(); // Automatically create b/c backends for file repos... $repos = array_merge( $wgForeignFileRepos, array( $wgLocalFileRepo ) ); @@ -105,8 +102,16 @@ class FileBackendGroup { ); } - // Register implicitly defined backends - $this->register( $autoBackends ); + $backends = array_merge( $autoBackends, $wgFileBackends ); + + // Apply $wgReadOnly to all backends if not already read-only + foreach ( $backends as &$backend ) { + $backend['readOnly'] = !empty( $backend['readOnly'] ) + ? $backend['readOnly'] + : wfConfiguredReadOnlyReason(); + } + + $this->register( $backends ); } /**