[rdct] IJPL-166453: Avoid getting component for local ClientId when intentionally reloading it for another ClientId

If an InstanceHolder was created for a component under the local ClientId, it was returned in ComponentManagerImpl.doGetService. However, in ComponentManagerImpl.reloadPerClientState we intentionally want to get the component for another ClientId.

GitOrigin-RevId: 121a95e104ef4d84e47a3b7c394680a98f9d5c58
This commit is contained in:
Nikita Zaytsev
2025-08-01 15:56:29 +00:00
committed by intellij-monorepo-bot
parent 45896caa60
commit ac357741de
3 changed files with 10 additions and 1 deletions
@@ -710,7 +710,7 @@ abstract class ComponentStoreImpl : IComponentStore {
throw AssertionError("This method must be called under remote client id")
}
val perClientComponent = (storageManager.componentManager ?: application).getService(componentClass) ?: return
val perClientComponent = (storageManager.componentManager ?: application).getServiceForClient(componentClass) ?: return
if (perClientComponent === info.component) {
LOG.error(
"Failed to reload per-client component '${info.stateSpec?.name ?: componentClass.simpleName}': " +
@@ -101,6 +101,11 @@ public interface ComponentManager extends UserDataHolder, Disposable, AreaInstan
*/
<T> T getService(@NotNull Class<T> serviceClass);
@ApiStatus.Internal
default <T> T getServiceForClient(@NotNull Class<T> serviceClass) {
return getService(serviceClass);
}
/**
* Collects all services registered with matching client="..." attribute in xml.
* Take a look at {@link com.intellij.openapi.client.ClientSession}
@@ -20,6 +20,10 @@ abstract class ClientAwareComponentManager: ComponentManagerImpl {
protected constructor(parentScope: CoroutineScope): super(parentScope)
override fun <T : Any> getServiceForClient(serviceClass: Class<T>): T? {
return postGetService(serviceClass, createIfNeeded = true)
}
override fun <T : Any> getServices(serviceClass: Class<T>, clientKind: ClientKind): List<T> {
val sessionsManager = super.getService(ClientSessionsManager::class.java)!!
return sessionsManager.getSessions(clientKind).mapNotNull {