DB/Redisを再構築せずに、不要になったプラグインを削除したいです。
ClassとModelSchemaは、この手順の対象外です
ここで紹介する手順(Redisから登録を削除する)を、classes(xaas.classes)とmodelschemas(xaas.modelschemas)に対して行わないでください。
ClassとModelSchemaの登録はDBのテーブル定義と直結しており、登録を削除した状態でプラグインをインストールすると、テーブルのマイグレーション(カラム・インデックスの変更や削除)や、定義が見つからないテーブルの自動削除が発生し、ATOMインスタンスのデータが失われるおそれがあります。
特にxaas.modelschemasには、modelschemasディレクトリのプラグインだけでなく、Classから自動生成されたテーブル定義も同じキーに格納されています。
不要になったClassは、インスタンスをすべて削除したうえで、Classの削除(DELETE /classes/{name})を実行してください。テーブルの削除まで含めて安全に処理されます。
Gitリポジトリ(プラグインディレクトリ)からプラグインのファイルを削除・移動しても、Qmonus SDKには削除・移動する前のプラグインが登録されたまま残ることがあります。
ここでは、残る理由と、DB/Redisを再構築せずに不要なプラグインの登録を削除する方法を紹介します。
登録が残る理由
プラグインのインストールは、プラグインファイルの内容を種別(Scenario、Class、Module、Function など)ごとに登録(追加・上書き)する処理です。ファイルから無くなったプラグインの登録を削除する処理は行いません。
インストールされたプラグインの情報は、種別ごとにRedisに保存されています。そのため、Redisをクリアせずにインストールし直すと、ファイルから無くなったプラグインの登録はRedisに残り続けます。
具体的には、以下のような場合に不要な登録が残ります。
- プラグインのファイルを削除した場合: 削除したプラグインの登録が残ります。
- プラグインの名前を変更した場合: 変更前の名前の登録が残ります。
- プラグインのファイルを別の種別のディレクトリへ移動した場合: 移動前の種別の登録が残り、移動前と移動後の両方が登録された状態になります。
これは特定の種別に限らず、すべての種別のプラグインで起こります。
Note
Redisをクリアしてからプラグインをインストールした場合は、登録はGitリポジトリの状態と一致します。
ただし、あわせてDBもクリアした場合は、DBに格納されているATOMインスタンスなども削除されます。
対処方法
DB/Redisを再構築できない場合は、Redisに残っている不要な登録をインタラクティブシェルから削除します。
不要な登録だけを個別に削除する方法(方法1)と、種別ごとにまとめて削除してから再インストールする方法(方法2)があります。通常は方法1を使用してください。
登録を削除したあとは、Scenarioサーバの再起動が必要です
Redisの登録を直接削除しても、すでにサーバのメモリ上に読み込まれているプラグインはその場では破棄されません。再起動するまでは、以下のように削除したはずのプラグインが動作し続けます。
- Scenario: URIが有効なまま残り、リクエストを受け付けます。
- Module/Function: 構築済みの実行コンテキストに残っているため、引き続き呼び出せる場合があります。
- Job: スケジューラが削除したJobを実行し続けます。
- Daemon: 稼働中のDaemonが停止せずに動き続けます。
また、プラグインの削除API(DELETE /scenariosなど)が行っている「実行中のトランザクションがあれば削除を拒否する」「稼働中のDaemonは削除を拒否する」といったチェックも行われません。対象のプラグインが実行されていないことを確認してから削除してください。
Redisのキーの確認
Scenarioサーバのプラグインの登録は、種別ごとに以下のRedisのキーに保存されています。
(※対象外)と記載したキーは、冒頭の注意のとおり削除しないでください。
| プラグインサービスディレクトリ | Redisのキー |
|---|---|
formats |
xaas.formats |
jsonschemas |
xaas.jsonschemas |
configs |
xaas.service.configs |
variablegroups |
xaas.variable.groups |
modules |
xaas.modules |
functions |
xaas.functions |
toyblocks |
xaas.toyblocks |
templates |
xaas.config.templates |
scenarios |
xaas.scenarios |
modelschemas |
xaas.modelschemas (※対象外) |
closedloopcomponents |
xaas.closedloop.components |
closedlooptypes |
xaas.closedloop.types |
daemons |
xaas.daemons |
classes |
xaas.classes (※対象外) |
dags |
xaas.dags |
aliases |
xaas.aliases |
protobufs |
xaas.protobufs |
grpcservicers |
xaas.grpcservicers |
jobs |
xaas.jobs |
fakers |
xaas.fakers |
illusions |
xaas.illusions |
testcases |
xaas.testcases |
testsuites |
xaas.testsuites |
Note
上表はScenarioサーバのプラグインのキーです。API Gateway(roles、accounts、parametermappers、routings)、Transaction(counters、aborthooks、exclusives、transactionquotas、ipam)、Lambda(cliproxy、netconfproxy、devices、deviceroles、lambdafunctions)、Collection、Reflectionなどのプラグインにも、同様に種別ごとのキーがあります。
各キーには、<キー名>.<プラグイン名>というフィールド名でプラグインが1つずつ登録されています。
登録されているプラグインは、インタラクティブシェルで確認できます。
>>> print(await Redis.hkeys("xaas.modules")) # Moduleとして登録されているプラグインを確認
['xaas.modules.FooModule', 'xaas.modules.BarModule']
方法1: 不要な登録だけを削除する
不要になったプラグインの登録だけを、フィールド名を指定して削除します。
プラグインの再インストールは不要で、他のプラグインが未登録になる時間も発生しないため、通常はこの方法を使用してください。
1. インタラクティブシェルで、削除するフィールド名を確認します。
>>> print(await Redis.hkeys("xaas.modules")) # 現在登録されているModuleを確認
2. 不要な登録を削除します。
>>> await Redis.command("hdel", "xaas.modules", "xaas.modules.FooModule") # 不要なModuleの登録を削除
>>> print(await Redis.hkeys("xaas.modules")) # 削除されたことを確認
3. Scenarioサーバを再起動します。
メモリ上に残っているプラグインを破棄するために再起動します(上の注意を参照)。
方法2: 種別ごとにまとめて削除して、再インストールする
不要な登録が多数ある場合など、種別の登録をすべて削除してから再インストールし、Gitリポジトリにあるプラグインだけを登録し直す方法です。
ここではModuleを例に説明します。他の種別も、対応するキーに置き換えて同じ手順で削除できます。
1. インタラクティブシェルで、Moduleの登録をすべて削除します。
>>> print(await Redis.hkeys("xaas.modules")) # 現在登録されているModuleを確認
>>> await Redis.command("delete", "xaas.modules") # Moduleの登録をすべて削除
>>> print(await Redis.hkeys("xaas.modules")) # 空になったことを確認
2. プラグインを再インストールします。
Scenarioサーバを再起動します。起動パラメータ--plugins_auto_installが有効な場合、起動時にプラグインがインストールされます。
この再起動によって、メモリ上に残っているプラグインもあわせて破棄されます。
3. 不要な登録がなくなったことを確認します。
>>> print(await Redis.hkeys("xaas.modules")) # Gitリポジトリにあるものだけが登録されていること
Warning
方法2には、次の注意点があります。
- 登録を削除してから再インストールが完了するまでの間、その種別のプラグインは登録されていない状態になります。利用の少ない時間帯に行ってください。
- 再インストールが途中で失敗した場合、その種別のプラグインは登録されていない状態のまま残ります。再インストールが正常に完了したことを必ず確認してください。
- 起動パラメータ
--ignore_pluginsに対象の種別が指定されていると、その種別は再インストールされません。 - 複数のScenarioサーバを起動している構成では、起動時のプラグインのインストールはmasterのみが実行します。メモリ上のプラグインを破棄するには、すべてのサーバを再起動してください。
インストールされているプラグインとGitリポジトリのファイルを比較して確認したい場合は、Q14. プラグインのチェック を参照してください。
Warning
- 削除するのは、不要な登録が残っている種別のキーだけにしてください。Redisには、トランザクションやBookingの情報など、プラグイン以外のデータを保存しているキーもあります。
- プラグインの登録を削除しても、カバレッジの情報(
xaas.coverages、xaas.coverage.map)には削除したプラグインのエントリが残ることがあります。