Insight で「InvalidCacheLoadException: loadAll failed to return a value for xxx (loadAll により xxx の値が返されませんでした)」または「This attribute needs to be indexed (この属性にはインデックスを付ける必要があります)」というエラーが発生する
Platform Notice: Data Center - This article applies to Atlassian products on the Data Center platform.
Note that this KB was created for the Data Center version of the product. Data Center KBs for non-Data Center-specific features may also work for Server versions of the product, however they have not been tested. Support for Server* products ended on February 15th 2024. If you are running a Server product, you can visit the Atlassian Server end of support announcement to review your migration options.
*Fisheye および Crucible は除く
要約
Insight をアップグレードすると、Insight スキーマにオブジェクトが表示されなくなり、Insight カスタム フィールドで選択するオプションとして表示されなくなり、カーディナリティなどの属性オプションを変更できなくなりました。
InvalidCacheLoadException
Insight のインデックス再作成をトリガーすると、atlassian-jira.log に次のエラーが表示されます。
2021-05-06 14:27:55,871 insight-InsightThreadGroup-worker-thread-6 ERROR admin 863x2041x1 1gmljw3 127.0.0.1 /rest/insight/1.0/index/reindex/start [i.r.i.index.model.ObjectIndexImpl] Index not completed successfully. objectIds: ([1, 2, 3, 4, 5])
com.google.common.cache.CacheLoader$InvalidCacheLoadException: loadAll failed to return a value for 3
at com.google.common.cache.LocalCache.getAll(LocalCache.java:4025)
at com.google.common.cache.LocalCache$LocalLoadingCache.getAll(LocalCache.java:4972)
at io.riada.insight.index.model.InsightIndexBase.loadAll(InsightIndexBase.java:81)
at io.riada.insight.index.model.ObjectIndexImpl.reindexObjects(ObjectIndexImpl.java:318)
at com.riadalabs.jira.plugins.insight.services.core.index.ReindexServiceImpl$ReindexObjectsJob.executeTask(ReindexServiceImpl.java:543)
at com.riadalabs.jira.plugins.insight.services.core.index.ReindexServiceImpl$ReindexObjectsJob.executeTask(ReindexServiceImpl.java:520)
at com.riadalabs.jira.plugins.insight.services.core.multithreadservice.InsightServiceJob.call(InsightServiceJob.java:42)
at com.atlassian.sal.core.executor.ThreadLocalDelegateCallable.call(ThreadLocalDelegateCallable.java:38)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:834)
- 「objectIds」リストには、Insight がその特定の操作でインデックス再作成を試みたすべてのオブジェクト ID が表示されます (顧客の状況ではリストは長くなる可能性があります)。
- 「return a value for」とは、Insight で上記の問題が最初に発生したオブジェクト ID の値のことです。
該当する属性に対してインデックスを作成する必要がある
オブジェクト参照属性の設定を編集しようとすると、次のように表示されます。
環境
この問題は Insight のメジャー バージョン 8.6.x および 8.7.x で検出されました。
原因
ここで説明するどちらのエラーも「ラベル」や「オブジェクト参照」属性など、インデックスを作成する必要があるものの Insight によるインデックス作成の対象としてマークされていない属性に起因しています。
これは UI から実行可能な操作ではないため、この誤設定は、Insight によるアップグレード タスクが不完全であったり、データベースが直接改ざんされたりすることが原因で発生している可能性があります。
インデックスを作成する必要がある属性
上記のエラー メッセージの主な原因は "ラベル" 属性と "オブジェクト タイプ" 属性ですが、Insight で他の属性がインデックス作成の対象となっていて、UI から無効にすることができない場合も考慮する必要があります。次のものを扱うシナリオが該当します。
- オブジェクト タイプごとに自動的に作成される 4 つのフィールド ([キー]、[作成済み]、[更新済み]、[ラベル])
- 別のオブジェクトを参照する属性
診断
この問題を診断するには、Jira ログで上記のエラーを探すか、Jira データベースで次のクエリを実行します。
SELECT "ID", "NAME", "REMOVABLE", "TYPE", "LABEL", "INDEXED" FROM "AO_8542F1_IFJ_OBJ_TYPE_ATTR" WHERE ("REMOVABLE" = 'false' OR "TYPE" = 1) AND ("INDEXED" != 'true' OR "INDEXED" is NULL);
SELECT ID, NAME, REMOVABLE, TYPE, LABEL, INDEXED FROM AO_8542F1_IFJ_OBJ_TYPE_ATTR WHERE (REMOVABLE = false OR TYPE = 1) AND INDEXED != true;
REMOVABLE 列はオブジェクト タイプの 4 つの既定のフィールドを示し、TYPE 1 はオブジェクトを参照する属性に割り当てられたタイプを示します。
行が返された場合は、後述の「解決方法」の手順に進んでください。
行が返されなかった場合は、別の解決方法を参照してください。
ソリューション
影響を受ける環境でこの問題を解決するためには、Insight UI によって [ラベル] フィールド (または [診断] セクションに記載されている他のフィールド) に対するインデックス作成を有効/無効にできないため、まだインデックスが作成されていないすべての必須フィールドに対して、データベースに直接変更を適用する必要があります。
重要な注意事項
Insight の既定の動作では、インデックス作成に非常にコストがかかる "textarea" を除き、すべての属性に対してインデックスが作成されます。
このため、後述の手順には 2 つのオプションが含まれています。1 つは必須フィールドに対してのみインデックスを作成するように設定すること、もう 1 つは "textarea" を除くすべての属性に対してインデックスを作成するように設定することです。
どのオプションに従うべきかをよりよく理解するために、「オブジェクト タイプに属性を追加する」に記載されているインデックス作成の説明をご確認ください。
「各属性に対するインデックス作成機能は、基本検索を行ったり、事後操作、インポート、カスタム フィールドなどの任意の場所で IQL による詳細検索を行ったりする場合に、検索結果をより速く取得するのに役立ちます。したがって、これらの複数の場所で使用されるすべての IQL クエリにおいて、属性にインデックスを作成することをお勧めします。
属性にインデックスを作成すると、Insight は毎回データベースから結果を取得するのではなく、インデックス/キャッシュから結果を取得するため、より迅速に結果が得られます。ただし、これにはメモリ消費量が増えるという代償が伴います。」
次の手順に進む前に、変更のロールバックが必要になった場合に備えて、常にネイティブ データベース バックアップを作成することをお勧めします。
詳細な手順:
- Jira データベースにアクセスします。
- 次のクエリの 1 つを実行して、目的のパスとデータベース タイプに応じて Insight 属性に対するインデックス作成フラグを調整します。
必要な属性に対してのみインデックスを作成するように設定します。
Postgres の場合:UPDATE "AO_8542F1_IFJ_OBJ_TYPE_ATTR" SET "INDEXED" = 'true' WHERE ("REMOVABLE" = 'false' OR "TYPE" = 1) AND ("INDEXED" != 'true' OR "INDEXED" is NULL);
MySQLUPDATE AO_8542F1_IFJ_OBJ_TYPE_ATTR SET INDEXED = true WHERE (REMOVABLE = false OR TYPE = 1) AND INDEXED != true;
"textarea" タイプを除くすべての属性に対してインデックスを作成するように設定します。
Postgres の場合:UPDATE "AO_8542F1_IFJ_OBJ_TYPE_ATTR" SET "INDEXED" = 'true' WHERE "DEFAULT_TYPE_ID" != 9 AND ("INDEXED" != 'true' OR "INDEXED" is NULL);
MySQLUPDATE AO_8542F1_IFJ_OBJ_TYPE_ATTR SET INDEXED = true WHERE DEFAULT_TYPE_ID != 9 AND INDEXED != true;
- 必要に応じて変更をコミットします。
- Jira UI で、[Jira 管理] (歯車アイコン) > [アプリの管理] > [Insight のインデックス作成] に移動します。
- Insight のクリーン インデックス再作成を実行します。
- DC 環境の場合は、各ノードで Insight インデックス再作成を繰り返します。
ここではダウンタイムは不要です。