Page MenuHomePhabricator

Verify AbuseFilter code that claims to share and re-use ParserOutput from core
Open, MediumPublic

Description

In RunVariableGenerator and AFComputedVariable there are several code bits where a comment says that we can share a parse operation with the edit, see this search.

Back in 2009, (see rEABF48bfcc35ee9829cc15e9404c2cbe0d7bf86402b1), this was achieved by keeping a cache of Article objects, and calling Article::prepareTextForEdit (i.e. what was used at the time to parse the content) on those objects. Since sometimes AbuseFilter will parse the page content *before* saving the edit (e.g. if it needs to know what links are being added), this guarantees (or guaranteed) that the parsing didn't happen twice.

Today, 11 years later, things have changed a lot. Notably:

  • We use WikiPage instead of Article
  • The method is now called prepareContentForEdit
  • We now have a dedicated PageUpdater service with the logic for preparing edits
    • I'm unsure about this, but I guess that the cache for prepared edit now lives elsewhere, and perhaps it doesn't need to cache WikiPage/Article objects
  • I think (but I may be wrong) that parsing the content can now happen *after* the edit is saved

All of this means that the AF code is most probably out of date. I'm tagging CPT as stewards of AbuseFilter and maintainers of the ContentHandler/MCR/Revision backend code which is the vital point here. What I'd like to understand is:

  • Is there any point in keeping a cache of WikiPage objects?
    • Will the parse operation be shared with the edit even if we don't
  • What else can we do to ensure that the parse operation is shared, or anyway that we keep the code performant?

I should also say that a related change is to stop using WikiPage::prepareContentForEdit in favour of its MCR replacement. However, as per T242249, the method has been deprecated since 1.32 without a viable alternative (the recommended replacement is a private method).

Event Timeline

@daniel Adding another question: as part of T198651, we'd like to unconditionally apply a PST to every edit before filtering it, so we can tell whether it's a null edit. Is there any precaution we should take in doing so to reduce the performance impact?

Krinkle renamed this task from Checkup code claiming that we can share a parse operation with the ongoing edit to Verify AbuseFilter code that claims to share and re-use ParserOutput from core.Aug 16 2021, 8:29 PM

One year later, now that T288707 is resolved, it seems that we're indeed parsing stuff twice.

Change 819484 had a related patch set uploaded (by Matěj Suchánek; author: Matěj Suchánek):

[mediawiki/extensions/AbuseFilter@master] Retrieve external links from PreparedUpdate

https://gerrit.wikimedia.org/r/819484

One year later, now that T288707 is resolved, it seems that we're indeed parsing stuff twice.

I just discovered an old filter on enwiki that was checking added_links on every edit. Does that mean we were doubling the time it takes to save every (non-stashed) page?!

Change 819484 merged by jenkins-bot:

[mediawiki/extensions/AbuseFilter@master] Retrieve external links from PreparedUpdate

https://gerrit.wikimedia.org/r/819484

The code hasn't been removed yet, but it shouldn't be executed on every edit anymore.

Change 929657 had a related patch set uploaded (by Ladsgroup; author: Matěj Suchánek):

[mediawiki/extensions/AbuseFilter@wmf/1.41.0-wmf.13] Retrieve external links from PreparedUpdate

https://gerrit.wikimedia.org/r/929657

Change 929657 merged by jenkins-bot:

[mediawiki/extensions/AbuseFilter@wmf/1.41.0-wmf.13] Retrieve external links from PreparedUpdate

https://gerrit.wikimedia.org/r/929657

Mentioned in SAL (#wikimedia-operations) [2023-06-13T18:32:36Z] <ladsgroup@deploy1002> Started scap: Backport for [[gerrit:929657|Retrieve external links from PreparedUpdate (T65632 T264104)]]

Mentioned in SAL (#wikimedia-operations) [2023-06-13T18:34:10Z] <ladsgroup@deploy1002> ladsgroup: Backport for [[gerrit:929657|Retrieve external links from PreparedUpdate (T65632 T264104)]] synced to the testservers: mwdebug1002.eqiad.wmnet, mwdebug2001.codfw.wmnet, mwdebug1001.eqiad.wmnet, mwdebug2002.codfw.wmnet

Mentioned in SAL (#wikimedia-operations) [2023-06-13T18:44:55Z] <ladsgroup@deploy1002> Finished scap: Backport for [[gerrit:929657|Retrieve external links from PreparedUpdate (T65632 T264104)]] (duration: 12m 18s)

Change 938442 had a related patch set uploaded (by Matěj Suchánek; author: Matěj Suchánek):

[mediawiki/extensions/AbuseFilter@master] Get parsed content from PreparedUpdate

https://gerrit.wikimedia.org/r/938442

Change 938442 merged by jenkins-bot:

[mediawiki/extensions/AbuseFilter@master] Get parsed content from PreparedUpdate

https://gerrit.wikimedia.org/r/938442

@Daimona I believe this has been resolved. Can you confirm?

Not really. There are still fallbacks to the legacy code, and I believe they are still heavily used (e.g., during edit stashing).

Not really. There are still fallbacks to the legacy code, and I believe they are still heavily used (e.g., during edit stashing).

Indeed, it looks like we still have several events in the DuplicateParse channel that AF is responsible for. There have been 212 in the last 60 minutes, here are some examples:

Ex 1

First parse
#0 /srv/mediawiki/php-1.41.0-wmf.26/includes/content/ContentHandler.php(1764): MediaWiki\Parser\ParserObserver->notifyParse(Object(MediaWiki\Title\Title), NULL, Object(ParserOptions), Object(Wikibase\MediaInfo\Content\MediaInfoContent), Object(ParserOutput))
#1 /srv/mediawiki/php-1.41.0-wmf.26/includes/content/Renderer/ContentRenderer.php(47): ContentHandler->getParserOutput(Object(Wikibase\MediaInfo\Content\MediaInfoContent), Object(MediaWiki\Content\Renderer\ContentParseParams))
#2 /srv/mediawiki/php-1.41.0-wmf.26/includes/Revision/RenderedRevision.php(260): MediaWiki\Content\Renderer\ContentRenderer->getParserOutput(Object(Wikibase\MediaInfo\Content\MediaInfoContent), Object(MediaWiki\Title\Title), NULL, Object(ParserOptions), true)
#3 /srv/mediawiki/php-1.41.0-wmf.26/includes/Revision/RenderedRevision.php(232): MediaWiki\Revision\RenderedRevision->getSlotParserOutputUncached(Object(Wikibase\MediaInfo\Content\MediaInfoContent), true)
#4 /srv/mediawiki/php-1.41.0-wmf.26/includes/Revision/RevisionRenderer.php(238): MediaWiki\Revision\RenderedRevision->getSlotParserOutput('mediainfo', Array)
#5 /srv/mediawiki/php-1.41.0-wmf.26/includes/Revision/RevisionRenderer.php(164): MediaWiki\Revision\RevisionRenderer->combineSlotOutput(Object(MediaWiki\Revision\RenderedRevision), Array)
#6 [internal function]: MediaWiki\Revision\RevisionRenderer->MediaWiki\Revision\{closure}(Object(MediaWiki\Revision\RenderedRevision), Array)
#7 /srv/mediawiki/php-1.41.0-wmf.26/includes/Revision/RenderedRevision.php(199): call_user_func(Object(Closure), Object(MediaWiki\Revision\RenderedRevision), Array)
#8 /srv/mediawiki/php-1.41.0-wmf.26/includes/Storage/DerivedPageDataUpdater.php(1466): MediaWiki\Revision\RenderedRevision->getRevisionParserOutput()
#9 [internal function]: MediaWiki\Storage\DerivedPageDataUpdater->getCanonicalParserOutput()
#10 /srv/mediawiki/php-1.41.0-wmf.26/includes/edit/PreparedEdit.php(97): call_user_func(Array)
#11 /srv/mediawiki/php-1.41.0-wmf.26/includes/edit/PreparedEdit.php(112): MediaWiki\Edit\PreparedEdit->getOutput()
#12 /srv/mediawiki/php-1.41.0-wmf.26/extensions/ConfirmEdit/SimpleCaptcha/SimpleCaptcha.php(675): MediaWiki\Edit\PreparedEdit->__get('output')
#13 /srv/mediawiki/php-1.41.0-wmf.26/extensions/ConfirmEdit/SimpleCaptcha/SimpleCaptcha.php(877): MediaWiki\Extension\ConfirmEdit\SimpleCaptcha\SimpleCaptcha->shouldCheck(Object(WikiFilePage), Object(Wikibase\MediaInfo\Content\MediaInfoContent), '', Object(DerivativeContext))
#14 /srv/mediawiki/php-1.41.0-wmf.26/extensions/ConfirmEdit/SimpleCaptcha/SimpleCaptcha.php(914): MediaWiki\Extension\ConfirmEdit\SimpleCaptcha\SimpleCaptcha->doConfirmEdit(Object(WikiFilePage), Object(Wikibase\MediaInfo\Content\MediaInfoContent), '', Object(DerivativeContext), Object(User))
#15 /srv/mediawiki/php-1.41.0-wmf.26/extensions/ConfirmEdit/includes/Hooks.php(87): MediaWiki\Extension\ConfirmEdit\SimpleCaptcha\SimpleCaptcha->confirmEditMerged(Object(DerivativeContext), Object(Wikibase\MediaInfo\Content\MediaInfoContent), Object(MediaWiki\Status\Status), '/* wbsetclaim-c...', Object(User), false)
#16 /srv/mediawiki/php-1.41.0-wmf.26/includes/HookContainer/HookContainer.php(161): MediaWiki\Extension\ConfirmEdit\Hooks->onEditFilterMergedContent(Object(DerivativeContext), Object(Wikibase\MediaInfo\Content\MediaInfoContent), Object(MediaWiki\Status\Status), '/* wbsetclaim-c...', Object(User), false, 'mediainfo')
#17 /srv/mediawiki/php-1.41.0-wmf.26/extensions/Wikibase/repo/includes/EditEntity/MediaWikiEditFilterHookRunner.php(122): MediaWiki\HookContainer\HookContainer->run('EditFilterMerge...', Array)
#18 /srv/mediawiki/php-1.41.0-wmf.26/extensions/Wikibase/repo/includes/EditEntity/StatsdTimeRecordingEditFilterHookRunner.php(48): Wikibase\Repo\EditEntity\MediaWikiEditFilterHookRunner->run(Object(Wikibase\MediaInfo\DataModel\MediaInfo), Object(DerivativeContext), '/* wbsetclaim-c...')
#19 /srv/mediawiki/php-1.41.0-wmf.26/extensions/Wikibase/repo/includes/EditEntity/MediaWikiEditEntity.php(738): Wikibase\Repo\EditEntity\StatsdTimeRecordingEditFilterHookRunner->run(Object(Wikibase\MediaInfo\DataModel\MediaInfo), Object(DerivativeContext), '/* wbsetclaim-c...')
#20 /srv/mediawiki/php-1.41.0-wmf.26/extensions/Wikibase/repo/includes/EditEntity/StatsdSaveTimeRecordingEditEntity.php(77): Wikibase\Repo\EditEntity\MediaWikiEditEntity->attemptSave(Object(Wikibase\MediaInfo\DataModel\MediaInfo), '/* wbsetclaim-c...', 2, 'a8eabe17b3a056e...', true, Array)
#21 /srv/mediawiki/php-1.41.0-wmf.26/extensions/Wikibase/repo/includes/Api/EntitySavingHelper.php(391): Wikibase\Repo\EditEntity\StatsdSaveTimeRecordingEditEntity->attemptSave(Object(Wikibase\MediaInfo\DataModel\MediaInfo), '/* wbsetclaim-c...', 2, 'a8eabe17b3a056e...', NULL, Array)
#22 /srv/mediawiki/php-1.41.0-wmf.26/extensions/Wikibase/repo/includes/Api/SetClaim.php(215): Wikibase\Repo\Api\EntitySavingHelper->attemptSaveEntity(Object(Wikibase\MediaInfo\DataModel\MediaInfo), '/* wbsetclaim-c...', Array, Object(DerivativeContext))
#23 /srv/mediawiki/php-1.41.0-wmf.26/extensions/Wikibase/repo/includes/Api/SetClaim.php(163): Wikibase\Repo\Api\SetClaim->executeInternal()
#24 /srv/mediawiki/php-1.41.0-wmf.26/includes/api/ApiMain.php(1929): Wikibase\Repo\Api\SetClaim->execute()
#25 /srv/mediawiki/php-1.41.0-wmf.26/includes/api/ApiMain.php(906): ApiMain->executeAction()
#26 /srv/mediawiki/php-1.41.0-wmf.26/includes/api/ApiMain.php(877): ApiMain->executeActionWithErrorHandling()
#27 /srv/mediawiki/php-1.41.0-wmf.26/api.php(95): ApiMain->execute()
#28 /srv/mediawiki/php-1.41.0-wmf.26/api.php(48): wfApiMain()
#29 /srv/mediawiki/w/api.php(3): require('/srv/mediawiki/...')
#30 {main}
Second parse
#0 /srv/mediawiki/php-1.41.0-wmf.26/includes/content/ContentHandler.php(1764): MediaWiki\Parser\ParserObserver->notifyParse(Object(MediaWiki\Title\Title), NULL, Object(ParserOptions), Object(Wikibase\MediaInfo\Content\MediaInfoContent), Object(ParserOutput))
#1 /srv/mediawiki/php-1.41.0-wmf.26/includes/content/Renderer/ContentRenderer.php(47): ContentHandler->getParserOutput(Object(Wikibase\MediaInfo\Content\MediaInfoContent), Object(MediaWiki\Content\Renderer\ContentParseParams))
#2 /srv/mediawiki/php-1.41.0-wmf.26/includes/Revision/RenderedRevision.php(260): MediaWiki\Content\Renderer\ContentRenderer->getParserOutput(Object(Wikibase\MediaInfo\Content\MediaInfoContent), Object(MediaWiki\Title\Title), NULL, Object(ParserOptions), true)
#3 /srv/mediawiki/php-1.41.0-wmf.26/includes/Revision/RenderedRevision.php(232): MediaWiki\Revision\RenderedRevision->getSlotParserOutputUncached(Object(Wikibase\MediaInfo\Content\MediaInfoContent), true)
#4 /srv/mediawiki/php-1.41.0-wmf.26/includes/Revision/RevisionRenderer.php(238): MediaWiki\Revision\RenderedRevision->getSlotParserOutput('mediainfo', Array)
#5 /srv/mediawiki/php-1.41.0-wmf.26/includes/Revision/RevisionRenderer.php(164): MediaWiki\Revision\RevisionRenderer->combineSlotOutput(Object(MediaWiki\Revision\RenderedRevision), Array)
#6 [internal function]: MediaWiki\Revision\RevisionRenderer->MediaWiki\Revision\{closure}(Object(MediaWiki\Revision\RenderedRevision), Array)
#7 /srv/mediawiki/php-1.41.0-wmf.26/includes/Revision/RenderedRevision.php(199): call_user_func(Object(Closure), Object(MediaWiki\Revision\RenderedRevision), Array)
#8 /srv/mediawiki/php-1.41.0-wmf.26/includes/Storage/DerivedPageDataUpdater.php(1466): MediaWiki\Revision\RenderedRevision->getRevisionParserOutput()
#9 [internal function]: MediaWiki\Storage\DerivedPageDataUpdater->getCanonicalParserOutput()
#10 /srv/mediawiki/php-1.41.0-wmf.26/includes/edit/PreparedEdit.php(97): call_user_func(Array)
#11 /srv/mediawiki/php-1.41.0-wmf.26/includes/edit/PreparedEdit.php(112): MediaWiki\Edit\PreparedEdit->getOutput()
#12 /srv/mediawiki/php-1.41.0-wmf.26/extensions/AbuseFilter/includes/Variables/LazyVariableComputer.php(209): MediaWiki\Edit\PreparedEdit->__get('output')
#13 /srv/mediawiki/php-1.41.0-wmf.26/extensions/AbuseFilter/includes/Variables/VariablesManager.php(79): MediaWiki\Extension\AbuseFilter\Variables\LazyVariableComputer->compute(Object(MediaWiki\Extension\AbuseFilter\Variables\LazyLoadedVariable), Object(MediaWiki\Extension\AbuseFilter\Variables\VariableHolder), Object(Closure))
#14 /srv/mediawiki/php-1.41.0-wmf.26/extensions/AbuseFilter/includes/Parser/FilterEvaluator.php(820): MediaWiki\Extension\AbuseFilter\Variables\VariablesManager->getVar(Object(MediaWiki\Extension\AbuseFilter\Variables\VariableHolder), 'all_links', 2)
#15 /srv/mediawiki/php-1.41.0-wmf.26/extensions/AbuseFilter/includes/Parser/FilterEvaluator.php(455): MediaWiki\Extension\AbuseFilter\Parser\FilterEvaluator->getVarValue('all_links')
#16 /srv/mediawiki/php-1.41.0-wmf.26/extensions/AbuseFilter/includes/Parser/FilterEvaluator.php(495): MediaWiki\Extension\AbuseFilter\Parser\FilterEvaluator->evalNode(Object(MediaWiki\Extension\AbuseFilter\Parser\AFPTreeNode))
#17 /srv/mediawiki/php-1.41.0-wmf.26/extensions/AbuseFilter/includes/Parser/FilterEvaluator.php(564): MediaWiki\Extension\AbuseFilter\Parser\FilterEvaluator->evalNode(Object(MediaWiki\Extension\AbuseFilter\Parser\AFPTreeNode))
#18 /srv/mediawiki/php-1.41.0-wmf.26/extensions/AbuseFilter/includes/Parser/FilterEvaluator.php(579): MediaWiki\Extension\AbuseFilter\Parser\FilterEvaluator->evalNode(Object(MediaWiki\Extension\AbuseFilter\Parser\AFPTreeNode))
#19 /srv/mediawiki/php-1.41.0-wmf.26/extensions/AbuseFilter/includes/Parser/FilterEvaluator.php(595): MediaWiki\Extension\AbuseFilter\Parser\FilterEvaluator->evalNode(Object(MediaWiki\Extension\AbuseFilter\Parser\AFPTreeNode))
#20 /srv/mediawiki/php-1.41.0-wmf.26/extensions/AbuseFilter/includes/Parser/FilterEvaluator.php(436): MediaWiki\Extension\AbuseFilter\Parser\FilterEvaluator->evalNode(Object(MediaWiki\Extension\AbuseFilter\Parser\AFPTreeNode))
#21 /srv/mediawiki/php-1.41.0-wmf.26/extensions/AbuseFilter/includes/Parser/FilterEvaluator.php(380): MediaWiki\Extension\AbuseFilter\Parser\FilterEvaluator->evalTree(Object(MediaWiki\Extension\AbuseFilter\Parser\AFPSyntaxTree))
#22 /srv/mediawiki/php-1.41.0-wmf.26/extensions/AbuseFilter/includes/Parser/FilterEvaluator.php(346): MediaWiki\Extension\AbuseFilter\Parser\FilterEvaluator->parse('!(article_prefi...')
#23 /srv/mediawiki/php-1.41.0-wmf.26/extensions/AbuseFilter/includes/FilterRunner.php(363): MediaWiki\Extension\AbuseFilter\Parser\FilterEvaluator->checkConditions('!(article_prefi...', '130')
#24 /srv/mediawiki/php-1.41.0-wmf.26/extensions/AbuseFilter/includes/FilterRunner.php(324): MediaWiki\Extension\AbuseFilter\FilterRunner->checkFilter(Object(MediaWiki\Extension\AbuseFilter\Filter\ExistingFilter))
#25 /srv/mediawiki/php-1.41.0-wmf.26/extensions/AbuseFilter/includes/FilterRunner.php(216): MediaWiki\Extension\AbuseFilter\FilterRunner->checkAllFiltersInternal()
#26 /srv/mediawiki/php-1.41.0-wmf.26/extensions/AbuseFilter/includes/Hooks/Handlers/FilteredActionsHandler.php(151): MediaWiki\Extension\AbuseFilter\FilterRunner->run()
#27 /srv/mediawiki/php-1.41.0-wmf.26/extensions/AbuseFilter/includes/Hooks/Handlers/FilteredActionsHandler.php(97): MediaWiki\Extension\AbuseFilter\Hooks\Handlers\FilteredActionsHandler->filterEdit(Object(DerivativeContext), Object(User), Object(Wikibase\MediaInfo\Content\MediaInfoContent), '/* wbsetclaim-c...', 'mediainfo')
#28 /srv/mediawiki/php-1.41.0-wmf.26/includes/HookContainer/HookContainer.php(161): MediaWiki\Extension\AbuseFilter\Hooks\Handlers\FilteredActionsHandler->onEditFilterMergedContent(Object(DerivativeContext), Object(Wikibase\MediaInfo\Content\MediaInfoContent), Object(MediaWiki\Status\Status), '/* wbsetclaim-c...', Object(User), false, 'mediainfo')
#29 /srv/mediawiki/php-1.41.0-wmf.26/extensions/Wikibase/repo/includes/EditEntity/MediaWikiEditFilterHookRunner.php(122): MediaWiki\HookContainer\HookContainer->run('EditFilterMerge...', Array)
#30 /srv/mediawiki/php-1.41.0-wmf.26/extensions/Wikibase/repo/includes/EditEntity/StatsdTimeRecordingEditFilterHookRunner.php(48): Wikibase\Repo\EditEntity\MediaWikiEditFilterHookRunner->run(Object(Wikibase\MediaInfo\DataModel\MediaInfo), Object(DerivativeContext), '/* wbsetclaim-c...')
#31 /srv/mediawiki/php-1.41.0-wmf.26/extensions/Wikibase/repo/includes/EditEntity/MediaWikiEditEntity.php(738): Wikibase\Repo\EditEntity\StatsdTimeRecordingEditFilterHookRunner->run(Object(Wikibase\MediaInfo\DataModel\MediaInfo), Object(DerivativeContext), '/* wbsetclaim-c...')
#32 /srv/mediawiki/php-1.41.0-wmf.26/extensions/Wikibase/repo/includes/EditEntity/StatsdSaveTimeRecordingEditEntity.php(77): Wikibase\Repo\EditEntity\MediaWikiEditEntity->attemptSave(Object(Wikibase\MediaInfo\DataModel\MediaInfo), '/* wbsetclaim-c...', 2, 'a8eabe17b3a056e...', true, Array)
#33 /srv/mediawiki/php-1.41.0-wmf.26/extensions/Wikibase/repo/includes/Api/EntitySavingHelper.php(391): Wikibase\Repo\EditEntity\StatsdSaveTimeRecordingEditEntity->attemptSave(Object(Wikibase\MediaInfo\DataModel\MediaInfo), '/* wbsetclaim-c...', 2, 'a8eabe17b3a056e...', NULL, Array)
#34 /srv/mediawiki/php-1.41.0-wmf.26/extensions/Wikibase/repo/includes/Api/SetClaim.php(215): Wikibase\Repo\Api\EntitySavingHelper->attemptSaveEntity(Object(Wikibase\MediaInfo\DataModel\MediaInfo), '/* wbsetclaim-c...', Array, Object(DerivativeContext))
#35 /srv/mediawiki/php-1.41.0-wmf.26/extensions/Wikibase/repo/includes/Api/SetClaim.php(163): Wikibase\Repo\Api\SetClaim->executeInternal()
#36 /srv/mediawiki/php-1.41.0-wmf.26/includes/api/ApiMain.php(1929): Wikibase\Repo\Api\SetClaim->execute()
#37 /srv/mediawiki/php-1.41.0-wmf.26/includes/api/ApiMain.php(906): ApiMain->executeAction()
#38 /srv/mediawiki/php-1.41.0-wmf.26/includes/api/ApiMain.php(877): ApiMain->executeActionWithErrorHandling()
#39 /srv/mediawiki/php-1.41.0-wmf.26/api.php(95): ApiMain->execute()
#40 /srv/mediawiki/php-1.41.0-wmf.26/api.php(48): wfApiMain()
#41 /srv/mediawiki/w/api.php(3): require('/srv/mediawiki/...')
#42 {main}

Ex 2

First parse
#0 /srv/mediawiki/php-1.41.0-wmf.26/includes/content/ContentHandler.php(1764): MediaWiki\Parser\ParserObserver->notifyParse(Object(MediaWiki\Title\Title), NULL, Object(ParserOptions), Object(WikitextContent), Object(ParserOutput))
#1 /srv/mediawiki/php-1.41.0-wmf.26/includes/content/Renderer/ContentRenderer.php(47): ContentHandler->getParserOutput(Object(WikitextContent), Object(MediaWiki\Content\Renderer\ContentParseParams))
#2 /srv/mediawiki/php-1.41.0-wmf.26/includes/Revision/RenderedRevision.php(260): MediaWiki\Content\Renderer\ContentRenderer->getParserOutput(Object(WikitextContent), Object(MediaWiki\Title\Title), NULL, Object(ParserOptions), false)
#3 /srv/mediawiki/php-1.41.0-wmf.26/includes/Revision/RenderedRevision.php(232): MediaWiki\Revision\RenderedRevision->getSlotParserOutputUncached(Object(WikitextContent), false)
#4 /srv/mediawiki/php-1.41.0-wmf.26/includes/Revision/RevisionRenderer.php(223): MediaWiki\Revision\RenderedRevision->getSlotParserOutput('main', Array)
#5 /srv/mediawiki/php-1.41.0-wmf.26/includes/Revision/RevisionRenderer.php(164): MediaWiki\Revision\RevisionRenderer->combineSlotOutput(Object(MediaWiki\Revision\RenderedRevision), Array)
#6 [internal function]: MediaWiki\Revision\RevisionRenderer->MediaWiki\Revision\{closure}(Object(MediaWiki\Revision\RenderedRevision), Array)
#7 /srv/mediawiki/php-1.41.0-wmf.26/includes/Revision/RenderedRevision.php(199): call_user_func(Object(Closure), Object(MediaWiki\Revision\RenderedRevision), Array)
#8 /srv/mediawiki/php-1.41.0-wmf.26/includes/Storage/DerivedPageDataUpdater.php(1458): MediaWiki\Revision\RenderedRevision->getRevisionParserOutput(Array)
#9 /srv/mediawiki/php-1.41.0-wmf.26/extensions/SpamBlacklist/includes/Hooks.php(105): MediaWiki\Storage\DerivedPageDataUpdater->getParserOutputForMetaData()
#10 /srv/mediawiki/php-1.41.0-wmf.26/includes/HookContainer/HookContainer.php(161): MediaWiki\Extension\SpamBlacklist\Hooks->onEditFilterMergedContent(Object(DerivativeContext), Object(WikitextContent), Object(MediaWiki\Status\Status), 'Fixing double r...', Object(User), true)
#11 /srv/mediawiki/php-1.41.0-wmf.26/includes/HookContainer/HookRunner.php(1474): MediaWiki\HookContainer\HookContainer->run('EditFilterMerge...', Array)
#12 /srv/mediawiki/php-1.41.0-wmf.26/includes/editpage/Constraint/EditFilterMergedContentHookConstraint.php(106): MediaWiki\HookContainer\HookRunner->onEditFilterMergedContent(Object(DerivativeContext), Object(WikitextContent), Object(MediaWiki\Status\Status), 'Fixing double r...', Object(User), true)
#13 /srv/mediawiki/php-1.41.0-wmf.26/includes/editpage/Constraint/EditConstraintRunner.php(88): MediaWiki\EditPage\Constraint\EditFilterMergedContentHookConstraint->checkConstraint()
#14 /srv/mediawiki/php-1.41.0-wmf.26/includes/editpage/EditPage.php(2420): MediaWiki\EditPage\Constraint\EditConstraintRunner->checkConstraints()
#15 /srv/mediawiki/php-1.41.0-wmf.26/includes/editpage/EditPage.php(1813): MediaWiki\EditPage\EditPage->internalAttemptSave(NULL, true, true)
#16 /srv/mediawiki/php-1.41.0-wmf.26/includes/api/ApiEditPage.php(532): MediaWiki\EditPage\EditPage->attemptSave(NULL)
#17 /srv/mediawiki/php-1.41.0-wmf.26/includes/api/ApiMain.php(1929): ApiEditPage->execute()
#18 /srv/mediawiki/php-1.41.0-wmf.26/includes/api/ApiMain.php(906): ApiMain->executeAction()
#19 /srv/mediawiki/php-1.41.0-wmf.26/includes/api/ApiMain.php(877): ApiMain->executeActionWithErrorHandling()
#20 /srv/mediawiki/php-1.41.0-wmf.26/api.php(95): ApiMain->execute()
#21 /srv/mediawiki/php-1.41.0-wmf.26/api.php(48): wfApiMain()
#22 /srv/mediawiki/w/api.php(3): require('/srv/mediawiki/...')
#23 {main}
Second parse
#0 /srv/mediawiki/php-1.41.0-wmf.26/includes/content/ContentHandler.php(1764): MediaWiki\Parser\ParserObserver->notifyParse(Object(MediaWiki\Title\Title), NULL, Object(ParserOptions), Object(WikitextContent), Object(ParserOutput))
#1 /srv/mediawiki/php-1.41.0-wmf.26/includes/content/Renderer/ContentRenderer.php(47): ContentHandler->getParserOutput(Object(WikitextContent), Object(MediaWiki\Content\Renderer\ContentParseParams))
#2 /srv/mediawiki/php-1.41.0-wmf.26/includes/Revision/RenderedRevision.php(260): MediaWiki\Content\Renderer\ContentRenderer->getParserOutput(Object(WikitextContent), Object(MediaWiki\Title\Title), NULL, Object(ParserOptions), true)
#3 /srv/mediawiki/php-1.41.0-wmf.26/includes/Revision/RenderedRevision.php(232): MediaWiki\Revision\RenderedRevision->getSlotParserOutputUncached(Object(WikitextContent), true)
#4 /srv/mediawiki/php-1.41.0-wmf.26/includes/Revision/RevisionRenderer.php(223): MediaWiki\Revision\RenderedRevision->getSlotParserOutput('main', Array)
#5 /srv/mediawiki/php-1.41.0-wmf.26/includes/Revision/RevisionRenderer.php(164): MediaWiki\Revision\RevisionRenderer->combineSlotOutput(Object(MediaWiki\Revision\RenderedRevision), Array)
#6 [internal function]: MediaWiki\Revision\RevisionRenderer->MediaWiki\Revision\{closure}(Object(MediaWiki\Revision\RenderedRevision), Array)
#7 /srv/mediawiki/php-1.41.0-wmf.26/includes/Revision/RenderedRevision.php(199): call_user_func(Object(Closure), Object(MediaWiki\Revision\RenderedRevision), Array)
#8 /srv/mediawiki/php-1.41.0-wmf.26/includes/Storage/DerivedPageDataUpdater.php(1466): MediaWiki\Revision\RenderedRevision->getRevisionParserOutput()
#9 /srv/mediawiki/php-1.41.0-wmf.26/extensions/AbuseFilter/includes/Variables/LazyVariableComputer.php(313): MediaWiki\Storage\DerivedPageDataUpdater->getCanonicalParserOutput()
#10 /srv/mediawiki/php-1.41.0-wmf.26/extensions/AbuseFilter/includes/Variables/VariablesManager.php(79): MediaWiki\Extension\AbuseFilter\Variables\LazyVariableComputer->compute(Object(MediaWiki\Extension\AbuseFilter\Variables\LazyLoadedVariable), Object(MediaWiki\Extension\AbuseFilter\Variables\VariableHolder), Object(Closure))
#11 /srv/mediawiki/php-1.41.0-wmf.26/extensions/AbuseFilter/includes/Variables/VariablesManager.php(77): MediaWiki\Extension\AbuseFilter\Variables\VariablesManager->getVar(Object(MediaWiki\Extension\AbuseFilter\Variables\VariableHolder), 'new_html')
#12 /srv/mediawiki/php-1.41.0-wmf.26/extensions/AbuseFilter/includes/Variables/LazyVariableComputer.php(318): MediaWiki\Extension\AbuseFilter\Variables\VariablesManager->MediaWiki\Extension\AbuseFilter\Variables\{closure}('new_html')
#13 /srv/mediawiki/php-1.41.0-wmf.26/extensions/AbuseFilter/includes/Variables/VariablesManager.php(79): MediaWiki\Extension\AbuseFilter\Variables\LazyVariableComputer->compute(Object(MediaWiki\Extension\AbuseFilter\Variables\LazyLoadedVariable), Object(MediaWiki\Extension\AbuseFilter\Variables\VariableHolder), Object(Closure))
#14 /srv/mediawiki/php-1.41.0-wmf.26/extensions/AbuseFilter/includes/Parser/FilterEvaluator.php(820): MediaWiki\Extension\AbuseFilter\Variables\VariablesManager->getVar(Object(MediaWiki\Extension\AbuseFilter\Variables\VariableHolder), 'new_text', 2)
#15 /srv/mediawiki/php-1.41.0-wmf.26/extensions/AbuseFilter/includes/Parser/FilterEvaluator.php(455): MediaWiki\Extension\AbuseFilter\Parser\FilterEvaluator->getVarValue('new_text')
#16 /srv/mediawiki/php-1.41.0-wmf.26/extensions/AbuseFilter/includes/Parser/FilterEvaluator.php(579): MediaWiki\Extension\AbuseFilter\Parser\FilterEvaluator->evalNode(Object(MediaWiki\Extension\AbuseFilter\Parser\AFPTreeNode))
#17 /srv/mediawiki/php-1.41.0-wmf.26/extensions/AbuseFilter/includes/Parser/FilterEvaluator.php(595): MediaWiki\Extension\AbuseFilter\Parser\FilterEvaluator->evalNode(Object(MediaWiki\Extension\AbuseFilter\Parser\AFPTreeNode))
#18 /srv/mediawiki/php-1.41.0-wmf.26/extensions/AbuseFilter/includes/Parser/FilterEvaluator.php(586): MediaWiki\Extension\AbuseFilter\Parser\FilterEvaluator->evalNode(Object(MediaWiki\Extension\AbuseFilter\Parser\AFPTreeNode))
#19 /srv/mediawiki/php-1.41.0-wmf.26/extensions/AbuseFilter/includes/Parser/FilterEvaluator.php(436): MediaWiki\Extension\AbuseFilter\Parser\FilterEvaluator->evalNode(Object(MediaWiki\Extension\AbuseFilter\Parser\AFPTreeNode))
#20 /srv/mediawiki/php-1.41.0-wmf.26/extensions/AbuseFilter/includes/Parser/FilterEvaluator.php(380): MediaWiki\Extension\AbuseFilter\Parser\FilterEvaluator->evalTree(Object(MediaWiki\Extension\AbuseFilter\Parser\AFPSyntaxTree))
#21 /srv/mediawiki/php-1.41.0-wmf.26/extensions/AbuseFilter/includes/Parser/FilterEvaluator.php(346): MediaWiki\Extension\AbuseFilter\Parser\FilterEvaluator->parse('(action == "edi...')
#22 /srv/mediawiki/php-1.41.0-wmf.26/extensions/AbuseFilter/includes/FilterRunner.php(363): MediaWiki\Extension\AbuseFilter\Parser\FilterEvaluator->checkConditions('(action == "edi...', '7')
#23 /srv/mediawiki/php-1.41.0-wmf.26/extensions/AbuseFilter/includes/FilterRunner.php(324): MediaWiki\Extension\AbuseFilter\FilterRunner->checkFilter(Object(MediaWiki\Extension\AbuseFilter\Filter\ExistingFilter))
#24 /srv/mediawiki/php-1.41.0-wmf.26/extensions/AbuseFilter/includes/FilterRunner.php(216): MediaWiki\Extension\AbuseFilter\FilterRunner->checkAllFiltersInternal()
#25 /srv/mediawiki/php-1.41.0-wmf.26/extensions/AbuseFilter/includes/Hooks/Handlers/FilteredActionsHandler.php(151): MediaWiki\Extension\AbuseFilter\FilterRunner->run()
#26 /srv/mediawiki/php-1.41.0-wmf.26/extensions/AbuseFilter/includes/Hooks/Handlers/FilteredActionsHandler.php(97): MediaWiki\Extension\AbuseFilter\Hooks\Handlers\FilteredActionsHandler->filterEdit(Object(DerivativeContext), Object(User), Object(WikitextContent), 'Fixing double r...', 'main')
#27 /srv/mediawiki/php-1.41.0-wmf.26/includes/HookContainer/HookContainer.php(161): MediaWiki\Extension\AbuseFilter\Hooks\Handlers\FilteredActionsHandler->onEditFilterMergedContent(Object(DerivativeContext), Object(WikitextContent), Object(MediaWiki\Status\Status), 'Fixing double r...', Object(User), true)
#28 /srv/mediawiki/php-1.41.0-wmf.26/includes/HookContainer/HookRunner.php(1474): MediaWiki\HookContainer\HookContainer->run('EditFilterMerge...', Array)
#29 /srv/mediawiki/php-1.41.0-wmf.26/includes/editpage/Constraint/EditFilterMergedContentHookConstraint.php(106): MediaWiki\HookContainer\HookRunner->onEditFilterMergedContent(Object(DerivativeContext), Object(WikitextContent), Object(MediaWiki\Status\Status), 'Fixing double r...', Object(User), true)
#30 /srv/mediawiki/php-1.41.0-wmf.26/includes/editpage/Constraint/EditConstraintRunner.php(88): MediaWiki\EditPage\Constraint\EditFilterMergedContentHookConstraint->checkConstraint()
#31 /srv/mediawiki/php-1.41.0-wmf.26/includes/editpage/EditPage.php(2420): MediaWiki\EditPage\Constraint\EditConstraintRunner->checkConstraints()
#32 /srv/mediawiki/php-1.41.0-wmf.26/includes/editpage/EditPage.php(1813): MediaWiki\EditPage\EditPage->internalAttemptSave(NULL, true, true)
#33 /srv/mediawiki/php-1.41.0-wmf.26/includes/api/ApiEditPage.php(532): MediaWiki\EditPage\EditPage->attemptSave(NULL)
#34 /srv/mediawiki/php-1.41.0-wmf.26/includes/api/ApiMain.php(1929): ApiEditPage->execute()
#35 /srv/mediawiki/php-1.41.0-wmf.26/includes/api/ApiMain.php(906): ApiMain->executeAction()
#36 /srv/mediawiki/php-1.41.0-wmf.26/includes/api/ApiMain.php(877): ApiMain->executeActionWithErrorHandling()
#37 /srv/mediawiki/php-1.41.0-wmf.26/api.php(95): ApiMain->execute()
#38 /srv/mediawiki/php-1.41.0-wmf.26/api.php(48): wfApiMain()
#39 /srv/mediawiki/w/api.php(3): require('/srv/mediawiki/...')
#40 {main}

Ex 3

First parse
#0 /srv/mediawiki/php-1.41.0-wmf.26/includes/content/ContentHandler.php(1764): MediaWiki\Parser\ParserObserver->notifyParse(Object(MediaWiki\Title\Title), NULL, Object(ParserOptions), Object(WikitextContent), Object(ParserOutput))
#1 /srv/mediawiki/php-1.41.0-wmf.26/includes/content/Renderer/ContentRenderer.php(47): ContentHandler->getParserOutput(Object(WikitextContent), Object(MediaWiki\Content\Renderer\ContentParseParams))
#2 /srv/mediawiki/php-1.41.0-wmf.26/extensions/SpamBlacklist/includes/Hooks.php(302): MediaWiki\Content\Renderer\ContentRenderer->getParserOutput(Object(WikitextContent), Object(MediaWiki\Title\Title), NULL, Object(ParserOptions))
#3 /srv/mediawiki/php-1.41.0-wmf.26/includes/HookContainer/HookContainer.php(161): MediaWiki\Extension\SpamBlacklist\Hooks->onUploadVerifyUpload(Object(UploadFromFile), Object(User), Array, '', '== {{int:filede...', NULL)
#4 /srv/mediawiki/php-1.41.0-wmf.26/includes/HookContainer/HookRunner.php(4149): MediaWiki\HookContainer\HookContainer->run('UploadVerifyUpl...', Array)
#5 /srv/mediawiki/php-1.41.0-wmf.26/includes/upload/UploadBase.php(910): MediaWiki\HookContainer\HookRunner->onUploadVerifyUpload(Object(UploadFromFile), Object(User), Array, '', '== {{int:filede...', NULL)
#6 /srv/mediawiki/php-1.41.0-wmf.26/includes/api/ApiUpload.php(905): UploadBase->performUpload('', '== {{int:filede...', true, Object(User), Array, NULL)
#7 /srv/mediawiki/php-1.41.0-wmf.26/includes/api/ApiUpload.php(171): ApiUpload->performUpload(Array)
#8 /srv/mediawiki/php-1.41.0-wmf.26/includes/api/ApiUpload.php(129): ApiUpload->getContextResult()
#9 /srv/mediawiki/php-1.41.0-wmf.26/includes/api/ApiMain.php(1929): ApiUpload->execute()
#10 /srv/mediawiki/php-1.41.0-wmf.26/includes/api/ApiMain.php(906): ApiMain->executeAction()
#11 /srv/mediawiki/php-1.41.0-wmf.26/includes/api/ApiMain.php(877): ApiMain->executeActionWithErrorHandling()
#12 /srv/mediawiki/php-1.41.0-wmf.26/api.php(95): ApiMain->execute()
#13 /srv/mediawiki/php-1.41.0-wmf.26/api.php(48): wfApiMain()
#14 /srv/mediawiki/w/api.php(3): require('/srv/mediawiki/...')
#15 {main}
Second parse
#0 /srv/mediawiki/php-1.41.0-wmf.26/includes/content/ContentHandler.php(1764): MediaWiki\Parser\ParserObserver->notifyParse(Object(MediaWiki\Title\Title), NULL, Object(ParserOptions), Object(WikitextContent), Object(ParserOutput))
#1 /srv/mediawiki/php-1.41.0-wmf.26/includes/content/Renderer/ContentRenderer.php(47): ContentHandler->getParserOutput(Object(WikitextContent), Object(MediaWiki\Content\Renderer\ContentParseParams))
#2 /srv/mediawiki/php-1.41.0-wmf.26/includes/Revision/RenderedRevision.php(260): MediaWiki\Content\Renderer\ContentRenderer->getParserOutput(Object(WikitextContent), Object(MediaWiki\Title\Title), NULL, Object(ParserOptions), true)
#3 /srv/mediawiki/php-1.41.0-wmf.26/includes/Revision/RenderedRevision.php(232): MediaWiki\Revision\RenderedRevision->getSlotParserOutputUncached(Object(WikitextContent), true)
#4 /srv/mediawiki/php-1.41.0-wmf.26/includes/Revision/RevisionRenderer.php(223): MediaWiki\Revision\RenderedRevision->getSlotParserOutput('main', Array)
#5 /srv/mediawiki/php-1.41.0-wmf.26/includes/Revision/RevisionRenderer.php(164): MediaWiki\Revision\RevisionRenderer->combineSlotOutput(Object(MediaWiki\Revision\RenderedRevision), Array)
#6 [internal function]: MediaWiki\Revision\RevisionRenderer->MediaWiki\Revision\{closure}(Object(MediaWiki\Revision\RenderedRevision), Array)
#7 /srv/mediawiki/php-1.41.0-wmf.26/includes/Revision/RenderedRevision.php(199): call_user_func(Object(Closure), Object(MediaWiki\Revision\RenderedRevision), Array)
#8 /srv/mediawiki/php-1.41.0-wmf.26/includes/Storage/DerivedPageDataUpdater.php(1466): MediaWiki\Revision\RenderedRevision->getRevisionParserOutput()
#9 [internal function]: MediaWiki\Storage\DerivedPageDataUpdater->getCanonicalParserOutput()
#10 /srv/mediawiki/php-1.41.0-wmf.26/includes/edit/PreparedEdit.php(97): call_user_func(Array)
#11 /srv/mediawiki/php-1.41.0-wmf.26/includes/edit/PreparedEdit.php(112): MediaWiki\Edit\PreparedEdit->getOutput()
#12 /srv/mediawiki/php-1.41.0-wmf.26/extensions/AbuseFilter/includes/Variables/LazyVariableComputer.php(209): MediaWiki\Edit\PreparedEdit->__get('output')
#13 /srv/mediawiki/php-1.41.0-wmf.26/extensions/AbuseFilter/includes/Variables/VariablesManager.php(79): MediaWiki\Extension\AbuseFilter\Variables\LazyVariableComputer->compute(Object(MediaWiki\Extension\AbuseFilter\Variables\LazyLoadedVariable), Object(MediaWiki\Extension\AbuseFilter\Variables\VariableHolder), Object(Closure))
#14 /srv/mediawiki/php-1.41.0-wmf.26/extensions/AbuseFilter/includes/Variables/VariablesManager.php(77): MediaWiki\Extension\AbuseFilter\Variables\VariablesManager->getVar(Object(MediaWiki\Extension\AbuseFilter\Variables\VariableHolder), 'all_links')
#15 /srv/mediawiki/php-1.41.0-wmf.26/extensions/AbuseFilter/includes/Variables/LazyVariableComputer.php(270): MediaWiki\Extension\AbuseFilter\Variables\VariablesManager->MediaWiki\Extension\AbuseFilter\Variables\{closure}('all_links')
#16 /srv/mediawiki/php-1.41.0-wmf.26/extensions/AbuseFilter/includes/Variables/VariablesManager.php(79): MediaWiki\Extension\AbuseFilter\Variables\LazyVariableComputer->compute(Object(MediaWiki\Extension\AbuseFilter\Variables\LazyLoadedVariable), Object(MediaWiki\Extension\AbuseFilter\Variables\VariableHolder), Object(Closure))
#17 /srv/mediawiki/php-1.41.0-wmf.26/extensions/AbuseFilter/includes/Parser/FilterEvaluator.php(820): MediaWiki\Extension\AbuseFilter\Variables\VariablesManager->getVar(Object(MediaWiki\Extension\AbuseFilter\Variables\VariableHolder), 'added_links', 2)
#18 /srv/mediawiki/php-1.41.0-wmf.26/extensions/AbuseFilter/includes/Parser/FilterEvaluator.php(455): MediaWiki\Extension\AbuseFilter\Parser\FilterEvaluator->getVarValue('added_links')
#19 /srv/mediawiki/php-1.41.0-wmf.26/extensions/AbuseFilter/includes/Parser/FilterEvaluator.php(541): MediaWiki\Extension\AbuseFilter\Parser\FilterEvaluator->evalNode(Object(MediaWiki\Extension\AbuseFilter\Parser\AFPTreeNode))
#20 /srv/mediawiki/php-1.41.0-wmf.26/extensions/AbuseFilter/includes/Parser/FilterEvaluator.php(586): MediaWiki\Extension\AbuseFilter\Parser\FilterEvaluator->evalNode(Object(MediaWiki\Extension\AbuseFilter\Parser\AFPTreeNode))
#21 /srv/mediawiki/php-1.41.0-wmf.26/extensions/AbuseFilter/includes/Parser/FilterEvaluator.php(595): MediaWiki\Extension\AbuseFilter\Parser\FilterEvaluator->evalNode(Object(MediaWiki\Extension\AbuseFilter\Parser\AFPTreeNode))
#22 /srv/mediawiki/php-1.41.0-wmf.26/extensions/AbuseFilter/includes/Parser/FilterEvaluator.php(436): MediaWiki\Extension\AbuseFilter\Parser\FilterEvaluator->evalNode(Object(MediaWiki\Extension\AbuseFilter\Parser\AFPTreeNode))
#23 /srv/mediawiki/php-1.41.0-wmf.26/extensions/AbuseFilter/includes/Parser/FilterEvaluator.php(380): MediaWiki\Extension\AbuseFilter\Parser\FilterEvaluator->evalTree(Object(MediaWiki\Extension\AbuseFilter\Parser\AFPSyntaxTree))
#24 /srv/mediawiki/php-1.41.0-wmf.26/extensions/AbuseFilter/includes/Parser/FilterEvaluator.php(346): MediaWiki\Extension\AbuseFilter\Parser\FilterEvaluator->parse('!"autoconfirmed...')
#25 /srv/mediawiki/php-1.41.0-wmf.26/extensions/AbuseFilter/includes/FilterRunner.php(363): MediaWiki\Extension\AbuseFilter\Parser\FilterEvaluator->checkConditions('!"autoconfirmed...', 'global-250')
#26 /srv/mediawiki/php-1.41.0-wmf.26/extensions/AbuseFilter/includes/FilterRunner.php(330): MediaWiki\Extension\AbuseFilter\FilterRunner->checkFilter(Object(MediaWiki\Extension\AbuseFilter\Filter\ExistingFilter), true)
#27 /srv/mediawiki/php-1.41.0-wmf.26/extensions/AbuseFilter/includes/FilterRunner.php(216): MediaWiki\Extension\AbuseFilter\FilterRunner->checkAllFiltersInternal()
#28 /srv/mediawiki/php-1.41.0-wmf.26/extensions/AbuseFilter/includes/Hooks/Handlers/FilteredActionsHandler.php(288): MediaWiki\Extension\AbuseFilter\FilterRunner->run()
#29 /srv/mediawiki/php-1.41.0-wmf.26/extensions/AbuseFilter/includes/Hooks/Handlers/FilteredActionsHandler.php(238): MediaWiki\Extension\AbuseFilter\Hooks\Handlers\FilteredActionsHandler->filterUpload('upload', Object(UploadFromFile), Object(User), Array, '', '== {{int:filede...', NULL)
#30 /srv/mediawiki/php-1.41.0-wmf.26/includes/HookContainer/HookContainer.php(161): MediaWiki\Extension\AbuseFilter\Hooks\Handlers\FilteredActionsHandler->onUploadVerifyUpload(Object(UploadFromFile), Object(User), Array, '', '== {{int:filede...', NULL)
#31 /srv/mediawiki/php-1.41.0-wmf.26/includes/HookContainer/HookRunner.php(4149): MediaWiki\HookContainer\HookContainer->run('UploadVerifyUpl...', Array)
#32 /srv/mediawiki/php-1.41.0-wmf.26/includes/upload/UploadBase.php(910): MediaWiki\HookContainer\HookRunner->onUploadVerifyUpload(Object(UploadFromFile), Object(User), Array, '', '== {{int:filede...', NULL)
#33 /srv/mediawiki/php-1.41.0-wmf.26/includes/api/ApiUpload.php(905): UploadBase->performUpload('', '== {{int:filede...', true, Object(User), Array, NULL)
#34 /srv/mediawiki/php-1.41.0-wmf.26/includes/api/ApiUpload.php(171): ApiUpload->performUpload(Array)
#35 /srv/mediawiki/php-1.41.0-wmf.26/includes/api/ApiUpload.php(129): ApiUpload->getContextResult()
#36 /srv/mediawiki/php-1.41.0-wmf.26/includes/api/ApiMain.php(1929): ApiUpload->execute()
#37 /srv/mediawiki/php-1.41.0-wmf.26/includes/api/ApiMain.php(906): ApiMain->executeAction()
#38 /srv/mediawiki/php-1.41.0-wmf.26/includes/api/ApiMain.php(877): ApiMain->executeActionWithErrorHandling()
#39 /srv/mediawiki/php-1.41.0-wmf.26/api.php(95): ApiMain->execute()
#40 /srv/mediawiki/php-1.41.0-wmf.26/api.php(48): wfApiMain()
#41 /srv/mediawiki/w/api.php(3): require('/srv/mediawiki/...')
#42 {main}

Ex 1

AbuseFilter and ConfirmEdit invoke legacy code and do not share a WikiPage instance (probably due to hacks in MediaWikiEditFilterHookRunner).

Ex 2

This one is suspicious. SpamBlacklist calls PreparedUpdate::getParserOutputForMetaData, AbuseFilter calls PreparedUpdate::getCanonicalParserOutput, yet they do not share the parse operation.

Ex 3

Cannot share the parse operation between AbuseFilter and SpamBlacklist during file upload. This is expected because the hook provides no WikiPage to be shared.

Change #1084169 had a related patch set uploaded (by Matěj Suchánek; author: Matěj Suchánek):

[mediawiki/extensions/AbuseFilter@master] Load new_pst from PreparedUpdate if possible

https://gerrit.wikimedia.org/r/1084169

Change #1084169 merged by jenkins-bot:

[mediawiki/extensions/AbuseFilter@master] Load new_pst from PreparedUpdate if possible

https://gerrit.wikimedia.org/r/1084169