管理人さんさんのページ

アクセス記録[アクセスアップ.orgの外部からのアクセス元URL (昨日 / 過去8日間) / ログイン状態の論客]
メニュー
プロフィール
私書箱
受/送/送済
評価履歴
共感[/]
DB作成履歴
生成/承認/
書き物
リンク集
登録有

RSSリーダー登録
RSS
日記表示スタイル
ホームページ型/携帯
画像/動画/音声/リンク
表示開始年月
分類
日記内検索

ここから下の欄は
個人ページ設定
から設定可能

ここは
accessup.org
の管理人さん
のページです。

日記では主に
・サイト運営/開発
・技術ネタ
・検索エンジン情報
を扱っています。

サイト内ショートカット
1.定期更新処理
2.英語版Myページ
3.未処理削除提案

1. 2008/05/07 Berkeley DB > 同時アクセス > 書き込みの排他処理(CDB)の注意事項」
[この書込みのみ表示(記事URL紹介用) / 書込変更/削除 / トラックバック送信 / 共有分類に追加(タグ付け)](この日の語りにコメント/感想つけてみる)

1. BerkeleyDB側にロック処理を任せるには       
2. __db.001というようなファイルは何?  
3. BerkeleyDBに関する日本における情報           
4. Windows上で同時書き込み実験    
5. BDBファイルの破損のチェック       
6. BDBファイルの回復           


1. BerkeleyDB側にロック処理を任せるには

DB_INIT_CDB | DB_CREATE | DB_INIT_MPOOL    
の3つのFlagをEnvに対して設定して開くことが必要。 
CDBという仕組みでロックの管理をしてくれる。


2. __db.001というようなファイルは何?

DB_CREATEをEnvのFlag内で指定していると、__db.001, __db.002, __db.003というファイルができるが、プログラムが途中で死ぬとロック状態を残してしまうので、後で自分で消さなければならない。  
これがどこに出来るかは、-Homeで指定した場所による。           
ただ、絶対パスでBDBの場所を書いていないと、プログラムを実行したcurrent directoryに出来てしまうので注意。         
db_stat -N -Co    
をそのディレクトリで打つとロックの状況を見れる。
またBDBファイル毎に異なるようにHomeを用意しなければならない(そうでないと__db.001などが共有されてロックまで他と共有してしまう)。
HomeはBDBファイルを開く前にディレクトリとして作っておく(そうでないと無効)。

なお、4.4らへん(?)からロック状態で死んでしまったものを回復するためのAPIをBerkeleyDB側でも提供しはじめたようだが、今のところBerkeleyDB.pmはその為に必要なenv_failchkを提供していない。
なのでそこに対応する処理は自分で作る(正確には機能が提供されていても色々と作ることが必要そう/まあ基本的にC API経由で使うものなので)。
自分はタイムアウト処理を活用してタイムアウトしたらそのファイル群を消去してしまっているが、
その実装においてはalarmが今のところ少なくともcygwinのperlではサポートされていないことに注意。


3. BerkeleyDBに関する日本における情報

<
日本にはBerkeleyDBに関する突っ込んだ情報はネット上には皆無。
これだけ年月が経ちながら不思議な位情報無しなので英語が出来ないと厳しいだろうなぁ。
ちなみに英語圏だとBerkeleyDBの本も出ていたりします(自分は手元にあります)。


4. Windows上で同時書き込み実験

同時書き込みを100プロセスで行う実験の結果:
1. 壊れませんでした。
2. abortにはロックを残してしまうという弱さはあり(ここは自分でフォローしないといけない)。
3. ファイルの破損は起きませんでしたが、putに失敗することは何度かありました。書き込みが失敗することがあるということは前提でエラーハンドル処理を実装しておきましょう。


5. BDBファイルの破損のチェック

db_verify BDBファイル
と打つと確認できます。
なお、書きこみ中だと正常なファイルでもErrorを返してくることがあるので、常時書き込まれる系のBDBは何度かやってみて本当にエラーなのか確認してみましょう。


6. BDBファイルの回復

BDBファイルが破損してしまった場合
1. トランザクション処理をしていればログディレクトリから回復させることができる。
2. トランザクション処理をしていない場合は、バックアップファイルからその時点まで復旧させるか、読めるところを読み込んでファイルを再生成する。
ログファイル含めてコストがかかりますが、確実な処理を要するのなら1.で。

ちなみに自分はこんなプログラムを作って2のケースの場合リカバリーしています。
#!/usr/local/bin/perl -w
use strict;
use BerkeleyDB;
use BDB::Wrapper;
use CGI::Accessup;
use File::Copy;
my $c=new CGI::Accessup;
my $bdbw=new BDB::Wrapper;
my $bdb=shift || die "no bdb";

my %checked=();
my $key_cnt=0;
File::Copy::copy($bdb, $c->shmf($bdb));
if(my $dbh=$bdbw->create_read_dbh($c->shmf($bdb))){
  if(my $wdbh=$bdbw->create_write_dbh($bdb.'.wtmp')){
    my $key;
    my $value;
    if(my $cursor=$dbh->db_cursor()){
      while($cursor->c_get($key, $value, DB_NEXT)==0){
        if($checked{$key}){
          print $key." appeared again\n";
          last;
        }
        $wdbh->db_put($key, $value);
        $key_cnt++;
        $checked{$key}=1;
      }
      $cursor->c_close();
    }
    $wdbh->db_close();
  }
  $dbh->db_close();
}
unlink ($c->shmf($bdb));
$c->lockf($bdb);
$c->rename($bdb.'.wtmp', $bdb);
$c->unlockf($bdb);

print $key_cnt."\n";


[この論客の他の日付の書込み含めて全て見る] / [分類がBerkeley DBの他の書込みを読む]
特定日付の書き物にコメント・感想を書いてみる
[日記・コメントの削除ルール]
一言で言えば: 喧嘩になること/場を荒らすことに繋がる内容は禁止 (必要なら私書で/但し私書にもルールがあります。別途参照)。
詳細はこちらの記事参照

コメントする日記の日付
ここは日記の「この書込みにコメント」をクリックすると自動的に入ります。手動入力不可)

注意
1. 書込みには階位が必要
2. 特殊機能利用可能。太文字/大文字/画像挿入等ができます。
注意: netaタグはあくまで基本ネタバレ防止の用途にのみ使って下さい。嫌な人は見なければ良いという意図で使わないで下さい。netaタグを使おうが使うまいが他人が文章を読むという意味では変わりません。
日記へのコメント

お名前(階位必要):
パスワード:

<=悪用しないこと。この機能を使ったからといってルールの適用基準が変わることはありません。


作品データベース目次 | 最速一括検索エンジン | サイトマップ | Copyright(c) 1999- 1st Class