Set cpPosTime cookie for the non-redirect case as well
authorAaron Schulz <aschulz@wikimedia.org>
Wed, 14 Sep 2016 06:52:05 +0000 (23:52 -0700)
committerAaron Schulz <aschulz@wikimedia.org>
Wed, 14 Sep 2016 06:52:11 +0000 (23:52 -0700)
This is useful if the ChronologyProtector store cannot sync
among datacenters and waitForReplication() is DC-local.
It only applies if the user stays on the domain, however.

Change-Id: I800cade7b87a0f02d6a429e70924c54189a4a7af

includes/MediaWiki.php

index 5ea8c31..9bbbd35 100644 (file)
@@ -604,6 +604,14 @@ class MediaWiki {
                        // OutputPage::output() is fairly slow; run it in $postCommitWork to mask
                        // the latency of syncing DB positions accross all datacenters synchronously
                        $flags = $lbFactory::SHUTDOWN_CHRONPROT_SYNC;
+                       if ( $lbFactory->hasOrMadeRecentMasterChanges( INF ) ) {
+                               $cpPosTime = microtime( true );
+                               // Set a cookie in case the DB position store cannot sync accross datacenters.
+                               // This will at least cover the common case of the user staying on the domain.
+                               $expires = time() + ChronologyProtector::POSITION_TTL;
+                               $options = [ 'prefix' => '' ];
+                               $request->response()->setCookie( 'cpPosTime', $cpPosTime, $expires, $options );
+                       }
                }
                // Record ChronologyProtector positions for DBs affected in this request at this point
                $lbFactory->shutdown( $flags, $postCommitWork );