We have encountered similar problems in other projects (please see
https://issues.apache.org/jira/browse/ARROW-9315).
The problem is not always reproducible, because it depends on the
particular order of class loading.
That means other systems using different versions of JVM may potentially be
affected by the problem.

Our solution was to change some class initialization task to be lazily
performed. FYI.

Best,
Liya Fan

On Fri, Nov 6, 2020 at 8:20 AM Ruben Q L <[email protected]> wrote:

> Thanks for the answers.
> Indeed, WebSphere uses IBM's own JVM, and my hypothesis is that its class
> loader follows a different (and unlucky) order to load Calcite classes.
> I will continue digging into it, see if I can isolate the problem, and open
> a Jira if there is in fact something to be addressed on Calcite's side.
> Ruben
>
>
> On Fri, Nov 6, 2020 at 12:10 AM Julian Hyde <[email protected]>
> wrote:
>
> > As you’re using Websphere, it’s possible you’re using IBM’s Java runtime.
> > Is that so?
> >
> > Julian
> >
> >
> > > On Nov 5, 2020, at 2:23 PM, Stamatis Zampetakis <[email protected]>
> > wrote:
> > >
> > > Hi Ruben,
> > >
> > > Since you mentioned WebSphere I am wondering if it is related to some
> > weird
> > > problem in the ClassLoader.
> > > If it was only a JVM problem I guess it could be reproduced outside of
> > > WebSphere just by referencing a few Calcite classes in some specific
> > order.
> > >
> > > Other than that, it is better to use JIRA when you have code and
> > > stacktraces; the formatting is helpful.
> > >
> > > Best,
> > > Stamatis
> > >
> > > On Thu, Nov 5, 2020 at 10:00 AM Ruben Q L <[email protected]> wrote:
> > >
> > >> Hello everyone,
> > >>
> > >> I'm getting a strange error on WebSphere 9 (on Ubuntu) when trying to
> > start
> > >> an application that uses Calcite (shaded) library. The exception
> message
> > >> says:
> > >>
> > >> **         error [-]: Unexpected error.
> > >> **               ...
> > >> **               Caused by: java.lang.BootstrapMethodError:
> > >> java.lang.ExceptionInInitializerError
> > >> **
> > >>
> > >>
> >
> com.onwbp.org.apache.calcite.sql.type.InferTypes.<clinit>(InferTypes.java:41)
> > >> **
> > >>
> > >>
> >
> com.onwbp.org.apache.calcite.sql.fun.SqlMultisetSetOperator.<init>(SqlMultisetSetOperator.java:43)
> > >> **
> > >>
> > >>
> >
> com.onwbp.org.apache.calcite.sql.fun.SqlStdOperatorTable.<clinit>(SqlStdOperatorTable.java:118)
> > >> **
> > >>
> > >>
> >
> com.onwbp.org.apache.calcite.adapter.enumerable.RexToLixTranslator.<clinit>(RexToLixTranslator.java:93)
> > >> **               java.lang.Class.forNameImpl(Native Method)
> > >> **               java.lang.Class.forName(Class.java:348)
> > >> **
> > >>
> > >>
> >
> java.lang.invoke.MethodType.nonPrimitiveClassFromString(MethodType.java:311)
> > >> **
> > >> java.lang.invoke.MethodType.parseIntoClasses(MethodType.java:373)
> > >> **
> > >>
> >
> java.lang.invoke.MethodType.fromMethodDescriptorString(MethodType.java:286)
> > >> **
>  java.lang.invoke.MethodHandle.getCPMethodTypeAt(Native
> > >> Method)
> > >> **
> > >>
> > java.lang.invoke.MethodHandle.resolveInvokeDynamic(MethodHandle.java:849)
> > >> **               ... 74 more
> > >> **               Caused by: java.lang.ExceptionInInitializerError
> > >> **
> > >> java.lang.J9VMInternals.ensureError(J9VMInternals.java:141)
> > >> **
> > >>
> >
> java.lang.J9VMInternals.recordInitializationFailure(J9VMInternals.java:130)
> > >> **               java.lang.Class.forNameImpl(Native Method)
> > >> **               java.lang.Class.forName(Class.java:348)
> > >> **
> > >>
> > >>
> >
> java.lang.invoke.MethodType.nonPrimitiveClassFromString(MethodType.java:311)
> > >> **
> > >> java.lang.invoke.MethodType.parseIntoClasses(MethodType.java:373)
> > >> **
> > >>
> >
> java.lang.invoke.MethodType.fromMethodDescriptorString(MethodType.java:286)
> > >> **
>  java.lang.invoke.MethodHandle.getCPMethodTypeAt(Native
> > >> Method)
> > >> **
> > >>
> > java.lang.invoke.MethodHandle.resolveInvokeDynamic(MethodHandle.java:849)
> > >> **               ... 85 more
> > >> **               Caused by: java.lang.NullPointerException
> > >> **
> > >>
> > >>
> >
> com.onwbp.org.apache.calcite.sql.SqlCallBinding.<clinit>(SqlCallBinding.java:60)
> > >> **               ... 92 more
> > >> ****** 1 errors, 5 infos.
> > >>
> > >>
> > >> As we can see there is a NPE in SqlCallBinding:60, when it tries to
> > call a
> > >> method on SqlStdOperatorTable.DEFAULT, which seems to be null [0].
> > >> According to the logs, what I think is happening is a circular
> > dependency
> > >> issue when classes get loaded [1].
> > >> However, so far I have only seen this error in WebSphere, in other
> > >> environments the same application is correctly initialized and
> launched,
> > >> and this exception does not happen.
> > >>
> > >> Has anyone ever seen an issue like this?
> > >> Thanks,
> > >> Ruben
> > >>
> > >> WebSphere version is:
> > >> Integrated Solutions Console, 9.0.0.1
> > >> Build Number: cf011636.02
> > >> Build Date: 9/6/16
> > >>
> > >> It uses java 8:
> > >> java version "1.8.0"
> > >> Java(TM) SE Runtime Environment (build pxa6480sr3fp11-20160817_02(SR3
> > >> FP11))
> > >> IBM J9 VM (build 2.8, JRE 1.8.0 Linux amd64-64 Compressed References
> > >> 20160816_315341 (JIT enabled, AOT enabled)
> > >> J9VM - R28_20160816_1459_B315341
> > >> JIT  - tr.r14.java.green_20160726_121883
> > >> GC   - R28_20160816_1459_B315341_CMPRSS
> > >> J9CL - 20160816_315341)
> > >> JCL - 20160816_01 based on Oracle jdk8u101-b13
> > >>
> > >> [0]
> > >>
> > >>
> >
> https://github.com/apache/calcite/blob/2e9edae7fc57ab9c9c7c097008724ac99a1791a3/core/src/main/java/org/apache/calcite/sql/SqlCallBinding.java#L60
> > >>
> > >> [1]
> > >> *1) RexToLixTranslator.java*
> > >>
> > >> /*90*/ public class RexToLixTranslator implements
> > >> RexVisitor<RexToLixTranslator.Result> {/*91*/  public static final
> > >> Map<Method, SqlOperator> JAVA_TO_SQL_METHOD_MAP =/*92*/
> > >> Util.mapOf(/*93*/          findMethod(String.class, "toUpperCase"),
> > >> SqlStdOperatorTable.UPPER,// --> LOAD SqlStdOperatorTable
> > >>
> > >> *2) SqlStdOperatorTable.java*
> > >>
> > >> /*118*/  public static final SqlMultisetSetOperator
> > >> MULTISET_UNION_DISTINCT =/*119*/      new
> > >> SqlMultisetSetOperator("MULTISET UNION DISTINCT", 14, false);// -->
> > >> LOAD SqlMultisetSetOperator
> > >>
> > >> *3) SqlMultisetSetOperator.java*
> > >>
> > >> /*42*/  public SqlMultisetSetOperator(String name, int prec, boolean
> > >> all) {/*43*/    super(/*44*/        name,/*45*/
> > >> SqlKind.OTHER,/*46*/        prec,/*47*/        true,/*48*/
> > >> ReturnTypes.MULTISET_NULLABLE,/*49*/        InferTypes.FIRST_KNOWN, //
> > >> --> LOAD InferTypes/*50*/
> > >> OperandTypes.MULTISET_MULTISET);/*51*/    this.all = all;/*52*/  }
> > >>
> > >> *4) InferTypes.java*
> > >>
> > >> /*41*/  public static final SqlOperandTypeInference FIRST_KNOWN
> > >> =/*42*/      (callBinding, returnType, operandTypes) -> {/*43*/
> > >> final RelDataType unknownType =/*44*/
> > >> callBinding.getValidator().getUnknownType();/*45*/        RelDataType
> > >> knownType = unknownType;/*46*/        for (SqlNode operand :
> > >> callBinding.operands()) {/*47*/          knownType =
> > >> SqlTypeUtil.deriveType(callBinding, operand);/*48*/          if
> > >> (!knownType.equals(unknownType)) {/*49*/            break;/*50*/
> > >>   }/*51*/        }
> > >> // --> LOAD SqlCallBinding
> > >>
> > >> *5) SqlCallBinding.java*
> > >>
> > >> /*59*/  private static final SqlCall DEFAULT_CALL =/*60*/
> > >> SqlStdOperatorTable.DEFAULT.createCall(SqlParserPos.ZERO);//
> > >> SqlStdOperatorTable is still loading in 2)!
> > >> SqlStdOperatorTable.DEFAULT in SqlStdOperatorTable:185 is null => NPE!
> > >>
> >
> >
>

Reply via email to