Problem/Motivation

The attached patch causes 3 fails in Drupal\system\Tests\Session\SessionTest. Needless to say, that shouldn't happen.

When two event subscribers have the same weight their order depend on the order they were put into the services file.

Proposed resolution

  • Make the order more deterministic
  • The proposed order of the events depends on a) service priority (like now) b) the module weight and
    c) the class name, (so implicit by module name)

Remaining tasks

User interface changes

API changes

Beta phase evaluation

Reference: https://www.drupal.org/core/beta-changes
Issue category Bug, because its not obvious in which order events are fired, which results in hard to debug failures and potentially security problems
Issue priority Critical, because events are a fundamental part of our architecture
Disruption Nearly none disruption: internal changes and maybe some small changes in the order of events.

Original report by @chx

  1. Use module weights and module names additional to the normal priorities
  2. Remove event subscribers from core Drupal core. The reality is that hooks won't go anywhere so you need to learn them, event subscribers just cause a lot of confusion. Out of two parallel subsystems, event subscribers is a (lot) easier to remove. It does not matter what advantages event subscribers have, one needs to go and hooks can't be removed, there are too many and also event subscribers, as demo'd by the attached patch have some pretty huge problems.
  3. For Symfony fired events have a single subscriber that fires a hook instead
  4. Extend the hook system to classes: I recommend Drupal\modulename\Hook\hookname. Each class should have a single method. __invoke looks convenient even if we won't use the $callable = new $class; $callable(); way of doing things, it's the sanctioned method name for this.
  5. Change the return value of getImplementations to be keyed by modules and have callables array('Drupal\modulename\Hook\hookname', '__invoke') or functionnname as values. Alternatively add a new method doing this. However, getImplementations callers need to change anyways.
  6. Change getImplementations to work with container.namespaces and add Hook to the Plugin-Entity-Element trio in DrupalKernel allowing for Drupal\Core and Drupal\Component to implement hooks

Ceterum censeo: the routing system should be postponed to Drupal 9. It doesn't provide any benefits and the technical debt created is not resolvable within a reasonable timeframe.

Comments

larowlan’s picture

note @sun's proposal in this comment #1509164-29: Use Symfony EventDispatcher for hook system
magic numbers aren't good, before/after then module dependencies is better

chx’s picture

Totes, it should be $events[KernelEvents::REQUEST][] = array('before', 'another_service_id') then we can add a nice little topological sort into #1972300: Write a more scalable dispatcher and this would be resolved.

chx’s picture

Issue summary: View changes
chx’s picture

Issue summary: View changes
chx’s picture

Issue summary: View changes
chx’s picture

Issue summary: View changes

Status: Needs review » Needs work

The last submitted patch, drupal8_lol.patch, failed testing.

chx’s picture

Status: Needs work » Active

The patch was just a demo.

catch’s picture

Title: WTF of the month: the whole system relies on definition order » Event subscribers are run in the order they're defined in YAML when they have the same weight
Issue tags: +beta target, +D8 upgrade path

This will require a container rebuild, so tagging D8 upgrade path per #2341575: [meta] Provide a beta to beta/rc upgrade path.

Also more descriptive title.

znerol’s picture

Title: Event subscribers are run in the order they're defined in YAML when they have the same weight » Fix the execution order of all response subscribers by explicitly specifying the priorities

Uh, the title is misleading. This is not a problem with the YAML or the definition order but a problem with priorities missing for the events in AuthenticationSubscriber::getResponse() vs. FinishResponseSubscriber().

catch’s picture

Title: Fix the execution order of all response subscribers by explicitly specifying the priorities » The order of event subscribers should not be affected by definition order

I don't think the title is misleading.

For hooks we order them by module weight, name - that gives a reliable execution order which won't change unless you set a different weight or rename a module - which are conscious actions known to affect hook ordering.

Having the order affected by the YAML definition is considerably more brittle. If we didn't have test coverage this could have been done in a 'clean up' patch with no obvious side effects.

We might well want to set explicit weights for those two event listeners but that's not what the critical issue is for - could split that into a separate critical issue if necessary.

chx’s picture

Not only that but none of the YAML parser, the registration pass, the container dumper, the event dispatcher contract include this sort of pass through. It just happens that all of them does. Indeed, if you implement the event dispatcher differently as done in #1972300-14: Write a more scalable dispatcher then Drupal breaks in this very subtle, insanely hard to debug way. To give you an example: the entity_load contract (in Drupal 7 at least) definitely included that the returned nodes are in the order the nids were passed in and there's code to ensure this happening. There's nothing in code or doxygen in any of the links of this long chain (although the event dispatcher code actually might hint vaguely at it because array_multisort would be simpler than the current code but surely it is not documented on the interface that the order of addListener calls must be kept).

znerol’s picture

The Symfony event dispatcher maintains a list of callables (listeners) ordered by priority. Listeners can also be closures. Like pointed out by chx the order of the event listeners with the same priority depends on the implementation. Given that listeners can basically be any callable we cannot rely on any metadata (module name, class name, function name) which could be used as a second sort-key.

Instead I propose that event subscribers like the authentication subscriber or the access aware router subscriber can be tagged as exclusive in the service definition. This information could be used to ensure from within the compiler pass, that no other subscribers are registered with the same priority as an exclusive subscriber.

catch’s picture

@znerol, yes it's an unreliable model, and we may have to implement only a subset of the features to make it work with a modular system like Drupal - for example throwing an exception if no explicit weight is defined, or adding before/after instead of weights and using that, then documenting the behaviour properly.

znerol’s picture

Please keep in mind that the service definition of a subscriber is not the only place where listeners/subscribers can be added to the dispatcher. It is also possible to manipulate the list of listeners for an event at runtime using the methods defined in the interface.

I agree that it might be much easier if we did not have to define priorities but instead just would declare dependencies. Such a system might calculate the priorities from within a compiler pass before adding the listeners to the dispatcher. But that would make it difficult to add/remove listeners at runtime through the Symfony interface because priorities are not easily determinable anymore. That interface is the base line, let's just accept that.

Throwing an exception when priorities clash is the way to go - but not for all listeners/subscribers. Instead let's just do that for "milestones". Adding a subscriber with the same priority as the router subscriber is just a plain stupid idea and that should be punished. Other events are much less suspectible to execution order, like e.g. the TERMINATE event.

Talking about priorities, I just want to point out that git grep KernelEvents::REQUEST reveals the following pattern:

c/v/s/h/S/C/H/E/ProfilerListener.php:            KernelEvents::REQUEST => array('onKernelRequest', 1024),
c/v/s/h/S/C/H/E/SessionListener.php:            KernelEvents::REQUEST => array('onKernelRequest', 128),
c/v/s/h/S/C/H/E/FragmentListener.php:            KernelEvents::REQUEST => array(array('onKernelRequest', 48)),
c/v/s/h/S/C/H/E/RouterListener.php:            KernelEvents::REQUEST => array(array('onKernelRequest', 32)),
c/v/s/h/S/C/H/E/LocaleListener.php:            KernelEvents::REQUEST => array(array('onKernelRequest', 16)),
c/v/s/h/S/C/H/E/ErrorsLoggerListener.php:        return array(KernelEvents::REQUEST => 'injectLogger');

If there is only one 1 in the binary representation of the priority, then this is a milestone...

chx’s picture

> Throwing an exception when priorities clash is the way to go

Nope, removing events from D8 is the way to go. Am I clear?

There should be 1 listener for Symfony events firing hooks and hooks should be extended so that classes can implement hooks as well for autoloading. Drupal\module\Hook\hookname::__invoke or somesuch. This is still doable, there are only 68 event subscribers in core. Releasing in this state where both hooks and events are used is madness.

chx’s picture

Assigned: Crell » catch
Issue summary: View changes

catch, what do you think of the battle plan outlined in the issue summary?

xjm’s picture

Issue tags: +Pre-AMS beta sprint
chx’s picture

Issue summary: View changes
chx’s picture

Issue summary: View changes
Crell’s picture

Since this issue was assigned to me at one point...

We've already made the statement, including straight from Dries' mouth, that longer-term (D9) we should be moving away from hooks to events. Therefore any statement of "we can't have hooks and events together" must imply that we eliminate hooks, not that we eliminate events. We have already backed off on even partial hook-to-event conversions in the interest of not introducing "unnecessary" changes (a decision I have long disagreed with). So D8 living with hooks and events coexisting is, really, no longer a negotiable situation.

Weird ordering of things is hardly a new concept in Drupal; hook order has always been a challenge, to the point that we kept trying to add per-hook weights for cases where module weights were insufficient. Well, events now have per-hook weights, essentially. So rather than use them, the proposal is to avoid events? That does not make even the slightest bit of sense.

If the order of a given event matters, specify a weight. If it doesn't, well, it doesn't. If you don't think it does but it actually does, add a weight when you figure that out.

While a before/after ordering would be lovely, that's far out of scope for Drupal 8, and really ought to be done upstream in Symfony anyway.

This issue is a won't-fix for me.

chx’s picture

> We've already made the statement, including straight from Dries' mouth, that longer-term (D9) we should be moving away from hooks to events.

Exactly. We should remove the HttpKernel and the routing system from D8 as they are not ready and postpone them to D9. That's what I suggest too.

tim.plunkett’s picture

This issue is ballooning out of control. First it was fixing event subscribers, then it was removing events, now you're suggesting removing HttpKernel and the routing system?
Do you think we're going to reintroduce hook_menu?!

Let's get this issue back on track, where it was in #1 and #2.

Crell’s picture

Status: Active » Closed (won't fix)

Let's try a new issue with more focus and less hyperbolic silliness.

chx’s picture

Status: Closed (won't fix) » Active

> Do you think we're going to reintroduce hook_menu?!

No but I think that reintroducing menu.inc is realistic, I will try this afternoon. However, keeping this open for removing event subscribers at least.

fabianx’s picture

So that might be a stupid question but:

- We still have modules
- We still have weights
- We have module names
- We have the class name

D7 ordering (without hook_mod_impl_alter):

- Module Weight
- Module Name

=> consistent, only one hook per module

Proposed D8 ordering:

Use Drupal or System as "module name" for any events not belonging to a module.

Because we have consistent namespaces, we should be able to figure out to what module an event subscriber belongs to.

- Priority
- Module Weight
- Module Name
- Class Name

=> Consistent and working, changeable and predictable

As we persist services during the compiler pass and we have all modules loaded there (obviously), I cannot see why we cannot store the order per EventSubscriber?

Such module implements alter to change weights is kinda implemented as in Drupal 7, but just by instead changing the tagged services in the compiler pass.

Like I recently saw in a patch for the AcceptNegotiation Middleware where some format was subscribed to by changing compiler kernel run pass.

Is there anything I am missing here?

znerol’s picture

It is important to understand that listeners / subscribers can be added at runtime - not only from within the compiler pass. If something uses addListener the event dispatcher cannot possibly determine its origin.

class MyController  {
  public function action(Request $request) {
    $this->eventDispatcher->addListener(KernelEvents::TERMINATE, function () { /* do some work after the request already has been sent to the browser */ });
    return new Response('here is your response, some server side work still going on');
  }
}
fabianx’s picture

It is okay for them to be added at runtime:

But thanks for telling me how to implement BigPipe in core cleanly :-D - that was what I wondered how to do.

Anyway back to the issue:

If they have a unique priority, they get ordered by priority, if they don't we run them in arbitrary order either before or after all our compiled event subscribers.

I would vote for after, because if you need before, just increase priority.

And if that dynamic order is a problem => upstream symfony problem

but as you can set priorities that is as low a use case problem as can get, so I don't think we will ever hit that case.

Any more concerns?

Crell’s picture

Priority: Critical » Normal

Let me make sure I understand the issue:

In D7, the order of hook invocations is deterministic but sometimes obtuse, based on module weight, then module name.

In D8, the order of event invocations is deterministic but sometimes obtuse, based on priority, then module weight, then module name, then order of the event subscriber in services.yml. (Because we still parse through modules in the same order when parsing the container.) Right?

First off, there's no way that's critical. I'm half tempted to call it minor.

Secondly, I am inclined to agree with FabianX that if you find yourself in a situation where the order matters that much, use a priority and your problems go away. So I'm not convince there's an actual bug to address here.

If we do want to actually do something, finagling the service order to be alphabetic by class in via a compiler pass seems like a reasonable and still deterministic solution.

fabianx’s picture

Priority: Normal » Critical

This is critical as moving services in services.yml should not break something - unless there is a contract somewhere that that is not allowed.

If a service is not used always, this can lead to very difficult to find bugs and its a region where you don't expect change to break something. (I would totally accept a patch as a GK that reordered services.yml to group some services more logically and 2 weeks later I am bitten on production that some service fails ... )

If we support module weight implicitly due to the order how the services.yml is parsed, this should be fine and all we need to do is to additionally sort within system / the same module by class name.

So just a little sort adding and we should be done.

The only reason this is a new problem in D8 is that modules never did have a hook twice.

dawehner’s picture

StatusFileSize
new9.16 KB

Started with just writing down the tests how its expected to work. While doing that I realized that the current class is horrible named.

- Priority
- Module Weight
- Module Name
- Class Name

I think we could get rid of the module name if we just consider the full namespace + classname for the sorting.

fabianx’s picture

Status: Active » Needs review

Let the tests begin to fail :)

Status: Needs review » Needs work

The last submitted patch, 32: 2344645-tests.patch, failed testing.

dawehner’s picture

Status: Needs work » Needs review
StatusFileSize
new11.56 KB
new4.08 KB

There we go

Status: Needs review » Needs work

The last submitted patch, 35: 2344645-35.patch, failed testing.

dawehner’s picture

Status: Needs work » Needs review
StatusFileSize
new12.42 KB
new1.17 KB

There we go.

Status: Needs review » Needs work

The last submitted patch, 37: 2344645-37.patch, failed testing.

dawehner’s picture

So sadly the order of the events change which seems to let them all fail.

dawehner’s picture

Status: Needs work » Needs review
StatusFileSize
new12.29 KB
new1.03 KB

.

Status: Needs review » Needs work

The last submitted patch, 40: 2344645-40.patch, failed testing.

dawehner’s picture

Status: Needs work » Needs review
StatusFileSize
new12.82 KB
new545 bytes

Interesting bug.

Status: Needs review » Needs work

The last submitted patch, 42: 2344645-42.patch, failed testing.

dawehner’s picture

Status: Needs work » Needs review
Issue tags: -beta target, -D8 upgrade path, -Pre-AMS beta sprint +beta targetD8 upgrade pathPre-AMS beta sprint, +Ghent DA sprint
StatusFileSize
new16.78 KB
new4.17 KB

Worked a bit on it, and figured out that we have still some inconsistency in DrupalKernel::$moduleList.
It is sometimes considered to be a hashmap of module extensions keyed by module name, and sometimes a hashmap of module weights, keyed by module weight.

Let's see how much failures we do have left ... at least one of the web tests pass already.

dawehner’s picture

Issue tags: -beta targetD8 upgrade pathPre-AMS beta sprint +beta target, +D8 upgrade path, +Pre-AMS beta sprint

.

Status: Needs review » Needs work

The last submitted patch, 44: 2344645-44.patch, failed testing.

dawehner’s picture

Status: Needs work » Needs review
StatusFileSize
new19.2 KB
new2.79 KB

Fixed nearly all notices, working on the last remaining one (probably).

Status: Needs review » Needs work

The last submitted patch, 47: 2344645-47.patch, failed testing.

dawehner queued 47: 2344645-47.patch for re-testing.

The last submitted patch, 47: 2344645-47.patch, failed testing.

dawehner’s picture

Issue summary: View changes
znerol’s picture

Please note that if definition-dependent ordering is really an issue, then there is much more stuff affected by it. Not only the event dispatcher but basically anything that implements tagged services, i.e. most of the stuff implementing a chain-of-responsibility pattern.

If we really want to rely on the alphabetic order of modules, then it should be enough to sort the service definitions by module name before compiling the container.

dawehner’s picture

Status: Needs work » Needs review
StatusFileSize
new2 KB
new20.28 KB

Alright, looked at the resulting order, and fixed it.

aspilicious’s picture

Can someone fix the summary?

dawehner’s picture

Issue summary: View changes

Totally valid point!

chx’s picture

Issue tags: +sad chx
damiankloip’s picture

  1. +++ b/core/includes/common.inc
    @@ -2768,7 +2768,7 @@ function drupal_flush_all_caches() {
    +  \Drupal::service('kernel')->updateModules(\Drupal::config('core.extension')->get('module'), $files);
    

    What is this change about? And why not use the module handler (which is assigned below/after atm)?

  2. +++ b/core/lib/Drupal/Core/DependencyInjection/Compiler/RegisterEventListenersPass.php
    @@ -19,8 +22,43 @@ public function process(ContainerBuilder $container) {
    +      if ($drupal == 'Drupal' && isset($module_parameter[$provider]['weight'])) {
    

    A comment here that you are using the set weight for a module if available would be good.

  3. +++ b/core/lib/Drupal/Core/DependencyInjection/Compiler/RegisterEventListenersPass.php
    @@ -19,8 +22,43 @@ public function process(ContainerBuilder $container) {
    +    // Sort the IDs first by module weight, than by full classname. Using the
    

    then

  4. +++ b/core/lib/Drupal/Core/DependencyInjection/Compiler/RegisterEventListenersPass.php
    @@ -19,8 +22,43 @@ public function process(ContainerBuilder $container) {
    +    // full classname takes into account the module name automatically.
    

    class name

  5. +++ b/core/lib/Drupal/Core/DependencyInjection/Compiler/RegisterEventListenersPass.php
    @@ -31,6 +69,7 @@ public function process(ContainerBuilder $container) {
    +      // @todo Implement sorting by module weight and class name.
    

    Isn't that what's happening above in the compiler pass?

  6. +++ b/core/lib/Drupal/Core/DrupalKernel.php
    @@ -78,14 +78,16 @@ class DrupalKernel implements DrupalKernelInterface, TerminableInterface {
        * List of available modules and installation profiles.
    ...
    +   * Its a list of extensions keyed by module name.
    

    These could probably jsut be rolled into one line?

dawehner’s picture

StatusFileSize
new20.02 KB
new2.19 KB

What is this change about? And why not use the module handler (which is assigned below/after atm)?

Well, it uses the kernel as before. Note: We fixed the parameters of updateModules

znerol’s picture

I pointed out to @dawehner in IRC and also summarized in #52 that this approach is invalid. I've named several reasons, but the most important is that it only addresses one particular case of where definition order influences execution order.

If we really care about definition order influencing execution order, then it is not enough to "fix" the event listener compiler pass. We'd need to apply the same approach on most of the other tagged services also.

This issue has been started in a rage and subsequent discussion was loaded with considerable emotion. Please let us reconsider the scope and the severity of this issue from pure a technical perspective.

catch’s picture

Adding triage-needed tag. I personally think we should see if #52 is doable.

If we can't find a good resolution here, then we at least need to clearly document somewhere that the order of the services in the file affects the order of execution and get that clarified upstream.

dawehner’s picture

Adding triage-needed tag. I personally think we should see if #52 is doable.

The main difference is that other tagged services are basically always independent, in contrast to our various event subscribers

I bet upstream would say: use a priority if the order of execution matters.

catch’s picture

I'm sure upstream would say that, they don't have a module system though.

Thinking about this more, I think we should do the following:

1. Document somewhere that this is the behaviour so at least it's somewhere other than this issue.

2. Downgrade this to major, but if we can fix the ordering I'd probably allow that to happen right up until release candidate since any pain from contrib modules then would be less than people are going to run into later.

chx’s picture

Priority: Critical » Major

This means #2264049: Create an Events topic is now even more critical.

catch’s picture

Issue tags: +rc deadline

Adding RC deadline tag, don't think we want to change event order after release.

xjm’s picture

Issue tags: -sad chx, -Needs Drupal 8 critical triage
chx’s picture

Issue tags: +sad chx

Erm. Nope. You only get to remove that tag if you'd removed events.

larowlan’s picture

Issue tags: +Critical Office Hours

tagging for review during critical hours today

larowlan’s picture

+++ b/core/tests/Drupal/Tests/Core/DependencyInjection/Compiler/RegisterEventListenersPassTest.php
@@ -0,0 +1,202 @@
+    // @FIXME Introduce the weight of the modules.

Still needs doing? Looks like the test includes module weights so perhaps old comment?

I don't see that 'service_collector' tag is being addressed yet - is that in scope here or not?

dawehner’s picture

StatusFileSize
new5 KB
new20 KB

I don't see that 'service_collector' tag is being addressed yet - is that in scope here or not?

Can you describe what you mean by that point?

Still needs doing? Looks like the test includes module weights so perhaps old comment?

You are right, in testProcessWithMultipleSubscribersWithModuleWeightAndSamePriorities we deal with it already.

Also renamed from EventListeners to EventSubscribers, from former feedback of @chx

larowlan’s picture

Can you describe what you mean by that point?

So two breadcrumb builders in the same file with the same priority.
I think the answer is use a priority, but not sure how that differs from the overall OP.

dawehner’s picture

So two breadcrumb builders in the same file with the same priority.
I think the answer is use a priority, but not sure how that differs from the overall OP.

Ah I see, well yeah, better use priority. They might also not conflict with each other in the first place though.

larowlan’s picture

Status: Needs review » Reviewed & tested by the community

Let's do it

Status: Reviewed & tested by the community » Needs work

The last submitted patch, 69: 2344645-69.patch, failed testing.

larowlan’s picture

Issue tags: +Needs reroll

Someone can re-roll in office hours

larowlan’s picture

Status: Needs work » Needs review
StatusFileSize
new20.02 KB

straight re-roll

Status: Needs review » Needs work

The last submitted patch, 75: event-order.75.patch, failed testing.

Status: Needs work » Needs review

larowlan queued 75: event-order.75.patch for re-testing.

Status: Needs review » Needs work

The last submitted patch, 75: event-order.75.patch, failed testing.

znerol’s picture

The latest patch still does not address #59 / #60.

catch’s picture

Assigned: catch » Unassigned
Issue tags: -

Not sure why this is assigned to me.

Anonymous’s picture

Status: Needs work » Needs review
Issue tags: -Needs reroll
StatusFileSize
new23.22 KB

69 rerolled against 8.0.x-dev, hope it helps!

Status: Needs review » Needs work

The last submitted patch, 81: 2344645-81-rerol69.patch, failed testing.

effulgentsia’s picture

Issue tags: -Critical Office Hours

Since this issue is no longer critical, untagging for critical office hours. Don't know if we have or should start a "Major Office Hours" or similar tag.

Status: Needs work » Needs review

dawehner queued 81: 2344645-81-rerol69.patch for re-testing.

Status: Needs review » Needs work

The last submitted patch, 81: 2344645-81-rerol69.patch, failed testing.

xjm’s picture

Version: 8.0.x-dev » 8.2.x-dev
Issue tags: -beta target

This issue was marked as a beta target for the 8.0.x beta, but is not applicable as an 8.1.x beta target, so untagging.

This sounds disruptive still, so moving to 8.2.x.

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

Drupal 8.2.0-beta1 was released on August 3, 2016, which means new developments and disruptive changes should now 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.3.x-dev » 8.4.x-dev

Drupal 8.3.0-alpha1 will be released the week of January 30, 2017, which means new developments and disruptive changes should now 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.

xjm’s picture

Issue tags: -rc deadline

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

Drupal 8.4.0-alpha1 will be released the week of July 31, 2017, which means new developments and disruptive changes should now 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.5.x-dev » 8.6.x-dev

Drupal 8.5.0-alpha1 will be released the week of January 17, 2018, which means new developments and disruptive changes should now 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.

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

Drupal 8.6.0-alpha1 will be released the week of July 16, 2018, which means new developments and disruptive changes should now 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.7.x-dev » 8.8.x-dev

Drupal 8.7.0-alpha1 will be released the week of March 11, 2019, which means new developments and disruptive changes should now be targeted against the 8.8.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.8.x-dev » 8.9.x-dev

Drupal 8.8.0-alpha1 will be released the week of October 14th, 2019, which means new developments and disruptive changes should now be targeted against the 8.9.x-dev branch. (Any changes to 8.9.x will also be committed to 9.0.x in preparation for Drupal 9’s release, but some changes like significant feature additions will be deferred to 9.1.x.). 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.1.x-dev

Drupal 8.9.0-beta1 was released on March 20, 2020. 8.9.x is the final, long-term support (LTS) minor release of Drupal 8, which means new developments and disruptive changes should now 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: 9.1.x-dev » 9.2.x-dev

Drupal 9.1.0-alpha1 will be released the week of October 19, 2020, which means new developments and disruptive changes should now be targeted for the 9.2.x-dev branch. For more information see the Drupal 9 minor version schedule and the Allowed changes during the Drupal 9 release cycle.

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

Drupal 9.2.0-alpha1 will be released the week of May 3, 2021, which means new developments and disruptive changes should now be targeted for the 9.3.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.3.x-dev » 9.4.x-dev

Drupal 9.3.0-rc1 was released on November 26, 2021, which means new developments and disruptive changes should now be targeted for the 9.4.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.0-alpha1 was released on May 6, 2022, which means new developments and disruptive changes should now 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.

quietone’s picture

Updating tag.

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

Drupal 9.5.0-beta2 and Drupal 10.0.0-beta2 were released on September 29, 2022, which means new developments and disruptive changes should now 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: 10.1.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, which currently accepts only minor-version allowed changes. For more information, see the Drupal core minor version schedule and the Allowed changes during the Drupal core release cycle.

Version: 11.x-dev » main

Drupal core is now using the main branch as the primary development branch. New developments and disruptive changes should now be targeted to the main branch.

Read more in the announcement.