Import: Try to stop revisions getting created with rev_page = 0
authorThis, that and the other <at.light@live.com.au>
Sun, 3 Jan 2016 13:30:24 +0000 (00:30 +1100)
committerReedy <reedy@wikimedia.org>
Sun, 3 Jan 2016 21:56:02 +0000 (21:56 +0000)
It seems that when two simultaneous imports of the same page are started,
we get into the situation where $pageId is 0 (or at least something that
is transformed to 0 when inserted into the DB).

I can't reproduce this locally, so I can't tell you *why* this is
happening. But what is important is to stop it from happening.

Bug: T18674
Change-Id: I79406a1ef8e5db9a31f029438f8132ef590216fe

includes/import/WikiRevision.php

index 6c238cf..90b048a 100644 (file)
@@ -463,7 +463,7 @@ class WikiRevision {
                $page = WikiPage::factory( $this->title );
                $page->loadPageData( 'fromdbmaster' );
                if ( !$page->exists() ) {
-                       # must create the page...
+                       // must create the page...
                        $pageId = $page->insertOn( $dbw );
                        $created = true;
                        $oldcountable = null;
@@ -486,7 +486,17 @@ class WikiRevision {
                        }
                }
 
+               if ( !$pageId ) {
+                       // This seems to happen if two clients simultaneously try to import the
+                       // same page
+                       wfDebug( __METHOD__ . ': got invalid $pageId when importing revision of [[' .
+                               $this->title->getPrefixedText() . ']], timestamp ' . $this->timestamp . "\n" );
+                       return false;
+               }
+
                // Select previous version to make size diffs correct
+               // @todo This assumes that multiple revisions of the same page are imported
+               // in order from oldest to newest.
                $prevId = $dbw->selectField( 'revision', 'rev_id',
                        array(
                                'rev_page' => $pageId,