Problem/Motivation
Currently service provider for a module called the_module_name must be in a class called Drupal\module\TheModuleName. This naming is rather brittle, very hard to learn (and the decision to do this was made outside of normal core processes).
Steps to reproduce
Proposed resolution
Before going into the proposals, let's note YamlFileLoader has been forked from Symfony because at the time adding the Config component was not desirable however in #2464053: Remove @todo to Improve YamlFileLoader so that we can cache built service definition objects and not just the raw data. Drupal specific file caching was added which makes it fairly impossible to unfork it ever again. Thus, I will not list editing YamlFileLoader as a con.
Several proposals exist:
Add aservice_providerskey inservices.yml. Pros: multiple classes can be registered with ease with any name. Cons: it's a new Drupalism in services.yml.Call the classDrupal\module\ServicesorServiceProvider. Pros: it's very simple, avoids weird naming for more complex module names. Cons: it's still magic naming -- however checking for the all lower case version as well is not too hard to avoid FS problem.Put the registration in the module info yml (or composer.json). Pros: it keeps the Drupalisms in one place. Cons: alexpott doesn't think it belongs there.- ✅ Make them tagged services. Pros: it's easy and cheap to implement both in core and in modules. Cons: not much? injecting services need to be done with care because the container is still being built but then again both methods of these classes already receive the container and need to be careful with getting services so nothing new is happening here, really.
Remaining tasks
Choose approach 4 has the most votes for now
Review https://git.drupalcode.org/project/drupal/-/merge_requests/11198/diffs
Decide whether ServiceProvider classes should be renamed (as is in the current MR) or keep the ServiceProvider suffix.
User interface changes
N/A
Introduced terminology
N/A
API changes
Service providers are now tagged services
Data model changes
N/A
Release notes snippet
N/A
Original issue summary
In the docs at https://www.drupal.org/docs/8/api/services-and-dependency-injection/alte...
> Note that if you want this service alteration to be recognized automatically, the name of this class is required to be a CamelCase version of your module's machine name followed by ServiceProvider, it is required to be in your module's top-level namespace Drupal\your_module_name, and it must implement \Drupal\Core\DependencyInjection\ServiceModifierInterface (which ServiceProviderBase does).
The relevant code is in discoverServiceProviders().
It seems a bit backwards to be doing magic discovery on a class name, when all other things of this sort are done by explicitly declaring the class -- eg dynamic routes, dynamic permissions.
In line with that pattern, we should declare a dynamic service provider in the module's services.yml file.
| Comment | File | Size | Author |
|---|---|---|---|
| #123 | 2910814-nr-bot.txt | 91 bytes | needs-review-queue-bot |
| #121 | 2910814-nr-bot.txt | 91 bytes | needs-review-queue-bot |
| #115 | 2910814-nr-bot.txt | 91 bytes | needs-review-queue-bot |
Issue fork drupal-2910814
Show commands
Start within a Git clone of the project using the version control instructions.
Or, if you do not have SSH keys set up on git.drupalcode.org:
Comments
Comment #2
dawehnerIf I understand you correctly you are talking about something like this?
I would love that! I've been trying someone to help debugging a problem where something worked on their machine, but not on the testbot. It turned out, they camelcased their module name in the wrong way, and as such had issues with case (in)sensitive file systems.
Comment #3
joachim commentedYes, exactly like that!
Comment #4
dawehnerHere is just a start for people to play around with it.
Comment #6
dawehnerHere is also a test to prove it works.
Comment #9
claudiu.cristea#2817627: Make service swapping easier is not a duplicate but it allows overriding services provided by a different module directly in the
*.services.ymlfile.Comment #10
dawehnerI added a deprecation notice for now.
Comment #13
claudiu.cristeaI tried to test the deprecation, with
@expectedDeprecation, in \Drupal\KernelTests\Core\DrupalKernel\DrupalKernelTest::testServiceProviders() but it doesn't work. Have no idea why.Fixed all core deprecations.
Comment #14
borisson_This is looking really great, I like these changes. I think that the current core deprecation testing is sufficient and that we don't need to add that for this class.
Comment #15
joachim commentedI think we should add a TODO comment to this bit, to say it needs to be removed before D9:
Comment #16
claudiu.cristeaAdded @todo, improved a little around the docs.
Comment #17
joachim commentedLooks good!
Comment #18
alexpottI would argue that the deprecation is a much more effective @todo than this comment. Especially if we have a legacy test.
This should tell you which module has implicit service providers and what they are. This should be tested.
Comment #19
claudiu.cristea@alexpott, I tried to test, see my comment from #13 but the deprecation is not catched. Probably it's too early?
Added the test. Regarding the @todo, I think it doesn't hurt.
Comment #21
claudiu.cristeaFinally, I found out that
DrupalKernelTest::setUp()is not invokingparent::setUp()and this makes the PHPUnit Bridge not to be in effect. I haven't dig too much to find the exact point where this happens. Creating a new kernel test that is just usingparent::setUp()is fixing the problem.Comment #22
alexpott@claudiu.cristea nice sleuthing! Can you open an issue about DrupalKernelTest not having deprecation testing. I agree that fixing that here is out-of-scope.
Re the @todo - there's a standard that an @todo should be created with a corresponding issue. For me adding the deprecation is the @todo and we shouldn't be creating issues against Drupal 9 for every deprecation. Or maybe we should I don't know but to paraphrase @catch "a @todo without an issue is like a scream in space"
Comment #23
claudiu.cristeaRemoved the @todo.
Created #3001128: DrupalKernelTest doesn't test deprecation. I will add a "test only" patch there, as soon as this gets in, just to reuse the testing module introduced here.
Comment #24
joachim commentedNitpick: the error message could do to mention the new top-level key we are adding here.
Otherwise, RTBC.
Comment #25
alexpottThe one thing I wonder is are we missing a trick and not doing more of this in \Drupal\Core\DependencyInjection\YamlFileLoader - otoh introducing a drupalism into services.yml files is also interesting.
This is depending on an internal detail of YamlFileLoader outside of YamlFileLoader. That feels pretty odd.
Comment #26
claudiu.cristea@alexpott doing that in YamlFileLoader means we have to diverge more our ContainerBuilder in order to store there the service provider classes.
Comment #27
claudiu.cristeaAlternatively, we ca avoid the drupalism by moving the service provider classes in separate file $module.service_providers.yml
Comment #28
dawehnerAt least we replace one kind of Drupalism with sort of one other.
Comment #29
joachim commented> otoh introducing a drupalism into services.yml files is also interesting.
> At least we replace one kind of Drupalism with sort of one other.
And IMO it's a much better Drupalism.
The existing magic classname is a one-off pattern. Nothing else in core behaves like that, expecting the module name in a class name in a certain file location. It's obscure: if you try to find where a service comes from, you don't know to look for this file.
The pattern of declaring a class in a YAML that provides dynamic things is a pattern that is repeated in other parts of core: routes and permissions both do this already. It's also more explicit. You look for service definitions in the services.yml file, and you spot this 'service provider' declaration, and it's pretty clear what it means.
Comment #30
alexpottI totally agree that declaration is much better than magic discovery based on names. It's great to deprecate the magic and replace with a declarative approach and yes doing this inline with things like permissions.
But that still leaves open the how and the where. I think the current approach is the first new thing we've added to Symfony's services.yml files and moving us away from that means that we should take time to carefully consider if and how we do that. I agree with @joachim that a big +1 for putting it in the services.yml file is that this is were we declare a modules services so provider and modifier classes also belong here. A separate yaml file does seem icky and the only other places would be a modules .info.yml or composer.json and I don't think this belongs there. So +1 for putting in the module.services.yml. Also there are a number of Symfony things that we don't support - for example https://symfony.com/doc/current/service_container/import.html#importing-... so this divergence has already occurred.
So now we're extending what goes in services.yml files I think we need to look at our implementation. As noted in #25 the current implementation reaches into the internals of a cache to do an optimised read. That feels wrong. Also the uncached read takes place because we do a read for adding the services so on a completely uncached container rebuild we'll be doing 2 reads of the same file.
Comment #40
joachim commentedMade a MR with patch #23.
Still needs work for various comments above.
Comment #42
nicxvan commentedOh this is very interesting! I wonder if this might work for the install requirements: #3490843: Create class to replace hook_requirements('install')
Comment #43
nicxvan commentedDid a pass at calling out what needs to change for tests to run.
I think this looks great, not sure if there is anything to address 25 specifically.
Comment #44
tim.plunkettTo be clear, this is an MR I made of the branch @joachim of the patch @claudiu.cristea made in 2018. There's definitely a lot of cruft in it.
@nicxvan feel free to push to the MR fork!
Comment #45
nicxvan commentedI know, I wanted to just take on reviewing for now.
Comment #46
nicxvan commentedI'm gonna apply my comments and work on the other changes needed.
Comment #47
nicxvan commentedFixed the easy stuff, this is going to need a lot more work, currently
core/tests/Drupal/Tests/Core/DependencyInjection/YamlFileLoaderTest.phpneeds a lot of updates for the new error checking for valid keys.Comment #48
ghost of drupal pastAs always, I was curious how this came to be.
Well, there's no explanation. The camelize was added in d1e52e0089 which doesn't have an issue ID associated with it neither does the commit message "Various cleanups" tells us anything. This is what happened:
And then in #1988508: Stop pretending we support Symfony bundles when we really just have service providers it was merely kept. In that issue effulgenstia had an idea which might or might not be worth reconsidering: call the service provider simply
Drupal\modulename\Services.Comment #49
catchWent back a bit further via Google/related issues instead of git blame. I remember I hated the very existence of this, both the code and the way initiatives were ran which produced it.
#1716048: Do not boot bundle classes on every request
#1715940: Remove DIC compilation until it can be dumped to disk which has the choice phrase 'premature optimization' when talking about making changes to what was already a more than ten years old legacy code base.
This might be it. Don't think I was wrong in comment #1 #1599108: Allow modules to register services and subscriber services (events) glad we are finally getting there even if it involved reversing out of a lot of dead ends.
Comment #50
nicxvan commentedThat was quite the read!
This is going to take some effort though I think.
Comment #51
nicxvan commentedOk, there were a couple of modules with service providers missing the key in services.yml. I added those.
I also moved the service providers above the services key so it's clearer if a module uses one.
Let's see how this does with the tests.
Comment #52
ghost of drupal pastI added a few ideas and wrote a new issue summary.
Comment #53
catchTalked about this issue briefly with @ghost of drupal past. I'm not entirely sure that diverging from the services.yml format is worth it to avoid magic naming, so wondering about #2 in the issue summary.
Comment #54
ghost of drupal pastComment #55
ghost of drupal pastComment #56
ghost of drupal pastComment #58
ghost of drupal pastComment #59
ghost of drupal pastComment #60
nicxvan commentedThat makes finding a specific one hard to find, even the few test classes that have the same name it's hard to be sure you're in the right one or find it.
I generally navigate to a file using ctrl + E then type it, if there are more than a couple of files with the same name it becomes painful to pick them out.
moduleServiceProvider is magic naming, but at least it helps you find it and the file name tells you which module it's for if you're comparing two service providers.
Comment #61
nicxvan commentedApproach number 4 is encouraging!
Comment #62
nicxvan commentedDo we want to release the new feature here and do the core conversion / deprecation separately? Or do we want to do it all in one issue?
There are about 20 Service providers in core so it's not too bad to do it all at once.
Comment #63
nicxvan commentedComment #64
ghost of drupal pastThe tagged services branch is ready for review. I do not think it needs an explicit test, converting LanguageServiceProvider shows it works. I added preliminary code for deprecation, it just needs to be uncommented.
Comment #65
godotislate1 small nit/comment on the MR.
On a related tangent, has there been thought about deprecating service providers altogether? A lot of what service providers do can be done with service decorators. (Granted that LanguageServiceProvider setting a container parameter is an exception.)
But allowing services to be instantiated in service providers is a blocker to autowiring core services, as seen in #3295751: Autowire core services that do not require explicit configuration #48.
Comment #66
ghost of drupal pastI tried to shorten the code by moving things into a service pass but ordering makes it not viable. This is short enough.
Comment #67
ghost of drupal pastI reimplemented the tagged services branch with an even shorter version -- only DrupalKernel needs change and not much change at that.
Comment #69
nicxvan commentedI hid the other MR since this one seems a lot more concise.
@catch mentioned in slack that we can likely do the conversion here too which let's us deprecate too.
I'm going to start on converting the remaining ones.
Comment #70
nicxvan commentedOk I've converted everything and enabled the deprecation message.
Comment #71
nicxvan commentedComment #72
ghost of drupal pastSorry we have not answered #65 adequately. I checked the core service providers:
Overall, I do not think this can be dropped.
Comment #73
acbramley commentedIMO if we're going to remove the magic naming, we should also support autoconfigure for these new tagged services like we have for EventSubscribers and loggers now.
It seems backwards to me to require less magic and more yaml when we've been progressing so much towards less yaml with autowiring, autoconfiguring, etc.
Comment #74
acbramley commentedWhy don't we
1. Add autoconfiguration based on the interface similar to https://www.drupal.org/node/3357408
2. Keep class names as is, saves bike shedding a new naming convention and reduces changes
3. Only throw the deprecation if the class has the magic name AND it wasn't already autoconfigured or manually defined in a services.yml
Comment #75
claudiu.cristeaShould we introduce also “priority” for the tag, same as for destructible services? As it’s about service alterers I can see some value
Comment #76
nicxvan commentedI think renaming them is cleaner, how about EarlyServices?
Also, why not do the priority and autoconfigure work in a follow up, this is already a clean and easy to review issue with three things.
Adding more stuff that can be done in a follow up feels like it is out of scope.
Comment #77
acbramley commentedI think autoconfigure should be done here so we're not going backwards in terms of now having to define it as a tagged service in yaml, then all of a sudden not having to. Priority imo can be a separate issue as that's entirely new.
I still don't think we should change the names. EarlyServices doesn't make much sense to me. ServiceProvider imo is the best. If we're going to force modules to have to change class names for the sake of it that's even worse.
Comment #78
ghost of drupal pastComment #79
nicxvan commentedI agree with this, but I also agree services is too generic.
I am going to name them ServiceAlter, or Service Register, for the ones that do both I'll split them, how is that?
78.2 is precisely why this should be a follow up.
This is the only magically named class in core, removing this isn't backwards even if we are adding a tag in services.yml
Comment #80
acbramley commentedOk putting aside the autoconfig stuff for now (did not expect that to be so controversial), can we look at allowing the class names to remain as is and only fire a deprecation if it's a magicly named service provider rather than a tagged one?
Otherwise we're telling contrib "your service provider can't be called ServiceProvider"
Comment #81
acbramley commentedBackwards was referring to requiring more yaml. All the other autodiscovery/autowire/autoconfig stuff we've got into core in the past year is moving to less yaml
Comment #82
acbramley commentedMissed this bit. I think the deprecation is perfect for showing things are changing without being as disruptive. Moving to NW to do the swap.
Comment #83
nicxvan commentedI didn't see your comments, I just finished renaming them to be service alter or service register depending on which they are doing.
That way we keep the simplest deprecation and the classes now actually describe what they are doing.
Service provider isn't what they are either.
I hope this is acceptable, I think it will be really confusing to keep the name the same and tell people they have to put the yaml, with the rename, which is just renaming the file and the class they can tag it, otherwise I think it seems like what you're saying, adding the tag for no reason.
Yep, but that's a clean way to tell people to add the tag too. Also what does service provider mean semantically I think these new names are more descriptive anyway.
Comment #84
ghost of drupal pastI upgraded https://www.drupal.org/node/3357408 to be quite a bit more clear about what is happening and crucially removed the link to the Symfony documentation because Drupal only autoconfigures registered services -- Symfony picks classes up from the filesystem and registers them as services so it was quite a bit misleading as to what autoconfigure means to Drupal.
Now that I stepped through what autoconfiguration does, it's quite clear it does not apply here since autoconfiguration is handled by
RegisterAutoconfigureAttributesPassand this runs before any service passes. It needs to. (A few days ago I tried to convert it to a pass, it just doesn't work.)I rebased on 11.x.
Comment #85
acbramley commentedRe #83
But it's simpler if we don't force modules to change class names? The classes extend ServiceProviderInterface, a class name with ServiceProvider in it seems to describe it well.
Also, if we force a name change now it means come Drupal 12 modules will technically be able to use that name again. It just seems odd to force that IMO.
The reason should be basically the same as why this issue itself exists? Is it for performance, or just that magic naming is bad? Either way that's justification enough IMO. I think it's stranger to artificially force a name change for 1 major version of Drupal in the sake of making it seem like there's a reason to? If that makes sense 😅
Re #84
Thanks for the clarification! I would love to see services autoregistered as well, We want to do that with loggers (see #3395439: Automatically create a logger channel for autoconfigured modules) and it could definitely work for this service provider tagged service and event subscribers too.
I'm still not seeing a good reason to force the name change, I won't change the status again though as maybe we need another opinion?
I'm coming at this from a DX perspective, the change from magic naming is good, just not the forced name change IMO.
Comment #86
ghost of drupal pastTo clarify what #83 says, if there's no rename then people won't understand why they need to tag it. But, the rename is not forced. Core does the renames to be more clear, contrib can do whatever they want. I just pushed a version where the tagged services fire first and then if any magic named classes remain then they fire and trigger the deprecation. Previously it was the other way 'round which meant if someone actually injected something in the service definition it wouldn't have worked -- but never was a forced rename proposed. If contrib wants to keep name, sure they can -- in fact I expect most contrib in the beginning to keep 'em so they can maintain a single branch.
Comment #87
nicxvan commentedOh I like that compromise.
Comment #88
acbramley commentedThanks, it certainly was made to sound that way!
Still think it'd be better to leave core as is in case someone is doing something with these classes but I'm happy as long as we're not forcing the change :)
Comment #89
ghost of drupal past> in case someone is doing something with these classes
https://www.drupal.org/about/core/policies/core-change-policies/bc-policy basically everything that is like a "herd" implementation of an interface is not BC, specifically listed are plugins, paramconverters, entity handler etc. Also, it is not at all clear why would anyone want to, changing services has its own interface. Perhaps to reach a utility function but the only provider with a utility function is languageserviceprovider and that's not used in contrib https://git.drupalcode.org/search?group_id=2&scope=blobs&search=language... and since the functions are isMultilingual / getDefaultLanguageValue it's hard to see why custom code would need 'em , surely you know whether your site is multilingual or not. Oh and protected methods are also exempt from BC so you shouldn't be using them anyways. So: the class is exempted, the methods are exempted and they are not used for what little there is.
And, once again, the code in DrupalKernel ever since this idea came up always allowed for renaming or not renaming. This is not my first rodeo :)
Comment #90
acbramley commentedI've tested this locally and there's a few issues.
1. The trigger_error wasn't throwing a deprecation, this has uncovered some providers that haven't been converted (e.g InstallerServiceProvider) - I've applied a fix for this.
2. Deprecations are still thrown if a class is named with the old magic naming. I tested this by reverting FileServiceAlter to FileServiceProvider and running a Kernel test. The deprecation is still thrown even with an entry in file.services.yml
3. Other random things are throwing deprecations now:
Comment #91
acbramley commentedComment #92
ghost of drupal pastThanks! Yes, that's a recent oversight from #86. Please test again and if there are still unexpected fails, I will need reproduction instructions but I think we are good now.
Comment #93
acbramley commentedTests are failing on non magic named things
Also can still reproduce my previous report of magic named classes still throwing errors with the new service_provider tag.
Steps to reproduce this are applying the following diff:
Comment #94
ghost of drupal pastOK and after naming it back, what are you running? It's going to be something tests do, I bet...
Comment #95
acbramley commented@ghost of drupal past just running a random test that installs file module. In this case DownloadTest::testPublicFileTransfer.
I think the test failures in CI are showing that there's more to it seeing as non-magically named services that are tagged are also throwing errors.
I can also put a breakpoint on the trigger_error line and hit it via a
drush crwhich throws these:Comment #96
ghost of drupal pastOK. The problem was tagged services marked with servicemodifierinterace got added to the service provider objects list before depreciation message hit so those were thought to be deprecated.
(MysqlServiceRegister should be changed to implement only one of the interfaces.)
Comment #97
ghost of drupal pastjsonapi was left behind, I converted it.
Comment #98
acbramley commentedNice, that latest commit has fixed both issues.
I do still think we should keep core classes as they were to cover us from these weird bugs in the future. That way we won't regress for contrib.
Comment #99
ghost of drupal pastWe are now running in circles. I thought the question of renaming was resolved in #88.
Comment #100
acbramley commented@ghost of drupal past no it was not resolved. I don't see the point in renaming core classes if it's not needed, especially since it's potentially hiding bugs from what we can see from my manual testing.
Now things are getting even weirder with the jsonapi split. We have
class JsonapiServiceAlter implements ServiceModifierInterfacewhere the other *ServiceAlter classes are extendingServiceProviderInterface. Andclass JsonapiServiceRegister implements ServiceProviderInterfaceI think I see where the *Alter and *Register are coming from though. They are matching the methods they are implementing (
alterfromServiceModifierInterfaceandregisterfromServiceProviderInterface). However, classes that extend ServiceProviderBase which implements both don't fit here, this base class is used a lot by core and contrib.Comment #101
nicxvan commentedAs mentioned it's to illustrate they can be renamed. We could see what each is doing and find a name that is unique and split them further.
However, I think that's follow up territory.
Yes alter and register are based on the method.
The alters should probably use
ServiceModifierInterfaceAnd register should probably use
ServiceProviderInterfaceComment #104
ghost of drupal pastOK back to the service_providers approach it seems, our approach has failed to gain acceptance.
Comment #105
ghost of drupal pastComment #107
nicxvan commentedI wouldn't be too hasty, there is one person against renaming, and two for it, we can get other opinions.
Also if other's also agree that we shouldn't rename, we can always name everything back to serviceProvider and just tag them.
Putting this back to needs review so we can gather other opinions.
Comment #108
acbramley commentedYes please don't take my disagreement on renaming as a disagreement on the change as a whole, I have said that overall this is great. I am just trying to get it into a state that I think would be easiest for a committer to review and commit, and in my mind the renaming could block that and turn into a bike shedding exercise of what things should be called.
With that being said, I will happily concede the naming if it means getting this in faster.
Comment #111
nicxvan commentedBaseline seems out of sync.
If you would not mind asking core dev their opinion on renaming, no need to bike shed more here. If a core committer agrees I'll rename everything back.
Comment #112
acbramley commentedBaseline is fixed
Comment #113
acbramley commentedComment #114
nicxvan commentedFalse alarm
Baseline is still out of sync, but i think it's a different issue.
https://git.drupalcode.org/project/drupal/-/merge_requests/11198/diffs?c...
Those were not changed in this issue.
They were fixed here: https://www.drupal.org/project/drupal/issues/3483146
Comment #115
needs-review-queue-bot commentedThe Needs Review Queue Bot tested this issue. It no longer applies to Drupal core. Therefore, this issue status is now "Needs work".
This does not mean that the patch necessarily needs to be re-rolled or the MR rebased. Read the Issue Summary, the issue tags and the latest discussion here to determine what needs to be done.
Consult the Drupal Contributor Guide to find step-by-step guides for working with issues.
Comment #116
nicxvan commentedRebased.
Comment #117
godotislateAre service providers considered internal, and not API? Service providers aren't mentioned specifically in the BC policy. The closest thing is that compiler passes are considered internal, and it certainly seems like service providers should not be considered API. (It's also really hard for me to imagine how contrib/custom modules would be extending core service providers.)
But if that is not generally understood, then with the service provider classes being moved/split, there probably should be deprecation messages to that effect. Classes that are moved can use the new container parameters from https://www.drupal.org/node/3509577 to deprecate the old class name.
Comment #118
nicxvan commentedGood question!
Comment #119
godotislateWill doing the deprecation alleviate concerns about renaming? Adding the container parameters aliases the old class name to the new class name and provides BC, though the added typehints would be a breaking change for any implementing subclass methods.
Comment #120
ghost of drupal pastLet me restate #89: while the letter of the law doesn't include service providers the spirit of it certainly does. The way I read https://www.drupal.org/about/core/policies/core-change-policies/bc-policy basically everything that is like a "herd" implementation of an interface is not BC, specifically listed are plugins, paramconverters, entity handler etc.
It only makes sense TBH. You should only be interacting with the interface not the specific classes.
Comment #121
needs-review-queue-bot commentedThe Needs Review Queue Bot tested this issue. It no longer applies to Drupal core. Therefore, this issue status is now "Needs work".
This does not mean that the patch necessarily needs to be re-rolled or the MR rebased. Read the Issue Summary, the issue tags and the latest discussion here to determine what needs to be done.
Consult the Drupal Contributor Guide to find step-by-step guides for working with issues.
Comment #122
nicxvan commentedRebased.
Comment #123
needs-review-queue-bot commentedThe Needs Review Queue Bot tested this issue. It no longer applies to Drupal core. Therefore, this issue status is now "Needs work".
This does not mean that the patch necessarily needs to be re-rolled or the MR rebased. Read the Issue Summary, the issue tags and the latest discussion here to determine what needs to be done.
Consult the Drupal Contributor Guide to find step-by-step guides for working with issues.