Skip to content

Commit 14ba833

Browse files
committed
Serialization: remove potential data race during extension registration
RCA: Before this commit, serialization plugin performed its protobuf extension registration during its own initialization. This could provoke a data race between one thread without serialization already doing some work with protobuf and another thread with serialization registering this extension in parallel thus changing the same HashMap. Also, after the commit ea46a4f we got exactly 12 standard protobuf extensions, and one more from serialization provokes rehashing in the map making this race possible in practice. This commit makes registration for standard & serialization extensions together, thus removing a possibility of the data race. #KT-83984 Fixed #KT-81700 Fixed #KT-82473 Fixed #KT-83339 Fixed
1 parent fb8d334 commit 14ba833

4 files changed

Lines changed: 18 additions & 14 deletions

File tree

compiler/util-klib-metadata/src/org/jetbrains/kotlin/library/metadata/KlibMetadataSerializerProtocol.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,16 @@
55

66
package org.jetbrains.kotlin.library.metadata
77

8+
import org.jetbrains.kotlin.library.metadata.KlibMetadataProtoBuf.registerAllExtensions
9+
import org.jetbrains.kotlin.metadata.SerializationPluginMetadataExtensions
810
import org.jetbrains.kotlin.protobuf.ExtensionRegistryLite
911
import org.jetbrains.kotlin.serialization.SerializerExtensionProtocol
1012

1113
object KlibMetadataSerializerProtocol : SerializerExtensionProtocol(
12-
ExtensionRegistryLite.newInstance().apply(KlibMetadataProtoBuf::registerAllExtensions),
14+
ExtensionRegistryLite.newInstance().apply {
15+
registerAllExtensions(this)
16+
SerializationPluginMetadataExtensions.registerAllExtensions(this)
17+
},
1318
KlibMetadataProtoBuf.packageFqName,
1419
KlibMetadataProtoBuf.constructorAnnotation,
1520
KlibMetadataProtoBuf.classAnnotation,

core/metadata.jvm/src/org/jetbrains/kotlin/metadata/jvm/deserialization/JvmProtoBufUtil.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,10 @@
66
package org.jetbrains.kotlin.metadata.jvm.deserialization
77

88
import org.jetbrains.kotlin.metadata.ProtoBuf
9+
import org.jetbrains.kotlin.metadata.SerializationPluginMetadataExtensions
910
import org.jetbrains.kotlin.metadata.deserialization.*
1011
import org.jetbrains.kotlin.metadata.jvm.JvmProtoBuf
12+
import org.jetbrains.kotlin.metadata.jvm.JvmProtoBuf.registerAllExtensions
1113
import org.jetbrains.kotlin.metadata.jvm.serialization.JvmStringTable
1214
import org.jetbrains.kotlin.protobuf.ExtensionRegistryLite
1315
import org.jetbrains.kotlin.protobuf.MessageLite
@@ -16,7 +18,10 @@ import java.io.ByteArrayOutputStream
1618
import java.io.InputStream
1719

1820
object JvmProtoBufUtil {
19-
val EXTENSION_REGISTRY: ExtensionRegistryLite = ExtensionRegistryLite.newInstance().apply(JvmProtoBuf::registerAllExtensions)
21+
val EXTENSION_REGISTRY: ExtensionRegistryLite = ExtensionRegistryLite.newInstance().apply {
22+
registerAllExtensions(this)
23+
SerializationPluginMetadataExtensions.registerAllExtensions(this)
24+
}
2025

2126
const val PLATFORM_TYPE_ID = "kotlin.jvm.PlatformType"
2227

js/js.serializer/src/org/jetbrains/kotlin/serialization/js/JsSerializerProtocol.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,17 @@
55

66
package org.jetbrains.kotlin.serialization.js
77

8+
import org.jetbrains.kotlin.metadata.SerializationPluginMetadataExtensions
89
import org.jetbrains.kotlin.metadata.js.JsProtoBuf
10+
import org.jetbrains.kotlin.metadata.js.JsProtoBuf.registerAllExtensions
911
import org.jetbrains.kotlin.protobuf.ExtensionRegistryLite
1012
import org.jetbrains.kotlin.serialization.SerializerExtensionProtocol
1113

1214
object JsSerializerProtocol : SerializerExtensionProtocol(
13-
ExtensionRegistryLite.newInstance().apply(JsProtoBuf::registerAllExtensions),
15+
ExtensionRegistryLite.newInstance().apply {
16+
registerAllExtensions(this)
17+
SerializationPluginMetadataExtensions.registerAllExtensions(this)
18+
},
1419
JsProtoBuf.packageFqName,
1520
JsProtoBuf.constructorAnnotation,
1621
JsProtoBuf.classAnnotation,

plugins/kotlinx-serialization/kotlinx-serialization.cli/src/org/jetbrains/kotlinx/serialization/compiler/extensions/SerializationComponentRegistrar.kt

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,9 @@ import org.jetbrains.kotlin.container.useInstance
1414
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
1515
import org.jetbrains.kotlin.extensions.StorageComponentContainerContributor
1616
import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrarAdapter
17-
import org.jetbrains.kotlin.library.metadata.KlibMetadataSerializerProtocol
18-
import org.jetbrains.kotlin.metadata.SerializationPluginMetadataExtensions
19-
import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmProtoBufUtil
2017
import org.jetbrains.kotlin.platform.TargetPlatform
2118
import org.jetbrains.kotlin.resolve.extensions.SyntheticResolveExtension
2219
import org.jetbrains.kotlin.serialization.DescriptorSerializerPlugin
23-
import org.jetbrains.kotlin.serialization.js.JsSerializerProtocol
2420
import org.jetbrains.kotlinx.serialization.compiler.diagnostic.SerializationPluginDeclarationChecker
2521
import org.jetbrains.kotlinx.serialization.compiler.extensions.SerializationConfigurationKeys.DISABLE_INTRINSIC
2622
import org.jetbrains.kotlinx.serialization.compiler.fir.FirSerializationExtensionRegistrar
@@ -74,7 +70,6 @@ class SerializationComponentRegistrar : CompilerPluginRegistrar() {
7470
// So we create SerializationDescriptorSerializerPlugin only outside of IDE.
7571
val serializationDescriptorSerializer = SerializationDescriptorSerializerPlugin()
7672
DescriptorSerializerPlugin.registerExtension(serializationDescriptorSerializer)
77-
registerProtoExtensions()
7873

7974
SyntheticResolveExtension.registerExtension(SerializationResolveExtension(serializationDescriptorSerializer))
8075

@@ -84,12 +79,6 @@ class SerializationComponentRegistrar : CompilerPluginRegistrar() {
8479

8580
FirExtensionRegistrarAdapter.registerExtension(FirSerializationExtensionRegistrar())
8681
}
87-
88-
private fun registerProtoExtensions() {
89-
SerializationPluginMetadataExtensions.registerAllExtensions(JvmProtoBufUtil.EXTENSION_REGISTRY)
90-
SerializationPluginMetadataExtensions.registerAllExtensions(JsSerializerProtocol.extensionRegistry)
91-
SerializationPluginMetadataExtensions.registerAllExtensions(KlibMetadataSerializerProtocol.extensionRegistry)
92-
}
9382
}
9483
}
9584

0 commit comments

Comments
 (0)