Skip to content
Snippets Groups Projects
Verified Commit 213906e2 authored by Alex Pott's avatar Alex Pott
Browse files

Issue #3414287 by catch, longwave: Avoid reading session from the database...

Issue #3414287 by catch, longwave: Avoid reading session from the database multiple times during a big pipe request
parent 4e26ae9c
No related branches found
No related tags found
33 merge requests!11131[10.4.x-only-DO-NOT-MERGE]: Issue ##2842525 Ajax attached to Views exposed filter form does not trigger callbacks,!9470[10.3.x-only-DO-NOT-MERGE]: #3331771 Fix file_get_contents(): Passing null to parameter,!8540Issue #3457061: Bootstrap Modal dialog Not closing after 10.3.0 Update,!8528Issue #3456871 by Tim Bozeman: Support NULL services,!8373Issue #3427374 by danflanagan8, Vighneshh: taxonomy_tid ViewsArgumentDefault...,!7526Expose roles in response,!7352Draft: Resolve #3203489 "Set filename as",!6880Add @property to the DateTimeItem,!6791Issue #3163299: Ajax exposed filters not working for multiple instances of the same Views block placed on one page,!3878Removed unused condition head title for views,!3818Issue #2140179: $entity->original gets stale between updates,!3742Issue #3328429: Create item list field formatter for displaying ordered and unordered lists,!3731Claro: role=button on status report items,!3668Resolve #3347842 "Deprecate the trusted",!3651Issue #3347736: Create new SDC component for Olivero (header-search),!3531Issue #3336994: StringFormatter always displays links to entity even if the user in context does not have access,!3355Issue #3209129: Scrolling problems when adding a block via layout builder,!3154Fixes #2987987 - CSRF token validation broken on routes with optional parameters.,!3133core/modules/system/css/components/hidden.module.css,!2964Issue #2865710 : Dependencies from only one instance of a widget are used in display modes,!2812Issue #3312049: [Followup] Fix Drupal.Commenting.FunctionComment.MissingReturnType returns for NULL,!2794Issue #3100732: Allow specifying `meta` data on JSON:API objects,!2378Issue #2875033: Optimize joins and table selection in SQL entity query implementation,!2334Issue #3228209: Add hasRole() method to AccountInterface,!2062Issue #3246454: Add weekly granularity to views date sort,!1105Issue #3025039: New non translatable field on translatable content throws error,!1073issue #3191727: Focus states on mobile second level navigation items fixed,!10223132456: Fix issue where views instances are emptied before an ajax request is complete,!877Issue #2708101: Default value for link text is not saved,!617Issue #3043725: Provide a Entity Handler for user cancelation,!579Issue #2230909: Simple decimals fail to pass validation,!560Move callback classRemove outside of the loop,!555Issue #3202493
Pipeline #101741 canceled
Pipeline: drupal

#101744

    <?php
    namespace Drupal\Core\Session;
    /**
    * Indicates that sessions for this response should be kept open after sending.
    *
    * By default, Drupal closes sessions as soon as the response is sent. If
    * a response implements this interface, Drupal will skip this behavior and
    * assume that the session will be closed manually later in the request.
    *
    * @see Drupal\Core\StackMiddleware\Session
    * @see Drupal\big_pipe\src\Render\BigPipeResponse
    * @internal
    */
    interface ResponseKeepSessionOpenInterface {}
    ...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
    namespace Drupal\Core\StackMiddleware; namespace Drupal\Core\StackMiddleware;
    use Drupal\Core\Session\ResponseKeepSessionOpenInterface;
    use Symfony\Component\DependencyInjection\ContainerAwareTrait; use Symfony\Component\DependencyInjection\ContainerAwareTrait;
    use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Request;
    use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\Response;
    ...@@ -58,7 +59,7 @@ public function handle(Request $request, $type = self::MAIN_REQUEST, $catch = TR ...@@ -58,7 +59,7 @@ public function handle(Request $request, $type = self::MAIN_REQUEST, $catch = TR
    $result = $this->httpKernel->handle($request, $type, $catch); $result = $this->httpKernel->handle($request, $type, $catch);
    if ($type === self::MAIN_REQUEST && PHP_SAPI !== 'cli' && $request->hasSession()) { if ($type === self::MAIN_REQUEST && !$result instanceof ResponseKeepSessionOpenInterface && PHP_SAPI !== 'cli' && $request->hasSession()) {
    $request->getSession()->save(); $request->getSession()->save();
    } }
    ......
    ...@@ -220,16 +220,6 @@ public function __construct(RendererInterface $renderer, SessionInterface $sessi ...@@ -220,16 +220,6 @@ public function __construct(RendererInterface $renderer, SessionInterface $sessi
    } }
    } }
    /**
    * Performs tasks before sending content (and rendering placeholders).
    */
    protected function performPreSendTasks() {
    // The content in the placeholders may depend on the session, and by the
    // time the response is sent (see index.php), the session is already
    // closed. Reopen it for the duration that we are rendering placeholders.
    $this->session->start();
    }
    /** /**
    * Performs tasks after sending content (and rendering placeholders). * Performs tasks after sending content (and rendering placeholders).
    */ */
    ...@@ -282,8 +272,6 @@ public function sendContent(BigPipeResponse $response) { ...@@ -282,8 +272,6 @@ public function sendContent(BigPipeResponse $response) {
    $cumulative_assets = AttachedAssets::createFromRenderArray(['#attached' => $attachments]); $cumulative_assets = AttachedAssets::createFromRenderArray(['#attached' => $attachments]);
    $cumulative_assets->setAlreadyLoadedLibraries($attachments['library']); $cumulative_assets->setAlreadyLoadedLibraries($attachments['library']);
    $this->performPreSendTasks();
    // Find the closing </body> tag and get the strings before and after. But be // Find the closing </body> tag and get the strings before and after. But be
    // careful to use the latest occurrence of the string "</body>", to ensure // careful to use the latest occurrence of the string "</body>", to ensure
    // that strings in inline JavaScript or CDATA sections aren't used instead. // that strings in inline JavaScript or CDATA sections aren't used instead.
    ......
    ...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
    namespace Drupal\big_pipe\Render; namespace Drupal\big_pipe\Render;
    use Drupal\Core\Render\HtmlResponse; use Drupal\Core\Render\HtmlResponse;
    use Drupal\Core\Session\ResponseKeepSessionOpenInterface;
    /** /**
    * A response that is sent in chunks by the BigPipe service. * A response that is sent in chunks by the BigPipe service.
    ...@@ -18,7 +19,7 @@ ...@@ -18,7 +19,7 @@
    * created in https://www.drupal.org/node/2577631. Only code internal to * created in https://www.drupal.org/node/2577631. Only code internal to
    * BigPipe should instantiate or type hint to this class. * BigPipe should instantiate or type hint to this class.
    */ */
    class BigPipeResponse extends HtmlResponse { class BigPipeResponse extends HtmlResponse implements ResponseKeepSessionOpenInterface {
    /** /**
    * The BigPipe service. * The BigPipe service.
    ......
    ...@@ -35,8 +35,7 @@ public function testFrontPageAuthenticatedWarmCache(): void { ...@@ -35,8 +35,7 @@ public function testFrontPageAuthenticatedWarmCache(): void {
    $performance_data = $this->collectPerformanceData(function () { $performance_data = $this->collectPerformanceData(function () {
    $this->drupalGet('<front>'); $this->drupalGet('<front>');
    }, 'authenticatedFrontPage'); }, 'authenticatedFrontPage');
    $this->assertGreaterThanOrEqual(10, $performance_data->getQueryCount()); $this->assertCountBetween(9, 11, $performance_data->getQueryCount());
    $this->assertLessThanOrEqual(12, $performance_data->getQueryCount());
    $this->assertSame(45, $performance_data->getCacheGetCount()); $this->assertSame(45, $performance_data->getCacheGetCount());
    $this->assertSame(0, $performance_data->getCacheSetCount()); $this->assertSame(0, $performance_data->getCacheSetCount());
    $this->assertSame(0, $performance_data->getCacheDeleteCount()); $this->assertSame(0, $performance_data->getCacheDeleteCount());
    ......
    ...@@ -113,7 +113,7 @@ public function testLogin(): void { ...@@ -113,7 +113,7 @@ public function testLogin(): void {
    $this->submitLoginForm($account); $this->submitLoginForm($account);
    }); });
    $this->assertCountBetween(26, 31, $performance_data->getQueryCount()); $this->assertCountBetween(25, 30, $performance_data->getQueryCount());
    $this->assertSame(64, $performance_data->getCacheGetCount()); $this->assertSame(64, $performance_data->getCacheGetCount());
    $this->assertSame(1, $performance_data->getCacheSetCount()); $this->assertSame(1, $performance_data->getCacheSetCount());
    $this->assertSame(1, $performance_data->getCacheDeleteCount()); $this->assertSame(1, $performance_data->getCacheDeleteCount());
    ...@@ -146,7 +146,7 @@ public function testLoginBlock(): void { ...@@ -146,7 +146,7 @@ public function testLoginBlock(): void {
    $performance_data = $this->collectPerformanceData(function () use ($account) { $performance_data = $this->collectPerformanceData(function () use ($account) {
    $this->submitLoginForm($account); $this->submitLoginForm($account);
    }); });
    $this->assertCountBetween(31, 34, $performance_data->getQueryCount()); $this->assertCountBetween(30, 33, $performance_data->getQueryCount());
    $this->assertSame(85, $performance_data->getCacheGetCount()); $this->assertSame(85, $performance_data->getCacheGetCount());
    $this->assertSame(1, $performance_data->getCacheSetCount()); $this->assertSame(1, $performance_data->getCacheSetCount());
    $this->assertSame(1, $performance_data->getCacheDeleteCount()); $this->assertSame(1, $performance_data->getCacheDeleteCount());
    ......
    0% Loading or .
    You are about to add 0 people to the discussion. Proceed with caution.
    Finish editing this message first!
    Please register or to comment