Closed nvh0412 closed 2 years ago
21.3 is not the last release, could you try 22.0 or dev builds as documented in the README?
grpc in general is not well supported yet (some details in https://github.com/oracle/truffleruby/issues/2611#issuecomment-1058145324 and what follows).
Dev builds doesn't work
Here is the error when I tried our latest dev build
➜ truffle-ruby bundle exec ruby -e 'require "grpc"'
truffleruby: an internal exception escaped out of the interpreter,
please report it to https://github.com/oracle/truffleruby/issues.
LLVMThreadLocalSymbol symbol: _ZN9grpc_core7ExecCtx9exec_ctx_E (java.lang.IllegalStateException)
from com.oracle.truffle.llvm.runtime.CommonNodeFactory.createDebugStaticValue(CommonNodeFactory.java:461)
from com.oracle.truffle.llvm.ParserDriver.lambda$createDebugInfo$4(ParserDriver.java:429)
from com.oracle.truffle.llvm.ParserDriver$$Lambda$846e00f780c439ca5e981359c05f49f4fa5f1dea.accept(Unknown Source)
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:628)
from com.oracle.truffle.api.TruffleLanguage$ParsingRequest.parse(TruffleLanguage.java:969)
from com.oracle.truffle.api.TruffleLanguage.parse(TruffleLanguage.java:1326)
from com.oracle.truffle.api.LanguageAccessor$LanguageImpl.parse(LanguageAccessor.java:292)
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:247)
from com.oracle.truffle.api.TruffleLanguage$Env.parseInternal(TruffleLanguage.java:2251)
from org.truffleruby.language.loader.FeatureLoader.loadCExtLibrary(FeatureLoader.java:505)
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.language.loader.RequireNode$$Lambda$e54385dcb305ff68f57bf2cc513b32655fe4e7f0.get(Unknown Source)
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:830)
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:659)
/home/nvh0412/.rbenv/versions/truffleruby-dev/lib/gems/bundler/gems/grpc-852dfdb82bbb/src/ruby/lib/grpc/grpc.rb:22:in `gem_original_require'
from /home/nvh0412/.rbenv/versions/truffleruby-dev/lib/gems/bundler/gems/grpc-852dfdb82bbb/src/ruby/lib/grpc/grpc.rb:22:in `<top (required)>'
from <internal:core> core/kernel.rb:293:in `require_relative'
from /home/nvh0412/.rbenv/versions/truffleruby-dev/lib/gems/bundler/gems/grpc-852dfdb82bbb/src/ruby/lib/grpc.rb:19:in `<top (required)>'
from <internal:core> core/kernel.rb:234:in `gem_original_require'
from -e:1:in `<main>'
As for 22.0.0.2 can boost the gRPC server
But the gRPC server raises the segment fault error right after I made a gRPC request from a client
@eregon Dealing with the same situation with @jcoleman in this issue https://github.com/oracle/truffleruby/issues/2611, my system is heavy using gRPC. I want to give TruffleRuby a try before I make the decision that is we use TruffleRuby for current gRPC servers, but as we can see here, no luck with a repository and maintainers like gRPC repo
Thank you for trying the other versions. The dev version error seems a regression, I'll report that to the GraalVM LLVM team (GR-37604).
Yes, grpc doesn't work yet on TruffleRuby. As I mentioned in https://github.com/oracle/truffleruby/issues/2611#issuecomment-1058145324 it's really difficult to make it work. The fact grpc ruby maintainers are pretty unresponsive (even for fixes for CRuby) is not helping.
If I may ask, what do you use gRPC for? Is it for RPC between Ruby processes?
Is it for RPC between Ruby processes?
Currently, yes. We applied micro-service architecture in the first place and now have many ruby apps in our clusters, pick up the right communication protocol between these microservices internally is one of most important thing and that's why we chose gRPC. We will have more services that will be written in other programming languages down the road
We're still fine with gRPC run under MRI, but there is a performance issue with multi-threaded gRPC server implementation (gRPC gem is using a thread-pool to handle requests), so giving TruffleRuby a try to archive a truly parallel
The error/regression LLVMThreadLocalSymbol symbol: _ZN9grpc_core7ExecCtx9exec_ctx_E (java.lang.IllegalStateException)
(https://github.com/oracle/truffleruby/issues/2634#issuecomment-1075323314) has been fixed in Sulong, and the fix will be in 22.1 too. It will be in truffleruby dev builds next week.
This specific error has been fixed, so I'll close this.
I will use https://github.com/oracle/truffleruby/issues/2247 to track issues with using grpc
at runtime.
TruffleRuby raised the error when I was trying to run a gRPC server with our truffle ruby (patched to run grpc via)
Error
To reproduce:
Follow this issue to get patched grpc gem version
Verify that it's working
Get proto files