Update docs to caution against use of create_function(). Per bug 15476.
[lhc/web/wiklou.git] / includes / ExternalStoreDB.php
index f9046f7..84d44a4 100644 (file)
@@ -1,12 +1,4 @@
 <?php
-/**
- *
- *
- * DB accessable external objects
- *
- */
-
-
 
 /**
  * External database storage will use one (or more) separate connection pools
@@ -28,28 +20,30 @@ $wgExternalLoadBalancers = array();
 global $wgExternalBlobCache;
 $wgExternalBlobCache = array();
 
+/**
+ * DB accessable external objects
+ * @ingroup ExternalStorage
+ */
 class ExternalStoreDB {
 
        /** @todo Document.*/
        function &getLoadBalancer( $cluster ) {
-               global $wgExternalServers, $wgExternalLoadBalancers;
-               if ( !array_key_exists( $cluster, $wgExternalLoadBalancers ) ) {
-                       $wgExternalLoadBalancers[$cluster] = LoadBalancer::newFromParams( $wgExternalServers[$cluster] );
-               }
-               $wgExternalLoadBalancers[$cluster]->allowLagged(true);
-               return $wgExternalLoadBalancers[$cluster];
+               return wfGetLBFactory()->getExternalLB( $cluster );
        }
 
        /** @todo Document.*/
        function &getSlave( $cluster ) {
                $lb =& $this->getLoadBalancer( $cluster );
-               return $lb->getConnection( DB_SLAVE );
+               // Make only two connection attempts, since we still have the master to try
+               return $lb->getConnection( DB_SLAVE, array(), false, 2 );
        }
 
        /** @todo Document.*/
-       function &getMaster( $cluster ) {
+       function &getMaster( $cluster, $retry = true ) {
                $lb =& $this->getLoadBalancer( $cluster );
-               return $lb->getConnection( DB_MASTER );
+               // Make only two connection attempts if there are other clusters to try
+               $attempts = $retry ? false : 2;
+               return $lb->getConnection( DB_MASTER, array(), false, $attempts, LoadBalancer::GRACEFUL );
        }
 
        /** @todo Document.*/
@@ -65,7 +59,7 @@ class ExternalStoreDB {
         * Fetch data from given URL
         * @param string $url An url of the form DB://cluster/id or DB://cluster/id/itemid for concatened storage.
         */
-       function fetchFromURL($url) {
+       function fetchFromURL( $url ) {
                $path = explode( '/', $url );
                $cluster  = $path[2];
                $id       = $path[3];
@@ -128,15 +122,17 @@ class ExternalStoreDB {
         *
         * @param $cluster String: the cluster name
         * @param $data String: the data item
+        * @param $retry bool: allows an extra DB connection retry after 1 second
         * @return string URL
         */
-       function store( $cluster, $data ) {
-               $fname = 'ExternalStoreDB::store';
-
-               $dbw =& $this->getMaster( $cluster );
-
+       function store( $cluster, $data, $retry = true ) {
+               if( !$dbw = $this->getMaster( $cluster, $retry ) ) {
+                       return false; // failed, maybe another cluster is up...
+               }
                $id = $dbw->nextSequenceValue( 'blob_blob_id_seq' );
-               $dbw->insert( $this->getTable( $dbw ), array( 'blob_id' => $id, 'blob_text' => $data ), $fname );
+               $dbw->insert( $this->getTable( $dbw ), 
+                       array( 'blob_id' => $id, 'blob_text' => $data ), 
+                       __METHOD__ );
                $id = $dbw->insertId();
                if ( $dbw->getFlag( DBO_TRX ) ) {
                        $dbw->immediateCommit();
@@ -144,4 +140,3 @@ class ExternalStoreDB {
                return "DB://$cluster/$id";
        }
 }
-