Project

General

Profile

Actions

Bug #4474

closed

複数のスレッドからトランザクションに入ろうとした場合のPStoreの挙動

Added by Glass_saga (Masaki Matsushita) about 13 years ago. Updated about 13 years ago.

Status:
Closed
Assignee:
-
Target version:
-
ruby -v:
-
Backport:
[ruby-dev:43317]

Description

=begin
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 '

以下のコードは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の定義にも依りますが、これはバグではないでしょうか?
=end


Files

patch.diff (1.34 KB) patch.diff sorah (Sorah Fukumori), 03/06/2011 10:55 PM
patch.diff (1.69 KB) patch.diff Glass_saga (Masaki Matsushita), 03/07/2011 09:47 AM
patch2.diff (843 Bytes) patch2.diff Glass_saga (Masaki Matsushita), 03/10/2011 08:25 PM
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0