Ladsgroup has uploaded a new change for review. ( https://gerrit.wikimedia.org/r/404973 )
Change subject: Issue a warning when entity usage per page passes a limit ...................................................................... Issue a warning when entity usage per page passes a limit Bug: T184319 Change-Id: Ic413621d94e19126f63e35f4660d5ed63e927076 --- M client/config/WikibaseClient.default.php M client/includes/Store/Sql/DirectSqlStore.php M client/includes/Usage/Sql/SqlUsageTracker.php M client/includes/WikibaseClient.php M client/tests/phpunit/includes/Store/Sql/DirectSqlStoreTest.php M client/tests/phpunit/includes/Usage/Sql/SqlUsageTrackerTest.php M docs/options.wiki 7 files changed, 46 insertions(+), 11 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Wikibase refs/changes/73/404973/1 diff --git a/client/config/WikibaseClient.default.php b/client/config/WikibaseClient.default.php index f05fcec..a7ae48f 100644 --- a/client/config/WikibaseClient.default.php +++ b/client/config/WikibaseClient.default.php @@ -246,5 +246,8 @@ // Disabled entity access $defaults['disabledAccessEntityTypes'] = []; + // The limit to issue a warning when number of entities used in a page hit that + $defaults['entityUsagePerPageLimit'] = 100; + return $defaults; } ); diff --git a/client/includes/Store/Sql/DirectSqlStore.php b/client/includes/Store/Sql/DirectSqlStore.php index 6c0fc7b..7757800 100644 --- a/client/includes/Store/Sql/DirectSqlStore.php +++ b/client/includes/Store/Sql/DirectSqlStore.php @@ -8,6 +8,7 @@ use Wikibase\Client\Store\ClientStore; use Wikibase\Lib\Store\CachingPropertyInfoLookup; use Wikibase\Lib\Store\PropertyInfoLookup; +use Wikibase\SettingsArray; use Wikibase\StringNormalizer; use Wikibase\TermIndex; use Wikibase\Lib\Store\TermPropertyLabelResolver; @@ -19,7 +20,6 @@ use Wikibase\Client\Usage\SubscriptionManager; use Wikibase\Client\Usage\UsageLookup; use Wikibase\Client\Usage\UsageTracker; -use Wikibase\Client\WikibaseClient; use Wikibase\DataAccess\WikibaseServices; use Wikibase\DataModel\Entity\EntityIdParser; use Wikibase\DataModel\Services\Lookup\EntityLookup; @@ -100,7 +100,7 @@ private $cacheDuration; /** - * @var EntityRevisionLookup|null + * @var EntityLookup|null */ private $entityRevisionLookup = null; @@ -175,6 +175,11 @@ private $readFullEntityIdColumn; /** + * @var int + */ + private $entityUsagePerPageLimit; + + /** * @param EntityChangeFactory $entityChangeFactory * @param EntityIdParser $entityIdParser * @param EntityIdComposer $entityIdComposer @@ -190,6 +195,7 @@ EntityIdComposer $entityIdComposer, EntityNamespaceLookup $entityNamespaceLookup, WikibaseServices $wikibaseServices, + SettingsArray $settings, $repoWiki = false, $languageCode ) { @@ -201,8 +207,7 @@ $this->repoWiki = $repoWiki; $this->languageCode = $languageCode; - // @TODO: Inject - $settings = WikibaseClient::getDefaultInstance()->getSettings(); + // @TODO: split the class so it needs less injection $this->cacheKeyPrefix = $settings->getSetting( 'sharedCacheKeyPrefix' ); $this->cacheType = $settings->getSetting( 'sharedCacheType' ); $this->cacheDuration = $settings->getSetting( 'sharedCacheDuration' ); @@ -210,6 +215,7 @@ $this->writeFullEntityIdColumn = $settings->getSetting( 'writeFullEntityIdColumn' ); $this->disabledUsageAspects = $settings->getSetting( 'disabledUsageAspects' ); $this->readFullEntityIdColumn = $settings->getSetting( 'readFullEntityIdColumn' ); + $this->entityUsagePerPageLimit = $settings->getSetting( 'entityUsagePerPageLimit' ); } /** @@ -287,7 +293,12 @@ public function getUsageTracker() { if ( $this->usageTracker === null ) { $connectionManager = $this->getLocalConnectionManager(); - $this->usageTracker = new SqlUsageTracker( $this->entityIdParser, $connectionManager, $this->disabledUsageAspects ); + $this->usageTracker = new SqlUsageTracker( + $this->entityIdParser, + $connectionManager, + $this->disabledUsageAspects, + $this->entityUsagePerPageLimit + ); } return $this->usageTracker; diff --git a/client/includes/Usage/Sql/SqlUsageTracker.php b/client/includes/Usage/Sql/SqlUsageTracker.php index ffd1525..b60e0c8 100644 --- a/client/includes/Usage/Sql/SqlUsageTracker.php +++ b/client/includes/Usage/Sql/SqlUsageTracker.php @@ -42,6 +42,13 @@ private $disabledUsageAspects; /** + * The limit to issue a warning when entity usage per page hit that limit + * + * @var int + */ + private $entityUsagePerPageLimit; + + /** * @param EntityIdParser $idParser * @param SessionConsistentConnectionManager $connectionManager * @param string[] $disabledUsageAspects @@ -49,11 +56,13 @@ public function __construct( EntityIdParser $idParser, SessionConsistentConnectionManager $connectionManager, - array $disabledUsageAspects + array $disabledUsageAspects, + $entityUsagePerPageLimit ) { $this->idParser = $idParser; $this->connectionManager = $connectionManager; $this->disabledUsageAspects = $disabledUsageAspects; + $this->entityUsagePerPageLimit = $entityUsagePerPageLimit; } /** @@ -134,6 +143,10 @@ throw new InvalidArgumentException( '$pageId must be an int.' ); } + if ( count( $usages ) > $this->entityUsagePerPageLimit ) { + wfLogWarning( 'Number of usages is too high: ' . count( $usages ) ); + } + $usages = $this->handleBlacklistedUsages( $usages ); if ( empty( $usages ) ) { return; diff --git a/client/includes/WikibaseClient.php b/client/includes/WikibaseClient.php index a733b76..e28047f 100644 --- a/client/includes/WikibaseClient.php +++ b/client/includes/WikibaseClient.php @@ -538,6 +538,7 @@ $this->getEntityIdComposer(), $this->getEntityNamespaceLookup(), $this->getWikibaseServices(), + $this->getSettings(), $this->getRepositoryDefinitions()->getDatabaseNames()[''], $this->getContentLanguage()->getCode() ); diff --git a/client/tests/phpunit/includes/Store/Sql/DirectSqlStoreTest.php b/client/tests/phpunit/includes/Store/Sql/DirectSqlStoreTest.php index bf1bad7..01aaec0 100644 --- a/client/tests/phpunit/includes/Store/Sql/DirectSqlStoreTest.php +++ b/client/tests/phpunit/includes/Store/Sql/DirectSqlStoreTest.php @@ -43,7 +43,7 @@ ->disableOriginalConstructor() ->getMock(); - $client = WikibaseClient::getDefaultInstance(); + $wikibaseClient = WikibaseClient::getDefaultInstance(); $wikibaseServices = $this->getMock( WikibaseServices::class ); @@ -60,6 +60,7 @@ new EntityIdComposer( [] ), new EntityNamespaceLookup( [] ), $wikibaseServices, + $wikibaseClient->getSettings(), wfWikiID(), 'en' ); diff --git a/client/tests/phpunit/includes/Usage/Sql/SqlUsageTrackerTest.php b/client/tests/phpunit/includes/Usage/Sql/SqlUsageTrackerTest.php index 15d0c4f..969f92e 100644 --- a/client/tests/phpunit/includes/Usage/Sql/SqlUsageTrackerTest.php +++ b/client/tests/phpunit/includes/Usage/Sql/SqlUsageTrackerTest.php @@ -49,7 +49,8 @@ $this->sqlUsageTracker = new SqlUsageTracker( new ItemIdParser(), new SessionConsistentConnectionManager( wfGetLB() ), - [] + [], + 100 ); $this->trackerTester = new UsageTrackerContractTester( $this->sqlUsageTracker, [ $this, 'getUsages' ] ); @@ -90,7 +91,9 @@ $sqlUsageTracker = new SqlUsageTracker( new ItemIdParser(), new SessionConsistentConnectionManager( wfGetLB() ), - [ EntityUsage::STATEMENT_USAGE, EntityUsage::DESCRIPTION_USAGE => EntityUsage::OTHER_USAGE ] + [ EntityUsage::STATEMENT_USAGE, EntityUsage::DESCRIPTION_USAGE => + EntityUsage::OTHER_USAGE ], + 100 ); $sqlUsageTracker->addUsedEntities( 23, $usages ); @@ -118,7 +121,8 @@ $sqlUsageTracker = new SqlUsageTracker( new ItemIdParser(), new SessionConsistentConnectionManager( wfGetLB() ), - [] + [], + 100 ); // Make sure the blacklisted entries are actually removed. $sqlUsageTracker->addUsedEntities( 23, $usages ); @@ -126,7 +130,8 @@ $sqlUsageTrackerWithBlacklist = new SqlUsageTracker( new ItemIdParser(), new SessionConsistentConnectionManager( wfGetLB() ), - [ EntityUsage::STATEMENT_USAGE ] + [ EntityUsage::STATEMENT_USAGE ], + 100 ); $sqlUsageTrackerWithBlacklist->replaceUsedEntities( 23, $usages ); diff --git a/docs/options.wiki b/docs/options.wiki index 929f20c..08a8453 100644 --- a/docs/options.wiki +++ b/docs/options.wiki @@ -113,6 +113,7 @@ ;otherProjectsLinks: Site global ID list of sites which should be linked in the other projects sidebar section. Empty value will suppress this section. ;propertyOrderUrl: URL to use for retrieving the property order used for sorting properties by property ID. Will be ignored if set to null. ;disabledAccessEntityTypes: List of entity types that access to them in the client should be disabled. +;entityUsagePerPageLimit: An integer number determining the number of entity usages possible in a page before issuing a warning. The default is 100. === Expert Settings === -- To view, visit https://gerrit.wikimedia.org/r/404973 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Ic413621d94e19126f63e35f4660d5ed63e927076 Gerrit-PatchSet: 1 Gerrit-Project: mediawiki/extensions/Wikibase Gerrit-Branch: master Gerrit-Owner: Ladsgroup <ladsgr...@gmail.com> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits