diff --git a/platform/statistics/src/com/intellij/internal/statistic/eventLog/validator/IntellijSensitiveDataValidator.kt b/platform/statistics/src/com/intellij/internal/statistic/eventLog/validator/IntellijSensitiveDataValidator.kt index 542adf4c4065..0996173044d8 100644 --- a/platform/statistics/src/com/intellij/internal/statistic/eventLog/validator/IntellijSensitiveDataValidator.kt +++ b/platform/statistics/src/com/intellij/internal/statistic/eventLog/validator/IntellijSensitiveDataValidator.kt @@ -90,7 +90,7 @@ open class IntellijSensitiveDataValidator protected constructor( private val recorderId: String, ) : SensitiveDataValidator>(fusComponents?.metadataStorage ?: EMPTY_METADATA_STORAGE) { companion object { - private val instances = ConcurrentHashMap() + private val instances = ConcurrentHashMap>() init { CustomValidationRule.EP_NAME.addChangeListener({ instances.clear() }, null) @@ -105,18 +105,22 @@ open class IntellijSensitiveDataValidator protected constructor( @JvmStatic fun getInstance(recorderId: String): IntellijSensitiveDataValidator { return instances.computeIfAbsent(recorderId) { id -> - if (ApplicationManager.getApplication().isUnitTestMode) { - BlindSensitiveDataValidator(FusComponentProvider.createBlindFusComponents(id), id) + // Validator creation initializes metadata storage and may do IO; keep it outside ConcurrentHashMap locks. + lazy(LazyThreadSafetyMode.SYNCHRONIZED) { + if (ApplicationManager.getApplication().isUnitTestMode) { + BlindSensitiveDataValidator(FusComponentProvider.createBlindFusComponents(id), id) + } + else { + IntellijSensitiveDataValidator(FusComponentProvider.createFusComponents(id), id) + } } - else { - IntellijSensitiveDataValidator(FusComponentProvider.createFusComponents(id), id) - } - } + }.value } @JvmStatic fun getIfInitialized(recorderId: String): IntellijSensitiveDataValidator? { - return instances[recorderId] + val validator = instances[recorderId] ?: return null + return if (validator.isInitialized()) validator.value else null } private val EMPTY_METADATA_STORAGE: MetadataStorage = object : MetadataStorage { @@ -261,4 +265,4 @@ private class BlindSensitiveDataValidator( } override suspend fun isGroupAllowed(group: EventLogGroup): Boolean = true -} \ No newline at end of file +}