Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Retrieving unknown global symbol in LLVMParserRuntime: _ZN9grpc_core14ReclaimerQueue13kInvalidIndexE (java.lang.IllegalStateException) #2611

Closed
jcoleman opened this issue Mar 3, 2022 · 7 comments
Labels
Milestone

Comments

@jcoleman
Copy link

jcoleman commented Mar 3, 2022

Trying to require 'grpc' (using this PR branch since otherwise the native extensions don't build properly: grpc/grpc#27660) I get this:

Retrieving unknown global symbol in LLVMParserRuntime: _ZN9grpc_core14ReclaimerQueue13kInvalidIndexE (java.lang.IllegalStateException)
        from com.oracle.truffle.llvm.parser.LLVMParserRuntime.lookupGlobal(LLVMParserRuntime.java:113)
        from com.oracle.truffle.llvm.parser.model.symbols.globals.GlobalVariable.createNode(GlobalVariable.java:75)
        from com.oracle.truffle.llvm.parser.nodes.LLVMSymbolReadResolver.resolve(LLVMSymbolReadResolver.java:136)
        from com.oracle.truffle.llvm.ParserDriver.lambda$createDebugInfo$4(ParserDriver.java:419)
        from java.util.HashMap.forEach(HashMap.java:1421)
        from com.oracle.truffle.llvm.ParserDriver.createDebugInfo(ParserDriver.java:418)
        from com.oracle.truffle.llvm.ParserDriver.parseBinary(ParserDriver.java:362)
        from com.oracle.truffle.llvm.ParserDriver.parseLibraryWithSource(ParserDriver.java:440)
        from com.oracle.truffle.llvm.ParserDriver.parseWithDependencies(ParserDriver.java:145)
        from com.oracle.truffle.llvm.ParserDriver.parseWithDependencies(ParserDriver.java:131)
        from com.oracle.truffle.llvm.ParserDriver.parse(ParserDriver.java:104)
        from com.oracle.truffle.llvm.DefaultLoader.load(DefaultLoader.java:44)
        from com.oracle.truffle.llvm.runtime.LLVMLanguage.parse(LLVMLanguage.java:540)
        from com.oracle.truffle.api.TruffleLanguage$ParsingRequest.parse(TruffleLanguage.java:933)
        from com.oracle.truffle.api.TruffleLanguage.parse(TruffleLanguage.java:1290)
        from com.oracle.truffle.api.LanguageAccessor$LanguageImpl.parse(LanguageAccessor.java:300)
        from com.oracle.truffle.polyglot.PolyglotSourceCache.parseImpl(PolyglotSourceCache.java:94)
        from com.oracle.truffle.polyglot.PolyglotSourceCache.access$300(PolyglotSourceCache.java:56)
        from com.oracle.truffle.polyglot.PolyglotSourceCache$WeakCache.lookup(PolyglotSourceCache.java:222)
        from com.oracle.truffle.polyglot.PolyglotSourceCache.parseCached(PolyglotSourceCache.java:80)
        from com.oracle.truffle.polyglot.PolyglotLanguageContext.parseCached(PolyglotLanguageContext.java:369)
        from com.oracle.truffle.polyglot.EngineAccessor$EngineImpl.parseForLanguage(EngineAccessor.java:246)
        from com.oracle.truffle.api.TruffleLanguage$Env.parseInternal(TruffleLanguage.java:2215)
        from org.truffleruby.language.loader.FeatureLoader.loadCExtLibrary(FeatureLoader.java:500)
        from org.truffleruby.language.loader.RequireNode.requireCExtension(RequireNode.java:267)
        from org.truffleruby.language.loader.RequireNode.parseAndCall(RequireNode.java:216)
        from org.truffleruby.language.loader.RequireNode.doRequire(RequireNode.java:201)
        from org.truffleruby.language.loader.RequireNode.requireConsideringAutoload(RequireNode.java:125)
        from org.truffleruby.language.loader.RequireNode.lambda$requireWithMetrics$0(RequireNode.java:78)
        from org.truffleruby.debug.MetricsProfiler.callWithMetrics(MetricsProfiler.java:42)
        from org.truffleruby.language.loader.RequireNode.requireWithMetrics(RequireNode.java:75)
        from org.truffleruby.language.loader.RequireNode.require(RequireNode.java:67)
        from org.truffleruby.language.loader.RequireNodeGen.executeRequire(RequireNodeGen.java:30)
        from org.truffleruby.core.kernel.KernelNodes$LoadFeatureNode.loadFeature(KernelNodes.java:341)
        from org.truffleruby.core.kernel.KernelNodesFactory$LoadFeatureNodeFactory$LoadFeatureNodeGen.execute(KernelNodesFactory.java:827)
        from org.truffleruby.language.control.IfElseNode.execute(IfElseNode.java:43)
        from org.truffleruby.language.control.IfElseNode.execute(IfElseNode.java:45)
        from org.truffleruby.language.control.SequenceNode.execute(SequenceNode.java:36)
        from org.truffleruby.language.RubyMethodRootNode.execute(RubyMethodRootNode.java:58)
        from org.graalvm.compiler.truffle.runtime.OptimizedCallTarget.executeRootNode(OptimizedCallTarget.java:655)
/usr/local/bundle/truffleruby/3.0.2.22.0.0/bundler/gems/grpc-b1329700d351/src/ruby/lib/grpc/grpc.rb:22:in `gem_original_require'
        from /usr/local/bundle/truffleruby/3.0.2.22.0.0/bundler/gems/grpc-b1329700d351/src/ruby/lib/grpc/grpc.rb:22:in `<top (required)>'
        from <internal:core> core/kernel.rb:293:in `require_relative'
        from /usr/local/bundle/truffleruby/3.0.2.22.0.0/bundler/gems/grpc-b1329700d351/src/ruby/lib/grpc.rb:19:in `<top (required)>'
        from <internal:core> core/kernel.rb:234:in `gem_original_require'
        from (irb):1:in `<top (required)>'
        from /usr/lib/graalvm/languages/ruby/lib/mri/irb/workspace.rb:116:in `evaluate'
        from /usr/lib/graalvm/languages/ruby/lib/mri/irb/context.rb:450:in `evaluate'
        from /usr/lib/graalvm/languages/ruby/lib/mri/irb.rb:567:in `block (2 levels) in eval_input'
        from /usr/lib/graalvm/languages/ruby/lib/mri/irb.rb:751:in `signal_status'
        from /usr/lib/graalvm/languages/ruby/lib/mri/irb.rb:548:in `block in eval_input'
        from /usr/lib/graalvm/languages/ruby/lib/mri/irb/ruby-lex.rb:251:in `block (2 levels) in each_top_level_statement'
        from <internal:core> core/kernel.rb:407:in `loop'
        from /usr/lib/graalvm/languages/ruby/lib/mri/irb/ruby-lex.rb:233:in `block in each_top_level_statement'
        from <internal:core> core/throw_catch.rb:36:in `catch'
        from /usr/lib/graalvm/languages/ruby/lib/mri/irb/ruby-lex.rb:232:in `each_top_level_statement'
        from /usr/lib/graalvm/languages/ruby/lib/mri/irb.rb:547:in `eval_input'
        from /usr/lib/graalvm/languages/ruby/lib/mri/irb.rb:481:in `block in run'
        from <internal:core> core/throw_catch.rb:36:in `catch'
        from /usr/lib/graalvm/languages/ruby/lib/mri/irb.rb:480:in `run'
        from /usr/lib/graalvm/languages/ruby/lib/mri/irb.rb:409:in `start'
        from /usr/lib/graalvm/languages/ruby/lib/gems/gems/irb-1.3.5/exe/irb:11:in `<top (required)>'
        from <internal:core> core/kernel.rb:376:in `load'
        from <internal:core> core/kernel.rb:376:in `load'
        from /usr/lib/graalvm/languages/ruby/bin/irb:42:in `<main>'
@jcoleman
Copy link
Author

jcoleman commented Mar 3, 2022

@eregon Is this not something you're encountering on your PR branch?

@eregon
Copy link
Member

eregon commented Mar 3, 2022

@jcoleman Did you try with grpc/grpc#27660?

I think this Gemfile should use that branch:

source 'https://rubygems.org'

gem 'grpc', github: 'eregon/grpc', branch: 'make-the-gem-build-on-truffleruby', submodules: true

@eregon eregon added the cexts label Mar 3, 2022
@jcoleman
Copy link
Author

jcoleman commented Mar 3, 2022

@eregon My Gemfile has:

gem "grpc", git: "https://github.com/eregon/grpc", branch: "make-the-gem-build-on-truffleruby", submodules: true

Which should be equivalent?

@eregon
Copy link
Member

eregon commented Mar 3, 2022

I can reproduce on Linux with that Gemfile and then:

bundle install
bundle exec ruby -e 'require "grpc"'
Retrieving unknown global symbol in LLVMParserRuntime: _ZN9grpc_core14ReclaimerQueue13kInvalidIndexE (java.lang.IllegalStateException)
	from com.oracle.truffle.llvm.parser.LLVMParserRuntime.lookupGlobal(LLVMParserRuntime.java:113)
	from com.oracle.truffle.llvm.parser.model.symbols.globals.GlobalVariable.createNode(GlobalVariable.java:75)
	from com.oracle.truffle.llvm.parser.nodes.LLVMSymbolReadResolver.resolve(LLVMSymbolReadResolver.java:136)
	from com.oracle.truffle.llvm.ParserDriver.lambda$createDebugInfo$4(ParserDriver.java:428)
	from java.util.HashMap.forEach(HashMap.java:1337)
	from com.oracle.truffle.llvm.ParserDriver.createDebugInfo(ParserDriver.java:427)
	from com.oracle.truffle.llvm.ParserDriver.parseBinary(ParserDriver.java:371)
	from com.oracle.truffle.llvm.ParserDriver.parseLibraryWithSource(ParserDriver.java:449)
	from com.oracle.truffle.llvm.ParserDriver.parseWithDependencies(ParserDriver.java:145)
	from com.oracle.truffle.llvm.ParserDriver.parseWithDependencies(ParserDriver.java:131)
	from com.oracle.truffle.llvm.ParserDriver.parse(ParserDriver.java:104)
	from com.oracle.truffle.llvm.DefaultLoader.load(DefaultLoader.java:44)
	from com.oracle.truffle.llvm.runtime.LLVMLanguage.parse(LLVMLanguage.java:556)
	from com.oracle.truffle.api.TruffleLanguage$ParsingRequest.parse(TruffleLanguage.java:966)
	from com.oracle.truffle.api.TruffleLanguage.parse(TruffleLanguage.java:1323)
	from com.oracle.truffle.api.LanguageAccessor$LanguageImpl.parse(LanguageAccessor.java:295)
	from com.oracle.truffle.polyglot.PolyglotSourceCache.parseImpl(PolyglotSourceCache.java:94)
	from com.oracle.truffle.polyglot.PolyglotSourceCache$WeakCache.lookup(PolyglotSourceCache.java:222)
	from com.oracle.truffle.polyglot.PolyglotSourceCache.parseCached(PolyglotSourceCache.java:80)
	from com.oracle.truffle.polyglot.PolyglotLanguageContext.parseCached(PolyglotLanguageContext.java:369)
	from com.oracle.truffle.polyglot.EngineAccessor$EngineImpl.parseForLanguage(EngineAccessor.java:246)
	from com.oracle.truffle.api.TruffleLanguage$Env.parseInternal(TruffleLanguage.java:2248)
	from org.truffleruby.language.loader.FeatureLoader.loadCExtLibrary(FeatureLoader.java:503)
	from org.truffleruby.language.loader.RequireNode.requireCExtension(RequireNode.java:268)
	from org.truffleruby.language.loader.RequireNode.parseAndCall(RequireNode.java:217)
	from org.truffleruby.language.loader.RequireNode.doRequire(RequireNode.java:202)
	from org.truffleruby.language.loader.RequireNode.requireConsideringAutoload(RequireNode.java:126)
	from org.truffleruby.language.loader.RequireNode.lambda$requireWithMetrics$0(RequireNode.java:79)
	from org.truffleruby.debug.MetricsProfiler.callWithMetrics(MetricsProfiler.java:42)
	from org.truffleruby.language.loader.RequireNode.requireWithMetrics(RequireNode.java:76)
	from org.truffleruby.language.loader.RequireNode.require(RequireNode.java:68)
	from org.truffleruby.language.loader.RequireNodeGen.executeRequire(RequireNodeGen.java:31)
	from org.truffleruby.core.kernel.KernelNodes$LoadFeatureNode.loadFeature(KernelNodes.java:331)
	from org.truffleruby.core.kernel.KernelNodesFactory$LoadFeatureNodeFactory$LoadFeatureNodeGen.execute(KernelNodesFactory.java:829)
	from org.truffleruby.language.control.IfElseNode.execute(IfElseNode.java:43)
	from org.truffleruby.language.control.IfElseNode.execute(IfElseNode.java:45)
	from org.truffleruby.language.control.SequenceNode.execute(SequenceNode.java:36)
	from org.truffleruby.language.RubyMethodRootNode.execute(RubyMethodRootNode.java:65)
	from org.graalvm.compiler.truffle.runtime.OptimizedCallTarget.executeRootNode(OptimizedCallTarget.java:661)
/home/eregon/.rubies/truffleruby-dev/lib/gems/bundler/gems/grpc-b1329700d351/src/ruby/lib/grpc/grpc.rb:22:in `gem_original_require'
	from /home/eregon/.rubies/truffleruby-dev/lib/gems/bundler/gems/grpc-b1329700d351/src/ruby/lib/grpc/grpc.rb:22:in `'
	from  core/kernel.rb:293:in `require_relative'
	from /home/eregon/.rubies/truffleruby-dev/lib/gems/bundler/gems/grpc-b1329700d351/src/ruby/lib/grpc.rb:19:in `'
	from  core/kernel.rb:234:in `gem_original_require'
	from -e:1:in `'
$ echo _ZN9grpc_core14ReclaimerQueue13kInvalidIndexE | c++filt 
grpc_core::ReclaimerQueue::kInvalidIndex

This is an error that didn't happen in previous grpc versions, so I guess some new code/change in grpc is causing this.
It could also be a regression in Sulong potentially.

TBH grpc is about the hardest gem to work with, because they still didn't merge any change after more than 1 year (grpc/grpc#24632), and it's a huge C++ codebase doing lots of low-level tricks which tends to not be supported yet in Sulong.
The simpler google-protobuf gem OTOH seems fine.

If I may ask, what do you use grpc for?
I think it's worth considering alternatives to grpc for TruffleRuby, IMHO it seems the hardest gem to support I've seen since the start of TruffleRuby.

@jcoleman
Copy link
Author

jcoleman commented Mar 3, 2022

Unfortunately I don't have any ability to remove the reliance on grpc; that decision wasn't mine, but there's heavy usage of it.

Do you happen to have a commit/branch that you know is working? Right now I'm trying to spike running an app on TruffleRuby to prove out performance benefits before any larger effort is expended on it, but if I can't even boot the app obviously that can't happen.

@eregon
Copy link
Member

eregon commented Mar 3, 2022

I tried this branch, require 'grpc' works for me with it:

gem 'grpc', github: 'Shopify/grpc', branch: 'truffleruby-1.30.1', submodules: true

There are some more branches:

git branch -r | grep Shopify/truffleruby
  Shopify/truffleruby-1.30.1
  Shopify/truffleruby-1.38.0
  Shopify/truffleruby-1.40.0
  Shopify/truffleruby-build-compat
  Shopify/truffleruby-master

and also the truffleruby-debug branch which is the one used to try to make grpc work as good as possible on TruffleRuby.
That's a branch which might move over time though.

gem 'grpc', github: 'eregon/grpc', branch: 'truffleruby-debug', submodules: true

@eregon
Copy link
Member

eregon commented Jun 28, 2022

Closing as "can't reproduce/possibly already fixed".
I will use #2247 to track issues with using grpc at runtime.

@eregon eregon closed this as completed Jun 28, 2022
@eregon eregon added this to the 22.2.0 milestone Jun 28, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants