画面に「undefined」が。Moodleに潜む【幽霊エラー】の正体

Moodleを運用していると、ときどき「ふわっ」と現れる、あの不親切なポップアップ。

「undefined」

「エラーなのはわかった。でも、何が undefined(未定義)なんだい?」と、画面の前でツッコミを入れたことがある管理者の方も多いのではないでしょうか。

今回は、そんな「正体不明のエラー」に立ち向かった、ある日の調査記録をご紹介します。

そもそも「undefined」って何?

Moodleにおけるこのエラー、実は「Moodleがエラー内容を説明できなくなったとき」に出る断末魔のようなものです。

本来なら「パスワードが違います」とか「権限がありません」と教えてくれるはずのシステムが、予期せぬ事態によって、返すべきメッセージを見失ってしまった状態。

それが「undefined」の正体です。

特定のユーザが削除できない?!

先日、「特定のユーザアカウントをサイトから削除しようとすると、必ずundefinedが出て失敗する」というご相談をいただきました。

CSVで一括削除を試みても、サイト管理画面から手動で試みても、結果は同じ。

「他のユーザは消せるのに、なぜこのアカウントだけ?」
「サーバが何かを拒んでいる…?」

▼調査で判明した「地獄の連鎖」
サーバの奥深くまで挙動を追いかけていくと、意外な事実が浮かび上がりました。
それは、そのユーザが登録されていた「コースの作り込み」

Moodleには「Aというテストに合格しないと、Bという資料が見られない」といった利用制限(条件付け)の機能や、
Aコースをコース完了することがBコースのコース完了状況の1つである、など、非常にバラエティ豊かな因果関係を設定することができます。

これらは非常に便利で強力なのですが、今回のケースでは、その条件がまるで巨大な迷路のように、何層にも、何百箇所にも、複雑に組み合わさっていました。

ユーザを削除するとき、Moodleは裏側でこう考えます。
「このユーザを消すなら、学習履歴も消さなきゃ。あ、でもこの履歴が消えると、あっちの条件判定はどうなる? その先の判定は? そのさらに先の判定は…(無限ループ)」

結果、サーバの処理能力が限界を突破。
既定のタイムアウト値以上経っても計算が終わらず、Webブラウザ側が「もう待てません!」と匙を投げた瞬間に、あの「undefined」が表示されていたのです。

ちなみに、「アンエンロール(登録解除)すれば消えるのでは?」という仮説も立ててみましたが、Moodleの真面目なところ(データ整合性へのこだわり)が仇となり、履歴が残っている限り、削除時の再計算からは逃れられませんでした。

閃いた解決法

一緒に調査をしていたサーバ担当者が、ぼそっとこうつぶやきました。

「対象ユーザのコースに紐づいた情報の全削除ってサイト管理メニューからできないですか?」

アカウントを削除するユーザなら、それをしても問題ないですよね と。

その一言から、閃いたのが「データリクエスト」

この機能は、GDPR向けの機能で、ユーザ自身の個人データに対する取り扱いに関する諸々をサイト管理者に対して要求したり、プライバシーに関する問い合わせを行う機能です。
ここから「個人データ全てを削除する」という要求ができます。※サイト管理者によるリクエスト→承認も可能。

そしてこの処理の良いところは、実行がcron依存のため、バックグラウンド処理となり、タイムアウトとは別ロジックになるのです。

このデータリクエスト機能で個人データを全て削除実行した後に、アカウント削除を試みたところ、あっさり削除されました。

システムにも「考える限界」がある

この事例は私たちに大切なことを教えてくれました。
「undefined」は、サーバーからの「限界です」というサインかもしれない。

本来ならエラーの理由を丁寧に説明してくれるMoodleが、それすらできなくなるほど、裏側で膨大なデータの糸を解こうと一生懸命に奮闘していた…。
あの不親切なポップアップは、実はシステムが精一杯頑張った末の「最後の声」だったのかもしれません。

もし皆さんのMoodleでも、特定のアカウント削除ができずに「undefined」が出てしまったときは、
データリクエスト機能で個人データ全てを削除してからアカウントの削除をお試しください。

それと同時に、コース設計の見直しのよい機会だと前向きに捉えてみませんか?

Moodleのデータ整合性へのこだわりは、学習履歴を正しく守るための「優しさ」でもあります。
その性質を理解し、無理に削除しようとせず、システムが息切れしないような

「ちょうどいい距離感」で付き合っていくことが、安定運用の秘訣のひとつです。