bzrについての、はまりポイント

とある仕事で、構成管理のあたりの支援をやっていて、 bazaar をそれなりに評価していくつかはまりポイントがあったので、その結果をメモしておくことにする。

bazaar(略称:bzr)は、gitやmercurialのような分散型の構成管理ツールの一つ。git/mercurialに対してのアドバンテージでよく言われるのはファイルネームをUTF-8で管理しているので、ファイル名関連の問題が起きないというもの。実際今回bzrを選択したのは上記の理由が第一だった。

実際に使っていて感じたのは、bzrの最大の利点は リポジトリ構成の柔軟性 なんだろうな、という点だった。まぁそれはさておき、評価の際にハマったポイントをメモしていく。

巨大ファイルはadd/commitできるが、branch/checkoutができなくなる

最初に嵌ったのがこの問題。検証していたソースツリーの中に、oracleのdbダンプファイル(1.5GB)が含まれていた。DDLなのでテキストファイルだしということで追加してみたら登録できた。しかしここで油断してはいけない。そのリポジトリをbranchあるいはcheckoutしようとすると、その途中でこけてしまう。

落ちる個所は、zlib.decompressの中で、どうやらzlibで圧縮の掛ったコンテンツを復元しようとして巨大すぎてエラーになっていたようだ。bzrは環境変数 BZR_PDB に1を設定しておくと、エラー発生時にpythonデバッガが起動することができる。これでエラー発生の対象ファイルを突きとめて、原因(1.5GBファイル)が解明できたのだった。ちなみにエラー個所はこのあたりだった。

bzrlib/groupcompress.py (151) _ensure_content
  self._content = zlib.decompress(self._z_content)

なのでbzrへはテキストでも一定サイズ以上(これはまだ究明していないけど、zlibの制限などを調べればいいのかもしれない)のファイルはチェックイン時点で跳ねるようにしておかないといけないようだ。ignoreに含められるのであればそれがいいし、もしそうでない場合は、pre_commitのhookなどにファイルサイズをチェックするスクリプトなどでブロックしておく。コミットできるけど、取り出せない、というのがやっかいだよなぁ。

ファイル分割して登録する、という作戦もあるかもしれない。その際の最大ファイルサイズは別途調べないといけない。

ちなみに自分はignoreに追加で対応した。

コントロールコードのファイルネームが登録されているとマージディレクティブでマージできない

bzrはリポジトリ間の差分をマージディレクティブという差分データとしてメールで送信したり、ファイルに出力して、別のリポジトリでそれを取り込むことで、物理的に隔絶された環境でもリポジトリ間の同期を保つことができる。

ただこのマージディレクティブのpullうまくできないことがあった。これもBZR_PDBでデバッガに入ってようやく原因がわかったのだが、その原因とは登録ファイルのファイルネームにコントロールコード(C)の名前を持つファイルが含まれていたからだった。

しかし直接リポジトリを指定してpullする分には、マージは適切に行われる。なぜファイルネームの不正によって、マージディレクティブによるpullが失敗するのか、というとマージディレクティブをpullする際に、inventoryと呼ばれる、リポジトリ内のファイルの一覧情報をXMLとしてマージディレクティブのバンドル情報から取り出している時に、XMLがinvalidでこけていた。ちなみに以下のようなメッセージだったはず。

ERROR: not well-formed (invalid token):line 6547, column 58

bzrlib/xml_serializer.py(82) read_inventory_from_string()
   raise errors.UnexpectedInventoryFormat

ちなみに単にファイルをremoveしても履歴に残っているとまずいようなので、そのファイルが登録される時点までuncommitして、そもそも不正ファイルが登録される歴史自体を黒歴史として封印する必要があるようだ。

(調査中)Solaris上で作成したブランチの作業ツリーをWindows上で展開できない?

ただ今はまり中なのが、Solaris上で作成したブランチをWindows上にbranch/checkoutする段階で、作業ツリーを展開しようとする時にエラーになってしまうという件。

作業ツリーなしのブランチの複製(--no-tree)ならば成功するのだが、作業ツリーを作る際に、どうもcheckout情報のファイルの中にWindowsで使えないファイル名が含まれているからっぽいのだが、優先度は低いのでまだ調査できてない。

まとめ

ここまでコケた話を挙げているので「bzrだめじゃん」とか感じる人がいたらすみません。bzr自体は評価してみて結構気に入っているのです。BZR_PDBがあるおかげで原因も解明できたしね。

今度はbzrでこんなによかった、という話を書けばいいのかもしれないですねぇ。(そのうち)

Comments

No comments.