Kotlin / kotlin-jupyter

Kotlin kernel for Jupyter/IPython
Apache License 2.0
1.09k stars 106 forks source link

Concurrency exception #402

Closed jbaron closed 1 year ago

jbaron commented 1 year ago

Not blocking, but FYI I sometimes see the below exception in the output log (using kotlin-jupyter-kernel 0.11.0.255). Not sure what actions on my side are causing this.

java.util.ConcurrentModificationException: null
    at java.base/java.util.HashMap.computeIfAbsent(HashMap.java:1229)
    at org.jetbrains.kotlinx.jupyter.messaging.MessageTypeSerializer.getMessageType(message_types.kt:149)
    at org.jetbrains.kotlinx.jupyter.messaging.MessageTypeSerializer.deserialize(message_types.kt:162)
    at org.jetbrains.kotlinx.jupyter.messaging.MessageTypeSerializer.deserialize(message_types.kt:145)
    at kotlinx.serialization.json.internal.PolymorphicKt.decodeSerializableValuePolymorphic(Polymorphic.kt:61)
    at kotlinx.serialization.json.internal.AbstractJsonTreeDecoder.decodeSerializableValue(TreeJsonDecoder.kt:52)
    at kotlinx.serialization.internal.TaggedDecoder.decodeSerializableValue(Tagged.kt:207)
    at kotlinx.serialization.internal.TaggedDecoder$decodeSerializableElement$1.invoke(Tagged.kt:280)
    at kotlinx.serialization.internal.TaggedDecoder.tagBlock(Tagged.kt:297)
    at kotlinx.serialization.internal.TaggedDecoder.decodeSerializableElement(Tagged.kt:280)
    at org.jetbrains.kotlinx.jupyter.messaging.MessageHeader$$serializer.deserialize(message_types.kt:110)
    at org.jetbrains.kotlinx.jupyter.messaging.MessageHeader$$serializer.deserialize(message_types.kt:110)
    at kotlinx.serialization.json.internal.PolymorphicKt.decodeSerializableValuePolymorphic(Polymorphic.kt:61)
    at kotlinx.serialization.json.internal.AbstractJsonTreeDecoder.decodeSerializableValue(TreeJsonDecoder.kt:52)
    at kotlinx.serialization.internal.NullableSerializer.deserialize(NullableSerializer.kt:30)
    at kotlinx.serialization.json.internal.PolymorphicKt.decodeSerializableValuePolymorphic(Polymorphic.kt:61)
    at kotlinx.serialization.json.internal.AbstractJsonTreeDecoder.decodeSerializableValue(TreeJsonDecoder.kt:52)
    at kotlinx.serialization.json.internal.TreeJsonDecoderKt.readJson(TreeJsonDecoder.kt:25)
    at kotlinx.serialization.json.Json.decodeFromJsonElement(Json.kt:115)
    at org.jetbrains.kotlinx.jupyter.messaging.MessageDataSerializer.deserialize(message_types.kt:602)
    at org.jetbrains.kotlinx.jupyter.messaging.MessageDataSerializer.deserialize(message_types.kt:536)
    at kotlinx.serialization.json.internal.PolymorphicKt.decodeSerializableValuePolymorphic(Polymorphic.kt:61)
    at kotlinx.serialization.json.internal.AbstractJsonTreeDecoder.decodeSerializableValue(TreeJsonDecoder.kt:52)
    at kotlinx.serialization.json.internal.TreeJsonDecoderKt.readJson(TreeJsonDecoder.kt:25)
    at kotlinx.serialization.json.Json.decodeFromJsonElement(Json.kt:115)
    at org.jetbrains.kotlinx.jupyter.messaging.MessageKt.toMessage(message.kt:115)
    at org.jetbrains.kotlinx.jupyter.messaging.ProtocolKt.controlMessagesHandler(protocol.kt:213)
    at org.jetbrains.kotlinx.jupyter.IkotlinKt$kernelServer$1$1.invoke(ikotlin.kt:136)
    at org.jetbrains.kotlinx.jupyter.IkotlinKt$kernelServer$1$1.invoke(ikotlin.kt:135)
    at org.jetbrains.kotlinx.jupyter.protocol.AbstractJupyterConnection$addMessageCallback$socketCallback$1.invoke(AbstractJupyterConnection.kt:18)
    at org.jetbrains.kotlinx.jupyter.protocol.AbstractJupyterConnection$addMessageCallback$socketCallback$1.invoke(AbstractJupyterConnection.kt:16)
    at org.jetbrains.kotlinx.jupyter.protocol.SocketWrapper.runCallbacksOnMessage(SocketWrapper.kt:62)
    at org.jetbrains.kotlinx.jupyter.IkotlinKt$kernelServer$1$controlThread$1$1.invoke(ikotlin.kt:149)
    at org.jetbrains.kotlinx.jupyter.IkotlinKt$kernelServer$1$controlThread$1$1.invoke(ikotlin.kt:148)
    at org.jetbrains.kotlinx.jupyter.IkotlinKt.kernelServer$lambda$6$socketLoop(ikotlin.kt:125)
    at org.jetbrains.kotlinx.jupyter.IkotlinKt.access$kernelServer$lambda$6$socketLoop(ikotlin.kt:1)
    at org.jetbrains.kotlinx.jupyter.IkotlinKt$kernelServer$1$controlThread$1.invoke(ikotlin.kt:148)
    at org.jetbrains.kotlinx.jupyter.IkotlinKt$kernelServer$1$controlThread$1.invoke(ikotlin.kt:147)
    at kotlin.concurrent.ThreadsKt$thread$thread$1.run(Thread.kt:30)
ileasile commented 1 year ago

Hi, yes, it seems that we need concurrent map implementation or lock here: https://github.com/Kotlin/kotlin-jupyter/blob/master/src/main/kotlin/org/jetbrains/kotlinx/jupyter/messaging/message_types.kt#L146

Would be nice if you implement it, seems easy to fix

jbaron commented 1 year ago

Sure, will have a look at it.

jbaron commented 1 year ago

See PR 404

ileasile commented 1 year ago

Fixed with your PR, thank you!