[#43284] [Ruby 1.9 - Bug #4456] [Open] Time#strftime で %F 指定子に大きな幅を指定した際の不具合 — tadayoshi funaba <redmine@...>

14 messages 2011/03/02

[#43317] [Ruby 1.9 - Bug #4474][Open] 複数のスレッドからトランザクションに入ろうとした場合のPStoreの挙動 — Masaki Matsushita <redmine@...>

9 messages 2011/03/06

[#43327] [Ruby 1.9 - Feature #4483][Open] PStoreをデフォルトで複数のスレッドから扱えるようにしたい — Masaki Matsushita <redmine@...>

10 messages 2011/03/08

[#43365] [Ruby 1.9 - Bug #4536][Open] 定数参照について1.8と1.9の違い — Yukihiro Matsumoto <matz@...>

11 messages 2011/03/29

[ruby-dev:43317] [Ruby 1.9 - Bug #4474][Open] 複数のスレッドからトランザクションに入ろうとした場合のPStoreの挙動

From: Masaki Matsushita <redmine@...>
Date: 2011-03-06 12:54:05 UTC
List: ruby-dev #43317
Issue #4474 has been reported by Masaki Matsushita.

----------------------------------------
Bug #4474: 複数のスレッドからトランザクションに入ろうとした場合のPStoreの挙動
http://redmine.ruby-lang.org/issues/4474

Author: Masaki Matsushita
Status: Open
Priority: Normal
Assignee: 
Category: lib
Target version: 
ruby -v: ruby 1.9.2p180 (2011-02-18 revision 30909) [x86_64-linux]


PStoreは、initializeの第2引数thread_safeが真であればデータベースの読み書きをMutexで同期するようになっています。
しかし、次のコード

require 'pstore'
require 'thread'

pstore = PStore.new("foo", true)
q = Queue.new

Thread.start do
  pstore.transaction do
    pstore[:hoge] = "fuga"
    q.push(nil)
    sleep
  end
end

q.pop
pstore.transaction do
  p pstore[:hoge]
end

を実行すると例外が発生します。

/usr/local/lib/ruby/1.9.1/pstore.rb:321:in `transaction': nested transaction (PStore::Error)
        from pstore.rb:16:in `<main>'

以下のコードはpstore.rbの319行目以降から抜粋したものです。

319  def transaction(read_only = false, &block)  # :yields:  pstore
320    value = nil
321    raise PStore::Error, "nested transaction" if @transaction
322    @lock.synchronize do
      (中略)
348    end
      (中略)
352  end

Mutexで保護されたセクションに入る前に、別のトランザクションが実行されていないかどうか調べています。
あるスレッドがトランザクションを実行中に別のスレッドがトランザクションに入ろうとすると、ここで例外が発生します。
thread-safeの定義にも依りますが、これはバグではないでしょうか?


-- 
http://redmine.ruby-lang.org

In This Thread

Prev Next