Apply $wgReadOnly to all file backends
authorAaron Schulz <aschulz@wikimedia.org>
Thu, 1 Oct 2015 23:19:05 +0000 (16:19 -0700)
committerBryanDavis <bdavis@wikimedia.org>
Sat, 3 Oct 2015 00:15:28 +0000 (00:15 +0000)
* Also added a wfConfiguredReadOnly() method
  to avoid DB_SLAVE connections

Change-Id: I9e7ec95c4b2f763505166d2345d27abaef6257a3

includes/GlobalFunctions.php
includes/filebackend/FileBackendGroup.php

index 6fbc11d..496992b 100644 (file)
@@ -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;
 }
 
index 9bb1582..59b2fd6 100644 (file)
@@ -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 );
        }
 
        /**