svn commitに失敗してcleanupもできない
I/Oエラーでcommitに失敗してもう一度実行するとcleanupしろと言われるができない。(Subversion v1.8.9)
>svn cleanup svn: E200030: sqlite[S10]: disk I/O error svn: E200030: Additional errors: svn: E200030: sqlite[S10]: disk I/O error svn: E200030: Additional errors: svn: E200030: sqlite[S1]: cannot rollback - no transaction is active svn: E200030: Additional errors: svn: E200030: sqlite[S1]: cannot rollback - no transaction is active
ディスクの空きはGB単位であるし、通常のファイル操作は成功する。昨日試しに入れてみたAvastが疑わしいが、ファイルシステムシールド*1を一旦オフにしてみても変わらない。
他でこのworking copyを使っている等の正当なロックではないので直接いじって解除してみる。
>cd .svn >copy wc.db wc.db.bak >sqlite3 wc.db .tables ACTUAL_NODE NODES PRISTINE WC_LOCK EXTERNALS NODES_BASE REPOSITORY WORK_QUEUE LOCK NODES_CURRENT WCROOT
少し違うが似たようなcleanup不可事例ではWC_LOCK と WORK_QUEUE テーブルが関係するらしい。一応 LOCK も見てみる。
>sqlite3 wc.db --header "select * from LOCK" #空 >sqlite3 wc.db --header "select * from WORK_QUEUE" #空 >sqlite3 wc.db --header "select * from WC_LOCK" (--html)
wc_id | local_dir_relpath | locked_levels |
---|---|---|
1 | -1 |
WC全体のロックが残っているだけのようだ。svn stの状態とも矛盾しないのでこれを消してみる。
>sqlite3 wc.db "delete from WC_LOCK" >cd .. >svn commit ファイルのデータを送信しています .svn: E155011: コミットに失敗しました (詳しい理由は以下のとおりです): svn: E155011: ファイル '/path/to/wc/changed/file' はリポジトリ側と比べて古くなっています svn: E170004: File '/trunk/changed/file' is out of date
確認のためのsvn stを忘れたがロックは消えたようだ。前のコミットは成功していたらしい。同期してみる。
>svn up Updating '.': svn: E200030: sqlite[S10]: disk I/O error svn: E200030: Additional errors: svn: E200030: sqlite[S10]: disk I/O error svn: E200030: Additional errors: svn: E200030: sqlite[S1]: no such savepoint: svn svn: E200030: Additional errors: svn: E200030: sqlite[S1]: no such savepoint: svn svn: E200030: Additional errors: svn: E200030: sqlite[S1]: no such savepoint: svn svn: E200030: Additional errors: svn: E200030: sqlite[S1]: no such savepoint: svn
またもや失敗。ただしcommit時と違い今回ロックは残らなかった。
もう一度Avastを切って試したところ、今度はupdateに成功した。
検索してもAvastでSubversionが動かなくなったという話は聞かないし、 C:\ProgramData\AVAST Software\Avast\log にも何も書いてないのだが。*\.svn\*をスキャンから除外して様子を見ることにする。
Avastをアンインストールした*2
再びSubversionでI/Oエラーが出たり、.iniファイルが消えたり、スクリプトが不規則に失敗したりする症状が出るようになっていたのだが、ダメ押しでWindowsがロック状態から復帰できなくなりハードリセットする羽目になったためとりあえずMSSEに戻すことにした。
そもそもMSSEがリアルタイム保護しか使っていないのに、起動していないアプリのスキャンをPCの使用中に始めたりするため代替品を探していたのだが、仕方ない。
Windows 7では今までこれほどPCが不安定になった事は無い。