jenkins-bot has submitted this change and it was merged.
Change subject: Avoid exceptions on encodeTitle() INSERT races
......................................................................
Avoid exceptions on encodeTitle() INSERT races
Bug: T106849
Change-Id: I2a4adb3c0b1a77e0de39c731110289815e87c98a
---
M ShortUrl.utils.php
1 file changed, 36 insertions(+), 14 deletions(-)
Approvals:
Gilles: Looks good to me, approved
jenkins-bot: Verified
diff --git a/ShortUrl.utils.php b/ShortUrl.utils.php
old mode 100644
new mode 100755
index 5045b77..19db0b9
--- a/ShortUrl.utils.php
+++ b/ShortUrl.utils.php
@@ -22,36 +22,57 @@
* @param $title Title
* @return mixed|string
*/
- public static function encodeTitle( $title ) {
+ public static function encodeTitle( Title $title ) {
global $wgMemc;
$memcKey = wfMemcKey( 'shorturls', 'title', md5(
$title->getPrefixedText() ) );
+
$id = $wgMemc->get( $memcKey );
if ( !$id ) {
- $dbr = wfGetDB( DB_SLAVE );
- $entry = $dbr->selectRow(
+ $id = wfGetDB( DB_SLAVE )->selectField(
'shorturls',
- array( 'su_id' ),
+ 'su_id',
array(
'su_namespace' =>
$title->getNamespace(),
'su_title' => $title->getDBkey()
),
__METHOD__
);
- if ( $entry !== false ) {
- $id = $entry->su_id;
- } else {
+
+ // Automatically create an ID for this title if
missing...
+ if ( !$id ) {
$dbw = wfGetDB( DB_MASTER );
- $rowData = array(
- 'su_id' => $dbw->nextSequenceValue(
'shorturls_id_seq' ),
- 'su_namespace' =>
$title->getNamespace(),
- 'su_title' => $title->getDBkey()
+ $dbw->insert(
+ 'shorturls',
+ array(
+ 'su_id' =>
$dbw->nextSequenceValue( 'shorturls_id_seq' ),
+ 'su_namespace' =>
$title->getNamespace(),
+ 'su_title' => $title->getDBkey()
+ ),
+ __METHOD__,
+ array( 'IGNORE' )
);
- $dbw->insert( 'shorturls', $rowData, __METHOD__
);
- $id = $dbw->insertId();
+
+ if ( $dbw->affectedRows() ) {
+ $id = $dbw->insertId();
+ } else {
+ // Raced out; get the winning ID
+ $id = $dbw->selectField(
+ 'shorturls',
+ 'su_id',
+ array(
+ 'su_namespace' =>
$title->getNamespace(),
+ 'su_title' =>
$title->getDBkey()
+ ),
+ __METHOD__,
+ array( 'LOCK IN SHARE MODE' )
// ignore snapshot
+ );
+ }
}
- $wgMemc->set( $memcKey, $id, 0 );
+
+ $wgMemc->set( $memcKey, $id );
}
+
return base_convert( $id, 10, 36 );
}
@@ -79,6 +100,7 @@
}
$wgMemc->set( $memcKey, $entry, 0 );
}
+
return Title::makeTitle( $entry->su_namespace, $entry->su_title
);
}
--
To view, visit https://gerrit.wikimedia.org/r/226918
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: merged
Gerrit-Change-Id: I2a4adb3c0b1a77e0de39c731110289815e87c98a
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/ShortUrl
Gerrit-Branch: master
Gerrit-Owner: Aaron Schulz <[email protected]>
Gerrit-Reviewer: Gilles <[email protected]>
Gerrit-Reviewer: Legoktm <[email protected]>
Gerrit-Reviewer: jenkins-bot <>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits