* @param Title $requestTitle The original title, before any redirects were applied
*/
private function performAction( Page $page, Title $requestTitle ) {
-
$request = $this->context->getRequest();
$output = $this->context->getOutput();
$title = $this->context->getTitle();
}
$act = $this->getAction();
-
$action = Action::factory( $act, $page, $this->context );
if ( $action instanceof Action ) {
+ // Narrow DB query expectations for this HTTP request
+ $trxLimits = $this->config->get( 'TrxProfilerLimits' );
+ $trxProfiler = Profiler::instance()->getTransactionProfiler();
+ if ( $request->wasPosted() && !$action->doesWrites() ) {
+ $trxProfiler->setExpectations( $trxLimits['POST-nonwrite'], __METHOD__ );
+ }
+
# Let CDN cache things if we can purge them.
if ( $this->config->get( 'UseSquid' ) &&
in_array(
$output->setStatusCode( 404 );
$output->showErrorPage( 'nosuchaction', 'nosuchactiontext' );
}
-
}
/**
} );
} );
// Commit all changes
- $factory->commitMasterChanges();
+ $factory->commitMasterChanges( __METHOD__ );
// Record ChronologyProtector positions
$factory->shutdown();
wfDebug( __METHOD__ . ': all transactions committed' );
DeferredUpdates::doUpdates( 'enqueue', DeferredUpdates::PRESEND );
wfDebug( __METHOD__ . ': pre-send deferred updates completed' );
- // Set a cookie to tell all CDN edge nodes to "stick" the user to the
- // DC that handles this POST request (e.g. the "master" data center)
+ // Set a cookie to tell all CDN edge nodes to "stick" the user to the DC that handles this
+ // POST request (e.g. the "master" data center). Also have the user briefly bypass CDN so
+ // ChronologyProtector works for cacheable URLs.
$request = $context->getRequest();
if ( $request->wasPosted() && $factory->hasOrMadeRecentMasterChanges() ) {
$expires = time() + $config->get( 'DataCenterUpdateStickTTL' );
- $request->response()->setCookie( 'UseDC', 'master', $expires, array( 'prefix' => '' ) );
+ $options = array( 'prefix' => '' );
+ $request->response()->setCookie( 'UseDC', 'master', $expires, $options );
+ $request->response()->setCookie( 'UseCDNCache', 'false', $expires, $options );
}
- // Avoid letting a few seconds of slave lag cause a month of stale data
+ // Avoid letting a few seconds of slave lag cause a month of stale data. This logic is
+ // also intimately related to the value of $wgCdnReboundPurgeDelay.
if ( $factory->laggedSlaveUsed() ) {
$maxAge = $config->get( 'CdnMaxageLagged' );
$context->getOutput()->lowerCdnMaxage( $maxAge );
}
private function main() {
- global $wgTitle, $wgTrxProfilerLimits;
+ global $wgTitle;
$request = $this->context->getRequest();
$action = $this->getAction();
$wgTitle = $title;
+ // Set DB query expectations for this HTTP request
+ $trxLimits = $this->config->get( 'TrxProfilerLimits' );
$trxProfiler = Profiler::instance()->getTransactionProfiler();
$trxProfiler->setLogger( LoggerFactory::getInstance( 'DBPerformance' ) );
-
if ( $request->wasPosted() ) {
- $trxProfiler->setExpectations( $wgTrxProfilerLimits['POST'], __METHOD__ );
+ $trxProfiler->setExpectations( $trxLimits['POST'], __METHOD__ );
} else {
- $trxProfiler->setExpectations( $wgTrxProfilerLimits['GET'], __METHOD__ );
+ $trxProfiler->setExpectations( $trxLimits['GET'], __METHOD__ );
}
// If the user has forceHTTPS set to true, or if the user
if (
$request->getProtocol() == 'http' &&
(
+ $request->getSession()->shouldForceHTTPS() ||
+ // Check the cookie manually, for paranoia
$request->getCookie( 'forceHTTPS', '' ) ||
- // check for prefixed version for currently logged in users
+ // check for prefixed version that was used for a time in older MW versions
$request->getCookie( 'forceHTTPS' ) ||
// Avoid checking the user and groups unless it's enabled.
(
*/
public function restInPeace( $mode = 'fast' ) {
// Assure deferred updates are not in the main transaction
- wfGetLBFactory()->commitMasterChanges();
+ wfGetLBFactory()->commitMasterChanges( __METHOD__ );
// Ignore things like master queries/connections on GET requests
// as long as they are in deferred updates (which catch errors).
// Commit and close up!
$factory = wfGetLBFactory();
- $factory->commitMasterChanges();
+ $factory->commitMasterChanges( __METHOD__ );
$factory->shutdown( LBFactory::SHUTDOWN_NO_CHRONPROT );
wfDebug( "Request ended normally\n" );