Use consistent caching strategy in Revision storage classes
[lhc/web/wiklou.git] / includes / externalstore / ExternalStoreDB.php
index e5d36e1..422e1fb 100644 (file)
  * @file
  */
 
+use MediaWiki\MediaWikiServices;
 use Wikimedia\Rdbms\LoadBalancer;
 use Wikimedia\Rdbms\IDatabase;
 use Wikimedia\Rdbms\DBConnRef;
 use Wikimedia\Rdbms\MaintainableDBConnRef;
 
 /**
- * DB accessable external objects.
+ * DB accessible external objects.
  *
  * In this system, each store "location" maps to a database "cluster".
  * The clusters must be defined in the normal LBFactory configuration.
@@ -103,6 +104,10 @@ class ExternalStoreDB extends ExternalStoreMedium {
                return "DB://$location/$id";
        }
 
+       public function isReadOnly( $location ) {
+               return ( $this->getLoadBalancer( $location )->getReadOnlyReason() !== false );
+       }
+
        /**
         * Get a LoadBalancer for the specified cluster
         *
@@ -110,7 +115,8 @@ class ExternalStoreDB extends ExternalStoreMedium {
         * @return LoadBalancer
         */
        private function getLoadBalancer( $cluster ) {
-               return wfGetLBFactory()->getExternalLB( $cluster );
+               $lbFactory = MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
+               return $lbFactory->getExternalLB( $cluster );
        }
 
        /**
@@ -122,7 +128,7 @@ class ExternalStoreDB extends ExternalStoreMedium {
        public function getSlave( $cluster ) {
                global $wgDefaultExternalStore;
 
-               $wiki = isset( $this->params['wiki'] ) ? $this->params['wiki'] : false;
+               $wiki = $this->params['wiki'] ?? false;
                $lb = $this->getLoadBalancer( $cluster );
 
                if ( !in_array( "DB://" . $cluster, (array)$wgDefaultExternalStore ) ) {
@@ -145,7 +151,7 @@ class ExternalStoreDB extends ExternalStoreMedium {
         * @return MaintainableDBConnRef
         */
        public function getMaster( $cluster ) {
-               $wiki = isset( $this->params['wiki'] ) ? $this->params['wiki'] : false;
+               $wiki = $this->params['wiki'] ?? false;
                $lb = $this->getLoadBalancer( $cluster );
 
                $db = $lb->getMaintenanceConnectionRef( DB_MASTER, [], $wiki );
@@ -188,6 +194,10 @@ class ExternalStoreDB extends ExternalStoreMedium {
                static $externalBlobCache = [];
 
                $cacheID = ( $itemID === false ) ? "$cluster/$id" : "$cluster/$id/";
+
+               $wiki = $this->params['wiki'] ?? false;
+               $cacheID = ( $wiki === false ) ? $cacheID : "$cacheID@$wiki";
+
                if ( isset( $externalBlobCache[$cacheID] ) ) {
                        wfDebugLog( 'ExternalStoreDB-cache',
                                "ExternalStoreDB::fetchBlob cache hit on $cacheID" );
@@ -295,7 +305,7 @@ class ExternalStoreDB extends ExternalStoreMedium {
                return [
                        $path[2], // cluster
                        $path[3], // id
-                       isset( $path[4] ) ? $path[4] : false // itemID
+                       $path[4] ?? false // itemID
                ];
        }
 }