PubSub Runtime Error, Could not find policy 'pick_first' in META-INF/services/io.grpc.LoadBalancerProvider

523 Views Asked by At

I have a maven project with pubsub and I use maven-assembly-plugin to generate a jar file with dependencies.

With pubsub version 1.104.1, the jar file is working properly and I tried to update it to latest version 1.123.13. After updating, my application works as expected with exec-maven-plugin, but the same code is not working with a maven-assembly-plugin-generated jar file.

POM file and Error as follows.

<!-- language: xml -->
    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>org.example</groupId>
        <artifactId>test</artifactId>
        <version>1.0-SNAPSHOT</version>
    
        <properties>
            <java.version>8</java.version>
            <junit-version>4.4</junit-version>
        </properties>
    
        <dependencies>
           
            <dependency>
                <groupId>com.google.cloud</groupId>
                <artifactId>google-cloud-pubsub</artifactId>
                <version>1.123.13</version>
            </dependency>
    
        </dependencies>
    
        <build>
    
            <extensions>
                <extension>
                    <groupId>kr.motd.maven</groupId>
                    <artifactId>os-maven-plugin</artifactId>
                    <version>1.5.0.Final</version>
                </extension>
            </extensions>
    
            <plugins>
    
                <plugin>
                    <groupId>org.jacoco</groupId>
                    <artifactId>jacoco-maven-plugin</artifactId>
                    <version>0.8.5</version>
                    <executions>
                        <execution>
                            <goals>
                                <goal>prepare-agent</goal>
                            </goals>
                        </execution>
                        <execution>
                            <id>report</id>
                            <phase>prepare-package</phase>
                            <goals>
                                <goal>report</goal>
                            </goals>
                        </execution>
                        <execution>
                            <id>jacoco-check</id>
                            <goals>
                                <goal>check</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
    
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-assembly-plugin</artifactId>
                    <version>3.6.0</version>
                    <configuration>
                        <archive>
                            <manifest>
                                <addClasspath>true</addClasspath>
                                <mainClass>Main</mainClass>
                            </manifest>
                        </archive>
                        <descriptorRefs>
                            <descriptorRef>jar-with-dependencies</descriptorRef>
                        </descriptorRefs>
                    </configuration>
                    <executions>
                        <execution>
                            <id>assemble-all</id>
                            <phase>package</phase>
                            <goals>
                                <goal>single</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
    
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.7.0</version>
                    <configuration>
                        <source>1.8</source>
                        <target>1.8</target>
                    </configuration>
                </plugin>
            </plugins>
    
            <pluginManagement>
                <plugins>
                    <plugin>
                        <groupId>org.codehaus.mojo</groupId>
                        <artifactId>exec-maven-plugin</artifactId>
                        <version>1.6.0</version>
                        <configuration>
                            <cleanupDaemonThreads>false</cleanupDaemonThreads>
                        </configuration>
                    </plugin>
                    <plugin>
                        <groupId>org.sonarsource.scanner.maven</groupId>
                        <artifactId>sonar-maven-plugin</artifactId>
                        <version>3.7.0.1746</version>
                    </plugin>
                </plugins>
            </pluginManagement>
    
        </build>
    
    </project>

Error Log

Jun 13, 2023 12:15:11 PM io.grpc.internal.ManagedChannelImpl$2 uncaughtException
        SEVERE: [Channel<3>: (pubsub.googleapis.com:443)] Uncaught exception in the SynchronizationContext. Panic!
        java.lang.IllegalStateException: Could not find policy 'pick_first'. Make sure its implementation is either registered to LoadBalancerRegistry or included in META-INF/services/io.grpc.LoadBalancerProvider from your jar files.
                at io.grpc.internal.AutoConfiguredLoadBalancerFactory$AutoConfiguredLoadBalancer.<init>(AutoConfiguredLoadBalancerFactory.java:94)
                at io.grpc.internal.AutoConfiguredLoadBalancerFactory.newLoadBalancer(AutoConfiguredLoadBalancerFactory.java:61)
                at io.grpc.internal.ManagedChannelImpl.exitIdleMode(ManagedChannelImpl.java:413)
                at io.grpc.internal.ManagedChannelImpl$RealChannel$2.run(ManagedChannelImpl.java:968)
                at io.grpc.SynchronizationContext.drain(SynchronizationContext.java:95)
                at io.grpc.SynchronizationContext.execute(SynchronizationContext.java:127)
                at io.grpc.internal.ManagedChannelImpl$RealChannel.newCall(ManagedChannelImpl.java:965)
                at com.google.api.gax.grpc.GrpcChannelUUIDInterceptor.interceptCall(GrpcChannelUUIDInterceptor.java:52)
                at io.grpc.ClientInterceptors$InterceptorChannel.newCall(ClientInterceptors.java:156)
                at com.google.api.gax.grpc.GrpcHeaderInterceptor.interceptCall(GrpcHeaderInterceptor.java:80)
                at io.grpc.ClientInterceptors$InterceptorChannel.newCall(ClientInterceptors.java:156)
                at com.google.api.gax.grpc.GrpcMetadataHandlerInterceptor.interceptCall(GrpcMetadataHandlerInterceptor.java:54)
                at io.grpc.ClientInterceptors$InterceptorChannel.newCall(ClientInterceptors.java:156)
                at io.grpc.internal.ManagedChannelImpl.newCall(ManagedChannelImpl.java:907)
                at io.grpc.internal.ForwardingManagedChannel.newCall(ForwardingManagedChannel.java:63)
                at com.google.api.gax.grpc.ChannelPool$AffinityChannel.newCall(ChannelPool.java:516)
                at com.google.api.gax.grpc.ChannelPool.newCall(ChannelPool.java:145)
                at com.google.api.gax.grpc.GrpcClientCalls.newCall(GrpcClientCalls.java:99)
                at com.google.api.gax.grpc.GrpcDirectCallable.futureCall(GrpcDirectCallable.java:60)
                at com.google.api.gax.grpc.GrpcUnaryRequestParamCallable.futureCall(GrpcUnaryRequestParamCallable.java:65)
                at com.google.api.gax.grpc.GrpcExceptionCallable.futureCall(GrpcExceptionCallable.java:64)
                at com.google.api.gax.rpc.AttemptCallable.call(AttemptCallable.java:87)
                at com.google.api.gax.rpc.RetryingCallable.futureCall(RetryingCallable.java:63)
                at com.google.api.gax.rpc.RetryingCallable.futureCall(RetryingCallable.java:41)
                at com.google.api.gax.tracing.TracedUnaryCallable.futureCall(TracedUnaryCallable.java:75)
                at com.google.api.gax.rpc.UnaryCallable$1.futureCall(UnaryCallable.java:126)
                at com.google.api.gax.rpc.UnaryCallable.futureCall(UnaryCallable.java:87)
                at com.google.api.gax.rpc.UnaryCallable.call(UnaryCallable.java:112)
                at com.google.cloud.pubsub.v1.TopicAdminClient.createTopic(TopicAdminClient.java:319)
                at com.google.cloud.pubsub.v1.TopicAdminClient.createTopic(TopicAdminClient.java:224)
                at com.stl.sciocardio.common.pubsub.PubSubConsumer.createTopic(PubSubConsumer.java:232)
                at com.stl.sciocardio.common.pubsub.PubSubConsumer.startConsume(PubSubConsumer.java:197)
                at com.stl.sciocardio.common.pubsub.PubSubConsumer.run(PubSubConsumer.java:138)
                at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
                at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
                at java.base/java.lang.Thread.run(Thread.java:830)
        
        Exception in thread "pool-1-thread-1" com.google.api.gax.rpc.InternalException: io.grpc.StatusRuntimeException: INTERNAL: Panic! This is a bug!
                at com.google.api.gax.rpc.ApiExceptionFactory.createException(ApiExceptionFactory.java:110)
                at com.google.api.gax.rpc.ApiExceptionFactory.createException(ApiExceptionFactory.java:41)
                at com.google.api.gax.grpc.GrpcApiExceptionFactory.create(GrpcApiExceptionFactory.java:86)
                at com.google.api.gax.grpc.GrpcApiExceptionFactory.create(GrpcApiExceptionFactory.java:66)
                at com.google.api.gax.grpc.GrpcExceptionCallable$ExceptionTransformingFuture.onFailure(GrpcExceptionCallable.java:97)
                at com.google.api.core.ApiFutures$1.onFailure(ApiFutures.java:84)
                at com.google.common.util.concurrent.Futures$CallbackListener.run(Futures.java:1132)
                at com.google.common.util.concurrent.DirectExecutor.execute(DirectExecutor.java:31)
                at com.google.common.util.concurrent.AbstractFuture.executeListener(AbstractFuture.java:1270)
                at com.google.common.util.concurrent.AbstractFuture.addListener(AbstractFuture.java:761)
                at com.google.common.util.concurrent.ForwardingListenableFuture.addListener(ForwardingListenableFuture.java:47)
                at com.google.api.core.ApiFutureToListenableFuture.addListener(ApiFutureToListenableFuture.java:49)
                at com.google.common.util.concurrent.Futures.addCallback(Futures.java:1105)
                at com.google.api.core.ApiFutures.addCallback(ApiFutures.java:79)
                at com.google.api.gax.grpc.GrpcExceptionCallable.futureCall(GrpcExceptionCallable.java:67)
                at com.google.api.gax.rpc.AttemptCallable.call(AttemptCallable.java:87)
                at com.google.api.gax.rpc.RetryingCallable.futureCall(RetryingCallable.java:63)
                at com.google.api.gax.rpc.RetryingCallable.futureCall(RetryingCallable.java:41)
                at com.google.api.gax.tracing.TracedUnaryCallable.futureCall(TracedUnaryCallable.java:75)
                at com.google.api.gax.rpc.UnaryCallable$1.futureCall(UnaryCallable.java:126)
                at com.google.api.gax.rpc.UnaryCallable.futureCall(UnaryCallable.java:87)
                at com.google.api.gax.rpc.UnaryCallable.call(UnaryCallable.java:112)
                at com.google.cloud.pubsub.v1.TopicAdminClient.createTopic(TopicAdminClient.java:319)
                at com.google.cloud.pubsub.v1.TopicAdminClient.createTopic(TopicAdminClient.java:224)
                at com.stl.sciocardio.common.pubsub.PubSubConsumer.createTopic(PubSubConsumer.java:232)
                at com.stl.sciocardio.common.pubsub.PubSubConsumer.startConsume(PubSubConsumer.java:197)
                at com.stl.sciocardio.common.pubsub.PubSubConsumer.run(PubSubConsumer.java:138)
                at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
                at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
                at java.base/java.lang.Thread.run(Thread.java:830)
                Suppressed: com.google.api.gax.rpc.AsyncTaskException: Asynchronous task failed
                        at com.google.api.gax.rpc.ApiExceptions.callAndTranslateApiException(ApiExceptions.java:57)
                        ... 9 more
        Caused by: io.grpc.StatusRuntimeException: INTERNAL: Panic! This is a bug!
                at io.grpc.Status.asRuntimeException(Status.java:539)
                at io.grpc.stub.ClientCalls$UnaryStreamToFuture.onClose(ClientCalls.java:544)
                at io.grpc.PartialForwardingClientCallListener.onClose(PartialForwardingClientCallListener.java:39)
                at io.grpc.ForwardingClientCallListener.onClose(ForwardingClientCallListener.java:23)
                at io.grpc.ForwardingClientCallListener$SimpleForwardingClientCallListener.onClose(ForwardingClientCallListener.java:40)
                at com.google.api.gax.grpc.ChannelPool$ReleasingClientCall$1.onClose(ChannelPool.java:541)
                at io.grpc.internal.ClientCallImpl.closeObserver(ClientCallImpl.java:567)
                at io.grpc.internal.ClientCallImpl.access$300(ClientCallImpl.java:71)
                at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl$1StreamClosed.runInternal(ClientCallImpl.java:735)
                at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl$1StreamClosed.runInContext(ClientCallImpl.java:716)
                at io.grpc.internal.ContextRunnable.run(ContextRunnable.java:37)
                at io.grpc.internal.SerializingExecutor.run(SerializingExecutor.java:133)
                ... 3 more
        Caused by: java.lang.IllegalStateException: Could not find policy 'pick_first'. Make sure its implementation is either registered to LoadBalancerRegistry or included in META-INF/services/io.grpc.LoadBalancerProvider from your jar files.
                at io.grpc.internal.AutoConfiguredLoadBalancerFactory$AutoConfiguredLoadBalancer.<init>(AutoConfiguredLoadBalancerFactory.java:94)
                at io.grpc.internal.AutoConfiguredLoadBalancerFactory.newLoadBalancer(AutoConfiguredLoadBalancerFactory.java:61)
                at io.grpc.internal.ManagedChannelImpl.exitIdleMode(ManagedChannelImpl.java:413)
                at io.grpc.internal.ManagedChannelImpl$RealChannel$2.run(ManagedChannelImpl.java:968)
                at io.grpc.SynchronizationContext.drain(SynchronizationContext.java:95)
                at io.grpc.SynchronizationContext.execute(SynchronizationContext.java:127)
                at io.grpc.internal.ManagedChannelImpl$RealChannel.newCall(ManagedChannelImpl.java:965)
                at com.google.api.gax.grpc.GrpcChannelUUIDInterceptor.interceptCall(GrpcChannelUUIDInterceptor.java:52)
                at io.grpc.ClientInterceptors$InterceptorChannel.newCall(ClientInterceptors.java:156)
                at com.google.api.gax.grpc.GrpcHeaderInterceptor.interceptCall(GrpcHeaderInterceptor.java:80)
                at io.grpc.ClientInterceptors$InterceptorChannel.newCall(ClientInterceptors.java:156)
                at com.google.api.gax.grpc.GrpcMetadataHandlerInterceptor.interceptCall(GrpcMetadataHandlerInterceptor.java:54)
                at io.grpc.ClientInterceptors$InterceptorChannel.newCall(ClientInterceptors.java:156)
                at io.grpc.internal.ManagedChannelImpl.newCall(ManagedChannelImpl.java:907)
                at io.grpc.internal.ForwardingManagedChannel.newCall(ForwardingManagedChannel.java:63)
                at com.google.api.gax.grpc.ChannelPool$AffinityChannel.newCall(ChannelPool.java:516)
                at com.google.api.gax.grpc.ChannelPool.newCall(ChannelPool.java:145)
                at com.google.api.gax.grpc.GrpcClientCalls.newCall(GrpcClientCalls.java:99)
                at com.google.api.gax.grpc.GrpcDirectCallable.futureCall(GrpcDirectCallable.java:60)
                at com.google.api.gax.grpc.GrpcUnaryRequestParamCallable.futureCall(GrpcUnaryRequestParamCallable.java:65)
                at com.google.api.gax.grpc.GrpcExceptionCallable.futureCall(GrpcExceptionCallable.java:64)
                at com.google.api.gax.rpc.AttemptCallable.call(AttemptCallable.java:87)
                at com.google.api.gax.rpc.RetryingCallable.futureCall(RetryingCallable.java:63)
                at com.google.api.gax.rpc.RetryingCallable.futureCall(RetryingCallable.java:41)
                at com.google.api.gax.tracing.TracedUnaryCallable.futureCall(TracedUnaryCallable.java:75)
                at com.google.api.gax.rpc.UnaryCallable$1.futureCall(UnaryCallable.java:126)
                at com.google.api.gax.rpc.UnaryCallable.futureCall(UnaryCallable.java:87)
                at com.google.api.gax.rpc.UnaryCallable.call(UnaryCallable.java:112)
                at com.google.cloud.pubsub.v1.TopicAdminClient.createTopic(TopicAdminClient.java:319)
                at com.google.cloud.pubsub.v1.TopicAdminClient.createTopic(TopicAdminClient.java:224)
                at com.stl.sciocardio.common.pubsub.PubSubConsumer.createTopic(PubSubConsumer.java:232)
                at com.stl.sciocardio.common.pubsub.PubSubConsumer.startConsume(PubSubConsumer.java:197)
                at com.stl.sciocardio.common.pubsub.PubSubConsumer.run(PubSubConsumer.java:138)
                ... 3 more

What is the reason for this?

1

There are 1 best solutions below

0
Nuwan Sameera On BEST ANSWER

Issue getting when same file provide by many dependencies. At jar file generation time it select one file. If required details not available in selected file, this kind of issues can happen.

Following is the solution for my issue.

  1. Replace maven-assembly-plugin from maven-shade-plugin[1]. This plugin create executable jar file. At the build time it shows overlapping resources.

  2. At build result shows META-INF/services/io.grpc.LoadBalancerProvider overlapping resource.

    [WARNING] grpc-core-1.55.1.jar, grpc-grpclb-1.55.1.jar, grpc-rls-1.55.1.jar, grpc-services-1.55.1.jar, grpc-xds-1.55.1.jar define 1 overlapping resource: [WARNING] - META-INF/services/io.grpc.LoadBalancerProvider

  3. Here it shows three dependencies have io.grpc.LoadBalancerProvider file. But their contents are different. Only grpc-core has pick_first record. If another file select at jar file generation, run time pick_first record not found.

  4. With shade plugin there is a option to merge all same name service files. Following transformer need to add in pom.xml [2] <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>

Shade plugin details in pom.xml

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>3.4.1</version>
        <executions>
            <execution>
                <phase>package</phase>
                <goals>
                    <goal>shade</goal>
                </goals>
                <configuration>
                    <filters>
                        <filter>
                            <artifact>*:*</artifact>
                            <excludes>
                                <exclude>META-INF/*.SF</exclude>
                                <exclude>META-INF/*.DSA</exclude>
                                <exclude>META-INF/*.RSA</exclude>
                            </excludes>
                        </filter>
                    </filters>
                    <transformers>
                        <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                            <mainClass>Main Class</mainClass>
                        </transformer>
                        <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
                    </transformers>
                </configuration>
            </execution>
        </executions>
    </plugin>

[1]. https://maven.apache.org/plugins/maven-shade-plugin/examples/executable-jar.html

[2]. https://maven.apache.org/plugins/maven-shade-plugin/apidocs/org/apache/maven/plugins/shade/resource/ServicesResourceTransformer.html