毎度、ググっても出てこない小ネタを取り扱っております。
本記事は個人的な見解であり、筆者の所属するいかなる団体にも関係ございません。
0. はじめに
Nextcloudを使っていて、以下のような「ファイルがロックされてしまって消せなくなる」という記事をよく見かけます。
Nextcloudのファイルがロックされて困る – matoken's meme
https://matoken.org/blog/2018/05/19/nextcloud-files-locked/
Nextcloudで不要なファイルを削除できなくなったとき|ころQ
https://note.com/koroq2000/n/nefe57093f4f9
NextcloudでFileが削除できなくなった [ほほほのほ]
https://www.seirios.org/seirios/dokuwiki/doku.php?id=tweet:2022:0111_01
アップロードしたファイルやフォルダが消せなくなりましたが、どうしたら良いですか? | Nextcloud by NEXTsystems
https://solution.next-jp.net/2020/12/08/%e3%82%a2%e3%83%83%e3%83%97%e3%83%ad%e3%83%bc%e3%83%89%e3%81%97%e3%81%9f%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%82%84%e3%83%95%e3%82%a9%e3%83%ab%e3%83%80%e3%81%8c%e6%b6%88%e3%81%9b%e3%81%aa%e3%81%8f/
しかし、私が管理しているNextcloudではそういったことが起こったことは殆どありません。
(昔あったかもしれない気もしなくもないけど、覚えてないぐらい)
どう言う状況で起こっているのか、再現できていないので幾つかの可能性と共に解決策を考えてみます。
1. 原因の想定
1-1. oc_files_lockの利用用途
oc_files_lockはファイルの書き込み時にファイルが編集時に、そのファイルが更新されている途中で、別のファイルの更新でファイルが上書きされてしまったりしないために利用します。
例えば、Aさんがデスクトップクライアントでファイルを更新して、アップロードしている途中に、Bさんがウェブサーバーで同じファイルをアップロードすると、Aさんの更新とBさんのファイルの更新が重なってしまうので、先にファイルのアップロードを開始した人に優先権を与えて、後からファイルをアップロードしようとしたり更新している人に待ってもらう、というものです。
一時的な情報に過ぎないので、oc_files_lockのテーブル情報を削除しても問題ありません。
1-2. ファイルロックの場所
Nextcloudでは、このファイルロック情報を持つ場所を以下の2種類、どちらかに指定が可能です。
- データベース(Postgresql、MySQL等)
- KVS(Memcache、Redis等)
3. 記事での利用者の環境
記事で利用されている人は、全て「oc_files_lock」テーブルを操作しています。
つまり、1-2. ファイルロックの場所
で1を選択しています。
恐らく原因はここにありそうです。
私が管理しているNextcloudでは、1-2. ファイルロックの場所
は全て2を選択しています。
4. 原因想定
データベースはトランザクション等様々な操作を行うものです。KVSとは比較にならないほど重い処理だと言えます。また、Nextcloudがファイルをアップロードするときに書き込むのもデータベースです。
とすると、複数のファイルをアップロードしているときに「毎回ファイルロック情報」がデータベースに書き込まれて、ファイルのアップロードが終了したら、「ファイルロック情報」が削除される処理は、非常に重い処理といえるでしょう。
その場合に、PHPが接続してMySQL等にクエリーを送信してクエリー実行に失敗する事も考えられます。
そのような状況になると、oc_files_lockファイルにロック情報が残ってしまうということは容易に想像できます。
また、KVSをファイルロック情報としている私が管理しているNextcloudでは、同様の問題が発生していないことも鑑みると、データベースによるファイルロック情報の保存には問題があると言えます。
5. 解決案
5-1. ファイルロック情報のRedisへの移動
一番簡単な解決案は、ファイルロック情報の保存をデータベースからKVSであるRedisに変更する方法でしょう。
これは完全に互換性があり、リスクもなく、非常によくテストされているので一番お薦めです。
設定方法については以下をご参照ください。
Transactional file locking — Nextcloud latest Administration Manual latest documentation
'memcache.locking' => '\OC\Memcache\Redis',
'redis' => array(
'host' => 'localhost',
'port' => 6379,
'timeout' => 0.0,
'password' => '', // Optional, if not defined no password will be used.
),
5-2. 定期的なロック情報の削除
しかし、VPS等でRedisを自由に動かすことができない場合はどうすればいいでしょうか?
その場合は、データベース上のoc_files_lockテーブルを定期的に削除する方法しか、選択肢がありません。
しかし、全てを全消しするのも懸念がありますので、以下のようなスクリプトを利用して、24時間以上経ったレコードのみを削除するようにしましょう。
5-3. ファイルロックを無効化する
最後の手段としては、ファイルロック情報を保存しないという方法もあります。
しかし、これはそのリスクが分かっている人にのみお勧めする方法で一般的な対応としてはお薦めできません。
'filelocking.enabled' => false
6. まとめ
Nextcloudでよく言われるファイルがロックされてしまって削除できなくなる問題に対して述べました。
上記を参考にして、快適なNextcloudライフをお送りください。