Hi All,

Below is the exception which we get with Ratis 0.2.0

java.lang.NoSuchFieldError: CONTEXT_SPAN_KEY
  at 
org.apache.ratis.shaded.io.grpc.internal.CensusTracingModule$ServerTracer.filterContext(CensusTracingModule.java:340)
  at 
org.apache.ratis.shaded.io.grpc.internal.StatsTraceContext.serverFilterContext(StatsTraceContext.java:121)
  at 
org.apache.ratis.shaded.io.grpc.internal.ServerImpl$ServerTransportListenerImpl.createContext(ServerImpl.java:482)
  at 
org.apache.ratis.shaded.io.grpc.internal.ServerImpl$ServerTransportListenerImpl.streamCreated(ServerImpl.java:416)
   
<stack trace truncated>


The problem is because of two different definition of 
io.opencensus.trace.unsafe.ContextUtils class present in the classpath. The 
reason for having two different definition of ContextUtils in classpath is due 
to the fact that we are shading/relocating io.grpc and not io.opencensus.


With shading we are generating the below definition which ends up in 
ratis-proto-shaded jar

package io.opencensus.trace.unsafe;

import org.apache.ratis.shaded.io.grpc.Context;
import io.opencensus.trace.Span;

/**
 * Util methods/functionality to interact with the {@link 
org.apache.ratis.shaded.io.grpc.Context}.
 *
 * <p>Users must interact with the current Context via the public APIs in {@link
 * io.opencensus.trace.Tracer} and avoid usages of the {@link 
#CONTEXT_SPAN_KEY} directly.
 *
 * @since 0.5
 */
public final class ContextUtils {
  // No instance of this class.
  private ContextUtils() {}

  /**
   * The {@link org.apache.ratis.shaded.io.grpc.Context.Key} used to interact 
with {@link org.apache.ratis.shaded.io.grpc.Context}.
   *
   * @since 0.5
   */
  public static final Context.Key<Span> CONTEXT_SPAN_KEY = 
Context.key("opencensus-trace-span-key");
}


Since we have added io.opencensus as direct dependency in ratis-grpc we get the 
below definition in io.opencensus:opencensus-api:jar

package io.opencensus.trace.unsafe;

import io.grpc.Context;
import io.opencensus.trace.Span;

/**
 * Util methods/functionality to interact with the {@link io.grpc.Context}.
 *
 * <p>Users must interact with the current Context via the public APIs in {@link
 * io.opencensus.trace.Tracer} and avoid usages of the {@link 
#CONTEXT_SPAN_KEY} directly.
 *
 * @since 0.5
 */
public final class ContextUtils {
  // No instance of this class.
  private ContextUtils() {}

  /**
   * The {@link io.grpc.Context.Key} used to interact with {@link 
io.grpc.Context}.
   *
   * @since 0.5
   */
  public static final Context.Key<Span> CONTEXT_SPAN_KEY = 
Context.key("opencensus-trace-span-key");
}

Both of the jars end up in classpath and ContextUtils is getting loaded from 
io.opencensus:opencensus-api:jar which is causing the problem.

The simple fix would be to remove the dependency of io.opencensus from 
ratis-grpc/pom.xml (patch for the same is attached in this mail). This is not a 
permanent fix, as any application might bring in 
io.opencensus:opencensus-api:jar of its own.

We have to find a way to shade io.opencensus:opencensus-api:jar. 

Note: from the comment in ratis-proto-shaded/pom.xml: Cannot relocate 
io.opencensus due to AutoValue code generation


-Nanda

On 5/7/18, 3:28 PM, "Lokesh Jain" <lj...@hortonworks.com> wrote:

    We found an issue while updating ozone to Ratis snapshot build 
0.1.1-alpha-4309324-SNAPSHOT (https://issues.apache.org/jira/browse/HDDS-19). I 
feel we should hold the release till this is fixed. Please let us know of your 
opinion as well.
    
    Thanks
    Lokesh
    
    

Reply via email to