2010年7月19日

[mew-dist 29262] Re:cmewが例外で終わる

細田です。

古い話で恐縮ですが、ruby 版の cmew が例外で終わる件について、
私のところでも、たまに発生していたのですが、なんとなく原因がわかりました。

私のところでは、cmew と同時に mewest を動かしていました。
すると、タイミングによって、

・mewest が casket_replica を掘る
・cmew が find して、casket_replica が列挙される
・mewest が casket_replica を消す
・cmew が casket_replica を lstat して例外発生
・ensure に飛んで、add_entry.close, get_entry.close, del_entry.close せずに
 db.close してしまうので例外 SQLite3::BusyException が発生する

ということが発生しているようでした。

以下のパッチで、
casket_replica を ignore_regex に加える、
途中でファイル等が消えても先に進める、
その他の例外が発生してもちゃんと close できる、
というようにしたつもりです。

これで、とりあえず事象は発生しなくなった、と思います。


--- cmew.org 2009-09-09 09:57:27.001000000 +0900
+++ cmew 2010-07-17 18:30:42.610787100 +0900
@@ -127,6 +127,8 @@
deleted = 0
skipdir = ''

+begin
+
Find.find(target) do |fpath|
if fpath =~ ignore_regex
if FileTest.directory?(fpath)
@@ -135,7 +137,7 @@
end
# next
else
- st = File.lstat(fpath)
+ st = File.lstat(fpath) rescue next
if st.symlink?
if FileTest.directory?(fpath)
print fpath, " (ignored)\n"
@@ -159,7 +161,7 @@
elsif st.file? and fpath =~ /\/[0-9]+(\.mew)?$/
next if File.dirname(fpath) == skipdir
next if last_mod > st.ctime.tv_sec
- m = Mail.new(fpath)
+ m = Mail.new(fpath) rescue next
id = get_id(m)
parid = get_parid(m)
date = get_date(m)
@@ -183,10 +185,16 @@
end
end
end
+
+ensure
+
add_entry.close
get_entry.close
del_entry.close
print 'Registered: ', registred, ', deleted: ', deleted, "\n"
+
+end
+
end

################################################################
@@ -209,7 +217,7 @@

db_file = ARGV[0] || File.expand_path('~/Mail/id.db')
maildir = ARGV[1] || File.expand_path('~/Mail')
-ignore_regex = Regexp.new(ARGV[2] || '^\./casket$|^\./casket/|/\.')
+ignore_regex = Regexp.new(ARGV[2] || '^\./casket$|^\./casket/|^\./casket_replica$|^\./casket_replica/|/\.')
target = if ARGV[3]; './' + ARGV[3] else '.' end
have_target = if ARGV[3]; true else false end
fullupdate = opts[:f] == true


細田 真道 <trueroad@xxxxx>


投稿者 xml-rpc : 2010年7月19日 14:33
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/97112
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。