From: Aaron Schulz Date: Sat, 28 Apr 2012 21:15:26 +0000 (-0700) Subject: Optimized SqlBagOStuff::getBatch() a bit. X-Git-Tag: 1.31.0-rc.0~23682^2 X-Git-Url: https://git.cyclocoop.org/%7B%24www_url%7Dadmin/compta/exercices/journal.php?a=commitdiff_plain;h=253f8ff6a04461e64b0b261e62915b06dfb1bd01;p=lhc%2Fweb%2Fwiklou.git Optimized SqlBagOStuff::getBatch() a bit. Change-Id: I046ce9e1156071233077296b66071fcc0876719c --- diff --git a/includes/objectcache/SqlBagOStuff.php b/includes/objectcache/SqlBagOStuff.php index 4dfa5743dd..3e9aaff195 100644 --- a/includes/objectcache/SqlBagOStuff.php +++ b/includes/objectcache/SqlBagOStuff.php @@ -118,40 +118,64 @@ class SqlBagOStuff extends BagOStuff { } public function get( $key ) { - # expire old entries if any - $this->garbageCollect(); - $db = $this->getDB(); - $tableName = $this->getTableByKey( $key ); - $row = $db->selectRow( $tableName, array( 'value', 'exptime' ), - array( 'keyname' => $key ), __METHOD__ ); + $values = $this->getBatch( array( $key ) ); + return $values[$key]; + } - if ( !$row ) { - $this->debug( 'get: no matching rows' ); - return false; + public function getBatch( array $keys ) { + $values = array(); // array of (key => value) + + $keysByTableName = array(); + foreach ( $keys as $key ) { + $tableName = $this->getTableByKey( $key ); + if ( !isset( $keysByTableName[$tableName] ) ) { + $keysByTableName[$tableName] = array(); + } + $keysByTableName[$tableName][] = $key; } - $this->debug( "get: retrieved data; expiry time is " . $row->exptime ); + $db = $this->getDB(); + $this->garbageCollect(); // expire old entries if any - if ( $this->isExpired( $row->exptime ) ) { - $this->debug( "get: key has expired, deleting" ); - try { - $db->begin( __METHOD__ ); - # Put the expiry time in the WHERE condition to avoid deleting a - # newly-inserted value - $db->delete( $tableName, - array( - 'keyname' => $key, - 'exptime' => $row->exptime - ), __METHOD__ ); - $db->commit( __METHOD__ ); - } catch ( DBQueryError $e ) { - $this->handleWriteError( $e ); + $dataRows = array(); + foreach ( $keysByTableName as $tableName => $tableKeys ) { + $res = $db->select( $tableName, + array( 'keyname', 'value', 'exptime' ), + array( 'keyname' => $tableKeys ), + __METHOD__ ); + foreach ( $res as $row ) { + $dataRows[$row->keyname] = $row; } + } - return false; + foreach ( $keys as $key ) { + if ( isset( $dataRows[$key] ) ) { // HIT? + $row = $dataRows[$key]; + $this->debug( "get: retrieved data; expiry time is " . $row->exptime ); + if ( $this->isExpired( $row->exptime ) ) { // MISS + $this->debug( "get: key has expired, deleting" ); + try { + $db->begin( __METHOD__ ); + # Put the expiry time in the WHERE condition to avoid deleting a + # newly-inserted value + $db->delete( $this->getTableByKey( $key ), + array( 'keyname' => $key, 'exptime' => $row->exptime ), + __METHOD__ ); + $db->commit( __METHOD__ ); + } catch ( DBQueryError $e ) { + $this->handleWriteError( $e ); + } + $values[$key] = false; + } else { // HIT + $values[$key] = $this->unserialize( $db->decodeBlob( $row->value ) ); + } + } else { // MISS + $values[$key] = false; + $this->debug( 'get: no matching rows' ); + } } - return $this->unserialize( $db->decodeBlob( $row->value ) ); + return $values; } public function set( $key, $value, $exptime = 0 ) { @@ -328,7 +352,7 @@ class SqlBagOStuff extends BagOStuff { if ( $maxExpTime !== false ) { $conds[] = 'exptime > ' . $db->addQuotes( $maxExpTime ); } - $rows = $db->select( + $rows = $db->select( $this->getTableByShard( $i ), array( 'keyname', 'exptime' ), $conds, @@ -352,7 +376,7 @@ class SqlBagOStuff extends BagOStuff { $db->begin( __METHOD__ ); $db->delete( $this->getTableByShard( $i ), - array( + array( 'exptime >= ' . $db->addQuotes( $minExpTime ), 'exptime < ' . $db->addQuotes( $dbTimestamp ), 'keyname' => $keys @@ -364,12 +388,12 @@ class SqlBagOStuff extends BagOStuff { if ( intval( $totalSeconds ) === 0 ) { $percent = 0; } else { - $remainingSeconds = wfTimestamp( TS_UNIX, $timestamp ) + $remainingSeconds = wfTimestamp( TS_UNIX, $timestamp ) - wfTimestamp( TS_UNIX, $maxExpTime ); if ( $remainingSeconds > $totalSeconds ) { $totalSeconds = $remainingSeconds; } - $percent = ( $i + $remainingSeconds / $totalSeconds ) + $percent = ( $i + $remainingSeconds / $totalSeconds ) / $this->shards * 100; } call_user_func( $progressCallback, $percent );