diff options
author | jenkins-bot <jenkins-bot@gerrit.wikimedia.org> | 2025-04-07 16:59:41 +0000 |
---|---|---|
committer | Gerrit Code Review <gerrit@wikimedia.org> | 2025-04-07 16:59:41 +0000 |
commit | 7cd0f4e62adc27c9c7a070bc89a88054795a923b (patch) | |
tree | 1819602db72949177b2e08ee1a73071160dfb020 | |
parent | d4a22ffd011b22087442d74bbbec1e69dae2b59b (diff) | |
parent | 4e4deeb895b7b9b5eff94ad840898e14126ae8a1 (diff) | |
download | mediawikicore-7cd0f4e62adc27c9c7a070bc89a88054795a923b.tar.gz mediawikicore-7cd0f4e62adc27c9c7a070bc89a88054795a923b.zip |
-rw-r--r-- | includes/parser/RevisionOutputCache.php | 51 | ||||
-rw-r--r-- | tests/phpunit/includes/parser/RevisionOutputCacheTest.php | 8 |
2 files changed, 49 insertions, 10 deletions
diff --git a/includes/parser/RevisionOutputCache.php b/includes/parser/RevisionOutputCache.php index d1223451e126..f9aaef30d060 100644 --- a/includes/parser/RevisionOutputCache.php +++ b/includes/parser/RevisionOutputCache.php @@ -27,6 +27,7 @@ use InvalidArgumentException; use JsonException; use MediaWiki\Json\JsonCodec; use MediaWiki\Revision\RevisionRecord; +use MediaWiki\Revision\SlotRecord; use MediaWiki\Utils\MWTimestamp; use Psr\Log\LoggerInterface; use Wikimedia\ObjectCache\WANObjectCache; @@ -104,14 +105,28 @@ class RevisionOutputCache { } /** + * @param RevisionRecord $revision + * @return string + */ + private function getContentModelFromRevision( RevisionRecord $revision ) { + if ( !$revision->hasSlot( SlotRecord::MAIN ) ) { + return 'missing'; + } + return str_replace( '.', '_', $revision->getMainContentModel() ); + } + + /** + * @param RevisionRecord $revision * @param string $status e.g. hit, miss etc. * @param string|null $reason */ - private function incrementStats( string $status, ?string $reason = null ) { + private function incrementStats( RevisionRecord $revision, string $status, ?string $reason = null ) { + $contentModel = $this->getContentModelFromRevision( $revision ); $metricSuffix = $reason ? "{$status}_{$reason}" : $status; $this->stats->getCounter( 'RevisionOutputCache_operation_total' ) ->setLabel( 'name', $this->name ) + ->setLabel( 'contentModel', $contentModel ) ->setLabel( 'status', $status ) ->setLabel( 'reason', $reason ?: 'n/a' ) ->copyToStatsdAt( "RevisionOutputCache.{$this->name}.{$metricSuffix}" ) @@ -119,6 +134,21 @@ class RevisionOutputCache { } /** + * @param RevisionRecord $revision + * @param string $renderReason + */ + private function incrementRenderReasonStats( RevisionRecord $revision, $renderReason ) { + $contentModel = $this->getContentModelFromRevision( $revision ); + $renderReason = preg_replace( '/\W+/', '_', $renderReason ); + + $this->stats->getCounter( 'RevisionOutputCache_render_total' ) + ->setLabel( 'name', $this->name ) + ->setLabel( 'contentModel', $contentModel ) + ->setLabel( 'reason', $renderReason ) + ->increment(); + } + + /** * Get a key that will be used by this cache to store the content * for a given page considering the given options and the array of * used options. @@ -198,7 +228,7 @@ class RevisionOutputCache { } if ( !$parserOptions->isSafeToCache() ) { - $this->incrementStats( 'miss', 'unsafe' ); + $this->incrementStats( $revision, 'miss', 'unsafe' ); return false; } @@ -206,13 +236,13 @@ class RevisionOutputCache { $json = $this->cache->get( $cacheKey ); if ( $json === false ) { - $this->incrementStats( 'miss', 'absent' ); + $this->incrementStats( $revision, 'miss', 'absent' ); return false; } $output = $this->restoreFromJson( $json, $cacheKey, ParserOutput::class ); if ( $output === null ) { - $this->incrementStats( 'miss', 'unserialize' ); + $this->incrementStats( $revision, 'miss', 'unserialize' ); return false; } @@ -221,12 +251,12 @@ class RevisionOutputCache { $expiryTime = max( $expiryTime, (int)MWTimestamp::now( TS_UNIX ) - $this->cacheExpiry ); if ( $cacheTime < $expiryTime ) { - $this->incrementStats( 'miss', 'expired' ); + $this->incrementStats( $revision, 'miss', 'expired' ); return false; } $this->logger->debug( 'old-revision cache hit' ); - $this->incrementStats( 'hit' ); + $this->incrementStats( $revision, 'hit' ); return $output; } @@ -283,23 +313,24 @@ class RevisionOutputCache { $expiry = $output->getCacheExpiry(); if ( $expiry <= 0 ) { - $this->incrementStats( 'save', 'uncacheable' ); + $this->incrementStats( $revision, 'save', 'uncacheable' ); return; } if ( !$parserOptions->isSafeToCache() ) { - $this->incrementStats( 'save', 'unsafe' ); + $this->incrementStats( $revision, 'save', 'unsafe' ); return; } $json = $this->encodeAsJson( $output, $cacheKey ); if ( $json === null ) { - $this->incrementStats( 'save', 'nonserializable' ); + $this->incrementStats( $revision, 'save', 'nonserializable' ); return; } $this->cache->set( $cacheKey, $json, $expiry ); - $this->incrementStats( 'save', 'success' ); + $this->incrementStats( $revision, 'save', 'success' ); + $this->incrementRenderReasonStats( $revision, $parserOptions->getRenderReason() ); } /** diff --git a/tests/phpunit/includes/parser/RevisionOutputCacheTest.php b/tests/phpunit/includes/parser/RevisionOutputCacheTest.php index 0a0a028214ea..03419b88c1bf 100644 --- a/tests/phpunit/includes/parser/RevisionOutputCacheTest.php +++ b/tests/phpunit/includes/parser/RevisionOutputCacheTest.php @@ -3,6 +3,7 @@ namespace MediaWiki\Tests\Parser; use InvalidArgumentException; +use MediaWiki\Content\WikitextContent; use MediaWiki\Json\JsonCodec; use MediaWiki\Page\PageIdentity; use MediaWiki\Page\PageIdentityValue; @@ -11,6 +12,7 @@ use MediaWiki\Parser\ParserOutput; use MediaWiki\Parser\RevisionOutputCache; use MediaWiki\Revision\MutableRevisionRecord; use MediaWiki\Revision\RevisionRecord; +use MediaWiki\Revision\SlotRecord; use MediaWiki\Tests\Json\JsonDeserializableSuperClass; use MediaWiki\User\User; use MediaWiki\Utils\MWTimestamp; @@ -58,6 +60,12 @@ class RevisionOutputCacheTest extends MediaWikiIntegrationTestCase { ); $this->revision->setId( 24 ); $this->revision->setTimestamp( MWTimestamp::convert( TS_MW, $this->time ) ); + $this->revision->setSlot( + SlotRecord::newUnsaved( + SlotRecord::MAIN, + new WikitextContent( 'test test test' ) + ) + ); } /** |