Page MenuHomePhabricator

Tests for LinksUpdate should respect PostgreSQL database constraints
Closed, DeclinedPublic

Description

After enabling foreign key constraints on the database (see I326bb4a189bf881299b9fb678033a927b916efac) LinksTestUpdate gives 7 errors.

This is because wikipage content is created in memory only, why LinksUpdate attempts to operate on the database as well.

PostgreSQL in the current setup uses DEFERRED constraints, that means that all references are checked at commit time, allowing various operations in the meantime not immediately conforming to the constraints.

Sometimes fixings this kind of problem is trivial (see example at I653a8bccdaa748a9bea453cd1dbf609a30e1ff6f), but LinksUpdateTest makes it more
difficult because it attempts to use begin() and commit() in the middle
of the test.

7 errors:

  1. LinksUpdateTest::testUpdate_pagelinks

DBQueryError: A database error has occurred. Did you forget to run maintenance/update.php after upgrad
ing? See: https://www.mediawiki.org/wiki/Manual:Upgrading#Run_the_update_script
Query: COMMIT
Function: DatabaseBase::commit
Error: 23503 ERROR: insert or update on table "unittest_pagelinks" violates foreign key constraint "u
t_pagelinks_pl_from_fkey"
DETAIL: Key (pl_from)=(111) is not present in table "unittest_page".

/usr/home/saper/test/mytest/includes/db/Database.php:1111
/usr/home/saper/test/mytest/includes/db/DatabasePostgres.php:511
/usr/home/saper/test/mytest/includes/db/Database.php:1077
/usr/home/saper/test/mytest/includes/db/Database.php:3477
/usr/home/saper/test/mytest/includes/db/Database.php:3462
/usr/home/saper/test/mytest/includes/db/DatabasePostgres.php:241
/usr/home/saper/test/mytest/includes/db/DatabasePostgres.php:884
/usr/home/saper/test/mytest/includes/deferred/LinksUpdate.php:334
/usr/home/saper/test/mytest/includes/deferred/LinksUpdate.php:162
/usr/home/saper/test/mytest/includes/deferred/LinksUpdate.php:151
/usr/home/saper/test/mytest/tests/phpunit/includes/LinksUpdateTest.php:193
/usr/home/saper/test/mytest/tests/phpunit/includes/LinksUpdateTest.php:68
/usr/home/saper/test/mytest/tests/phpunit/MediaWikiTestCase.php:123
/usr/home/saper/test/mytest/tests/phpunit/MediaWikiPHPUnitCommand.php:80
/usr/home/saper/test/mytest/tests/phpunit/MediaWikiPHPUnitCommand.php:64
/usr/home/saper/test/mytest/tests/phpunit/phpunit.php:115

  1. LinksUpdateTest::testUpdate_externallinks

DBQueryError: A database error has occurred. Did you forget to run maintenance/update.php after upgrading? See: https://www.mediawiki.org/wiki/Manual:Upgrading#Run_the_update_script
Query: COMMIT
Function: DatabaseBase::commit
Error: 23503 ERROR: insert or update on table "unittest_externallinks" violates foreign key constraint "ut_externallinks_el_from_fkey"
DETAIL: Key (el_from)=(111) is not present in table "unittest_page".

(...)
/usr/home/saper/test/mytest/includes/deferred/LinksUpdate.php:334
/usr/home/saper/test/mytest/includes/deferred/LinksUpdate.php:178
/usr/home/saper/test/mytest/includes/deferred/LinksUpdate.php:151
/usr/home/saper/test/mytest/tests/phpunit/includes/LinksUpdateTest.php:193
/usr/home/saper/test/mytest/tests/phpunit/includes/LinksUpdateTest.php:102
(...)

  1. LinksUpdateTest::testUpdate_categorylinks

DBQueryError: A database error has occurred. Did you forget to run maintenance/update.php after upgrading? See: https://www.mediawiki.org/wiki/Manual:Upgrading#Run_the_update_script
Query: COMMIT
Function: DatabaseBase::commit
Error: 23503 ERROR: insert or update on table "unittest_categorylinks" violates foreign key constraint "ut_categorylinks_cl_from_fkey"
DETAIL: Key (cl_from)=(111) is not present in table "unittest_page".

(...)
/usr/home/saper/test/mytest/includes/deferred/LinksUpdate.php:334
/usr/home/saper/test/mytest/includes/deferred/LinksUpdate.php:201
/usr/home/saper/test/mytest/includes/deferred/LinksUpdate.php:151
/usr/home/saper/test/mytest/tests/phpunit/includes/LinksUpdateTest.php:193
/usr/home/saper/test/mytest/tests/phpunit/includes/LinksUpdateTest.php:117
(...)

  1. LinksUpdateTest::testUpdate_templatelinks

DBQueryError: A database error has occurred. Did you forget to run maintenance/update.php after upgrading? See: https://www.mediawiki.org/wiki/Manual:Upgrading#Run_the_update_script
Query: COMMIT
Function: DatabaseBase::commit
Error: 23503 ERROR: insert or update on table "unittest_templatelinks" violates foreign key constraint "ut_templatelinks_tl_from_fkey"
DETAIL: Key (tl_from)=(111) is not present in table "unittest_page".

/usr/home/saper/test/mytest/includes/db/Database.php:1111
/usr/home/saper/test/mytest/includes/db/DatabasePostgres.php:511
/usr/home/saper/test/mytest/includes/db/Database.php:1077
/usr/home/saper/test/mytest/includes/db/Database.php:3477
/usr/home/saper/test/mytest/includes/db/Database.php:3462
/usr/home/saper/test/mytest/includes/db/DatabasePostgres.php:241
/usr/home/saper/test/mytest/includes/db/DatabasePostgres.php:884
/usr/home/saper/test/mytest/includes/deferred/LinksUpdate.php:334
/usr/home/saper/test/mytest/includes/deferred/LinksUpdate.php:193
/usr/home/saper/test/mytest/includes/deferred/LinksUpdate.php:151
/usr/home/saper/test/mytest/tests/phpunit/includes/LinksUpdateTest.php:193
/usr/home/saper/test/mytest/tests/phpunit/includes/LinksUpdateTest.php:144

  1. LinksUpdateTest::testUpdate_imagelinks

DBQueryError: A database error has occurred. Did you forget to run maintenance/update.php after upgrading? See: https://www.mediawiki.org/wiki/Manual:Upgrading#Run_the_update_script
Query: COMMIT
Function: DatabaseBase::commit
Error: 23503 ERROR: insert or update on table "unittest_imagelinks" violates foreign key constraint "ut_imagelinks_il_from_fkey"
DETAIL: Key (il_from)=(111) is not present in table "unittest_page".

/usr/home/saper/test/mytest/includes/db/Database.php:1111
/usr/home/saper/test/mytest/includes/db/DatabasePostgres.php:511
/usr/home/saper/test/mytest/includes/db/Database.php:1077
/usr/home/saper/test/mytest/includes/db/Database.php:3477
/usr/home/saper/test/mytest/includes/db/Database.php:3462
/usr/home/saper/test/mytest/includes/db/DatabasePostgres.php:241
/usr/home/saper/test/mytest/includes/db/DatabasePostgres.php:884
/usr/home/saper/test/mytest/includes/deferred/LinksUpdate.php:334
/usr/home/saper/test/mytest/includes/deferred/LinksUpdate.php:169
/usr/home/saper/test/mytest/includes/deferred/LinksUpdate.php:151
/usr/home/saper/test/mytest/tests/phpunit/includes/LinksUpdateTest.php:193
/usr/home/saper/test/mytest/tests/phpunit/includes/LinksUpdateTest.php:157
/usr/home/saper/test/mytest/tests/phpunit/MediaWikiTestCase.php:123
/usr/home/saper/test/mytest/tests/phpunit/MediaWikiPHPUnitCommand.php:80
/usr/home/saper/test/mytest/tests/phpunit/MediaWikiPHPUnitCommand.php:64
/usr/home/saper/test/mytest/tests/phpunit/phpunit.php:115

  1. LinksUpdateTest::testUpdate_langlinks

DBQueryError: A database error has occurred. Did you forget to run maintenance/update.php after upgrading? See: https://www.mediawiki.org/wiki/Manual:Upgrading#Run_the_update_script
Query: COMMIT
Function: DatabaseBase::commit
Error: 23503 ERROR: insert or update on table "unittest_langlinks" violates
foreign key constraint "ut_langlinks_ll_from_fkey"
DETAIL: Key (ll_from)=(111) is not present in table "unittest_page".

/usr/home/saper/test/mytest/includes/db/Database.php:1111
/usr/home/saper/test/mytest/includes/db/DatabasePostgres.php:511
/usr/home/saper/test/mytest/includes/db/Database.php:1077
/usr/home/saper/test/mytest/includes/db/Database.php:3477
/usr/home/saper/test/mytest/includes/db/Database.php:3462
/usr/home/saper/test/mytest/includes/db/DatabasePostgres.php:241
/usr/home/saper/test/mytest/includes/db/DatabasePostgres.php:884
/usr/home/saper/test/mytest/includes/deferred/LinksUpdate.php:334
/usr/home/saper/test/mytest/includes/deferred/LinksUpdate.php:183
/usr/home/saper/test/mytest/includes/deferred/LinksUpdate.php:151
/usr/home/saper/test/mytest/tests/phpunit/includes/LinksUpdateTest.php:193
/usr/home/saper/test/mytest/tests/phpunit/includes/LinksUpdateTest.php:170
/usr/home/saper/test/mytest/tests/phpunit/MediaWikiTestCase.php:123
/usr/home/saper/test/mytest/tests/phpunit/MediaWikiPHPUnitCommand.php:80
/usr/home/saper/test/mytest/tests/phpunit/MediaWikiPHPUnitCommand.php:64
/usr/home/saper/test/mytest/tests/phpunit/phpunit.php:115

  1. LinksUpdateTest::testUpdate_page_props

DBQueryError: A database error has occurred. Did you forget to run maintenance/update.php after upgrading? See: https://www.mediawiki.org/wiki/Manual:Upgrading#Run_the_update_script
Query: COMMIT
Function: DatabaseBase::commit
Error: 23503 ERROR: insert or update on table "unittest_page_props" violates foreign key constraint "ut_page_props_pp_page_fkey"
DETAIL: Key (pp_page)=(111) is not present in table "unittest_page".

/usr/home/saper/test/mytest/includes/db/Database.php:1111
/usr/home/saper/test/mytest/includes/db/DatabasePostgres.php:511
/usr/home/saper/test/mytest/includes/db/Database.php:1077
/usr/home/saper/test/mytest/includes/db/Database.php:3477
/usr/home/saper/test/mytest/includes/db/Database.php:3462
/usr/home/saper/test/mytest/includes/db/DatabasePostgres.php:241
/usr/home/saper/test/mytest/includes/db/DatabasePostgres.php:884
/usr/home/saper/test/mytest/includes/deferred/LinksUpdate.php:334
/usr/home/saper/test/mytest/includes/deferred/LinksUpdate.php:215
/usr/home/saper/test/mytest/includes/deferred/LinksUpdate.php:151
/usr/home/saper/test/mytest/tests/phpunit/includes/LinksUpdateTest.php:193
/usr/home/saper/test/mytest/tests/phpunit/includes/LinksUpdateTest.php:183
/usr/home/saper/test/mytest/tests/phpunit/MediaWikiTestCase.php:123
/usr/home/saper/test/mytest/tests/phpunit/MediaWikiPHPUnitCommand.php:80
/usr/home/saper/test/mytest/tests/phpunit/MediaWikiPHPUnitCommand.php:64
/usr/home/saper/test/mytest/tests/phpunit/phpunit.php:115

Question #1: are LinksUpdates needed at all on the DB engine using triggers (ON DELETE CASCADE) to remove dependent rows? If yes, what can we do to make it create consistent contents of the database during this test?

Simplistic changes like

diff --git a/tests/phpunit/includes/LinksUpdateTest.php b/tests/phpunit/includes/LinksUpdateTest.php
index b37ff2e..60ad76e 100644

  • a/tests/phpunit/includes/LinksUpdateTest.php

+++ b/tests/phpunit/includes/LinksUpdateTest.php
@@ -49,6 +49,10 @@ class LinksUpdateTest extends MediaWikiTestCase {

		$po = new ParserOutput();
		$po->setTitleText( $t->getPrefixedText() );

+ $pg = WikiPage::factory( $t );
+ $dbw = wfGetDB ( DB_MASTER );
+ $pg->insertOn( $dbw );
+

		return array( $t, $po );
	}

don't fix the problem and make even more tests to fail, like on MySQL:

  1. LinksUpdateTest::testUpdate_pagelinks

row #1 missing
Failed asserting that a boolean is not empty.

/usr/home/saper/test/mytest/tests/phpunit/MediaWikiTestCase.php:678
/usr/home/saper/test/mytest/tests/phpunit/includes/LinksUpdateTest.php:200
/usr/home/saper/test/mytest/tests/phpunit/includes/LinksUpdateTest.php:72
/usr/home/saper/test/mytest/tests/phpunit/MediaWikiTestCase.php:123
/usr/home/saper/test/mytest/tests/phpunit/MediaWikiPHPUnitCommand.php:80
/usr/home/saper/test/mytest/tests/phpunit/MediaWikiPHPUnitCommand.php:64
/usr/home/saper/test/mytest/tests/phpunit/phpunit.php:115


Version: 1.23.0
Severity: normal

Details

Reference
bz58189

Event Timeline

bzimport raised the priority of this task from to Medium.Nov 22 2014, 2:32 AM
bzimport set Reference to bz58189.
bzimport added a subscriber: Unknown Object (MLST).
Krinkle renamed this task from LinksUpdateTest should respect database constraints to Tests for LinksUpdate should respect PostgreSQL database constraints.Jun 9 2019, 4:48 PM
Krinkle removed a subscriber: wikibugs-l-list.
Krinkle removed a subscriber: Krinkle.
Umherirrender added a subscriber: Umherirrender.

Constraints are dropped - RFC T164898