From d732604e62ddabd96f81cc2a64fb286eb1f9a8cc Mon Sep 17 00:00:00 2001 From: Hereward Cooper Date: Mon, 13 Apr 2026 15:21:15 -0700 Subject: [PATCH] date race condition fix --- .../SemanticDependency/src/Hooks.php | 32 ++++++++++--------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/webserver/html/ropewiki/extensions/SemanticDependency/src/Hooks.php b/webserver/html/ropewiki/extensions/SemanticDependency/src/Hooks.php index 3a44086..67178be 100644 --- a/webserver/html/ropewiki/extensions/SemanticDependency/src/Hooks.php +++ b/webserver/html/ropewiki/extensions/SemanticDependency/src/Hooks.php @@ -3,13 +3,9 @@ namespace MediaWiki\Extension\SemanticDependency; use MediaWiki\MediaWikiServices; -use MediaWiki\Revision\RevisionRecord; -use MediaWiki\Storage\EditResult; -use MediaWiki\User\UserIdentity; use Parser; use SMWUpdateJob; use Title; -use WikiPage; class Hooks { @@ -62,31 +58,37 @@ public static function onPageSaveComplete( return; } - foreach ( self::$pagesToRefresh as $title ) { + // Capture the pages to refresh and clear the static array immediately + $pagesToRefresh = self::$pagesToRefresh; + self::$pagesToRefresh = []; + + // Push SMWUpdateJobs to the job queue instead of running them immediately + // This allows SMW to process the current page's semantic data first + // (via its own queued jobs) before dependent pages query for it + $jobQueueGroup = MediaWikiServices::getInstance()->getJobQueueGroup(); + + foreach ( $pagesToRefresh as $title ) { if ( !$title->exists() ) { self::log( "Skipping non-existent page: " . $title->getText() ); continue; } $targetTitle = $title->getText(); - self::log( "Starting update job for dependent page: {$targetTitle}" ); + self::log( "Pushing SMWUpdateJob to queue for dependent page: {$targetTitle}" ); try { $updateJob = new SMWUpdateJob( $title ); - $result = $updateJob->run(); - - if ( $result ) { - self::log( "Successfully completed update job for: {$targetTitle}" ); - } else { - self::log( "WARNING: Update job returned false for: {$targetTitle}" ); - } + // Add a release timestamp to delay job execution by 5 seconds + // This ensures SMW's own jobs for the current page run first + $updateJob->setDelay( 5 ); + $jobQueueGroup->push( $updateJob ); + self::log( "Successfully queued update job with 5s delay for: {$targetTitle}" ); } catch ( \Exception $e ) { - self::log( "ERROR updating {$targetTitle}: " . $e->getMessage() ); + self::log( "ERROR queueing job for {$targetTitle}: " . $e->getMessage() ); } } self::log( "PageSaveComplete hook completed for: {$articleTitle}" ); - self::$pagesToRefresh = []; } private static function log( string $message ): void {