[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 メーリングリストの案内