jenkins-bot has submitted this change and it was merged.
Change subject: Only try to add a row in EntityPerPageTable if needed
..
Only try to add a row in EntityPerPageTable if needed
No need to (re-)insert a row there, if there's already one.
EntityPerPageTable::addEntityPage is called after any entity
edit, see EntityHandler::getEntityModificationUpdates.
Change-Id: I143f37949813e0849711bc808ce48a741c236d11
---
M repo/includes/Store/Sql/EntityPerPageTable.php
M repo/includes/Store/Sql/SqlStore.php
M repo/tests/phpunit/includes/Store/Sql/EntityPerPageTableTest.php
3 files changed, 77 insertions(+), 8 deletions(-)
Approvals:
Aude: Looks good to me, approved
Daniel Kinzler: Looks good to me, approved
Thiemo Mättig (WMDE): Looks good to me, but someone else must approve
jenkins-bot: Verified
diff --git a/repo/includes/Store/Sql/EntityPerPageTable.php
b/repo/includes/Store/Sql/EntityPerPageTable.php
index 2aabf66..16b41d7 100644
--- a/repo/includes/Store/Sql/EntityPerPageTable.php
+++ b/repo/includes/Store/Sql/EntityPerPageTable.php
@@ -3,6 +3,7 @@
namespace Wikibase\Repo\Store\SQL;
use InvalidArgumentException;
+use LoadBalancer;
use Wikibase\DataModel\Entity\EntityId;
use Wikibase\DataModel\Entity\EntityIdParser;
use Wikibase\DataModel\Entity\Int32EntityId;
@@ -34,10 +35,21 @@
private $entityIdComposer;
/**
+* @var LoadBalancer
+*/
+ private $loadBalancer;
+
+ /**
+* @param LoadBalancer $loadBalancer
* @param EntityIdParser $entityIdParser
* @param EntityIdComposer $entityIdComposer
*/
- public function __construct( EntityIdParser $entityIdParser,
EntityIdComposer $entityIdComposer ) {
+ public function __construct(
+ LoadBalancer $loadBalancer,
+ EntityIdParser $entityIdParser,
+ EntityIdComposer $entityIdComposer
+ ) {
+ $this->loadBalancer = $loadBalancer;
$this->entityIdParser = $entityIdParser;
$this->entityIdComposer = $entityIdComposer;
}
@@ -94,14 +106,16 @@
'epp_redirect_target' => $redirectTarget
);
- $this->addRowInternal( $values );
+ if ( !$this->rowExists( $values ) ) {
+ $this->addRowInternal( $values );
+ }
}
/**
* @param array $row
*/
private function addRowInternal( array $row ) {
- $dbw = wfGetDB( DB_MASTER );
+ $dbw = $this->loadBalancer->getConnection( DB_MASTER );
// Try to add the row and see it it conflicts on (id,type) or
(page_id).
// With innodb, this only sets IX gap and SH/EX record locks.
This is useful for new
// page/entity creation, as just doing DELETE+INSERT would put
SH gap locks on the range
@@ -133,8 +147,19 @@
);
}
+ /**
+* @param array $row
+*
+* @return bool
+*/
+ private function rowExists( array $row ) {
+ $dbw = $this->loadBalancer->getConnection( DB_MASTER );
+
+ return $dbw->selectRow( 'wb_entity_per_page', '1', $row,
__METHOD__ ) !== false;
+ }
+
private function getConflictingRowConditions( array $values ) {
- $dbw = wfGetDB( DB_MASTER );
+ $dbw = $this->loadBalancer->getConnection( DB_MASTER );
$indexes = $this->getUniqueIndexes();
$conditions = array();
@@ -187,7 +212,7 @@
throw new InvalidArgumentException( '$entityId must be
an Int32EntityId' );
}
- $dbw = wfGetDB( DB_MASTER );
+ $dbw = $this->loadBalancer->getConnection( DB_MASTER );
return $dbw->delete(
'wb_entity_per_page',
@@ -207,7 +232,7 @@
* @return boolean Success indicator
*/
public function clear() {
- return wfGetDB( DB_MASTER )->delete( 'wb_entity_per_page', '*',
__METHOD__ );
+ return $this->loadBalancer->getConnection( DB_MASTER )->delete(
'wb_entity_per_page', '*', __METHOD__ );
}
/**
diff --git a/repo/includes/Store/Sql/SqlStore.php
b/repo/includes/Store/Sql/SqlStore.php
index bcc4974d..b17b439 100644
--- a/repo/includes/Store/Sql/SqlStore.php
+++ b/repo/includes/Store/Sql/SqlStore.php
@@ -294,7 +294,7 @@
* @return EntityPerPage
*/
public function newEntityPerPage() {
- return new EntityPerPageTable( $this->entityIdParser,
$this->entityIdComposer );
+ return new EntityPerPageTable( wfGetLB(),
$this->entityIdParser, $this->entityIdComposer );
}
/**
diff --git a/repo/tests/phpunit/includes/Store/Sql/EntityPerPageTableTest.php