From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: AS4713 221.184.0.0/13 X-Spam-Status: No, score=-3.9 required=3.0 tests=AWL,BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED, SPF_PASS shortcircuit=no autolearn=ham autolearn_force=no version=3.4.2 Received: from neon.ruby-lang.org (neon.ruby-lang.org [221.186.184.75]) by dcvr.yhbt.net (Postfix) with ESMTP id 12B5D1F453 for ; Mon, 28 Jan 2019 19:20:34 +0000 (UTC) Received: from neon.ruby-lang.org (localhost [IPv6:::1]) by neon.ruby-lang.org (Postfix) with ESMTP id D5F09121D92; Tue, 29 Jan 2019 04:20:26 +0900 (JST) Received: from o1678948x4.outbound-mail.sendgrid.net (o1678948x4.outbound-mail.sendgrid.net [167.89.48.4]) by neon.ruby-lang.org (Postfix) with ESMTPS id 06C26121DA7 for ; Tue, 29 Jan 2019 04:20:24 +0900 (JST) Received: by filter0132p3las1.sendgrid.net with SMTP id filter0132p3las1-32097-5C4F55F7-49 2019-01-28 19:20:23.929132192 +0000 UTC m=+322987.759335832 Received: from herokuapp.com (ec2-54-226-102-166.compute-1.amazonaws.com [54.226.102.166]) by ismtpd0001p1iad1.sendgrid.net (SG) with ESMTP id oXUWneelQM2pLI2flKda9g for ; Mon, 28 Jan 2019 19:20:23.738 +0000 (UTC) Date: Mon, 28 Jan 2019 19:20:24 +0000 (UTC) From: ko1@atdot.net To: ruby-core@ruby-lang.org Message-ID: References: Mime-Version: 1.0 X-Redmine-MailingListIntegration-Message-Ids: 66761 X-Redmine-Project: ruby-trunk X-Redmine-Issue-Id: 15499 X-Redmine-Issue-Author: apolcyn X-Redmine-Issue-Assignee: ko1 X-Redmine-Sender: ko1 X-Mailer: Redmine X-Redmine-Host: bugs.ruby-lang.org X-Redmine-Site: Ruby Issue Tracking System X-Auto-Response-Suppress: All Auto-Submitted: auto-generated X-SG-EID: ync6xU2WACa70kv/Ymy4QrNMhiuLXJG8OTL2vJD1yS62Fba1461TagCCfo8jSvoFZj4HSAsIO8ZNZP YSsvWzwRvQZ+bntBOPvKfLLXPfejn8JMu0pzL+izhLvOThCAqDtKqZmB2W4dV26aKUlc+Lbl/2f+aZ O6aMf2JrNnEjtUP8lTIYXL6BVA6hhE9AuzTP X-ML-Name: ruby-core X-Mail-Count: 91310 Subject: [ruby-core:91310] [Ruby trunk Bug#15499] Breaking behavior on ruby 2.6: rb_thread_call_without_gvl doesn't invoke unblock_function when used on the main thread X-BeenThere: ruby-core@ruby-lang.org X-Mailman-Version: 2.1.15 Precedence: list Reply-To: Ruby developers List-Id: Ruby developers List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: ruby-core-bounces@ruby-lang.org Sender: "ruby-core" Issue #15499 has been updated by ko1 (Koichi Sasada). Sorry I didn't check this ticket (because it seems difficult). > r66708 I'm not sure why another thread is needed. could you explain about it? > r66712 `rb_nogvl` seems not good name. Maybe Microsoft will name it `rb_thread_call_without_gvl_ex()`. I'm not sure the requirement of `RB_NOGVL_UBF_ASYNC_SAFE` because I can't understand why r66708 is needed. ``` else if (ubf && vm_living_thread_num(th->vm) == 1) { - ubf_th = rb_thread_start_unblock_thread(); + if (RB_NOGVL_UBF_ASYNC_SAFE) { + th->vm->ubf_async_safe = 1; + } + else { + ubf_th = rb_thread_start_unblock_thread(); + } } ``` The condition is always true and maybe r66708 is disabled. No test? ---------------------------------------- Bug #15499: Breaking behavior on ruby 2.6: rb_thread_call_without_gvl doesn't invoke unblock_function when used on the main thread https://bugs.ruby-lang.org/issues/15499#change-76557 * Author: apolcyn (alex polcyn) * Status: Assigned * Priority: Normal * Assignee: ko1 (Koichi Sasada) * Target version: * ruby -v: 2.6.0 * Backport: 2.4: DONTNEED, 2.5: DONTNEED, 2.6: REQUIRED ---------------------------------------- This issue was noticed when trying to add ruby 2.6 support to the "grpc" ruby gem (this gem is a native C-extension), and was caught by a unit test. There are several APIs on the grpc ruby gem (https://github.com/grpc/grpc/tree/master/src/ruby) that invoke "rb_thread_call_without_gvl" on the current thread, doing a blocking operation in the "without gvl" callback and cancel that blocking operation in the "unblocking function". These APIs work in ruby versions prior to ruby 2.6 (e.g. ruby 2.5), but have problems when used on ruby 2.6 Minimal repro: My system: ``` > lsb_release -a No LSB modules are available. Distributor ID: Debian Description: Debian GNU/Linux 9.6 (stretch) Release: 9.6 Codename: stretch > ruby -v ruby 2.6.0p0 (2018-12-25 revision 66547) [x86_64-linux # I installed ruby 2.6.0 with rvm - https://rvm.io/rvm/install > GRPC_CONFIG=dbg gem install grpc --platform ruby # build grpc gem from source with debug symbols ``` ruby script, "repro.rb" that looks like this: ```ruby require 'grpc' ch = GRPC::Core::Channel.new('localhost:1234', {}, :this_channel_is_insecure) ch.watch_connectivity_state(ch.connectivity_state, Time.now + 360) ``` Run "ruby repro.rb" with an interactive shell, and it will hang there. At this point, ctrl^C the process, and it will not terminate. What should happen is this unblocking func should be invoked: https://github.com/grpc/grpc/blob/master/src/ruby/ext/grpc/rb_channel.c#L354, but as seen with logging or debuggers, that unblocking func is never ran. Thus the blocking operation never completes and the main thread is stuck. When the same repro.rb is ran on e.g. ruby 2.5.3 or ruby 2.4.1, the blocking operation is unblocked and the process terminates, as expected, when sending it a SIGINT. Also note that if the blocking operation is put in a background thread, e.g. with this script: ```ruby require 'grpc' th = Thread.new do ch = GRPC::Core::Channel.new('localhost:1234', {}, :this_channel_is_insecure) ch.watch_connectivity_state(ch.connectivity_state, Time.now + 360) end th.join ``` then "unblocking" functions will in fact be invoked upon sending the process a SIGINT, so this looks like a problem specifically with rb_thread_call_without_gvl being used on the main thread. Please let me know and I can provide more details or alternative repro cases. Thanks in advance. -- https://bugs.ruby-lang.org/