-
Notifications
You must be signed in to change notification settings - Fork 26.4k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Fix thread pool configuration is invalid #11543
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM. Fix for 3.1.x, and. should be fixed by executor isolation in 3.2.x
private Map<Integer, ExecutorService> getExecutors(URL url) { | ||
Map<Integer, ExecutorService> executors; | ||
// if it's on the provider side and has user-defined services, use biz service executor first, avoid using internal executor | ||
if (PROVIDER_SIDE.equalsIgnoreCase(url.getParameter(SIDE_KEY)) | ||
&& data.containsKey(EXECUTOR_SERVICE_COMPONENT_KEY)) { | ||
executors = data.get(EXECUTOR_SERVICE_COMPONENT_KEY); | ||
} else { | ||
executors = data.get(getExecutorKey(url)); | ||
} | ||
return executors; | ||
} | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I have a question that why ServiceDescriptor serviceDescriptor = applicationModel.getInternalModule().getServiceRepository().lookupService(url.getServiceInterface());
not work?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Because url.getServiceInterface()
always returns MetadataService, when the MetadataService is first loaded.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The PortUnificationExchanger#reset
method will return a new url instead of updating, so the Map in AbstractPortUnificationServer#supportedUrls
will not be changed.
in NettyPortUnificationServerHandler#decode
, localUrl is set by the value in urlMapper, not the updated url
So the url is still MetadataService.
Change private String getExecutorKey(URL url) {
if (CONSUMER_SIDE.equalsIgnoreCase(url.getParameter(SIDE_KEY))) {
return CONSUMER_SHARED_EXECUTOR_SERVICE_COMPONENT_KEY;
}
return EXECUTOR_SERVICE_COMPONENT_KEY;
} |
SonarCloud Quality Gate failed. |
Fixed in #11652 |
What is the purpose of the change
Fix #11524
why:
Initiating RPC in the life cycle initialization phase of Spring Bean, that is, before ServiceBean#afterPropertiesSet, because configManager does not have any serviceConfig, and without publishing any provider, the DefaultApplicationDeployer#exportMetadataService() method is first triggered, resulting in org.apache.dubbo.metadata The .MetadataService metadata interface is exported first, and finally the url is passed and fixed in the ChannelHandler. After the service starts to receive the request, when obtaining the ExecutorService, the thread pool of the MetadataService is obtained through the url, not the thread pool configured by parameters such as dubbo.protocol.threads.
how:
When the getExecutor(URL url) method obtains the thread pool, if it is the provider side and has a user-defined interface, the service thread pool will be used first to avoid using its own thread when the registered URL is org.apache.dubbo.metadata.MetadataService pool.
Brief changelog
Verifying this change
Checklist