jeremylvln / Shulker

A Kubernetes operator for managing complex and dynamic Minecraft infrastructures, including game servers and proxies.
https://shulker.jeremylvln.fr/
GNU Affero General Public License v3.0
181 stars 14 forks source link

Agent crashes due to NoClassDefFoundError #489

Closed TehNeon closed 6 months ago

TehNeon commented 6 months ago

What happened?

Upon launching a cluster with the new operator, the plugin on both proxy & game will end up erroring causing the pod to get terminated. These logs were generated with the tutorial cluster.

What components are involved in your issue?

Proxy Agent (BungeeCord), Proxy Agent (Velocity), Server Agent (Paper)

Version

0.8.0

Kubernetes Version

1.28.7

Relevant log output

Velocity Logs:
19:36:36 ERROR] [io.shulkermc.proxyagent.velocity.ShulkerProxyAgentVelocity]: Shulker Agent crashed, stopping proxy
java.util.concurrent.ExecutionException: io.grpc.StatusRuntimeException: CANCELLED: Failed to read message.
    at java.base/java.util.concurrent.CompletableFuture.reportGet(Unknown Source) ~[?:?]
    at java.base/java.util.concurrent.CompletableFuture.get(Unknown Source) ~[?:?]
    at io.shulkermc.proxyagent.ShulkerProxyAgentCommon.onProxyInitialization(ShulkerProxyAgentCommon.kt:53) ~[?:?]
    at io.shulkermc.proxyagent.velocity.ShulkerProxyAgentVelocity.onProxyInitialization(ShulkerProxyAgentVelocity.kt:30) ~[?:?]
    at io.shulkermc.proxyagent.velocity.Lmbda$11.execute(Unknown Source) ~[?:?]
    at com.velocitypowered.proxy.event.UntargetedEventHandler$VoidHandler.lambda$buildHandler$0(UntargetedEventHandler.java:56) ~[velocity.jar:3.3.0-SNAPSHOT (git-8891faa5-b370)]
    at com.velocitypowered.proxy.event.VelocityEventManager.fire(VelocityEventManager.java:597) ~[velocity.jar:3.3.0-SNAPSHOT (git-8891faa5-b370)]
    at com.velocitypowered.proxy.event.VelocityEventManager.lambda$fire$5(VelocityEventManager.java:478) ~[velocity.jar:3.3.0-SNAPSHOT (git-8891faa5-b370)]
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) ~[?:?]
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) ~[?:?]
    at java.base/java.lang.Thread.run(Unknown Source) [?:?]
Caused by: io.grpc.StatusRuntimeException: CANCELLED: Failed to read message.
    at io.grpc.Status.asRuntimeException(Status.java:533) ~[?:?]
    at io.grpc.stub.ClientCalls$UnaryStreamToFuture.onClose(ClientCalls.java:538) ~[?:?]
    at io.grpc.internal.ClientCallImpl.closeObserver(ClientCallImpl.java:574) ~[?:?]
    at io.grpc.internal.ClientCallImpl.access$300(ClientCallImpl.java:72) ~[?:?]
    at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl$1StreamClosed.runInternal(ClientCallImpl.java:742) ~[?:?]
    at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl$1StreamClosed.runInContext(ClientCallImpl.java:723) ~[?:?]
    at io.grpc.internal.ContextRunnable.run(ContextRunnable.java:37) ~[?:?]
    at io.grpc.internal.SerializingExecutor.run(SerializingExecutor.java:133) ~[?:?]
    ... 3 more
Caused by: java.lang.NoClassDefFoundError: com/google/protobuf/GeneratedMessageV3
    at java.base/java.lang.ClassLoader.defineClass1(Native Method) ~[?:?]
    at java.base/java.lang.ClassLoader.defineClass(Unknown Source) ~[?:?]
    at java.base/java.security.SecureClassLoader.defineClass(Unknown Source) ~[?:?]
    at java.base/java.net.URLClassLoader.defineClass(Unknown Source) ~[?:?]
    at java.base/java.net.URLClassLoader$1.run(Unknown Source) ~[?:?]
    at java.base/java.net.URLClassLoader$1.run(Unknown Source) ~[?:?]
    at java.base/java.security.AccessController.doPrivileged(Unknown Source) ~[?:?]
    at java.base/java.net.URLClassLoader.findClass(Unknown Source) ~[?:?]
    at java.base/java.lang.ClassLoader.loadClass(Unknown Source) ~[?:?]
    at com.velocitypowered.proxy.plugin.PluginClassLoader.loadClass0(PluginClassLoader.java:70) ~[velocity.jar:3.3.0-SNAPSHOT (git-8891faa5-b370)]
    at com.velocitypowered.proxy.plugin.PluginClassLoader.loadClass(PluginClassLoader.java:64) ~[velocity.jar:3.3.0-SNAPSHOT (git-8891faa5-b370)]
    at java.base/java.lang.ClassLoader.loadClass(Unknown Source) ~[?:?]
    at com.google.api.AnnotationsProto.<clinit>(AnnotationsProto.java:45) ~[?:?]
    at com.agones.dev.sdk.SdkProto.<clinit>(SdkProto.java:201) ~[?:?]
    at com.agones.dev.sdk.GameServer$ObjectMeta$AnnotationsDefaultEntryHolder.<clinit>(GameServer.java:455) ~[?:?]
    at com.agones.dev.sdk.GameServer$ObjectMeta$Builder.mergeFrom(GameServer.java:1123) ~[?:?]
    at com.agones.dev.sdk.GameServer$ObjectMeta$Builder.mergeFrom(GameServer.java:883) ~[?:?]
    at com.google.protobuf.CodedInputStream$ArrayDecoder.readMessage(CodedInputStream.java:845) ~[?:?]
    at com.agones.dev.sdk.GameServer$Builder.mergeFrom(GameServer.java:9195) ~[?:?]
    at com.agones.dev.sdk.GameServer$1.parsePartialFrom(GameServer.java:9617) ~[?:?]
    at com.agones.dev.sdk.GameServer$1.parsePartialFrom(GameServer.java:9609) ~[?:?]
    at com.google.protobuf.AbstractParser.parseFrom(AbstractParser.java:63) ~[?:?]
    at com.google.protobuf.AbstractParser.parseFrom(AbstractParser.java:25) ~[?:?]
    at io.grpc.protobuf.lite.ProtoLiteUtils$MessageMarshaller.parseFrom(ProtoLiteUtils.java:245) ~[?:?]
    at io.grpc.protobuf.lite.ProtoLiteUtils$MessageMarshaller.parse(ProtoLiteUtils.java:237) ~[?:?]
    at io.grpc.protobuf.lite.ProtoLiteUtils$MessageMarshaller.parse(ProtoLiteUtils.java:134) ~[?:?]
    at io.grpc.MethodDescriptor.parseResponse(MethodDescriptor.java:284) ~[?:?]
    at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl$1MessagesAvailable.runInternal(ClientCallImpl.java:667) ~[?:?]
    at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl$1MessagesAvailable.runInContext(ClientCallImpl.java:654) ~[?:?]
    at io.grpc.internal.ContextRunnable.run(ContextRunnable.java:37) ~[?:?]
    at io.grpc.internal.SerializingExecutor.run(SerializingExecutor.java:133) ~[?:?]
    ... 3 more

Paper logs:
[io.shulkermc.proxyagent.velocity.ShulkerProxyAgentVelocity]: Shulker Agent crashed, stopping proxy
java.util.concurrent.ExecutionException: io.grpc.StatusRuntimeException: CANCELLED: Failed to read message.
    at java.base/java.util.concurrent.CompletableFuture.reportGet(Unknown Source) ~[?:?]
    at java.base/java.util.concurrent.CompletableFuture.get(Unknown Source) ~[?:?]
    at io.shulkermc.proxyagent.ShulkerProxyAgentCommon.onProxyInitialization(ShulkerProxyAgentCommon.kt:53) ~[?:?]
    at io.shulkermc.proxyagent.velocity.ShulkerProxyAgentVelocity.onProxyInitialization(ShulkerProxyAgentVelocity.kt:30) ~[?:?]
    at io.shulkermc.proxyagent.velocity.Lmbda$11.execute(Unknown Source) ~[?:?]
    at com.velocitypowered.proxy.event.UntargetedEventHandler$VoidHandler.lambda$buildHandler$0(UntargetedEventHandler.java:56) ~[velocity.jar:3.3.0-SNAPSHOT (git-8891faa5-b370)]
    at com.velocitypowered.proxy.event.VelocityEventManager.fire(VelocityEventManager.java:597) ~[velocity.jar:3.3.0-SNAPSHOT (git-8891faa5-b370)]
    at com.velocitypowered.proxy.event.VelocityEventManager.lambda$fire$5(VelocityEventManager.java:478) ~[velocity.jar:3.3.0-SNAPSHOT (git-8891faa5-b370)]
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) ~[?:?]
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) ~[?:?]
    at java.base/java.lang.Thread.run(Unknown Source) [?:?]
Caused by: io.grpc.StatusRuntimeException: CANCELLED: Failed to read message.
    at io.grpc.Status.asRuntimeException(Status.java:533) ~[?:?]
    at io.grpc.stub.ClientCalls$UnaryStreamToFuture.onClose(ClientCalls.java:538) ~[?:?]
    at io.grpc.internal.ClientCallImpl.closeObserver(ClientCallImpl.java:574) ~[?:?]
    at io.grpc.internal.ClientCallImpl.access$300(ClientCallImpl.java:72) ~[?:?]
    at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl$1StreamClosed.runInternal(ClientCallImpl.java:742) ~[?:?]
    at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl$1StreamClosed.runInContext(ClientCallImpl.java:723) ~[?:?]
    at io.grpc.internal.ContextRunnable.run(ContextRunnable.java:37) ~[?:?]
    at io.grpc.internal.SerializingExecutor.run(SerializingExecutor.java:133) ~[?:?]
    ... 3 more
Caused by: java.lang.NoClassDefFoundError: com/google/protobuf/GeneratedMessageV3
    at java.base/java.lang.ClassLoader.defineClass1(Native Method) ~[?:?]
    at java.base/java.lang.ClassLoader.defineClass(Unknown Source) ~[?:?]
    at java.base/java.security.SecureClassLoader.defineClass(Unknown Source) ~[?:?]
    at java.base/java.net.URLClassLoader.defineClass(Unknown Source) ~[?:?]
    at java.base/java.net.URLClassLoader$1.run(Unknown Source) ~[?:?]
    at java.base/java.net.URLClassLoader$1.run(Unknown Source) ~[?:?]
    at java.base/java.security.AccessController.doPrivileged(Unknown Source) ~[?:?]
    at java.base/java.net.URLClassLoader.findClass(Unknown Source) ~[?:?]
    at java.base/java.lang.ClassLoader.loadClass(Unknown Source) ~[?:?]
    at com.velocitypowered.proxy.plugin.PluginClassLoader.loadClass0(PluginClassLoader.java:70) ~[velocity.jar:3.3.0-SNAPSHOT (git-8891faa5-b370)]
    at com.velocitypowered.proxy.plugin.PluginClassLoader.loadClass(PluginClassLoader.java:64) ~[velocity.jar:3.3.0-SNAPSHOT (git-8891faa5-b370)]
    at java.base/java.lang.ClassLoader.loadClass(Unknown Source) ~[?:?]
    at com.google.api.AnnotationsProto.<clinit>(AnnotationsProto.java:45) ~[?:?]
    at com.agones.dev.sdk.SdkProto.<clinit>(SdkProto.java:201) ~[?:?]
    at com.agones.dev.sdk.GameServer$ObjectMeta$AnnotationsDefaultEntryHolder.<clinit>(GameServer.java:455) ~[?:?]
    at com.agones.dev.sdk.GameServer$ObjectMeta$Builder.mergeFrom(GameServer.java:1123) ~[?:?]
    at com.agones.dev.sdk.GameServer$ObjectMeta$Builder.mergeFrom(GameServer.java:883) ~[?:?]
    at com.google.protobuf.CodedInputStream$ArrayDecoder.readMessage(CodedInputStream.java:845) ~[?:?]
    at com.agones.dev.sdk.GameServer$Builder.mergeFrom(GameServer.java:9195) ~[?:?]
    at com.agones.dev.sdk.GameServer$1.parsePartialFrom(GameServer.java:9617) ~[?:?]
    at com.agones.dev.sdk.GameServer$1.parsePartialFrom(GameServer.java:9609) ~[?:?]
    at com.google.protobuf.AbstractParser.parseFrom(AbstractParser.java:63) ~[?:?]
    at com.google.protobuf.AbstractParser.parseFrom(AbstractParser.java:25) ~[?:?]
    at io.grpc.protobuf.lite.ProtoLiteUtils$MessageMarshaller.parseFrom(ProtoLiteUtils.java:245) ~[?:?]
    at io.grpc.protobuf.lite.ProtoLiteUtils$MessageMarshaller.parse(ProtoLiteUtils.java:237) ~[?:?]
    at io.grpc.protobuf.lite.ProtoLiteUtils$MessageMarshaller.parse(ProtoLiteUtils.java:134) ~[?:?]
    at io.grpc.MethodDescriptor.parseResponse(MethodDescriptor.java:284) ~[?:?]
    at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl$1MessagesAvailable.runInternal(ClientCallImpl.java:667) ~[?:?]
    at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl$1MessagesAvailable.runInContext(ClientCallImpl.java:654) ~[?:?]
    at io.grpc.internal.ContextRunnable.run(ContextRunnable.java:37) ~[?:?]
    at io.grpc.internal.SerializingExecutor.run(SerializingExecutor.java:133) ~[?:?]
    ... 3 more

Code of Conduct

jeremylvln commented 6 months ago

That's weird. I've fully tested the flow on my test cluster before releasing. I must have missed something. I'll fix ASAP

jeremylvln commented 6 months ago

Hi @TehNeon I found the issue. I was using a JAR I've built myself to test before the release and the embedded version of Protobuf dependencies were not aligned properly which caused the crash once built.

I've pushed a fix, I'm ensuring that everything works fine and I release a fix version.

Very sorry for the inconvenience, I'll focus some time on automated testing to ensure at least the getting started example is always working

jeremylvln commented 6 months ago

It is fixed in the latest release (0.8.1), again, very sorry

TehNeon commented 6 months ago

Thank you so much! It appears everything is functional on my end again, including all the additional enhancements that have been made.

jeremylvln commented 6 months ago

That's fantastic to hear, do not hesitate to contact me, even just to say that everything work properly. I'm not aware of any production use of Shulker, so any feedback will be really precious for me :)