[#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

小塚@しなきゃならないテストがいっぱいだ〜....です。

[#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です。

[#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

[#39288] 固有値、固有ベクトルの計算 — Masahiro Sato <msato@...>

19 messages 2004/02/27

[ruby-list:39131] Re: pstoreのバックアップファイルについて

From: 堀川 久 <vzw00011@...>
Date: 2004-02-10 13:31:13 UTC
List: ruby-list #39131
こんにちは。

元のファイルでは次のようになっています。

      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)

これは,"rb+"で開くのに失敗して"wb+"で開くまでの間に別プロセスが何か書
き込んでいると,切り捨ててしまいます。

ここは次のようにします。

      file = File.open(@filename, File::RDWR | File::CREAT)
      file.flock(File::LOCK_EX)

次に,元ファイルでは、ファイルを更新する部分がこのようになっています。

  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

   1. バックアップファイルにコピー
   2. オリジナルファイルを更新   です。

これは,ファイルコピーの途中で異常終了したとき,オリジナルファイルに書
き出す途中で異常終了したとき,のいずれでも不味いことになります。

こうします。

  if !md5 || size != content.size || md5 != Digest::MD5.digest(content)
    File.open(tmp_file, "w") {|t|
      t.write(content)
    }
    File.rename(tmp_file, new_file)
    commit_new()
  end

filename.tmp に内容を書き出し,完了した後に,filename.new に名前を替え
ます。rename()が重要です。.tmp は捨ててもよく,.new は完全なファイルで
す。

.new が存在するときのみ,オリジナルファイルに書き戻します。

  def commit_new()
    new_file = @filename + ".new"
    if !File.copy(new_file, @filename)
      raise IOError
    end
    File.unlink(new_file)
  end

元のpstoreと比べて,read onlyの場合でもFile::LOCK_EXでロックするため,
パフォーマンスが低下する恐れがありますが,大したことはないと思います。

-- 
HORIKAWA Hisashi (in Kanji: 堀川 久)
Netsphere Laboratories  http://www.nslabs.jp/

In This Thread