指定した条件を満たすファイルはバックアップしない改良

指定した条件を満たすファイルはバックアップしない改良

- Tatsuya Shirai の投稿
返信数: 11

 大きなサイズのファイルをコースファイルとして大量に保有するコースのバックアップに失敗する事例がいくつも報告されています.Using moodleにおいても頻繁に報告され,「Moodle2.0では改善されるのでお待ちを!」という回答が繰り返されています.これは現在のPHPが2GBを越えるファイルを正常に取り扱うことができない制限が主たる要因でありますが,かといって例えば4GBのバックアップを5個も保存すると,一つのコースでHDDを20GBも浪費してしまいます.そのバックアップファイルを作成するにはHDDだけではなくCPUも著しく浪費します.HDDの空き容量不足によりサーバがダウンしたという話もいくつか聞きます.

 そこで「これはバックアップしないで良いです」という条件を指定できる改良を開始しました.

 標準のMoodleではなく対象はfs_moodleに限りますが,可能な限り本体側の改造を少なくするつもりです.標準のMoodleでも多少の改造で対応できるかも知れません.

 仕様は以下のURLで参照できます.
 http://www.suzuka-ct.ac.jp/mech/moodle/mod/wiki/view.php?id=320&page=Shirai171&thankyou=1

 進捗を少しずつですが,こちらにも報告していこうと思います.

Tatsuya Shirai への返信

Re: 指定した条件を満たすファイルはバックアップしない改良

- Tatsuya Shirai の投稿

 とりあえず,コース指定無し(全コース対象),ファイルサイズ指定無しで,拡張子によってバックアップを制限することには成功しました.次はファイル名の正規表現による制限のチェックです.

Tatsuya Shirai への返信

Re: 指定した条件を満たすファイルはバックアップしない改良

- Tatsuya Shirai の投稿
 ファイル名でフィルタを掛ける,と,単純に考えていましたが,よく考えてみたら,相対パス(コースのルートフォルダ基準)でも指定できると良いですね.頭にスラッシュを付けるかどうかで判断すれば良い訳だし.でも,頭にスラッシュを付けないでパス指定されたら困るな.その場合はこちらで頭にスラッシュを補おう.
Tatsuya Shirai への返信

Re: 指定した条件を満たすファイルはバックアップしない改良

- Tatsuya Shirai の投稿

 ファイル名によるバックアップ制限の確認を行っています.
 ファイル名を直接指定した場合と,正規表現を用いて指定する場合の条件設定用の関数を分けました.

 正規表現の例としては,以下のような設定を設定ファイル(fsconfig.phpか,fs_backup_exception.php)に設定すれば,コースIDが2のコースの”サンプル.doc”もサンプル1.doc”も”サンプル999.doc”もバックアップされなくなります.ファイルサイズに関係なく.

    fs_add_backup_exception_filename_ereg('サンプル[0-9]*\.doc', -1, 2);

 まだベースネームにしか対応していません.今後,フルパス名にも対応できるかどうか,試して見ます.


 とりあえず,フォームに入力されたファイル名がバックアップ制限条件に合致するかどうかをチェックするページを作成し,そちらを通してチェックを行っています.

 最終的にはコースフォルダを”ファイル”で閲覧する際に,バックアップ制限対象のファイルやフォルダを色分け表示することで確認をより容易にする予定です(コースファイルを編集する権限をもつ者のみ対象).

Tatsuya Shirai への返信

Re: 指定した条件を満たすファイルはバックアップしない改良

- Tatsuya Shirai の投稿

 バックアップ制限条件として,ファイル名/フォルダ名を同等に扱う仕様で考えていましたが,逆に想定外の挙動をしたり,プログラムが複雑化するため,設定用の関数をファイル名用とフォルダ名用とに分けました.

 また,ファイル名指定やフォルダ名指定にパスを考慮できるようにコードを改造し始めました.ただし,相対パスは考えません.ファイル名/フォルダ名の頭に'/'(半角スラッシュ)が存在した場合は$CFG->dataroot/コースIDからの相対パスとして扱います.もし頭に'/'を付け忘れた場合は,たとえ途中にスラッシュを含む文字列が当てられたとしてもベースネーム(拡張子付きのファイル名,あるいはフォルダ名)として扱います.この制限はもしかしたら緩和するかも知れません.

Tatsuya Shirai への返信

Re: 指定した条件を満たすファイルはバックアップしない改良

- Tatsuya Shirai の投稿

 一応,指定されたフォルダ以下をバックアップしない条件でのバックアップに成功しました.

 まだまだチェックが足りませんが,おおよそ完成したと考えて良さそうです.

Tatsuya Shirai への返信

Re: 指定した条件を満たすファイルはバックアップしない改良

- Tatsuya Shirai の投稿

 ファイル名とフォルダ名の指定が,相対パスか,単なるフォルダ名/ファイル名の指定か.
 正規表現か,否か.

 この辺りの処理が意外と煩雑であることに気付きました.例えば,フォルダ "data2" をバックアップしない,と指定した場合は,

moodledata/0/work/data1/data2/data3/sample1.doc

というファイルをチェックした場合は,除外しなくてはいけない.ファイル"sample1.doc"を指定した場合も除外しなくてはいけない."data1"を指定した場合も除外しなくてはいけない."/work"を指定した場合も除外しなくてはいけない.でも,"/data2"を指定した場合は除外してはいけない.などなど.

 コードをシンプルかつメンテナンスし易い構成にするのに意外と手間取りましたが,なんとか成功したようです.添付したファイルの条件は,

    fs_add_backup_exception_extension('wmv', 100, 57);

コース57に含まれる拡張子"wmv"(大文字小文字は区別しない)で,ファイルサイズが100MB以上のものはバックアップしない,という条件です.ファイルサイズやコースIDは指定しないことも可能です.

 添付したファイルのように,どのファイルがバックアップの制限対象か分かるようにしました.リソースの「フォルダ」の参照ではなく,管理メニューの「ファイル」で見た場合のみ,このようにバックアップ除外対象のファイルに(!)マークが表示されます.Titleでどのバックアップ制限条件に(この場合は条件6)合致したのかをツールチップ表示します.同じWMV形式のファイルでも,100MB以下のものには(!)が表示されていないのが分かります.

添付 backup_exception.jpg
Tatsuya Shirai への返信

Re: 指定した条件を満たすファイルはバックアップしない改良

- Tatsuya Shirai の投稿

 なお,設定ファイルで指定されたバックアップ制限条件は,fs_moodleの状態表示(これはfs_moodleのみ.サイト管理メニューのサーバの項に追加しています)にて,下図のように確認することができます.

 簡易的ですが,下の方にあるテキスト入力フォームにファイル名(パスもOK)を入力すると,そのファイル名が上記条件に合致するかどうかをチェックできます(コースIDとファイルサイズは無視.実在しないファイル名でのチェックですので).

添付 backup_exception_condition.jpg
Tatsuya Shirai への返信

Re: 指定した条件を満たすファイルはバックアップしない改良

- Tatsuya Shirai の投稿

見落としがありました.

 同じコースファイルでも,モジュール(フォルダのリンク)で指示されているフォルダの内容は,コースファイルのバックアップの前にバックアップされるのですね.こちらも対策しないといけませんでした.

 ちょっと気になったのは,backup/lib.phpの中のfunction backup_copy_file()がコースファイルその他をガバッとコピーするリカーシブな関数(対象がフォルダの場合は自分自身を呼ぶことで再帰的にフォルダ構造ごとコピーする)です.でも,いま気付いたように,先にmod/resource/backuplib.phpでリソースの指し示す先にあるフォルダなりファイルなりをコピーした後に,改めて(コースファイルのバックアップを指示されているならば)コピーします.これ,かなり無駄では?

 backup/lib.phpのfunction backup_copy_file()のコピーを行う箇所,まずファイルの有無をチェックして,存在しないならばコピーすれば良いのじゃ無いでしょうか.

    function backup_copy_file ($from_file,$to_file,$log_clam=false) {

        global $CFG;

        if (is_file($from_file)) {
            //echo "<br />Copying ".$from_file." to ".$to_file;              //Debug
            //$perms=fileperms($from_file);
            //return copy($from_file,$to_file) && chmod($to_file,$perms);
            umask(0000);
            if (file_exists($to_file) or copy($from_file,$to_file)) {
                chmod($to_file,$CFG->directorypermissions);
                if (!empty($log_clam)) {
                    clam_log_upload($to_file,null,true);
                }
                return true;
            }
            return false;
        }

赤い箇所を追加しても,大して危険は無いと思うのですけれども.どうでしょうか.

Tatsuya Shirai への返信

Re: 指定した条件を満たすファイルはバックアップしない改良

- Tatsuya Shirai の投稿

 バックアップファイルのサイズが4GBを超えてしまったため先月末からバックアップに失敗していたコースがありました.中身の大半はzipファイルでした.これをzipはバックアップしない設定にしたところ,バックアップファイルが44MBに縮小しました.成功です.色々とバグが出せましたね.

 少々,fs_moodleに頼る改造になってしまいました.したがってパッチでの公開は難しいです.コアになるライブラリの公開と,あとはWikiを参考に独自の適用を試みることは容易にできると思いますので,もう少し実験を重ねた後にライブラリを公開します.

Tatsuya Shirai への返信

Re: 指定した条件を満たすファイルはバックアップしない改良

- Tatsuya Shirai の投稿

 現在,backupdataは当然として,moddataフォルダもバックアップ制限機能の対象外としています.

 ところがあるコースでフォーラムの添付ファイルの合計が1.5GBを超えていました.甘かったですね.一つ一つのファイルのサイズは小さくても,積み重なると凄い量になるものです(制限を50MBまでに緩めてあるので,大きなファイルも存在します).

 とりあえず近日中に,backupdata / moddataフォルダは制限対象外としたΒバージョンでfs_moodleを公開するつもりでしたが,混乱が生じると怖いので見送ります.「あるコースのzip書庫は全てバックアップしない」という設定にしてしまうと,コースファイルのみを対象としたつもりがmoddataフォルダ内のzipファイルまでバックアップされなくなってしまいます.なんらかの方法でバックアップ制限条件に,moddataも含むかどうかを指示するパラメータを追加しなくてはいけません.まだ仕様が頭の中で確定していませんので,それが整理されてから実装,テスト,ですね.

#早く,Moodle1.9.6+を試したいのですが...

Tatsuya Shirai への返信

Re: 指定した条件を満たすファイルはバックアップしない改良

- Tatsuya Shirai の投稿
とりあえず無駄なコピーは行わないで良いのではないか,という提案をTrackerに投稿しました(MDL-20600).