[#39102] pstoreのバックアップファイルについて — 堀川 久 <vzw00011@...>
こんにちは。
10 messages
2004/02/08
[#39103] Re: pstoreのバックアップファイルについて
— matz@... (Yukihiro Matsumoto)
2004/02/09
まつもと ゆきひろです
[#39131] Re: pstoreのバックアップファイルについて
— 堀川 久 <vzw00011@...>
2004/02/10
こんにちは。
[#39135] Re: pstoreのバックアップファイルについて
— matz@... (Yukihiro Matsumoto)
2004/02/10
まつもと ゆきひろです
[#39138] Re: pstoreのバックアップファイルについて
— 堀川 久 <vzw00011@...>
2004/02/11
こんにちは。
[#39139] Re: pstoreのバックアップファイルについて
— Tanaka Akira <akr@...17n.org>
2004/02/11
In article <40299a95.1368%vzw00011@nifty.ne.jp>,
[#39104] Internet Explorer で印刷 — Shin-ichiro HARA <sinara@...>
原です。
12 messages
2004/02/09
[#39105] Re: Internet Explorer で印刷
— MIYAMUKO Katsuyuki <k-miyamuko@...>
2004/02/09
みやむこです。
[#39106] What processor do you run ruby on? — "K.Sasada" <ko1@...>
ささだです。
13 messages
2004/02/09
[#39200] Re: What processor do you run ruby on?
— "K.Sasada" <ko1@...>
2004/02/17
"K.Sasada" <ko1@namikilab.tuat.ac.jp> wrote :
[#39207] Re: What processor do you run ruby on?
— Isamu KOZUKA <kozuka@...>
2004/02/17
小塚@しなきゃならないテストがいっぱいだ〜....です。
[#39208] printf %b bug (Re: Re: What processor do you run ruby on?)
— matz@... (Yukihiro Matsumoto)
2004/02/17
[#39209] Re: printf %b bug (Re: Re: What processor do you run ruby on?)
— "U.Nakamura" <usa@...>
2004/02/17
こんにちは、なかむら(う)です。
[#39210] Re: printf %b bug (Re: Re: What processor do you run ruby on?)
— matz@... (Yukihiro Matsumoto)
2004/02/17
まつもと ゆきひろです
[#39217] Re: printf %b bug (Re: Re: What processor do you run ruby on?)
— "U.Nakamura" <usa@...>
2004/02/18
こんにちは、なかむら(う)です。
[#39218] Re: printf %b bug (Re: Re: What processor do you run ruby on?)
— matz@... (Yukihiro Matsumoto)
2004/02/18
まつもと ゆきひろです
[#39220] Re: printf %b bug (Re: Re: What processor do you run ruby on?)
— matz@... (Yukihiro Matsumoto)
2004/02/18
まつもと ゆきひろです
[#39111] *a=aの挙動の違い — Tamiyasu Murakami <tamiyasu_m@...>
村上と申します。
5 messages
2004/02/09
[#39118] YAML without Syck — IWATSUKI Hiroyuki <don@...>
岩月と申します。
6 messages
2004/02/10
[#39129] InternetExplorer ってインターフェースとして使える? — Shin-ichiro HARA <sinara@...>
原です。
34 messages
2004/02/10
[#39130] Re: InternetExplorer ってインターフェースとして使える?
— Yac <yac@...>
2004/02/10
岡です。
[#39136] Re: InternetExplorer ってインターフェースとして使える?
— Yac <yac@...>
2004/02/10
岡です。
[#39140] Re: InternetExplorer ってインターフェースとして使える?
— arton <artonx@...>
2004/02/11
artonです。別件。
[#39144] Re: InternetExplorer ってインターフェースとして使える?
— Shin-ichiro HARA <sinara@...>
2004/02/12
原です。
[#39145] Re: InternetExplorer ってインターフェースとして使える?
— arton <artonx@...>
2004/02/12
artonです。
[#39146] Re: InternetExplorer ってインターフェースとして使える?
— nobu.nakada@...
2004/02/12
なかだです。
[#39147] Re: InternetExplorer ってインターフェースとして使える?
— arton <artonx@...>
2004/02/12
artonです。
[#39150] Re: InternetExplorer ってインターフェースとして使える?
— nobu.nakada@...
2004/02/12
なかだです。
[#39151] Re: InternetExplorer ってインターフェースとして使える?
— arton <artonx@...>
2004/02/12
artonです。
[#39152] Re: InternetExplorerってインターフェースとして使える?
— Minero Aoki <aamine@...>
2004/02/12
青木です。
[#39155] Re: InternetExplorerってインターフェースとして使える?
— arton <artonx@...>
2004/02/12
artonです。
[#39157] Re: InternetExplorerってインターフェースとして使える?
— arton <artonx@...>
2004/02/12
artonです。
[#39161] Re: InternetExplorerってインターフェースとして使える?
— nobu.nakada@...
2004/02/12
なかだです。
[#39174] Re: InternetExplorer ってインターフェースとして使える?
— Shin-ichiro HARA <sinara@...>
2004/02/13
原です。
[#39148] [BUG] ruby-mode indentation bug — Kenta MURATA <muraken2@...>
むらけんです.
7 messages
2004/02/12
[#39158] setup.rb on mswin32 — KUBO Takehiro <kubo@...>
久保@横浜(茅ヶ崎より移転)です。
8 messages
2004/02/12
[#39197] [ANN] Nora 0.0.20040216 released — MoonWolf <moonwolf@...>
MoonWolfです。
1 message
2004/02/16
[#39212] 特異メソッドでのクラス変数 — "eclipse" <eclipse@...>
はじめまして.eclipseと申します.
5 messages
2004/02/17
[#39213] IconvでUTF-16を変換 — Takashi & Kayoko Sano <tksano@...3.kcn.ne.jp>
7 messages
2004/02/17
[#39237] erb コマンドが compile error になる — Kouhei Yanagita <sugi@...>
柳田と申します。
5 messages
2004/02/19
[#39254] [ANN] Nora 0.0.20040222 released — MoonWolf <moonwolf@...>
MoonWolfです。
1 message
2004/02/22
[#39275] DnD on win32 — Shinichiro HIDA <shinichiro@...>
飛田と申します。
21 messages
2004/02/26
[#39276] Re: DnD on win32
— たむらけんいち <sgs02516@...>
2004/02/26
たむらです。
[#39277] Re: DnD on win32
— Shinichiro HIDA <shinichiro@...>
2004/02/27
飛田です。
[#39278] Re: DnD on win32
— Itou-T15@...
2004/02/27
[#39280] Re: DnD on win32
— "H.Shimura" <shimurahiroyuki@...>
2004/02/27
志村 弘之
[#39281] Re: DnD on win32
— "U.Nakamura" <usa@...>
2004/02/27
こんにちは、なかむら(う)です。
[#39282] Re: DnD on win32
— Shinichiro HIDA <shinichiro@...>
2004/02/27
飛田です。
[#39283] Re: DnD on win32
— "U.Nakamura" <usa@...>
2004/02/27
こんにちは、なかむら(う)です。
[#39285] Re: DnD on win32
— Shinichiro HIDA <shinichiro@...>
2004/02/27
飛田です。
[#39287] Re: DnD on win32
— Yuya Kato <yuya-ml@4th.to>
2004/02/27
Yuya%Exerb作者です。
[#39291] Re: DnD on win32
— Shinichiro HIDA <shinichiro@...>
2004/02/27
こんにちは、
[#39286] Re: [ruby-dev:16312] Re: ライブラリ拡大計画 — "NAKAMURA, Hiroshi" <nakahiro@...>
なひです。ruby-devの、えらく古いメイルからです。
7 messages
2004/02/27
[#39288] 固有値、固有ベクトルの計算 — Masahiro Sato <msato@...>
19 messages
2004/02/27
[#39290] Re: 固有値、固有ベクトルの計算
— NISHIMATSU Takeshi <t-nissie@...>
2004/02/27
西松と申します.
[ruby-list:39102] pstoreのバックアップファイルについて
From:
堀川 久 <vzw00011@...>
Date:
2004-02-08 12:08:24 UTC
List:
ruby-list #39102
こんにちは。
pstoreは,ファイルを書き換えるときにバックアップファイルを作っています
が,タイミングによっては安全ではありません。
ファイルを開くときには、まず"rb+"で開こうとし,失敗したときに"wb+"で開
きなおしていますが,タイミングによってはファイルが切り詰められてしまい
ます。
バックアップファイルが存在するときに,
・元ファイルが正しくてバックアップファイルが不正
・バックアップファイルが正しくて元ファイルが不正
の両方の可能性があるために,どちらも信頼することができません。というわ
けで,パッチを書きました。
.tmp -> .new -> 元ファイルという順でファイルを変更します。
--- pstore.rb.orig 2004-02-08 20:30:25.200663384 +0900
+++ pstore.rb 2004-02-08 21:01:29.396262576 +0900
@@ -35,7 +35,11 @@
def in_transaction
raise PStore::Error, "not in transaction" unless @transaction
end
- private :in_transaction
+ def in_transaction_wr()
+ in_transaction()
+ raise PStore::Error, "in read-only transaction" if @rdonly
+ end
+ private :in_transaction, :in_transaction_wr
def [](name)
in_transaction
@@ -52,11 +56,11 @@
self[name]
end
def []=(name, value)
- in_transaction
+ in_transaction_wr()
@table[name] = value
end
def delete(name)
- in_transaction
+ in_transaction_wr()
@table.delete name
end
@@ -86,27 +90,26 @@
def transaction(read_only=false)
raise PStore::Error, "nested transaction" if @transaction
begin
+ @rdonly = read_only
+ @abort = false
@transaction = true
value = nil
- backup = @filename+"~"
- begin
- file = File::open(@filename, read_only ? "rb" : "rb+")
- orig = true
- rescue Errno::ENOENT
- raise if read_only
- file = File::open(@filename, "wb+")
- end
- file.flock(read_only ? File::LOCK_SH : File::LOCK_EX)
- if read_only
- @table = Marshal::load(file)
- elsif orig and (content = file.read) != ""
+ file = File.open(@filename, File::RDWR | File::CREAT)
+ file.flock(File::LOCK_EX)
+ new_file = @filename + ".new"
+ commit_new() if FileTest.exist?(new_file)
+
+ if (content = file.read) != ""
@table = Marshal::load(content)
- size = content.size
- md5 = Digest::MD5.digest(content)
- content = nil # unreference huge data
+ if !read_only
+ size = content.size
+ md5 = Digest::MD5.digest(content)
+ end
else
@table = {}
end
+ content = nil # unreference huge data
+
begin
catch(:pstore_abort_transaction) do
value = yield(self)
@@ -116,24 +119,17 @@
raise
ensure
if !read_only and !@abort
- file.rewind
+ tmp_file = @filename + ".tmp"
content = Marshal::dump(@table)
if !md5 || size != content.size || md5 != Digest::MD5.digest(content)
- File::copy @filename, backup
- begin
- file.write(content)
- file.truncate(file.pos)
- content = nil # unreference huge data
- rescue
- File::rename backup, @filename if File::exist?(backup)
- raise
- end
- end
- end
- if @abort and !orig
- File.unlink(@filename)
+ File.open(tmp_file, "w") {|t|
+ t.write(content)
+ }
+ File.rename(tmp_file, new_file)
+ commit_new()
+ end
+ content = nil # unreference huge data
end
- @abort = false
end
ensure
@table = nil
@@ -142,6 +138,15 @@
end
value
end
+
+ private
+ def commit_new()
+ new_file = @filename + ".new"
+ if !File.copy(new_file, @filename)
+ raise IOError
+ end
+ File.unlink(new_file)
+ end
end
if __FILE__ == $0
--
HORIKAWA Hisashi (in Kanji: 堀川 久)
Netsphere Laboratories http://www.nslabs.jp/