Problem/Motivation

Theme registry icreates the cache on the construct which is very early. Cache record should be created instead when the results are actually being needed.

Proposed resolution

Create getter methods for all the parameters that are wanted to cache so that they can implement logic for cache misses.

Remaining tasks

-

User interface changes

-

API changes

-

Beta phase evaluation

Reference: https://www.drupal.org/core/beta-changes
Issue category Task because issue is to improve performance
Issue priority Major because it contains performance improvements
Prioritized changes The main goal of this issue is performance improvements which is considered to be prioritized change.
Disruption Could be disruptive for contributed because it includes a API change.
CommentFileSizeAuthor
#76 2472285-76.patch16.85 KBopdavies
#61 interdiff.txt1.59 KBlauriii
#61 make_theme_registry-2472285-61.patch16.84 KBlauriii
#57 make_theme_registry-2472285-57.patch16.7 KBlauriii
#57 interdiff.txt6.4 KBlauriii
#52 interdiff-2472285-50-52.txt1.56 KBcsg
#52 make_theme_registry-2472285-52.patch12.79 KBcsg
#50 interdiff.txt4.89 KBlauriii
#50 make_theme_registry-2472285-50.patch11.79 KBlauriii
#46 interdiff.txt534 byteslauriii
#46 make_theme_registry-2472285-46.patch7.69 KBlauriii
#36 interdiff-36.txt688 bytesjoshi.rohit100
#36 make_theme_registry_use-2472285-36.patch7.7 KBjoshi.rohit100
#30 interdiff.txt1.93 KBlauriii
#30 make_theme_registry_use-2472285-28.patch7.71 KBlauriii
#26 make_theme_registry_use-2472285-26.patch6.66 KBlauriii
#26 interdiff.txt5.8 KBlauriii
#22 interdiff.txt2.12 KBlauriii
#22 make_theme_registry_use-2472285-22.patch12.05 KBlauriii
#21 interdiff.txt632 byteslauriii
#21 make_theme_registry_use-2472285-21.patch10.48 KBlauriii
#19 interdiff.txt2.83 KBlauriii
#19 make_theme_registry_use-2472285-19.patch10.48 KBlauriii
#15 make_theme_registry_use-2472285-15.patch10.62 KBlauriii
#15 interdiff.txt632 byteslauriii
#14 make_theme_registry_use-2472285-14.patch10.63 KBlauriii
#14 interdiff.txt1.93 KBlauriii
#12 make_theme_registry_use-2472285-11.patch10.4 KBlauriii
#11 interdiff.txt2.66 KBlauriii
#7 interdiff.txt2.27 KBlauriii
#7 make_theme_registry_use-2472285-7.patch9.82 KBlauriii
#5 interdiff.txt989 byteslauriii
#5 make_theme_registry_use-2472285-5.patch7.43 KBlauriii
#3 make_theme_registry_use-2472285-3.patch7.26 KBlauriii
Support from Acquia helps fund testing for Drupal Acquia logo

Comments

Fabianx’s picture

Issue tags: +Twig

Tagging

lauriii’s picture

I think this issue is more than just changing the cid to be not set in constructor. Theme registry is not lazy loading at the moment and I think that should be done here.

lauriii’s picture

Status: Active » Needs review
FileSize
7.26 KB

Lets see how many tests I'm able to break with this!

Status: Needs review » Needs work

The last submitted patch, 3: make_theme_registry_use-2472285-3.patch, failed testing.

lauriii’s picture

Status: Needs work » Needs review
FileSize
7.43 KB
989 bytes

Status: Needs review » Needs work

The last submitted patch, 5: make_theme_registry_use-2472285-5.patch, failed testing.

lauriii’s picture

Status: Needs work » Needs review
FileSize
9.82 KB
2.27 KB
dawehner’s picture

Just some quick comments ...

+++ b/core/lib/Drupal/Core/Utility/ThemeRegistry.php
@@ -38,10 +38,13 @@ class ThemeRegistry extends CacheCollector implements DestructableInterface {
   /**
+   * Whether all modules have already been loaded.
+   */
+  protected $modules_loaded;

@@ -51,32 +54,64 @@ class ThemeRegistry extends CacheCollector implements DestructableInterface {
+    $this->modules_loaded;
+  }

Note: We never assign the variable :) Also, maybe consider to use camelCase.

The last submitted patch, 5: make_theme_registry_use-2472285-5.patch, failed testing.

Status: Needs review » Needs work

The last submitted patch, 7: make_theme_registry_use-2472285-7.patch, failed testing.

lauriii’s picture

Status: Needs work » Needs review
FileSize
2.66 KB
lauriii’s picture

Missed the patch file :P

Status: Needs review » Needs work

The last submitted patch, 12: make_theme_registry_use-2472285-11.patch, failed testing.

lauriii’s picture

Status: Needs work » Needs review
FileSize
1.93 KB
10.63 KB
lauriii’s picture

Status: Needs review » Needs work

The last submitted patch, 15: make_theme_registry_use-2472285-15.patch, failed testing.

Status: Needs work » Needs review
star-szr’s picture

Status: Needs review » Needs work

Overall looks very good! Nice work @lauriii.

  1. +++ b/core/lib/Drupal/Core/Utility/ThemeRegistry.php
    @@ -38,45 +39,90 @@ class ThemeRegistry extends CacheCollector implements DestructableInterface {
       /**
    +   * Whether all modules have already been loaded.
    +   */
    +  protected $modulesLoaded;
    

    I think this needs a @var with the type.

  2. +++ b/core/lib/Drupal/Core/Utility/ThemeRegistry.php
    @@ -38,45 +39,90 @@ class ThemeRegistry extends CacheCollector implements DestructableInterface {
    +        // to function correctly on non-registered theme hooks without triggering
    +        // a call to resolveCacheMiss().
    

    Super minor: 81 characters, could be rewrapped.

  3. +++ b/core/lib/Drupal/Core/Utility/ThemeRegistry.php
    @@ -126,34 +173,35 @@ public function resolveCacheMiss($key) {
    +    $storage = $this->storage;
    

    Just curious, why not getStorage here?

  4. +++ b/core/modules/system/src/Tests/Theme/RegistryTest.php
    @@ -31,21 +31,24 @@ class RegistryTest extends KernelTestBase {
    +
    

    Minor: Extra blank line.

  5. +++ b/core/modules/system/src/Tests/Theme/RegistryTest.php
    @@ -31,21 +31,24 @@ class RegistryTest extends KernelTestBase {
    +    $this->assertTRUE(\Drupal::cache()->get($cid), 'Cache entry was created.');
    

    Minor: assetTrue

lauriii’s picture

Status: Needs work » Needs review
FileSize
10.48 KB
2.83 KB

Thanks for the review @cottser!

star-szr’s picture

Status: Needs review » Needs work
Issue tags: +Needs beta evaluation, +Needs issue summary update
+++ b/core/lib/Drupal/Core/Utility/ThemeRegistry.php
@@ -58,7 +62,7 @@
-   *   The theme object representing the active theme for this registry.
+   *   The theme object representing the active theme for this registry. ¶

Evil whitespace invades!

This could probably benefit from a beta evaluation and issue summary update, I think it's making API changes if I'm not mistaken.

lauriii’s picture

Status: Needs work » Needs review
FileSize
10.48 KB
632 bytes
lauriii’s picture

lauriii’s picture

Issue summary: View changes
Issue tags: -Needs beta evaluation
lauriii’s picture

lauriii’s picture

Another option would be to still give the cid as a parameter for the class and then set it to a temporary property. Then it could be set as cid on getCid call.

lauriii’s picture

dawehner’s picture

+++ b/core/lib/Drupal/Core/Utility/ThemeRegistry.php
@@ -30,53 +30,90 @@ class ThemeRegistry extends CacheCollector implements DestructableInterface {
    *   The lock backend.
+   * @param \Drupal\Core\Theme\ActiveTheme $theme
+   *   The theme object representing the active theme for this registry.
    * @param array $tags
...
   function __construct($cid, CacheBackendInterface $cache, LockBackendInterface $lock, $tags = array(), $modules_loaded = FALSE) {

that doc seems wrong, I don't see $theme in there.

Status: Needs review » Needs work

The last submitted patch, 26: make_theme_registry_use-2472285-26.patch, failed testing.

star-szr’s picture

Yup the changes to that docblock need to be rolled back, @lauriii knows :)

lauriii’s picture

Status: Needs work » Needs review
FileSize
7.71 KB
1.93 KB
if ($lauriii === 'sucks') {
  drupal_post_new_patch($patch);
}
dawehner’s picture

Status: Needs review » Reviewed & tested by the community

undefined variable $lauriii

joshi.rohit100’s picture

As we are updating the type of $completeRegistry, should we not do the same for $persistable ?

lauriii’s picture

@joshi.rohit100: no, $persistable has to be set NULL so it can be tested here:

+++ b/core/lib/Drupal/Core/Utility/ThemeRegistry.php
@@ -52,31 +69,52 @@ class ThemeRegistry extends CacheCollector implements DestructableInterface {
+    if ($this->persistable === NULL) {
joshi.rohit100’s picture

@lauriii : Sorry If I am wrong. My point was to document the variable as we did for other.

+++ b/core/lib/Drupal/Core/Utility/ThemeRegistry.php
@@ -30,16 +30,33 @@ class ThemeRegistry extends CacheCollector implements DestructableInterface {
-  protected $persistable;
lauriii’s picture

Status: Reviewed & tested by the community » Needs work

@joshi.rohit100 good catch! Sorry for misunderstanding your first commit. If you want, feel free to fix that so I can review it :)

joshi.rohit100’s picture

Status: Needs work » Needs review
FileSize
7.7 KB
688 bytes

@lauriii: Please you can review now.

lauriii’s picture

Status: Needs review » Reviewed & tested by the community

Thanks! Looks good. Setting as RTBC per #31

joshi.rohit100’s picture

But as per #31, variable is undefined :)

catch’s picture

Status: Reviewed & tested by the community » Needs work
  1. +++ b/core/lib/Drupal/Core/Utility/ThemeRegistry.php
    @@ -52,31 +70,52 @@ class ThemeRegistry extends CacheCollector implements DestructableInterface {
    +   * Gets the persistable.
    

    Could use a better comment. "Gets whether the theme registry is safe to persist?"

    Also while it's not introduced by this patch, I'm wondering whether we might want to remove the GET-only requirement from here - that would allow the cache entry to be used on form submissions.

  2. +++ b/core/lib/Drupal/Core/Utility/ThemeRegistry.php
    @@ -52,31 +70,52 @@ class ThemeRegistry extends CacheCollector implements DestructableInterface {
    +        }
    +        // RegistryTest::testRaceCondition() ensures that the cache entry is
    +        // written on the initial construction of the theme registry.
    +        $this->updateCache();
    

    This comment is out of date. We now ensure the cache gets written when a theme registry key is requested, not when the class is constructed.

lauriii’s picture

#1011614: Theme registry can grow too large for MySQL max_allowed_packet and memcache default slab size it seems like it has been limited to GET since the theme registry cache class has been created.

Fabianx’s picture

Overall:

+1 from me

star-szr’s picture

Does the issue title/summary need an update now?

lauriii’s picture

Yes it does.

lauriii’s picture

Title: Make theme registry use getCid instead of setting cid on constructor » Make theme registry cache collector lazyload
Issue summary: View changes
Issue tags: -Needs issue summary update
lauriii’s picture

lauriii’s picture

Status: Needs work » Needs review
FileSize
7.69 KB
534 bytes

Fixed #39.2

pfrenssen’s picture

Status: Needs review » Reviewed & tested by the community

Looking good. Nice catch!

Fabianx’s picture

Status: Reviewed & tested by the community » Needs review
Issue tags: +needs profiling

I looked at the patch more closely and I think we introduce a run-time overhead into get() and has():

- It always calls $this->getStorage(), can we optimize to do that only when !isset($this->storage)?
- Same for has() and resolveCacheMiss()

Could also be called "loadStorage()"

Xano’s picture

Status: Needs review » Needs work

It always calls $this->getStorage(), can we optimize to do that only when !isset($this->storage)?

That check already exists within ::getStorage(). Is the overhead really that much, and will reducing it warrant introducing repeated checks in different parts of the code?

  1. +++ b/core/lib/Drupal/Core/Utility/ThemeRegistry.php
    @@ -52,31 +70,52 @@ class ThemeRegistry extends CacheCollector implements DestructableInterface {
    +   * Gets the persistable.
    

    A persistable isn't really anything. Maybe write a one-line summary based on the property's description?

  2. +++ b/core/lib/Drupal/Core/Utility/ThemeRegistry.php
    @@ -52,31 +70,52 @@ class ThemeRegistry extends CacheCollector implements DestructableInterface {
    +      $this->persistable = $this->modulesLoaded && \Drupal::hasRequest() && \Drupal::request()->isMethod('GET');
    

    Can we inject these dependencies? The class is only instantiated hard-coded in \Drupal\Core\Theme\Registry, which itself is only instantiated as a service or by tests, so adding dependencies there wouldn't be a BC break.

  3. +++ b/core/lib/Drupal/Core/Utility/ThemeRegistry.php
    @@ -52,31 +70,52 @@ class ThemeRegistry extends CacheCollector implements DestructableInterface {
    +   * @return array
    

    array doesn't really mean much. What's in the array? Even mixed[] would be more explicit and specific.

lauriii’s picture

Status: Needs work » Needs review
FileSize
11.79 KB
4.89 KB

Xano: so is this what you want for 2? Injecting request_stack for ThemeRegistry.

Tests will still fail.

Status: Needs review » Needs work

The last submitted patch, 50: make_theme_registry-2472285-50.patch, failed testing.

csg’s picture

I added the request_stack parameter to core/modules/system/src/Test/Themes/RegistryTest.php, there are no other occurrences of creating an instance of the ThemeRegistry class.

star-szr’s picture

Status: Needs work » Needs review

Thanks @csg, setting to needs review so it gets tested.

dawehner’s picture

+++ b/core/lib/Drupal/Core/Utility/ThemeRegistry.php
@@ -46,37 +65,61 @@ class ThemeRegistry extends CacheCollector implements DestructableInterface {
+  protected function getPersistable() {

What about name it "isPersistable()"?

Status: Needs review » Needs work

The last submitted patch, 52: make_theme_registry-2472285-52.patch, failed testing.

catch’s picture

With persistable, we should get rid of the GET requirement. Since we disable render caching on POST requests, but may end up rendering parts of a page for form submissions, we want the theme registry cached there if possible.

lauriii’s picture

Status: Needs work » Needs review
FileSize
6.4 KB
16.7 KB
joelpittet’s picture

Scenario:

  • 50 10 Nodes on the homepage generated with Devel Generate
  • Xdebug off
  • render caching off
=== 8.0.x..8.0.x compared (5578e29590a73..5578e2f4f233d):

ct  : 162,412|162,412|0|0.0%
wt  : 367,081|367,264|183|0.0%
mu  : 26,823,752|26,823,752|0|0.0%
pmu : 26,990,312|26,990,312|0|0.0%

http://www.lionsad.de/xhprof-kit/xhprof/xhprof_html/?run1=5578e29590a73&...

=== 8.0.x..2472285-lazy-theme-registry compared (5578e29590a73..5578e32524136):

ct  : 162,412|164,985|2,573|1.6%
wt  : 367,081|380,250|13,169|3.6%
mu  : 26,823,752|27,398,648|574,896|2.1%
pmu : 26,990,312|27,498,200|507,888|1.9%

http://www.lionsad.de/xhprof-kit/xhprof/xhprof_html/?run1=5578e29590a73&...

Should I have a different scenario to see the improvement or does this need some work?

joelpittet’s picture

Here's with caching on though I don't think it really shows much because everything is bypassed.

=== 8.0.x..8.0.x compared (5578e7733b8ce..5578e81d210fd):

ct  : 2,192|2,192|0|0.0%
wt  : 6,135|6,119|-16|-0.3%
mu  : 1,982,952|1,982,952|0|0.0%
pmu : 2,072,728|2,072,728|0|0.0%

http://www.lionsad.de/xhprof-kit/xhprof/xhprof_html/?run1=5578e7733b8ce&...

=== 8.0.x..2472285-lazy-theme-registry compared (5578e7733b8ce..5578e832a56c5):

ct  : 2,192|2,192|0|0.0%
wt  : 6,135|6,148|13|0.2%
mu  : 1,982,952|1,983,144|192|0.0%
pmu : 2,072,728|2,072,960|232|0.0%

http://www.lionsad.de/xhprof-kit/xhprof/xhprof_html/?run1=5578e7733b8ce&...

joelpittet’s picture

Whoops lied only 10 items on the homepage.

lauriii’s picture

This looks a lot better:

=== 8.0.x..8.0.x compared (557c2635273b3..557c2797a7d51):

ct  : 466,261|466,261|0|0.0%
wt  : 943,821|942,756|-1,065|-0.1%
mu  : 35,055,096|35,173,344|118,248|0.3%
pmu : 35,585,920|35,703,528|117,608|0.3%

http://www.lionsad.de/xhprof-kit/xhprof/xhprof_html/?run1=557c2635273b3&...

=== 8.0.x..2472285-lazy-theme-registry compared (557c2635273b3..557c27da9db93):

ct  : 466,261|468,732|2,471|0.5%
wt  : 943,821|919,157|-24,664|-2.6%
mu  : 35,055,096|35,812,344|757,248|2.2%
pmu : 35,585,920|36,084,432|498,512|1.4%

http://www.lionsad.de/xhprof-kit/xhprof/xhprof_html/?run1=557c2635273b3&...

Status: Needs review » Needs work

The last submitted patch, 61: make_theme_registry-2472285-61.patch, failed testing.

The last submitted patch, 61: make_theme_registry-2472285-61.patch, failed testing.

lauriii’s picture

I guess the profiling results in the previous comment are not very good :P there is some problem on the rendering during the profiling.

The last submitted patch, 61: make_theme_registry-2472285-61.patch, failed testing.

The last submitted patch, 61: make_theme_registry-2472285-61.patch, failed testing.

The last submitted patch, 61: make_theme_registry-2472285-61.patch, failed testing.

The last submitted patch, 61: make_theme_registry-2472285-61.patch, failed testing.

mgifford’s picture

Issue tags: +Needs reroll
opdavies’s picture

Status: Needs work » Needs review
Issue tags: -Needs reroll
FileSize
16.85 KB

Patch re-rolled. All merged automatically during rebase. :)

Status: Needs review » Needs work

The last submitted patch, 76: 2472285-76.patch, failed testing.

The last submitted patch, 76: 2472285-76.patch, failed testing.

Version: 8.0.x-dev » 8.1.x-dev

Drupal 8.0.6 was released on April 6 and is the final bugfix release for the Drupal 8.0.x series. Drupal 8.0.x will not receive any further development aside from security fixes. Drupal 8.1.0-rc1 is now available and sites should prepare to update to 8.1.0.

Bug reports should be targeted against the 8.1.x-dev branch from now on, and new development or disruptive changes should be targeted against the 8.2.x-dev branch. For more information see the Drupal 8 minor version schedule and the Allowed changes during the Drupal 8 release cycle.

Version: 8.1.x-dev » 8.2.x-dev

Drupal 8.1.9 was released on September 7 and is the final bugfix release for the Drupal 8.1.x series. Drupal 8.1.x will not receive any further development aside from security fixes. Drupal 8.2.0-rc1 is now available and sites should prepare to upgrade to 8.2.0.

Bug reports should be targeted against the 8.2.x-dev branch from now on, and new development or disruptive changes should be targeted against the 8.3.x-dev branch. For more information see the Drupal 8 minor version schedule and the Allowed changes during the Drupal 8 release cycle.

Version: 8.2.x-dev » 8.3.x-dev

Drupal 8.2.6 was released on February 1, 2017 and is the final full bugfix release for the Drupal 8.2.x series. Drupal 8.2.x will not receive any further development aside from critical and security fixes. Sites should prepare to update to 8.3.0 on April 5, 2017. (Drupal 8.3.0-alpha1 is available for testing.)

Bug reports should be targeted against the 8.3.x-dev branch from now on, and new development or disruptive changes should be targeted against the 8.4.x-dev branch. For more information see the Drupal 8 minor version schedule and the Allowed changes during the Drupal 8 release cycle.

Version: 8.3.x-dev » 8.4.x-dev

Drupal 8.3.6 was released on August 2, 2017 and is the final full bugfix release for the Drupal 8.3.x series. Drupal 8.3.x will not receive any further development aside from critical and security fixes. Sites should prepare to update to 8.4.0 on October 4, 2017. (Drupal 8.4.0-alpha1 is available for testing.)

Bug reports should be targeted against the 8.4.x-dev branch from now on, and new development or disruptive changes should be targeted against the 8.5.x-dev branch. For more information see the Drupal 8 minor version schedule and the Allowed changes during the Drupal 8 release cycle.

Version: 8.4.x-dev » 8.5.x-dev

Drupal 8.4.4 was released on January 3, 2018 and is the final full bugfix release for the Drupal 8.4.x series. Drupal 8.4.x will not receive any further development aside from critical and security fixes. Sites should prepare to update to 8.5.0 on March 7, 2018. (Drupal 8.5.0-alpha1 is available for testing.)

Bug reports should be targeted against the 8.5.x-dev branch from now on, and new development or disruptive changes should be targeted against the 8.6.x-dev branch. For more information see the Drupal 8 minor version schedule and the Allowed changes during the Drupal 8 release cycle.

donquixote’s picture

+   *
+   * @var bool
    */
-  protected $persistable;
+  protected $persistable = NULL;

This should be


  /**
   * (doc description)
   *
   * @var bool|null
   */
  protected $persistable;

No need to initialize with NULL. But the initial null value needs to be documented in @var.

donquixote’s picture

   /**
    * The complete theme registry array.
+   *
+   * @var array
    */
   protected $completeRegistry;

Same here, it should be $var array[]|null.
Why?
- array[] is more specific than just array.
- It can be null.

donquixote’s picture

From the OP:

Theme registry creates the cache on the construct which is very early. Cache record should be created instead when the results are actually being needed.

I checked where new instances of ThemeRegistry are created.
The only instance outside of tests was Registry::getRuntime().
Registry->getRuntime() is called in 3 places:

  • EntityViewBuilder::getBuildDefaults().
  • ThemeRegistryLoader::findTemplate().
  • ThemeManager::render().

In all those places, the ->has() method is executed shortly after.

This means, the "lazy initialization" will gain us nothing.
The constructor is not "very early", because the object is only created shortly before it is needed.

This "external laziness" is actually more elegant than the internal laziness that this issue is trying to achieve :)

I suggest to close this as wontfix.

donquixote’s picture

Besides #86, the changes proposed in this issue would make ThemeRegistry even more complex than it is now.

Version: 8.5.x-dev » 8.6.x-dev

Drupal 8.5.6 was released on August 1, 2018 and is the final bugfix release for the Drupal 8.5.x series. Drupal 8.5.x will not receive any further development aside from security fixes. Sites should prepare to update to 8.6.0 on September 5, 2018. (Drupal 8.6.0-rc1 is available for testing.)

Bug reports should be targeted against the 8.6.x-dev branch from now on, and new development or disruptive changes should be targeted against the 8.7.x-dev branch. For more information see the Drupal 8 minor version schedule and the Allowed changes during the Drupal 8 release cycle.

Version: 8.6.x-dev » 8.8.x-dev

Drupal 8.6.x will not receive any further development aside from security fixes. Bug reports should be targeted against the 8.8.x-dev branch from now on, and new development or disruptive changes should be targeted against the 8.9.x-dev branch. For more information see the Drupal 8 and 9 minor version schedule and the Allowed changes during the Drupal 8 and 9 release cycles.

Version: 8.8.x-dev » 8.9.x-dev

Drupal 8.8.7 was released on June 3, 2020 and is the final full bugfix release for the Drupal 8.8.x series. Drupal 8.8.x will not receive any further development aside from security fixes. Sites should prepare to update to Drupal 8.9.0 or Drupal 9.0.0 for ongoing support.

Bug reports should be targeted against the 8.9.x-dev branch from now on, and new development or disruptive changes should be targeted against the 9.1.x-dev branch. For more information see the Drupal 8 and 9 minor version schedule and the Allowed changes during the Drupal 8 and 9 release cycles.

Version: 8.9.x-dev » 9.2.x-dev

Drupal 8 is end-of-life as of November 17, 2021. There will not be further changes made to Drupal 8. Bugfixes are now made to the 9.3.x and higher branches only. For more information see the Drupal core minor version schedule and the Allowed changes during the Drupal core release cycle.

Version: 9.2.x-dev » 9.3.x-dev

Version: 9.3.x-dev » 9.4.x-dev

Drupal 9.3.15 was released on June 1st, 2022 and is the final full bugfix release for the Drupal 9.3.x series. Drupal 9.3.x will not receive any further development aside from security fixes. Drupal 9 bug reports should be targeted for the 9.4.x-dev branch from now on, and new development or disruptive changes should be targeted for the 9.5.x-dev branch. For more information see the Drupal core minor version schedule and the Allowed changes during the Drupal core release cycle.

Version: 9.4.x-dev » 9.5.x-dev

Drupal 9.4.9 was released on December 7, 2022 and is the final full bugfix release for the Drupal 9.4.x series. Drupal 9.4.x will not receive any further development aside from security fixes. Drupal 9 bug reports should be targeted for the 9.5.x-dev branch from now on, and new development or disruptive changes should be targeted for the 10.1.x-dev branch. For more information see the Drupal core minor version schedule and the Allowed changes during the Drupal core release cycle.

Version: 9.5.x-dev » 11.x-dev

Drupal core is moving towards using a “main” branch. As an interim step, a new 11.x branch has been opened, as Drupal.org infrastructure cannot currently fully support a branch named main. New developments and disruptive changes should now be targeted for the 11.x branch. For more information, see the Drupal core minor version schedule and the Allowed changes during the Drupal core release cycle.