パスワードを忘れた? アカウント作成
220645 journal

okkyの日記: ROLLBACKの範囲を事前に指定しないといけない 1

日記 by okky

なんかコメントが書けないので。
http://srad.jp/~dzr/journal/507291
dzrさんの日記

昔々、考えた事がある。似たようなものを。簡単に実装する方法を。思いついたのはこう。

1) BEGIN; の部分で gcore のようなものを使って、メモリダンプを吐く
2) COMMIT; は実質何もしない。メモリダンプを捨てるぐらい。
3) ROLLBACK; は 1 で吐いたメモリダンプを gdb で読み込み cont

とりあえずマニュアルでやってみた。3 をやった瞬間に暴走状態に陥った事が判った。よーく考えると当たり前。

1 の段階で gcore で吐きだしたメモリダンプの中には Instruction Pointer も含まれています。なんと私の方法は、この IP も含めてCPUまで rollback してしまったわけです。すると 1に戻り、再び演算してエラーになり…

はっはっは。馬鹿ですな。

これで判るように「全てを」巻き戻すと、『涼宮ハルヒの憂鬱 の「エンドレスエイト」』状態になるので駄目。巻き戻らないものが無くちゃいけない。それは何? という辺りを考えなくちゃいけないし、多分「巻き戻らないもの」がデフォルトで「巻き戻るのは何?」を指定する事になるだろう。

.

write(2)のようなファイル書き込みは、プログラミングレベルでは ROLLBACK できません。ROLLBACKするには、そういうプリミティブなIOは全部隠してあげて、変更は全てバックアップを取りながら…とかしなくちゃいけない。

いや、ファイルIOはまだいい。ネットワーク通信とかどうするんだ。
「さっきしゃべったの、ナシ!」
を是とするには、かなり善意にあふれたネットワーク環境を前提にしなくちゃいけない。セキュリティ的にどうよ、なデータは流せない。それってどういう世界だと役に立つんだ?

実用的なプログラミング言語、と言う事になると結構この辺りも問題になる。この辺りが問題にならないとなると、かなり研究目的の言語になっちゃう。その辺も気合が入らなかったポイント。

.

多分最終的には「どの変数とどの変数は ROLLBACK 対象」というのを宣言しなくちゃけないし、ROLLBACK inside ROLLBACK もサポートしなくちゃいけないんだろう。一方で setjmp(3)/longjmp(3) との互換性も取らなくちゃいけない。

あれば面白いとは思うが、美しいインターフェースを思いつくのが面倒。この瞬間にあきらめた、という記憶がある。

この議論は、okky (2487)によって ログインユーザだけとして作成されたが、今となっては 新たにコメントを付けることはできません。
  • コメント書けずに申し訳ありません、
    確かにご指摘の通り、私も「CPUまで rollback」する所でした^^;

    (とは言うものの、私も実際そのような状況になって「…そうか!」という
     アハ体験はしてみたかったです)

    範囲の指定についても考えてみます。
    ありがとうございました。
typodupeerror

「科学者は100%安全だと保証できないものは動かしてはならない」、科学者「えっ」、プログラマ「えっ」

読み込み中...