藤原です。
2017年4月20日 14:02 ohira <
shin....@gmail.com>:
> いつもお世話になっております。
> おおひらです。
>
> hg pull 実行時に作業領域のロックを待ち続けるという現象が発生しました。
>
> Windows 7 Professional
> TortoiseHg 4.1.2
>
>
> 他のプログラムが動作しているためかとしれないので、他のプログラム
> を全て終了してみましたが状況に変化なし。
>
> OSの再起動を行って、再度 hg pull を実行しましたが状況に変化あり
> ませんでした。
>
> (設定ファイルをnulでクリアする設定も試したのですが、
「設定ファイルをnulでクリア」というのが「.hg/wlock ファイルの空ファ
イル化」を意味するものと仮定して話を進めます。
「作業領域の排他」や「リポジトリの排他」(履歴管理領域)は、基本的に
「ファイルの存在の有無」=「排他の有無」です。
せめて、存在しないプロセスの PID が格納されていれば、「プロセス終
了済み」扱いで、解放を待たずに獲得処理に移行するのですが、現状の実
装では「空の排他ファイル」は解放待ちの無限ループを生じる筈です (後
述しますが、この実装が問題の原因である可能性もあります)
実装内情を確認せずに、内部管理情報を不用意に手動編集するのは避けた
方が良いでしょう(後述する hg debuglocks を使用してください)。
> 設定ファイル
> を読まないとssh経由のアクセスができないため再現するところまでい
> きませんでした)
これは:
"hg pull" 実行前に「設定ファイル (= .hg/wlock) をnulでクリアす
る」処理をしたら、そもそも SSH 経由で履歴情報を取得する処理が
(排他解放待ちで)実行されない
という理解で合っていますか?
現在、"hg pull" は常に作業領域排他を必要としていますので、上記のよ
うな手順だと、単に排他解放を待ち続けるだけになってしまいます。
bookmark 周りが「履歴管理領域排他」傘下でさえあれば、-U/--update
無しの "hg pull" では作業領域排他が必要なかった筈なんですけどねぇ
(歴史的経緯から止むを得ないのですが……)
> 実行したコマンド
> --debugを付けて実行
上記2つは末尾の「中断されました!」以外は特に違いが無かったのですが、
実行ログのコピペミスでしょうか?
> C:\Users\ohira\repos\trunk\sps_20_static>hg pull --debug
> ssh://
h...@escm11.mxfw.net/trunk/sps_20_static から取り込み中
> running "C:\Program Files\TortoiseHg\lib\TortoisePlink.exe" -ssh -2
>
h...@escm11.mx
>
fw.net "hg -R trunk/sps_20_static serve --stdio"
> sending hello command
> sending between command
> remote: 329
> remote: capabilities: lookup changegroupsubset branchmap pushkey known
> getbundle
> unbundlehash batch stream
> bundle2=HG20%0Achangegroup%3D01%2C02%0Adigests%3Dmd5%
> 2Csha1%2Csha512%0Aerror%3Dabort%2Cunsupportedcontent%2Cpushraced%2Cpushkey%0Ahgt
> agsfnodes%0Alistkeys%0Apushkey%0Aremote-changegroup%3Dhttp%2Chttps
> unbundle=HG10
> GZ,HG10BZ,HG10UN
> remote: 1
> C:\Users\ohira\repos\trunk\sps_20_static の作業領域 のロック ('' が保持) の解放
> を待っています
> 中断されました!
上記の実行ログは、元々の「hg pull 実行時に作業領域の排他解放を待ち
続ける」問題が発生するリポジトリでのものでしょうか?
それとも「設定ファイルをnulでクリアする」設定を行った場合のもので
しょうか?
「作業領域 のロック ('' が保持) の解放」メッセージで、排他保持プロ
セスの情報が表示される筈のところに空文字列が表示される点から推測す
るに:
- 「元々の問題発生リポジトリでの実行」ケース
以前 Mercurial を実行した際の排他解放において、何らかの理由か
ら、「.hg/wlock ファイルの削除」が「.hg/wlock ファイルの空化」
になってしまった可能性があります。
先述したように、現状の実装では「空 .hg/wlock ファイル」は解放
待ちの無限ループになります。
4.2 向けに修正パッチを提案しようと思います。
- 「設定ファイルをnulでクリアする」ケース
内部管理ファイルの手動編集は止めましょう (笑)
「設定ファイルをnulでクリアする」に関しては「再現できませんでした」
との言及があったので、前者だとは思いますが、ログの出力を見る限りで
はどちらとも解釈可能なので、念のため……
非公開ではありますが、排他情報の参照/操作向けに "hg debuglocks"
コマンドが提供されています。
デフォルト動作が「排他保持プロセスに関する情報表示」なので、今後同
様の現象が発生した際には、まずは排他を保持しているプロセスの死活確
認を行ってください。
獲得済みの排他解放など、使用方法の詳細は "hg help debuglocks" でオ
ンラインヘルプを参照してください。
> hg verifyの実行
「履歴管理領域の整合性」をチェックする "hg verify" は、作業領域を
排他せずに(= 作業領域の排他が他のプロセスによって獲得済みでも)
実行されます。
ですので、"hg verify" は排他関連の整合性確認用途には適していません。
--
----------------------------------------------------------------------
FUJIWARA Katsunori(
flying...@gmail.com)