【しばらく編集不可モードで運営します】 編集(管理者用) | 差分 | 新規作成 | 一覧 | RSS | FrontPage | 検索 | 更新履歴

DB更新時のファイルロック - 安全なデータ更新のために。

目次

安全なデータ更新のために。

概要

データベースファイル更新前後で、ファイルロックを行います。 YukiWiki 2.0.0では、以下の個所を変更します。

wiki.cgi 53行 (スクリプト先頭、変数宣言部)

ロックファイルのファイル名を指定します。

 my $file_lock = "$modifier_dir_data/lock.txt";              # Walrus add (9)

wiki.cgi 142行 (スクリプト先頭、変数宣言部)

ロック関連の動作を設定する変数を追加します。

 ##############################
 my $lock_enable = 1;                                        # Walrus add
 my $lock_retry = 3;                                         # Walrus add

wiki.cgi 265行 (do_writeサブルーチン内)

%database更新前後でロックの作成と解除を行います。

         # Walrus mod start
         if ($lock_enable) {
             my $lock_handle = &create_lock($file_lock, $lock_retry);
             &print_error($resource{writedatafailed}) unless ($lock_handle);
             $database{$form{mypage}} = $form{mymsg};
             &remove_lock($file_lock, $lock_handle);
         } else {
             $database{$form{mypage}} = $form{mymsg};
         }
 #       $database{$form{mypage}} = $form{mymsg};
         # Walrus add end

wiki.cgi 664行 (update_recent_changesサブルーチン内)

%database更新前後でロックの作成と解除を行います。

     # Walrus mod start
     if ($lock_enable) {
         my $lock_handle = &create_lock($file_lock, $lock_retry);
         &print_error($resource{writedatafailed}) unless ($lock_handle);
         $database{$RecentChanges} = join("\n", @updates);
         &remove_lock($file_lock, $lock_handle);
     } else {
         $database{$RecentChanges} = join("\n", @updates);
     }
 #   $database{$RecentChanges} = join("\n", @updates);
     # Walrus mod end

wiki.cgi 1214行 (スクリプト最後部)

ロック作成と解除のサブルーチンを追加します。

 # Walrus add start
 sub create_lock {
     my ($lockfile, $retry) = @_;
     $retry = ($retry =~ /^\d+$/) ? $retry : 0;
     for (0..$retry) {
         if (open LOCK, ">$lockfile") {
             flock( LOCK, 2 );
             return *LOCK;
         }
     }
     return undef;
 }
 # Walrus add end
 
 # Walrus add start
 sub remove_lock {
     my ($lockfile, $lockhandle) = @_;
     flock( $lockhandle, 8);
     unlink $lockfile;
 }
 # Walrus add end
 
 1;
 __END__

resource.txt 47行 (リソースファイル末尾)

ロックできなかった際のメッセージを登録します。

 writedatafailed=データを保存できませんでした。時間を置いて再度実行してください。
 updatechangesfailed=更新情報を保存できませんでした。管理者までご連絡ください。

備考

WalWikiに組み込んで、現在稼動させています。 このページの内容は、WalWikiへの変更分をYukiWikiに反映させるためにまとめ直したものです。

2002-06-24 塚本牧生

コメント

 [[#comment]]