ruby-core@ruby-lang.org archive (unofficial mirror)
 help / color / mirror / Atom feed
From: shugo@ruby-lang.org
To: ruby-core@ruby-lang.org
Subject: [ruby-core:71239] [Ruby trunk - Bug #11384] multi-threaded autoload sometimes fails
Date: Wed, 28 Oct 2015 05:54:29 +0000	[thread overview]
Message-ID: <redmine.journal-54616.20151028055427.0b78d402f0c66f6a@ruby-lang.org> (raw)
In-Reply-To: redmine.issue-11384.20150722005813@ruby-lang.org

Issue #11384 has been updated by Shugo Maeda.


Eric Wong wrote:
> Eric Wong <normalperson@yhbt.net> wrote:
>  > Currently testing this in a loop:
>  > http://80x24.org/spew/m/94541be0225540e34f0196e9754ae0eb5c07a4b7.txt
>  
>  Nope, the original failure still happens with this, so there's
>  some other place where we're racing :<

TestAutoload#test_threaded_accessing_constant has failed often since r52139,
and it seems to be the same problem.
I could reproduce the problem easily by the following script:

```
require "tempfile"

Tempfile.create(['autoload', '.rb']) {|file|
  file.puts 'sleep(0.5); class AutoloadTest; X = 1; end'
  file.close
  1.upto(Float::INFINITY) do |i|
    p i
    autoload(:AutoloadTest, file.path)
    begin
      t1 = Thread.new { ::AutoloadTest::X }
      t2 = Thread.new { ::AutoloadTest::X }
      [t1, t2].each(&:join)
    ensure
      if Object.const_defined?(:AutoloadTest)
        Object.send(:remove_const, :AutoloadTest)
        $".pop
      end
    end
  end
}
```

The script causes an error within 100 times on My Ubuntu 14.04 box,
but it runs over 10,000 times with your patch.

Your patch looks good to me, and at least it solves the race condition
of autoload_require(), even if there's still another race condition.
Why don't you commit it?


----------------------------------------
Bug #11384: multi-threaded autoload sometimes fails
https://bugs.ruby-lang.org/issues/11384#change-54616

* Author: Eric Wong
* Status: Open
* Priority: Normal
* Assignee: 
* ruby -v: trunk r51319
* Backport: 2.0.0: UNKNOWN, 2.1: UNKNOWN, 2.2: UNKNOWN
----------------------------------------
~~~
I get this failure once in a blue moon:

#8 test_autoload.rb:46:in `<top (required)>':
     open("zzz.rb", "w") {|f| f.puts "class ZZZ; def self.ok;:ok;end;end"}
     autoload :ZZZ, "./zzz.rb"
     t1 = Thread.new {ZZZ.ok}
     t2 = Thread.new {ZZZ.ok}
     [t1.value, t2.value].join
  #=> "" (expected "okok")
stderr output is not empty
   bootstraptest.tmp.rb:5:in `block in <main>': uninitialized constant ZZZ (Name
+Error)
test_autoload.rb        FAIL 1/8
FAIL 1/1010 tests failed


It is a very rare failure, I extracted it into a standalone script and
it took over 500,000 runs to hit it:

unless test(?e, "zzz.rb")
  open("zzz.rb", "w") {|f| f.puts "class ZZZ; def self.ok;:ok;end;end"}
end
autoload :ZZZ, "./zzz.rb"
t1 = Thread.new {ZZZ.ok}
t2 = Thread.new {ZZZ.ok}
[t1.value, t2.value].join
~~~

I'll work on this when I find time, but maybe somebody else can look at it
sooner.  I'm not sure if it affects older versions.




-- 
https://bugs.ruby-lang.org/

  parent reply	other threads:[~2015-10-28  5:26 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <redmine.issue-11384.20150722005813@ruby-lang.org>
2015-07-22  0:58 ` [ruby-core:70075] [Ruby trunk - Bug #11384] [Open] multi-threaded autoload sometimes fails normalperson
2015-10-28  5:54 ` shugo [this message]
2015-10-28  9:03   ` [ruby-core:71241] Re: [Ruby trunk - Bug #11384] " Eric Wong
2015-10-28 23:14   ` [ruby-core:71256] " Eric Wong
2015-10-28 23:49     ` [ruby-core:71257] " Eric Wong
2015-10-29  2:09 ` [ruby-core:71258] " shugo
2015-11-03  3:33   ` [ruby-core:71305] " Eric Wong
2017-05-11 23:43 ` [ruby-core:81105] [Ruby trunk Bug#11384][Open] " s.wanabe
2017-05-12  0:01   ` [ruby-core:81106] " Eric Wong
2017-05-12 21:51 ` [ruby-core:81130] [Ruby trunk Bug#11384] " normalperson
2017-06-30 10:56 ` [ruby-core:81853] " usa
2017-07-09 20:46 ` [ruby-core:81984] " nagachika00

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.ruby-lang.org/en/community/mailing-lists/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=redmine.journal-54616.20151028055427.0b78d402f0c66f6a@ruby-lang.org \
    --to=ruby-core@ruby-lang.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).