[mew-dist 25201] Re: race? condition in +queue ?
Tatsuya Kinoshita
tats at example.com
2004年 8月 25日 (水) 22:25:11 JST
On August 23, 2004, [mew-dist 25179],
tats (at vega.ocn.ne.jp) wrote:
> [mew-dist 25162]の修正では、解決には至っていないように思えます。
ちゃんとした解決策はさておき、とりあえず、上書きしてしまわずにエラー
で逃げるだけのパッチです(エラーのあと手作業で救う)。
-----
--- mew-net.el.orig
+++ mew-net.el
@@ -274,7 +274,7 @@
(mew-delete-file iwrk) ;; 1.mqi.wrk
(if (file-exists-p orig)
(setq orig (mew-queue-check-new-message (mew-folder-new-message qfld)))))
- (rename-file work orig 'override)
+ (rename-file work orig) ;; An error is signaled if orig exists.
(unless mew-use-nfs-hack
;; This cause an error when using NFS.
(mew-set-file-modes orig))
@@ -289,7 +289,7 @@
(when (file-exists-p orig)
(setq orig (mew-queue-check-new-message (mew-folder-new-message dir)))
(setq info (concat orig mew-imapq-info-suffix)))
- (rename-file work orig 'override)
+ (rename-file work orig) ;; An error is signaled if orig exists.
(rename-file iwrk info 'override)))
(defun mew-queue-insert-file (pnm n qfld msg) ;; 1
-----
> foregroundとbackgroundとでmew-queue-enqueue関数が並行して動かない
> ように、たとえばロックをかけるような処理が必要になりそう
現状では、+queueだけでなくmew-folder-new-messageを使う処理全般につ
いて、新しいメッセージ用のファイル名を得てからそれを書き込むまでの
間に隙があるため、競合が起こるおそれがあります。(たとえば
`Fcc: +inbox'はメール受信処理とぶつかるので危険)
そのような隙が生まれないように、新しいメッセージ用のファイル名を得
ると同時に空のファイルを作っておいて、そのあとの作業では必ずファイ
ルを上書きするようにしておけば、解決できそうです。
排他openでファイルを作るためには、最近のEmacsではexcl指定付きの
write-regionが使えます。write-regionがexclに対応していない場合でも、
APELでのmake-temp-file実装のように、make-directoryや
add-name-to-file等を使うことで排他openを実現できるものと思います
(make-directoryで作った作業用ディレクトリに空のファイルを作成、新
しいファイル名の候補でadd-name-to-file、名前がぶつかった場合には次
の候補で繰り返し、というふうに)。
mew-folder-new-messageに排他open用オプションを加えるか別関数を新設
するかして、危なそうなところから少しずつでも修正していくのがよさそ
うな気がします。
--
木下達也
Mew-dist メーリングリストの案内