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.
Files: 
CommentFileSizeAuthor
#76 2472285-76.patch16.85 KBopdavies
FAILED: [[SimpleTest]]: [PHP 5.5 MySQL] 114,333 pass(es), 8 fail(s), and 6 exception(s). View
#61 interdiff.txt1.59 KBlauriii
#61 make_theme_registry-2472285-61.patch16.84 KBlauriii
FAILED: [[SimpleTest]]: [PHP 5.5 MySQL] Unable to apply patch make_theme_registry-2472285-61.patch. Unable to apply patch. See the log in the details link for more information. View
#57 make_theme_registry-2472285-57.patch16.7 KBlauriii
PASSED: [[SimpleTest]]: [PHP 5.4 MySQL] 96,252 pass(es). View
#57 interdiff.txt6.4 KBlauriii
#52 interdiff-2472285-50-52.txt1.56 KBcsg
#52 make_theme_registry-2472285-52.patch12.79 KBcsg
FAILED: [[SimpleTest]]: [PHP 5.4 MySQL] 95,645 pass(es), 4 fail(s), and 4 exception(s). View
#50 interdiff.txt4.89 KBlauriii
#50 make_theme_registry-2472285-50.patch11.79 KBlauriii
FAILED: [[SimpleTest]]: [PHP 5.4 MySQL] 95,327 pass(es), 6 fail(s), and 6 exception(s). View
#46 interdiff.txt534 byteslauriii
#46 make_theme_registry-2472285-46.patch7.69 KBlauriii
PASSED: [[SimpleTest]]: [PHP 5.4 MySQL] 94,823 pass(es). View
#36 interdiff-36.txt688 bytesjoshi.rohit100
#36 make_theme_registry_use-2472285-36.patch7.7 KBjoshi.rohit100
PASSED: [[SimpleTest]]: [PHP 5.4 MySQL] 94,386 pass(es). View
#30 interdiff.txt1.93 KBlauriii
#30 make_theme_registry_use-2472285-28.patch7.71 KBlauriii
PASSED: [[SimpleTest]]: [PHP 5.4 MySQL] 94,361 pass(es). View
#26 make_theme_registry_use-2472285-26.patch6.66 KBlauriii
FAILED: [[SimpleTest]]: [PHP 5.4 MySQL] 94,414 pass(es), 1 fail(s), and 0 exception(s). View
#26 interdiff.txt5.8 KBlauriii
#22 interdiff.txt2.12 KBlauriii
#22 make_theme_registry_use-2472285-22.patch12.05 KBlauriii
PASSED: [[SimpleTest]]: [PHP 5.4 MySQL] 94,423 pass(es). View
#21 interdiff.txt632 byteslauriii
#21 make_theme_registry_use-2472285-21.patch10.48 KBlauriii
PASSED: [[SimpleTest]]: [PHP 5.4 MySQL] 94,426 pass(es). View
#19 interdiff.txt2.83 KBlauriii
#19 make_theme_registry_use-2472285-19.patch10.48 KBlauriii
PASSED: [[SimpleTest]]: [PHP 5.4 MySQL] 94,353 pass(es). View
#15 make_theme_registry_use-2472285-15.patch10.62 KBlauriii
PASSED: [[SimpleTest]]: [PHP 5.4 MySQL] 94,342 pass(es). View
#15 interdiff.txt632 byteslauriii
#14 make_theme_registry_use-2472285-14.patch10.63 KBlauriii
PASSED: [[SimpleTest]]: [PHP 5.4 MySQL] 92,508 pass(es). View
#14 interdiff.txt1.93 KBlauriii
#12 make_theme_registry_use-2472285-11.patch10.4 KBlauriii
FAILED: [[SimpleTest]]: [PHP 5.4 MySQL] 92,454 pass(es), 2 fail(s), and 2 exception(s). View
#11 interdiff.txt2.66 KBlauriii
#7 interdiff.txt2.27 KBlauriii
#7 make_theme_registry_use-2472285-7.patch9.82 KBlauriii
FAILED: [[SimpleTest]]: [PHP 5.4 MySQL] 91,567 pass(es), 3 fail(s), and 0 exception(s). View
#5 interdiff.txt989 byteslauriii
#5 make_theme_registry_use-2472285-5.patch7.43 KBlauriii
FAILED: [[SimpleTest]]: [PHP 5.4 MySQL] 91,634 pass(es), 2 fail(s), and 4 exception(s). View
#3 make_theme_registry_use-2472285-3.patch7.26 KBlauriii
FAILED: [[SimpleTest]]: [PHP 5.4 MySQL] 90,111 pass(es), 986 fail(s), and 15,557 exception(s). View

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
FAILED: [[SimpleTest]]: [PHP 5.4 MySQL] 90,111 pass(es), 986 fail(s), and 15,557 exception(s). View

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
FAILED: [[SimpleTest]]: [PHP 5.4 MySQL] 91,634 pass(es), 2 fail(s), and 4 exception(s). View
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
FAILED: [[SimpleTest]]: [PHP 5.4 MySQL] 91,567 pass(es), 3 fail(s), and 0 exception(s). View
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

FileSize
10.4 KB
FAILED: [[SimpleTest]]: [PHP 5.4 MySQL] 92,454 pass(es), 2 fail(s), and 2 exception(s). View

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
PASSED: [[SimpleTest]]: [PHP 5.4 MySQL] 92,508 pass(es). View
lauriii’s picture

FileSize
632 bytes
10.62 KB
PASSED: [[SimpleTest]]: [PHP 5.4 MySQL] 94,342 pass(es). View

Status: Needs review » Needs work

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

Status: Needs work » Needs review
Cottser’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
PASSED: [[SimpleTest]]: [PHP 5.4 MySQL] 94,353 pass(es). View
2.83 KB

Thanks for the review @cottser!

Cottser’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
PASSED: [[SimpleTest]]: [PHP 5.4 MySQL] 94,426 pass(es). View
632 bytes
lauriii’s picture

FileSize
12.05 KB
PASSED: [[SimpleTest]]: [PHP 5.4 MySQL] 94,423 pass(es). View
2.12 KB
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

Issue tags: -Needs change record
FileSize
5.8 KB
6.66 KB
FAILED: [[SimpleTest]]: [PHP 5.4 MySQL] 94,414 pass(es), 1 fail(s), and 0 exception(s). View
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.

Cottser’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
PASSED: [[SimpleTest]]: [PHP 5.4 MySQL] 94,361 pass(es). View
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
PASSED: [[SimpleTest]]: [PHP 5.4 MySQL] 94,386 pass(es). View
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

Cottser’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
PASSED: [[SimpleTest]]: [PHP 5.4 MySQL] 94,823 pass(es). View
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
FAILED: [[SimpleTest]]: [PHP 5.4 MySQL] 95,327 pass(es), 6 fail(s), and 6 exception(s). View
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

FileSize
12.79 KB
FAILED: [[SimpleTest]]: [PHP 5.4 MySQL] 95,645 pass(es), 4 fail(s), and 4 exception(s). View
1.56 KB

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.

Cottser’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
PASSED: [[SimpleTest]]: [PHP 5.4 MySQL] 96,252 pass(es). View
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

Issue tags: -Needs profiling
FileSize
16.84 KB
FAILED: [[SimpleTest]]: [PHP 5.5 MySQL] Unable to apply patch make_theme_registry-2472285-61.patch. Unable to apply patch. See the log in the details link for more information. View
1.59 KB

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
FAILED: [[SimpleTest]]: [PHP 5.5 MySQL] 114,333 pass(es), 8 fail(s), and 6 exception(s). View

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.