Merge "Allow PHP version check to execute on older versions of PHP"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Thu, 11 Jul 2019 04:00:22 +0000 (04:00 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Thu, 11 Jul 2019 04:00:22 +0000 (04:00 +0000)
includes/CategoryFinder.php
includes/DefaultSettings.php
includes/Html.php
includes/libs/rdbms/database/Database.php
includes/objectcache/ObjectCache.php
maintenance/rebuildrecentchanges.php
maintenance/storage/orphanStats.php

index 7446b59..720abc3 100644 (file)
@@ -213,14 +213,14 @@ class CategoryFinder {
                        /* WHERE  */ [ 'cl_from' => $this->next ],
                        __METHOD__ . '-1'
                );
-               foreach ( $res as $o ) {
-                       $k = $o->cl_to;
+               foreach ( $res as $row ) {
+                       $k = $row->cl_to;
 
                        # Update parent tree
-                       if ( !isset( $this->parents[$o->cl_from] ) ) {
-                               $this->parents[$o->cl_from] = [];
+                       if ( !isset( $this->parents[$row->cl_from] ) ) {
+                               $this->parents[$row->cl_from] = [];
                        }
-                       $this->parents[$o->cl_from][$k] = $o;
+                       $this->parents[$row->cl_from][$k] = $row;
 
                        # Ignore those we already have
                        if ( in_array( $k, $this->deadend ) ) {
@@ -245,9 +245,9 @@ class CategoryFinder {
                                /* WHERE  */ [ 'page_namespace' => NS_CATEGORY, 'page_title' => $layer ],
                                __METHOD__ . '-2'
                        );
-                       foreach ( $res as $o ) {
-                               $id = $o->page_id;
-                               $name = $o->page_title;
+                       foreach ( $res as $row ) {
+                               $id = $row->page_id;
+                               $name = $row->page_title;
                                $this->name2id[$name] = $id;
                                $this->next[] = $id;
                                unset( $layer[$name] );
index b247c88..0886f38 100644 (file)
@@ -2492,11 +2492,35 @@ $wgWANObjectCaches = [
 $wgEnableWANCacheReaper = false;
 
 /**
- * Main object stash type. This should be a fast storage system for storing
- * lightweight data like hit counters and user activity. Sites with multiple
- * data-centers should have this use a store that replicates all writes. The
- * store should have enough consistency for CAS operations to be usable.
- * Reads outside of those needed for merge() may be eventually consistent.
+ * The object store type of the main stash.
+ *
+ * This store should be a very fast storage system optimized for holding lightweight data
+ * like incrementable hit counters and current user activity. The store should replicate the
+ * dataset among all data-centers. Any add(), merge(), lock(), and unlock() operations should
+ * maintain "best effort" linearizability; as long as connectivity is strong, latency is low,
+ * and there is no eviction pressure prompted by low free space, those operations should be
+ * linearizable. In terms of PACELC (https://en.wikipedia.org/wiki/PACELC_theorem), the store
+ * should act as a PA/EL distributed system for these operations. One optimization for these
+ * operations is to route them to a "primary" data-center (e.g. one that serves HTTP POST) for
+ * synchronous execution and then replicate to the others asynchronously. This means that at
+ * least calls to these operations during HTTP POST requests would quickly return.
+ *
+ * All other operations, such as get(), set(), delete(), changeTTL(), incr(), and decr(),
+ * should be synchronous in the local data-center, replicating asynchronously to the others.
+ * This behavior can be overriden by the use of the WRITE_SYNC and READ_LATEST flags.
+ *
+ * The store should *preferably* have eventual consistency to handle network partitions.
+ *
+ * Modules that rely on the stash should be prepared for:
+ *   - add(), merge(), lock(), and unlock() to be slower than other write operations,
+ *     at least in "secondary" data-centers (e.g. one that only serves HTTP GET/HEAD)
+ *   - Other write operations to have race conditions accross data-centers
+ *   - Read operations to have race conditions accross data-centers
+ *   - Consistency to be either eventual (with Last-Write-Wins) or just "best effort"
+ *
+ * In general, this means avoiding updates during idempotent HTTP requests (GET/HEAD) and
+ * avoiding assumptions of true linearizability (e.g. accepting anomalies). Modules that need
+ * these kind of guarantees should use other storage mediums.
  *
  * The options are:
  *   - db:      Store cache objects in the DB
index d0f9fc6..c4b57af 100644 (file)
@@ -154,8 +154,7 @@ class Html {
         * Returns an HTML link element in a string styled as a button
         * (when $wgUseMediaWikiUIEverywhere is enabled).
         *
-        * @param string $contents The raw HTML contents of the element: *not*
-        *   escaped!
+        * @param string $text The text of the element. Will be escaped (not raw HTML)
         * @param array $attrs Associative array of attributes, e.g., [
         *   'href' => 'https://www.mediawiki.org/' ]. See expandAttributes() for
         *   further documentation.
@@ -163,10 +162,10 @@ class Html {
         * @see https://tools.wmflabs.org/styleguide/desktop/index.html for guidance on available modifiers
         * @return string Raw HTML
         */
-       public static function linkButton( $contents, array $attrs, array $modifiers = [] ) {
+       public static function linkButton( $text, array $attrs, array $modifiers = [] ) {
                return self::element( 'a',
                        self::buttonAttributes( $attrs, $modifiers ),
-                       $contents
+                       $text
                );
        }
 
index 894a262..91dc069 100644 (file)
@@ -4290,8 +4290,8 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                                $this->server,
                                $this->user,
                                $this->password,
-                               $this->getDBname(),
-                               $this->dbSchema(),
+                               $this->currentDomain->getDatabase(),
+                               $this->currentDomain->getSchema(),
                                $this->tablePrefix()
                        );
                        $this->lastPing = microtime( true );
@@ -4868,8 +4868,8 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                                $this->server,
                                $this->user,
                                $this->password,
-                               $this->getDBname(),
-                               $this->dbSchema(),
+                               $this->currentDomain->getDatabase(),
+                               $this->currentDomain->getSchema(),
                                $this->tablePrefix()
                        );
                        $this->lastPing = microtime( true );
index e9853b1..82b760a 100644 (file)
@@ -365,18 +365,6 @@ class ObjectCache {
        /**
         * Get the cache object for the main stash.
         *
-        * Stash objects are BagOStuff instances suitable for storing light
-        * weight data that is not canonically stored elsewhere (such as RDBMS).
-        * Stashes should be configured to propagate changes to all data-centers.
-        *
-        * Callers should be prepared for:
-        *   - a) Writes to be slower in non-"primary" (e.g. HTTP GET/HEAD only) DCs
-        *   - b) Reads to be eventually consistent, e.g. for get()/getMulti()
-        * In general, this means avoiding updates on idempotent HTTP requests and
-        * avoiding an assumption of perfect serializability (or accepting anomalies).
-        * Reads may be eventually consistent or data might rollback as nodes flap.
-        * Callers can use BagOStuff:READ_LATEST to see the latest available data.
-        *
         * @return BagOStuff
         * @since 1.26
         * @deprecated Since 1.28 Use MediaWikiServices::getInstance()->getMainObjectStash()
index 4e92653..35af15c 100644 (file)
@@ -80,6 +80,8 @@ class RebuildRecentchanges extends Maintenance {
 
        /**
         * Rebuild pass 1: Insert `recentchanges` entries for page revisions.
+        *
+        * @param ILBFactory $lbFactory
         */
        private function rebuildRecentChangesTablePass1( ILBFactory $lbFactory ) {
                $dbw = $this->getDB( DB_MASTER );
@@ -177,6 +179,8 @@ class RebuildRecentchanges extends Maintenance {
        /**
         * Rebuild pass 2: Enhance entries for page revisions with references to the previous revision
         * (rc_last_oldid, rc_new etc.) and size differences (rc_old_len, rc_new_len).
+        *
+        * @param ILBFactory $lbFactory
         */
        private function rebuildRecentChangesTablePass2( ILBFactory $lbFactory ) {
                $dbw = $this->getDB( DB_MASTER );
@@ -199,25 +203,25 @@ class RebuildRecentchanges extends Maintenance {
                $lastOldId = 0;
                $lastSize = null;
                $updated = 0;
-               foreach ( $res as $obj ) {
+               foreach ( $res as $row ) {
                        $new = 0;
 
-                       if ( $obj->rc_cur_id != $lastCurId ) {
+                       if ( $row->rc_cur_id != $lastCurId ) {
                                # Switch! Look up the previous last edit, if any
-                               $lastCurId = intval( $obj->rc_cur_id );
-                               $emit = $obj->rc_timestamp;
+                               $lastCurId = intval( $row->rc_cur_id );
+                               $emit = $row->rc_timestamp;
 
-                               $row = $dbw->selectRow(
+                               $revRow = $dbw->selectRow(
                                        'revision',
                                        [ 'rev_id', 'rev_len' ],
                                        [ 'rev_page' => $lastCurId, "rev_timestamp < " . $dbw->addQuotes( $emit ) ],
                                        __METHOD__,
                                        [ 'ORDER BY' => 'rev_timestamp DESC' ]
                                );
-                               if ( $row ) {
-                                       $lastOldId = intval( $row->rev_id );
+                               if ( $revRow ) {
+                                       $lastOldId = intval( $revRow->rev_id );
                                        # Grab the last text size if available
-                                       $lastSize = !is_null( $row->rev_len ) ? intval( $row->rev_len ) : null;
+                                       $lastSize = !is_null( $revRow->rev_len ) ? intval( $revRow->rev_len ) : null;
                                } else {
                                        # No previous edit
                                        $lastOldId = 0;
@@ -233,7 +237,7 @@ class RebuildRecentchanges extends Maintenance {
                                $size = (int)$dbw->selectField(
                                        'revision',
                                        'rev_len',
-                                       [ 'rev_id' => $obj->rc_this_oldid ],
+                                       [ 'rev_id' => $row->rc_this_oldid ],
                                        __METHOD__
                                );
 
@@ -249,13 +253,13 @@ class RebuildRecentchanges extends Maintenance {
                                        ],
                                        [
                                                'rc_cur_id' => $lastCurId,
-                                               'rc_this_oldid' => $obj->rc_this_oldid,
-                                               'rc_timestamp' => $obj->rc_timestamp // index usage
+                                               'rc_this_oldid' => $row->rc_this_oldid,
+                                               'rc_timestamp' => $row->rc_timestamp // index usage
                                        ],
                                        __METHOD__
                                );
 
-                               $lastOldId = intval( $obj->rc_this_oldid );
+                               $lastOldId = intval( $row->rc_this_oldid );
                                $lastSize = $size;
 
                                if ( ( ++$updated % $this->getBatchSize() ) == 0 ) {
@@ -267,6 +271,8 @@ class RebuildRecentchanges extends Maintenance {
 
        /**
         * Rebuild pass 3: Insert `recentchanges` entries for action logs.
+        *
+        * @param ILBFactory $lbFactory
         */
        private function rebuildRecentChangesTablePass3( ILBFactory $lbFactory ) {
                global $wgLogRestrictions, $wgFilterLogTypes;
@@ -347,6 +353,8 @@ class RebuildRecentchanges extends Maintenance {
 
        /**
         * Rebuild pass 4: Mark bot and autopatrolled entries.
+        *
+        * @param ILBFactory $lbFactory
         */
        private function rebuildRecentChangesTablePass4( ILBFactory $lbFactory ) {
                global $wgUseRCPatrol, $wgMiserMode;
@@ -376,8 +384,8 @@ class RebuildRecentchanges extends Maintenance {
                        );
 
                        $botusers = [];
-                       foreach ( $res as $obj ) {
-                               $botusers[] = User::newFromRow( $obj );
+                       foreach ( $res as $row ) {
+                               $botusers[] = User::newFromRow( $row );
                        }
 
                        # Fill in the rc_bot field
@@ -428,8 +436,8 @@ class RebuildRecentchanges extends Maintenance {
                                [ 'user_groups' => [ 'JOIN', 'user_id = ug_user' ] ] + $userQuery['joins']
                        );
 
-                       foreach ( $res as $obj ) {
-                               $patrolusers[] = User::newFromRow( $obj );
+                       foreach ( $res as $row ) {
+                               $patrolusers[] = User::newFromRow( $row );
                        }
 
                        # Fill in the rc_patrolled field
@@ -453,8 +461,10 @@ class RebuildRecentchanges extends Maintenance {
        }
 
        /**
-        * Rebuild pass 5: Delete duplicate entries where we generate both a page revision and a log entry
-        * for a single action (upload only, at the moment, but potentially also move, protect, ...).
+        * Rebuild pass 5: Delete duplicate entries where we generate both a page revision and a log
+        * entry for a single action (upload only, at the moment, but potentially move, protect, ...).
+        *
+        * @param ILBFactory $lbFactory
         */
        private function rebuildRecentChangesTablePass5( ILBFactory $lbFactory ) {
                $dbw = wfGetDB( DB_MASTER );
@@ -475,9 +485,9 @@ class RebuildRecentchanges extends Maintenance {
                );
 
                $updates = 0;
-               foreach ( $res as $obj ) {
-                       $rev_id = $obj->ls_value;
-                       $log_id = $obj->ls_log_id;
+               foreach ( $res as $row ) {
+                       $rev_id = $row->ls_value;
+                       $log_id = $row->ls_log_id;
 
                        // Mark the logging row as having an associated rev id
                        $dbw->update(
index 219b47c..3866be7 100644 (file)
@@ -57,12 +57,12 @@ class OrphanStats extends Maintenance {
                $hashes = [];
                $maxSize = 0;
 
-               foreach ( $res as $boRow ) {
-                       $extDB = $this->getDB( $boRow->bo_cluster );
+               foreach ( $res as $row ) {
+                       $extDB = $this->getDB( $row->bo_cluster );
                        $blobRow = $extDB->selectRow(
                                'blobs',
                                '*',
-                               [ 'blob_id' => $boRow->bo_blob_id ],
+                               [ 'blob_id' => $row->bo_blob_id ],
                                __METHOD__
                        );